使用互動式地圖和動畫可視化倫敦的自行車流動性(上)
- 2020 年 2 月 23 日
- 筆記
編輯 | sunlei 發布 | ATYUN訂閱號
近年來,自行車共享系統已經成為流行的出行方式,為大都市地區的市民提供了一種綠色、靈活的交通方式。世界上許多國家的政府都認為這是一種創新戰略,可能會帶來許多社會效益。例如,它可以減少汽車的使用,從而減少溫室氣體排放,緩解城市中心的交通擁堵。
報告顯示,77%的倫敦人認為騎自行車是短途出行的最快方式。從長遠來看,這也可能有助於提高城市的預期壽命。
我一直在研究一種數據驅動的成本效益演算法,以優化(重新平衡)倫敦公共自行車租賃計劃桑坦德自行車(Santander Cycles)的系統。在真正研究這個演算法之前,我必須深入研究大量的數據,如果我能以某種方式將它們可視化,那將會很有幫助。
讓我們看看如何使用圖形、地圖和動畫來可視化自行車共享系統。
你可以在這個網頁上找到網路地圖。大多數地圖、動畫和源程式碼都可以在GitHub上找到。數據現在可以在Kaggle上獲得。
目錄
- 關於數據的更多資訊
- 柱形圖
- 互動式地圖
- 密度圖
- 連接圖
- 動畫
- 結論
- 評論
關於數據的更多資訊
我從倫敦交通局(TfL)獲得了自行車出行的數據。自2012年以來,他們系統中的每一次自行車旅行都會被記錄下來,這些公開的數據可以在線獲取。
對2017年8月1日至9月13日的36天出行記錄進行了分析。在此期間,倫敦的700個自行車停靠點中有大於150萬人次使用。從2014年開始,我們見證了自行車出行量超過190%的增長。該系統中的自行車和停靠站數量都增加了兩倍多,以適應倫敦市中心和地區自行車需求的顯著增長。準確的數據將顯示在我即將發布的論文中。敬請期待。
數據操作
我相信平日和周末的出行模式會有很大的不同。讓我們做一些編碼,看看這是不是真的。我們首先通過pd.read_csv()導入行程數據。
# Load journey data f = 'journeys.csv' j = pd.read_csv(f) date = j['date'].values month = j['month'].values year = j['year'].values hour = j['hour'].values minute = j['minute'].values station_start = j['id_start'].values station_end = j['id_end'].values
然後,我們按date.weekday()提取工作日的數據,並將一個24小時的工作日平均分成72個時間片,這樣每個時間片代表20分鐘的間隔。
# Compute IsWeekday weekday = np.zeros(len(date)) weekday[:] = np.nan cnt = 0 for _year, _month, _date, _hour, _minute in zip(year, month, date, hour, minute): _dt = datetime.datetime(_year, _month, _date, _hour, _minute) _weekday = _dt.weekday() weekday[cnt] = _weekday cnt += 1 IsWeekday = weekday < 5 j['IsWeekday'] = IsWeekday # Compute TimeSlice j['TimeSlice'] = (hour*3 + np.floor(minute/20)).astype(int)
我們還需要檢查這些自行車旅行是否從/到廢除的車站,因為沒有辦法獲得這些車站的資訊,如位置,車站名稱等(幹得好倫敦交通局)。我們給它們貼上了「無效」的標籤。
# Load station data f = 'stations.csv' stations = pd.read_csv(f) station_id = stations['station_id'].values # Extract valid journeys valid = np.zeros(len(date)) valid[:] = False cnt = 0 for _start, _end in zip(station_start, station_end): if np.logical_and((_start in station_id), (_end in station_id)): valid[cnt] = True cnt += 1 j['Valid'] = valid
最後,我們只保留那些「有效」的、在工作日出行的出行記錄,結果顯示有73%的數據是在工作日出行的。
df = j[j["IsWeekday"] == True].drop(columns="IsWeekday") df = df[df["Valid"] == True].drop(columns="Valid") print('Ratio of valid journeys= {:.2f}%'.format(df.shape[0] / j.shape[0] * 100))
柱形圖
我們終於深入到可視化部分!最簡單的數據可視化形式可以說是圖表。通過一個簡單的groupby(』TimeSlice』)函數,我們可以看到在不同的時間段內的頻繁行程。
grp_by_timeslice = df.groupby('TimeSlice').count().values[:,0] plt.bar(range(0,72), grp_by_timeslice) plt.xlabel('Time Slice') plt.ylabel('Departures') plt.show()
平日(左)和周末(右)平均離港率
看到了嗎?我們的假設是正確的!工作日和周末的出行模式是如此不同,我們可以看到工作日的兩個高峰時段,大多數人在這兩個時段通勤,但周末不是。我們也可以以類似的方式觀察出行時間和速度的分布。
行車時間分布(左)及速度分布(右)
請注意,由於數據限制(它們不跟蹤您的移動),我們假設採用直線路徑,這將比實際路徑短,因此根據起點和終點之間的距離計算的速度將被低估。如果顧客把自行車歸還到租車的地方,計算出的速度是0,這就解釋了為什麼在0公里/小時出現了一個奇怪的峰值。
互動式地圖
如果說圖表很花哨,那麼地圖就更花哨。我們將使用folium,它是一個製作互動式地圖的spool.js的Python包裝器。確保通過以下方式安裝最新版本
$ pip install folium==0.7.0
(或其conda安裝等效設備)。我在Google Colaboratory上工作,預裝版本是0.2.0,功能很小。
我建立了一個簡單的模板,用於生成帶有圓圈標記(不同顏色)的地圖使用群集。
import folium # Change colours def color_change(c): if(c < 15): return('red') elif(15 <= c < 30): return('orange') else: return('green') # Create base map London = [51.506949, -0.122876] map = folium.Map(location = London, zoom_start = 12, tiles = "CartoDB positron") marker_cluster = MarkerCluster(locations=[lat, lon]).add_to(map) # Plot markers for _lat, _lon, _cap, _name in zip(lat, lon, cap, name): folium.CircleMarker(location = [_lat, _lon], radius = 9, popup = "("+str(_cap)+") "+_name, fill_color = color_change(_cap), color = "gray", fill_opacity = 0.9).add_to(marker_cluster) f = 'map_station_cluster.html' map.save(f)
為什麼是集群?MarkerCluster()使標記在縮小時距離過近時聚集在一起。你不希望你的地圖太亂,標記重疊。
站群圖
放大時,它會自動取消聚集/展開:
站群地圖-放大
但我答應過你們互動式地圖。您可以設置彈出參數和顯示站名稱及其容量時,點擊它。萬歲!
站群圖中的交互作用
此地圖在
https://edenau.github.io/maps/station-cluster/上提供。
原文鏈接:
https://towardsdatascience.com/visualizing-bike-mobility-in-london-using-interactive-maps-for-absolute-beginners-3b9f55ccb59