前言
今天想做一些紀錄,幫助自己未來若忘記這些專案功能時,可以再回來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,我的做法是
- 先寫好4隻code.sql 儲存在C:\A資料夾
- 先新增一個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檔(也可以直接改副檔名)
R Shiny安裝在Linux設定
本節大概是最重要跟麻煩的,會有很多細節設定問題需要處理,只要有一點沒注意,整個Shiny都會無法使用。
- 照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!?),其實筆者以前就學過很多統計方法、以及很多機器學習模型參數優化技術,但發現有時候要落實到第一線業務人員,讓大家看得懂的方法,應該是先做出圖表,找出大家真正重視的東西後,再來建模預測等等,我想會更適合。