雖然最近幾年台灣政府吹起 open data 風,各界有許多大大致力於促進政府開放資料,造福這片土地上的芸芸眾生。例如各式各樣的等公車 App,讓我們可以很清楚掌握公車動向,使搭公車不再充滿不確定性的痛苦,提高了大眾運輸的使用率,間接促進環保和交通安全,這便是 open data 的好處。
只是,畢竟 open data 還是新興意識,許多政府單位對此還是扭扭捏捏,往往用個資法當作擋箭牌,只願意釋出統計過後的結論資料。在統計知識普及的時代,只要釋出原始事件資料,眾人力量往往能做出政府主計單位意想不到的成果。
由消防署提供的火災事件資料就是一份很棒的 open data ,截至106.8.16,一共釋出了民國 103~104 年的資料,每一筆都是一個火災事件,保留了 [縣市, 鄉、鎮、市、區, 街、路段, 火災案件編號, 報案時間 (月:日:時:分) , 抵達時間 (月:日:時:分), 起火原因, 死亡人數, 受傷人數] 共 9 個維度,訊息含量相當豐富。
難得看到這麼好的資料,我就忍不住想要好好玩一下。
不想看程式碼、沒興趣了解資料科學辛酸、只想看圖表和分析結論的讀者,請直接跳到下一篇:臺灣火災事件資料分析(二) - 縱火案件數量地圖
-
資料合併
- 各縣市都是獨立的 xls 檔案,但我要一次處理全國資料,所以需要把各縣市合併。
-
資料清理
- Noise 1:每個分頁的第 1 個 row 都是縣市名稱,第 2 個才開始是事件資料。
- Noise 2:有一個檔案的 “縣市” 欄位同時出現高雄市和台南市,一看這個檔案的事件都和船有關,我才知道這個是「高雄港務消防隊」,是一個和縣市消防局同等級的單位。我服役的時候在這裡受訓,所以一看就知道。此處是高雄港管制區,但是入口在台南市。因為太過特殊且數量少,高雄港務消防隊在這次分析先不採用。
- Noise 3:報案時間格式不一致
- 有全形冒號、半形冒號、還有的包含西元年(如下表)
- Noise 3:報案時間錯亂
- 時間是 141 點、106 分的(如下表)
表:每個縣市各抽一份資料出來觀察格式差異
縣市 | 鄉、鎮、市、區 | 街、路段 | 火災案件編號 | 報案時間 (月:日:時:分) | 抵達時間 (月:日:時:分) | 起火原因 | 死亡人數 | 受傷人數 |
---|---|---|---|---|---|---|---|---|
高雄市 | 高雄市旗津區德利造船廠(CERIBU漁船) | - | 315C20O2 | 03:20:141:59 | 03:20:15:106 | 施工不慎 | 0 | 0 |
新北市 | 淡水區 | 竿蓁二街 | H15A08D1 | 01:08:03:36 | 01:08:03:42 | 電氣因素 | 0 | 0 |
臺北市 | 南港區 | 昆陽街 | A15A04J1 | 2015-01-04 09:53:28.593000 | 2015-01-04 09:58:00 | 其他 | 0 | 0 |
桃園市 | 大溪區 | 瑞源里番仔寮 | I15A03I1 | 01 : 03 : 08 : 59 | 01 : 03 : 09 : 13 | 燃燒雜草、垃圾 | 0 | 0 |
臺中市 | 中區 | 成功路 | E15A11C1 | 01:11:02:31 | 01:11:02:53 | 縱火 | 0 | 0 |
臺南市 | 中西區 | 中山路 | G15A01X1 | 01:01:23:32 | 01:01:23:36 | 電氣因素 | 0 | 0 |
宜蘭縣 | 南澳鄉 | 金洋路 | T15A04R1 | 01:04:17:49 | 01:04:18:05 | 烘乾機作業不慎 | 0 | 0 |
新竹縣 | 北埔鄉 | 水祭村8鄰麻布樹排 | J15A13I1 | 2016-01-13 08:18:00 | 2016-01-13 08:23:00 | 敬神祭祖 | 0 | 0 |
苗栗縣 | 頭份市 | 市場內 | K15A20B1 | 01:20:02:01 | 01:20:02:04 | 縱火 | 0 | 0 |
彰化縣 | 芳苑鄉 | 芳漢路芳二段 | M15A03P1 | 01:03:15:40 | 01:03:15:51 | 遺留火種 | 0 | 0 |
南投縣 | 魚池鄉 | 水秀街 | N15A16G1 | 01:16:06:03 | 01:16:06:21 | 瓦斯漏氣或爆炸 | 0 | 0 |
雲林縣 | 口湖鄉 | 埔南村 | O15A02F1 | 01:02:05:30 | 01:02:05:39 | 電氣因素 | 0 | 0 |
嘉義縣 | 朴子市 | 四維路2段 | P15A06M1 | 01:06:12:11 | 01:06:12:14 | 施工不慎 | 0 | 0 |
屏東縣 | 崁頂鄉 | 復興路 | S15A01N1 | 01:01:14:00 | 01:01:14:08 | 縱火 | 0 | 0 |
臺東縣 | 臺東市 | 平等街 | V15A25J1 | 01:25:09:25 | 01:25:09:30 | 縱火 | 0 | 0 |
花蓮縣 | 玉里鎮 | 城南十街 | U15A18C1 | 01:18:02:21 | 01:18:02:30 | 電氣因素 | 0 | 0 |
澎湖縣 | 馬公市 | 鎖港里 | W15B18K1 | 02:18:10:01 | 02:18:10:06 | 菸蒂 | 0 | 0 |
基隆市 | 七堵 | 俊賢路 | C15A12C1 | 01:20:02:46 | 01:20:02:53 | 電氣因素 | 0 | 0 |
新竹市 | 東區 | 水利路 | D15A19X1 | 01:19:23:39 | 01:19:23:45 | 爐火烹調 | 0 | 0 |
嘉義市 | 東區 | 興業東路 | F15A11D1 | 01:11:03:44 | 01:11:03:49 | 電氣因素 | 0 | 0 |
金門縣 | 烈嶼鄉 | 上林至貴山路段 | X15B19U1 | 02:19:20:15 | 02:19:20:15 | 燃放爆竹 | 0 | 0 |
連江縣 | 北竿鄉 | 塘岐村 | Y15F12L1 | 06:12:11:30 | 06:12:11:33 | 電氣因素 | 0 | 0 |
臺中港 | 梧棲區 | 中南一路2段 | 215A25K1 | 01:25:10:32 | 01:25:10:36 | 施工不慎 | 0 | 0 |
- 補上缺失值
- 單一維度的 key 發生碰撞:想要分析到「鄉鎮市區」的解析度,那「鄉鎮市區」可以直接當作和地圖的 merge key 嗎?不行!因為會有重複。例如:
- “大安區” 台北市和台中市都有
- “信義區” 台北市和基隆市都有
因此,必須用「縣市」+「鄉鎮市區」兩個 merge key 。
- 缺字:「鄉鎮市區」這一欄的內容,字串結尾應該是「鄉鎮市區」的任一個字,但是卻找到以下資料例外
- [中山’, ‘七堵’, ‘中正’, ‘仁愛’, ‘信義’, ‘安樂’, ‘暖暖’, ‘臺西’]
所以還得自己補上區和鄉。
- [中山’, ‘七堵’, ‘中正’, ‘仁愛’, ‘信義’, ‘安樂’, ‘暖暖’, ‘臺西’]
- 將手動輸入資料屬性合併:各縣市消防局事件分類不一致,很多看起來都像是使用者自由輸入。有些感受到填表人員很盡力想忠實表達現場狀況,但這也讓資料被程式自動分類難度更高。只好把所有事件的火災原因都 unique 起來,用人工的方式,憑自己認知慢慢建立分組 dict(如下 code),程式就可以依照 dict 自動分類。火災資料還算少,如果是巨量資料,大到人工做不完,那就得靠 NLP(自然語言處理) 技術協助了。
- 單一維度的 key 發生碰撞:想要分析到「鄉鎮市區」的解析度,那「鄉鎮市區」可以直接當作和地圖的 merge key 嗎?不行!因為會有重複。例如:
因為我不是火災專家,這些分組歸類方式或許欠佳,歡迎網友在下方給我一些 comment
1 | # 火災事件關聯分組表 |
原本的火災事件總共有 62 類,但我們把敘述相似的字串正規化以後,最後只剩下 25 類了。
1
2
3
4
5
原先所有類別數量 = 62
關聯分組類別數量 = 25
['乾燥作業' '交通事故' '其他或不明' '天然災害' '敬神掃墓祭祖' '敬神祭祖' '施工不慎' '易燃液體接觸火源' '機械設備'
'汙泥過熱' '燃放爆竹煙火' '燃燒廢棄物' '爐火烹調' '玩火' '瓦斯' '縱火' '自殺' '菸蒂' '蠟燭' '車輛因素' '遺留火種'
'除蜂不慎' '電暖器引燃可燃物' '電氣因素' '點蚊香不慎引火']
1 | 原先所有類別數量 = 62 |
數據分析最難的是數學建模,但最煩瑣、最多人工的部份是資料前處理
這些障礙處理起來很煩瑣、痛苦,但是要處理完才能盡情的做分析。
那我們是一次就把這障礙一口氣處理完的嗎?其實很難,不太可能做得到。
通常是先處理一點點,開始分析以後才發現踩到雷,然後回過頭來處理新發現的資料缺陷。因為先前的分析是用有缺陷的資料,所以處理完再從頭開始分析…Orz
這就是數據分析的日常。
到這裡,就可以開始把火災事件資料和臺灣地圖合併分析了!
104 年台灣火災原因排名
電氣因素 | 縱火 | 其他或不明 | 菸蒂 | 遺留火種 | 爐火烹調 | 車輛因素 | 施工不慎 | 燃燒廢棄物 | 敬神祭祖 | 瓦斯 | 機械設備 | 燃放爆竹煙火 | 自殺 | 蠟燭 | 交通事故 | 易燃液體接觸火源 | 玩火 | 敬神掃墓祭祖 | 乾燥作業 | 汙泥過熱 | 除蜂不慎 | 電暖器引燃可燃物 | 天然災害 | 點蚊香不慎引火 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
576 | 270 | 164 | 148 | 104 | 72 | 46 | 37 | 31 | 31 | 29 | 27 | 26 | 24 | 19 | 18 | 15 | 14 | 14 | 2 | 1 | 1 | 1 | 1 | 1 |
縱火居然是排名第2?出乎意料之外!
到底,縱火都發生在哪些地區呢?
關於作者: [@LKY](https://mosdeo.github.io/) 自認不夠資格叫作 Data Scientist 的資料科學工程師,最近關注救災、救護相關的 Open Data。