利用R Shiny 製作儀表板Dashboard

閱讀時間約 11 分鐘

前言

今天想做一些紀錄,幫助自己未來若忘記這些專案功能時,可以再回來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!?),其實筆者以前就學過很多統計方法、以及很多機器學習模型參數優化技術,但發現有時候要落實到第一線業務人員,讓大家看得懂的方法,應該是先做出圖表,找出大家真正重視的東西後,再來建模預測等等,我想會更適合。
    avatar-img
    0會員
    1內容數
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    今天想跟大家聊聊分享一些市場的噪音, 以及後面會談到擊敗大盤績效的投資/交易方法。 一般來說, 在每天的交易上, 市場充斥的大量的訊息, 這些訊息常常對個股或大盤基本面沒有太多的影響, 但卻是會影響短期個股的報酬率
    Thumbnail
    新庄村位於岡山縣西北部、與鳥取縣接壤,屬中國山地,大部分是森林,村公所所在的村莊中心是新庄川流域的盆地,被認定為森林療養基地;與西粟倉村並列,是縣內的兩個村莊之一,也是縣內市町村中人口最少的,是日本最美麗的鄉村協會會員城市之一。 自1895年實施村治以來,沒有發生過合併,古代曾經作為出雲街道上的驛
    在一個陽光普照的早晨,你駕車經過一條熱鬧的商業街道,突然看到一家位於市中心的店面空出並貼著「出租」的牌子。你立即感到這是一次難得的機會,停車下來仔細審視這個店面。店面位於繁忙的商業區,附近有很多餐廳和商店,交通便利,正是開店的理想地點。 你靜靜站在店面前,閉上眼睛,深呼吸,心中默念著自己對於生意成
    Thumbnail
    當下週大家焦點都在關注週三CPI數據公佈與Fed的利率決策會議和點陣圖上時, 也許有一些短期賺快錢的機, 量化金融策略就是找出一些短, 中, 長期的投資機會, 並應用投資工具(個股期權或槓桿)提升報酬率與資產累積
    Thumbnail
    基本面當中,相當基礎,也是相當重要的幾個經營績效指標  包含,營業收入、營業毛利、營業利益與 EPS (每股盈餘)  ROA 資產報酬率、ROE 股東權益報酬率   從 goodinfo 網站上面,可以更清楚簡單的來看這些指標  讓新手可以更快速了解這些專有名詞,更快的進入基本面的世界
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    今天想跟大家聊聊分享一些市場的噪音, 以及後面會談到擊敗大盤績效的投資/交易方法。 一般來說, 在每天的交易上, 市場充斥的大量的訊息, 這些訊息常常對個股或大盤基本面沒有太多的影響, 但卻是會影響短期個股的報酬率
    Thumbnail
    新庄村位於岡山縣西北部、與鳥取縣接壤,屬中國山地,大部分是森林,村公所所在的村莊中心是新庄川流域的盆地,被認定為森林療養基地;與西粟倉村並列,是縣內的兩個村莊之一,也是縣內市町村中人口最少的,是日本最美麗的鄉村協會會員城市之一。 自1895年實施村治以來,沒有發生過合併,古代曾經作為出雲街道上的驛
    在一個陽光普照的早晨,你駕車經過一條熱鬧的商業街道,突然看到一家位於市中心的店面空出並貼著「出租」的牌子。你立即感到這是一次難得的機會,停車下來仔細審視這個店面。店面位於繁忙的商業區,附近有很多餐廳和商店,交通便利,正是開店的理想地點。 你靜靜站在店面前,閉上眼睛,深呼吸,心中默念著自己對於生意成
    Thumbnail
    當下週大家焦點都在關注週三CPI數據公佈與Fed的利率決策會議和點陣圖上時, 也許有一些短期賺快錢的機, 量化金融策略就是找出一些短, 中, 長期的投資機會, 並應用投資工具(個股期權或槓桿)提升報酬率與資產累積
    Thumbnail
    基本面當中,相當基礎,也是相當重要的幾個經營績效指標  包含,營業收入、營業毛利、營業利益與 EPS (每股盈餘)  ROA 資產報酬率、ROE 股東權益報酬率   從 goodinfo 網站上面,可以更清楚簡單的來看這些指標  讓新手可以更快速了解這些專有名詞,更快的進入基本面的世界