資料怎麼洗、熱力圖怎麼算
原始資料不能直接畫。這頁講清楚中間做了哪些處理, 以及每一個處理是為了修掉什麼問題。數字都是實際跑出來的。
一、一列是一個當事者,不是一件事故
這是最容易做錯的一步。原始資料裡,一件事故有幾個當事者就有幾列 —— 一輛車撞一台機車就是兩列,時間、地點、經緯度完全相同,只有「當事者順位」不同。
2,403,922 列原始資料,用(日期+時間+經緯度)去重之後是 1,042,189 件事故, 平均每件 2.26 個當事者。直接數列數的話,事故件數會膨脹超過兩倍。
二、剔除 geocode 失敗落回行政中心的假座標
有些事故的座標不是真的位置,而是地理編碼失敗之後退回的預設值 —— 通常是該縣市政府的座標。
最嚴重的一個點是 121.481, 25.009,那是新北市政府的位置。 如果不處理,這一個點上會堆著兩千多件事故,地址橫跨 20 個行政區, 畫出來全台灣最大的事故熱點會出現在新北市政府門口,而那是假的。
偵測方式很簡單:同一個座標的事故地址如果橫跨三個以上的行政區,那就是假點。 真實的路口不會同時在三峽和八里。全台共抓到 139 個這種點、 19,542 件事故,佔 1.84%,全部剔除。
三、聚合成格子,而不是畫原始點
1,042,189 個點直接丟給瀏覽器,手機會當掉。所以事故先被聚合成格子: 資料庫裡存一份約 12 公尺的細格(帶月份),查詢時再依照你的縮放層級 用整數除法即時併成需要的粗細,一個圖磚固定切 96 格。
所以你看到的每一個亮點不是一件事故,是一格範圍內的事故總數。 縮到全台時一格是 3.3 公里,放到街道時一格是 6 公尺。
四、顏色怎麼決定
每一格的權重是對數刻度:把該格的件數取自然對數,再除以畫面上最大值的對數。
這一段改過兩次,兩個版本都失敗過,值得寫下來。第一版拿最大值做線性刻度: 全台的分布是中位數 38 件、最大 15,601 件,差了四百倍, 結果除了那一個點以外全部趨近 0,整張圖是一片藍。 第二版改用第 97 百分位當滿分,一樣是一片藍 —— 因為 97% 的格子還是遠低於那個分母。 現在的對數刻度下,中位數的格子拿到 0.38、五百件的拿到 0.64、最高的拿到 1, 中間的層次才展得開。
這也表示顏色是相對的:同一個地方,在「看全台」和「放大看單一城市」時顏色會不一樣。 看全台時只有六都會紅;放大之後,該城市內部的差異才會展開。這是刻意的設計, 因為熱力圖的用途是比較,不是絕對量測。
五、「只看死亡」在算什麼
切過去之後只留下有人死亡的格子,權重也換成死亡人數。 統計顯示的是死亡事故的件數,不是那一格的事故總數。
這點我一開始做錯過:原本顯示的是「有死亡的格子裡的事故總數」, 那個數字比死亡人數大兩個數量級,看起來像是死亡事故有一萬多件。已經修掉。 「受傷」在這個模式下不顯示,因為那格的受傷多半來自別的非致命事故,混在一起會誤導。
站上其他工具
- 老照片動起來 — 把老照片變成會眨眼、微笑的 6 秒短片
- 變老變年輕 — 上傳正面照,看同一個人變老或變年輕
- 露營場合法查詢 — 1,807 家露營場哪些符合、違反哪條法規、還是不在名單上
- 淹水潛勢查詢 — 水利署 10 種降雨情境的模擬淹水深度地圖,各鄉鎮淹水比例
- 找回毛孩 — 全台走失/撿到毛孩地圖,沒晶片也能刊登,撿到的人免登入回報目擊
全部跑在同一台家用機器上;資料類工具用的是政府公開資料,每個都有寫清楚限制。