2022-04-20|閱讀時間 ‧ 約 11 分鐘

利用R Shiny 製作儀表板Dashboard

    前言

    今天想做一些紀錄,幫助自己未來若忘記這些專案功能時,可以再回來review一下。會有這個專案動機其實是我所在的公司,偏向非營利的機構,但又時候可能有一些客戶(民眾)來申請資料,或者我們也有些業務需對一些特定民眾進行處置,老闆因為需要管理很多業務,我想說我在該機構負責統計規劃,應該可以在不花錢的前提下(如果有錢我直接買Tableau或Power BI直接結案),做一個簡單的儀表板(Dashboard)。
    本文的重點並非是怎麼設計儀表板,那個比較偏重UI/UX專業,且不同的公司情境/老闆,所需要的排版及呈現也會有所差異,故本文著重是設計這個儀表版時,要用到的程式有哪些,大概需要做怎麼樣的前置設定才可以完成。

    程式語言

    統計軟體
    本專案會用到的語言為統計的R語言,其實我想用Python,感覺未來在很多效能維護的部分會方便許多,但因為目前寫這篇文章時,我的Python還沒到很熟練,所以先用R shiny來執行,但未來應該會採用Python來改寫。

    資料庫軟體
    因本機構N年前資料庫就是採用SQL Server 2016,所以我就跟前人用這個軟體,所以本文就採用這個軟體。

    網路儲存伺服器
    其實我猜一般公司如果弄R shiny dashboard,應該不需要用到這個才對,但是因為我這邊資安有點嚴格,SQL主機資料庫採斷網,所以我中間有使用S牌的NAS。

    Linux
    Linux的版本很多一開始我是想用CentOS,但有一些新聞表示後續不維護,為了怕麻煩我直接用ubuntu server,因為筆者本身屬於統計背景,很多資工的東西其實真的沒碰過,所以在ubuntu的設定上是請IT同事協助,但要特別注意我聽說ubuntu 18跟20有些差異,類似網路或防火牆設定等,所以在下載時要注意一下,另外有些資安比較嚴格的地方,在安裝Linux可能會有錯誤,我們猜測可能是Linux安裝時會從網路抓很多mirror檔,但有時防火牆會檔下來,這也是在下載須注意的部分,如果資安很嚴格,可以直接下載完整版。

    建置儀表板

    指標(Metrics)設計
    製作指標這件事,除非你是非常有經驗的人,或者是你是天生聰明的人,不然指標製作從零到有非常麻煩,如果你公司員工很少,沒有什麼人可以討論,我猜你需要在這一節花很久時間,如果很多人的話,直接問一下單位senior/PM,或者其他業務部門同事應該就解決了吧(其實人多只是找盲點快一點,但實務上還是要經過多輪討論),通常我不建議一開始直接找老闆,因為許多老闆根本不知道他要什麼,表面上他好像會是最關心指標數值的人,但很多老闆看到的都是結果,他們壓根不知道原因在哪,所以此時會需要儀表板的建立,用來幫助老闆釐清每個指標定義的先後順序。
    首先,製作指標前,你需要先了解到底指標跟KPI有什麼不一樣,以及拆解指標的作法,在這裡我推薦North Star Metric(北極星指標),網路上有非常多資料可參考,我個人是推薦Mr. PM 下午先生,我覺得他很多資料都很完整,或者是他的朋友,Peter的文章也有稍微提到,大家也可以去參考一下,我整個專案裡面溝通協調還有指標設計,大概佔我快6-7成的時間,剩下撰寫R shiny、SQL等等反而不會花太多時間。

    SQL Server 設定
    SQL在這裡扮演一個非常重要的角色,需要每日定期幫我產製資料到特定位址的NAS資料夾,後續讓我的R Shiny可以抓取,這裡我採用微軟的sqlcmd公用程式去處理,如果要用BCP去處理應該也可,但我沒試過,希望有會得人可以教我一下,我的目標是每天早上5點執行一隻sqlcmd,而這隻sqlcmd需要執行4隻SQL code,我的做法是
    1. 先寫好4隻code.sql 儲存在C:\A資料夾
    2. 先新增一個txt檔,輸入我的sqlcmd如下:(記得改為自己的IP)
    @echo off

    echo (1)Delete file yesterday 
    del \\192.168.1.1\dashboard\績效.csv
    (192.168.1.1是我的NAS位置)

    echo (2) Get the data
    sqlcmd -S 192.168.1.2 -U Willy999 -P 123456qwe -d ABC123 -s "," -i "C:\A\績效.sql" -o "\\192.168.1.1\dashboard\績效_test.csv"
    (192.168.1.2SQL的位置,Willy999我的帳號,123456qwe是我的密碼,ABC123你想要執行的SQL資料庫或資料庫快照集的名稱,執行我放在C:\A\績效.sql,產製出來的檔案放在\\192.168.1.1\dashboard\績效_test.csv)

    echo (3) Remove hyphen line
    findstr /R /C:"^[^-]*$" \\192.168.1.1\dashboard\績效_test.csv > \\192.168.1.1\dashboard\績效.csv

    echo (4) Delete file 
    del \\192.168.1.1\dashboard\績效_test.csv
    3. 在記事本撰寫之後,另存新檔為bat檔(也可以直接改副檔名)
    4. 使用Windows工作排程器,設定每天幾點開始執行,或者執行幾次bat檔等細節

    R Shiny安裝在Linux設定
    本節大概是最重要跟麻煩的,會有很多細節設定問題需要處理,只要有一點沒注意,整個Shiny都會無法使用。
    1. 照R Studio Shiny的官網先執行Ubuntu Packages for R裡面所有的指令,再開始執行下面這些指令(這是在Linux的介面執行)
    #step1
    sudo su - \
    -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
    #Step2
    sudo apt-get install gdebi-core
    wget https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.17.973-amd64.deb
    sudo gdebi shiny-server-1.5.17.973-amd64.deb
    2. 接著要先確認剛剛安裝的Shiny Server是否成功,可用以下指令確認
    #啟動Shiny Server(基本上只有第一次需要而已,除非你後來有重開Linux)
    sudo systemctl start shiny-server

    # 查看狀態(應該會顯示綠色的running,右邊會有開啟的時間)
    systemctl status shiny-server

    #重新啟動(Restart the server)
    sudo systemctl restart shiny-server

    # 關閉
    systemctl stop shiny-server
    3. 基本上很多網路資料大概到這邊都成功,但我運氣真的很差,又多遇到了很多問題,我猜很多人都需要安裝很多pkg在R Linux上面,我主要有遇到httr pkg安裝失敗,後來有找到方法解決,其實還有一些pkg一直安裝失敗,但要下一堆Linux指令,做一堆麻煩設定才能解決
    4. 另外安裝所有想要的R pkg時,我發現在Linux要用root權限執行R,接著在執行,我一開始不知道,全部用user權限安裝完,發現完全都沒安裝成功,導致Shiny執行時根本吃不到pkg
    5. 另外我有在Linux開一個NAS資料夾的權限(不過這邊就不多談了),方便我的R script指定路徑
    6. 字形問題要特別留意,我自己環境測試的電腦是Win10,在上面執行R script預測字型是CP950,換到Linux預設字型會是UTF-8檢視,另外如果是在R Linux讀取SQL產出的csv,且有出現中文時,可能read.csv需要額外下
    fileEncoding = "BIG5"
    7. 最重要的是如果出現錯誤不要慌,要看Linux路徑向下的Log檔錯誤訊息為何
    /var/log/shiny-server.log

    Linux設定
    1. 上傳檔案:如果你是本來Linux就很熟悉的人那應該怎麼做都沒關係,但如果是初學者,我會建議直接使用圖形化介面去傳輸檔案,我是用WinSCP來做,如果要用FileZilla也行
    2. 資料夾權限:我第一次用WinSCP上傳產生失敗(被擋),後來發現是權限問題,ui.R跟server.R要同時放置在sample-apps向下的資料夾,所以要先開啟Linux的這個資料夾權限
    cd /opt/shiny-server/samples/

    #willy999是我的Linux user帳號
    sudo chown willy999 sample-apps
    3. 在sample-apps底下設定一個資料夾叫做"dashboard"(當然你要設置其他名稱也行),最後在瀏覽器key以下網址,應該就可以看到自己的作品了(3838 port 預設應該是打開才對)
    #192.168.1.3是我的Linux IP
    http://192.168.1.3:3838/sample-apps/dashboard/
    4. 其實做到前面就完成了,但我執行Shiny有時候會遇到資料沒update在儀表板的問題,就是我每天早上自動用sqlcmd將csv檔放置在特定資料夾,可是儀表板上面的數字還是昨天的metrics,這種情形很少發生,但可能就是一個月一次,但是是不定期的,也就是可能20幾天,會有某一天儀表板的數字還是昨天的,我發現只要重新啟動R shiny Server就可以了,所以我後來乾脆每天早上重開,我使用Linux crontab自動排程這樣就可以了(如果有更好的解決方式 歡迎提供討論)
    #每天早上6點使用開指令(要先進入root權限,不然重開Shiny server要輸入密碼,user權限不行)
    crontab -e
    0 6 * * * systemctl restart shiny-server

    後記

    其實在整個專案,學到最多的是應該是指標拆解的方法(或者Linux!?),其實筆者以前就學過很多統計方法、以及很多機器學習模型參數優化技術,但發現有時候要落實到第一線業務人員,讓大家看得懂的方法,應該是先做出圖表,找出大家真正重視的東西後,再來建模預測等等,我想會更適合。
    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.