iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 27
0
Data Technology

職場老鳥的資料科學初體驗-R語言專案實作紀錄系列 第 27

(Day27)交通專案-自台北市公車路線資料集,觀察內科交通瓶頸.(上)

1. 專案緣由

北市內科地區,上下班時間的塞車問題,是台北市一大交通的困擾.並也屢屢成為政治炒作與選舉的熱門議題.
使用大眾運輸系統,是多方提出的方案之一.
但是否可藉由數據的搜集與整理,可觀察得知目前相關公車路線在尖峰時間的瓶頸,藉此更了解方案的可行性.

2. 專案說明

專案主題:交通與觀光
區域:臺北市內湖區(可適用台北市與新北市)
使用的資料集:臺北市公車路線圖

3. 專案發想

本專案發想自2017年新竹黑客松活動簡介,進行專案實作.
https://ithelp.ithome.com.tw/upload/images/20180105/20107033rRjpO2bVmk.jpg
以下開始實做

#本專案使用的套件
library(ggplot2)   #繪圖用
library(jsonlite)  #處理資料用
library(lubridate) #處理時間格式用

欲達成上圖的圖表結果,先試做一下所需的資料表範本.

#資料應該要有公車/站牌/記錄時間,小作幾筆資料測試先
bus<-c("X","X","X","X","X","X","Y","Y","Y","Y","Y","Y")
busstop<-c("A","A","B","C","D","E","A","A","B","C","D","E")
time<-c("2018/1/5 08:58","2018/1/5 08:59","2018/1/5 09:01","2018/1/5 09:02","2018/1/5 09:05","2018/1/5 09:15","2018/1/5 08:40","2018/1/5 08:55","2018/1/5 09:02","2018/1/5 09:03","2018/1/5 09:05","2018/1/5 09:15")
df1<-data.frame(bus,busstop,time)

# 畫圖囉!X軸定義為站牌 Y軸定義為到站時間 線圖為公車 
my.plot1 <- ggplot(df1, aes(busstop,time,  group = bus)) +
  geom_line(aes(colour = bus), linetype = 2)
my.plot1 

df1格式如下:
https://ithelp.ithome.com.tw/upload/images/20180105/201070339zvISmijqG.png
嗯!這個範本小有模樣!可開始下個步驟囉
(公車X與公車Y各自有線圖 Y軸部分 時間是自下而上的遞增)
https://ithelp.ithome.com.tw/upload/images/20180105/20107033QRdeVilDTt.png

4. 資料觀察

經查公車相關的公開資料,彙整在公車動態資訊(總索引),觀察結果,所需內容分別為:

  • 公車資料由公車路線資料集所提供,所提供的壓縮格式為.gz,資料內容為JSON格式.
  • 公車資料由定時車機資訊資料集所提供,所提供的壓縮格式為.gz,資料內容為JSON格式.
  • 本次使用JSON線上工具
    備註:此為GetBusData資料,有公車動態的經緯位置,但無站牌資訊,與本專題不符,不予採用.
    https://ithelp.ithome.com.tw/upload/images/20180106/20107033pJ60K6JRJL.png
    此為本次專題採用的資料GetBusEvent
    https://ithelp.ithome.com.tw/upload/images/20180106/20107033Fe9aitbfCh.png

5. 專案實作

車機資料處理

由於該車機資料,是透過服務觸發後,並無歷史資料可以大量取得.
僅能靠定時的觸發服務,並自行搜集整理而得.
這部分要注意的是專案目的在觀察帶狀性的時間下,公車在各站牌之間移動的動態,僅有一兩個無關係的資料檔,數據過少是無法說明本次專題目的的!

##lubridate套件所提供的好用日期格式套用Stamp功能,省去轉檔.
sf<-stamp("20171231235959") 
sf(Sys.time()) #可以測試一下或使用sf(now())

# 
for (i in 1:3) {
  #給定車機資料提供url
  url<-"https://tcgbusfs.blob.core.windows.net/blobbus/GetBusEvent.gz"
  #每次所產生的檔名,用觸發時間時分秒來當作檔名,以茲識別.如需指定路徑,請自行調整
  gfile<-paste0(sf(now()),".gz")
  
  #開始下載url對應的資料,並存為gfile,下載方式為binary(wb)
  download.file(url,gfile, mode = "wb")
  #直接套用jsonlite 套件,讀出對應的資料(透過gzfile直接讀取檔名為gfile的.gz)
  dlist<-fromJSON(gzfile(gfile))
  #直接取用該list第二層名為BusInfo的list,放入名為data的dataframe
  data<-data.frame(dlist[["BusInfo"]])
  
  #資料的append累積
  if (i==1){
    df<-data
  }else{
    df <- rbind(df, data)
  }
  #設定為每分鐘抓一份資料
  Sys.sleep(60) 
}#迴圈結束

前述的程式,開啟後預計將執行三個60秒的時間,並將資料累計起來.
這部分應該可改由Batch資料先將壓縮檔下載至固定目錄,之後再行以迴圈的方式讀完所有資料.
可以準備畫圖了!

#向307致敬: 因全台北公車多,資料龐大,僅篩選以一條路線代表 
df307<-filter(df,df$RouteID=="108640")
#沿用先前發想的圖 套用資料
my.plotA <- ggplot(df307, aes(StopID,DataTime,  group = BusID)) +
  geom_line(aes(colour = BusID), linetype = 2)
my.plotA

可以看見三分鐘左右的同一路線,多台公車在不同站牌的狀況
https://ithelp.ithome.com.tw/upload/images/20180106/20107033QPMsQG5b2L.png
df307看一下資料內容
https://ithelp.ithome.com.tw/upload/images/20180106/20107033GJ5p9iOOYN.png


上一篇
(Day26) 專案實作-用Shiny發布互動式網站
下一篇
(Day28)
系列文
職場老鳥的資料科學初體驗-R語言專案實作紀錄30

尚未有邦友留言

立即登入留言