資料怎麼洗、熱力圖怎麼算
原始資料不能直接畫。這頁講清楚中間做了哪些處理, 以及每一個處理是為了修掉什麼問題。數字都是實際跑出來的。
一、一列是一個當事者,不是一件事故
這是最容易做錯的一步。原始資料裡,一件事故有幾個當事者就有幾列 —— 一輛車撞一台機車就是兩列,時間、地點、經緯度完全相同,只有「當事者順位」不同。
2,287,215 列原始資料,用(日期+時間+經緯度)去重之後是 992,225 件事故, 平均每件 2.26 個當事者。直接數列數的話,事故件數會膨脹超過兩倍。
二、剔除 geocode 失敗落回行政中心的假座標
有些事故的座標不是真的位置,而是地理編碼失敗之後退回的預設值 —— 通常是該縣市政府的座標。
最嚴重的一個點是 121.481, 25.009,那是新北市政府的位置。 如果不處理,這一個點上會堆著兩千多件事故,地址橫跨 20 個行政區, 畫出來全台灣最大的事故熱點會出現在新北市政府門口,而那是假的。
偵測方式很簡單:同一個座標的事故地址如果橫跨三個以上的行政區,那就是假點。 真實的路口不會同時在三峽和八里。全台共抓到 128 個這種點、 17,784 件事故,佔 1.76%,全部剔除。
三、聚合成格子,而不是畫原始點
992,225 個點直接丟給瀏覽器,手機會當掉。所以事故先被聚合成格子: 資料庫裡存一份約 12 公尺的細格(帶月份),查詢時再依照你的縮放層級 用整數除法即時併成需要的粗細,一個圖磚固定切 96 格。
所以你看到的每一個亮點不是一件事故,是一格範圍內的事故總數。 縮到全台時一格是 3.3 公里,放到街道時一格是 6 公尺。
四、顏色怎麼決定
用畫面上所有格子的第 97 百分位當滿分,不是用最大值。
用最大值的話,全台只要有一個 300 件的路口,其他所有地方都會被壓成一片藍, 什麼都看不出來。用百分位再開 0.6 次方壓一下,中間層次才展得開。
這也表示顏色是相對的:同一個地方,在「看全台」和「放大看單一城市」時顏色會不一樣。 看全台時只有六都會紅;放大之後,該城市內部的差異才會展開。這是刻意的設計, 因為熱力圖的用途是比較,不是絕對量測。
五、「只看死亡」在算什麼
切過去之後只留下有人死亡的格子,權重也換成死亡人數。 統計顯示的是死亡事故的件數,不是那一格的事故總數。
這點我一開始做錯過:原本顯示的是「有死亡的格子裡的事故總數」, 那個數字比死亡人數大兩個數量級,看起來像是死亡事故有一萬多件。已經修掉。 「受傷」在這個模式下不顯示,因為那格的受傷多半來自別的非致命事故,混在一起會誤導。