LKY 只有原創內容的 Blog

今之能者,謂能轉貼,至於魯蛇,皆能轉貼。不原創,何以別乎?

臺灣火災事件資料分析(一) - 動機 & 前處理踩雷的痛苦

Lin, Kao-Yuan's Avatar 2017-08-22

  1. 1. 不想看程式碼、沒興趣了解資料科學辛酸、只想看圖表和分析結論的讀者,請直接跳到下一篇:臺灣火災事件資料分析(二) - 縱火案件數量地圖
  2. 2. 1 2 3 4 5 原先所有類別數量 = 62 關聯分組類別數量 = 25 ['乾燥作業' '交通事故' '其他或不明' '天然災害' '敬神掃墓祭祖' '敬神祭祖' '施工不慎' '易燃液體接觸火源' '機械設備' '汙泥過熱' '燃放爆竹煙火' '燃燒廢棄物' '爐火烹調' '玩火' '瓦斯' '縱火' '自殺' '菸蒂' '蠟燭' '車輛因素' '遺留火種' '除蜂不慎' '電暖器引燃可燃物' '電氣因素' '點蚊香不慎引火']
  3. 3. 數據分析最難的是數學建模,但最煩瑣、最多人工的部份是資料前處理
  4. 4. 104 年台灣火災原因排名

雖然最近幾年台灣政府吹起 open data 風,各界有許多大大致力於促進政府開放資料,造福這片土地上的芸芸眾生。例如各式各樣的等公車 App,讓我們可以很清楚掌握公車動向,使搭公車不再充滿不確定性的痛苦,提高了大眾運輸的使用率,間接促進環保和交通安全,這便是 open data 的好處。

只是,畢竟 open data 還是新興意識,許多政府單位對此還是扭扭捏捏,往往用個資法當作擋箭牌,只願意釋出統計過後的結論資料。在統計知識普及的時代,只要釋出原始事件資料,眾人力量往往能做出政府主計單位意想不到的成果。

由消防署提供的火災事件資料就是一份很棒的 open data ,截至106.8.16,一共釋出了民國 103~104 年的資料,每一筆都是一個火災事件,保留了 [縣市, 鄉、鎮、市、區, 街、路段, 火災案件編號, 報案時間 (月:日:時:分) , 抵達時間 (月:日:時:分), 起火原因, 死亡人數, 受傷人數] 共 9 個維度,訊息含量相當豐富。

難得看到這麼好的資料,我就忍不住想要好好玩一下。


不想看程式碼、沒興趣了解資料科學辛酸、只想看圖表和分析結論的讀者,請直接跳到下一篇:臺灣火災事件資料分析(二) - 縱火案件數量地圖


  1. 資料合併

    • 各縣市都是獨立的 xls 檔案,但我要一次處理全國資料,所以需要把各縣市合併。
  2. 資料清理

    • 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
  1. 補上缺失值
    • 單一維度的 key 發生碰撞:想要分析到「鄉鎮市區」的解析度,那「鄉鎮市區」可以直接當作和地圖的 merge key 嗎?不行!因為會有重複。例如:
      • “大安區” 台北市和台中市都有
      • “信義區” 台北市和基隆市都有
        因此,必須用「縣市」+「鄉鎮市區」兩個 merge key 。
    • 缺字:「鄉鎮市區」這一欄的內容,字串結尾應該是「鄉鎮市區」的任一個字,但是卻找到以下資料例外
      • [中山’, ‘七堵’, ‘中正’, ‘仁愛’, ‘信義’, ‘安樂’, ‘暖暖’, ‘臺西’]
        所以還得自己補上區和鄉。
    • 將手動輸入資料屬性合併:各縣市消防局事件分類不一致,很多看起來都像是使用者自由輸入。有些感受到填表人員很盡力想忠實表達現場狀況,但這也讓資料被程式自動分類難度更高。只好把所有事件的火災原因都 unique 起來,用人工的方式,憑自己認知慢慢建立分組 dict(如下 code),程式就可以依照 dict 自動分類。火災資料還算少,如果是巨量資料,大到人工做不完,那就得靠 NLP(自然語言處理) 技術協助了。

因為我不是火災專家,這些分組歸類方式或許欠佳,歡迎網友在下方給我一些 comment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 火災事件關聯分組表
dict_fire_event = {
'自殺':['自殺','自焚'],
'蠟燭':['蠟燭','燈燭'],
'縱火':['縱火','疑似縱火','人為縱火'],
'瓦斯':['瓦斯','瓦斯外洩','瓦斯漏氣或爆炸','洩漏液化石油氣','洩漏液化瓦斯','瓦斯漏氣爆炸','瓦斯灌充填打火機不慎'],
'機械設備':['機械設備','機械故障'],
'電氣因素':['電氣因素','電氣因素(不含車輛)'],
'乾燥作業':['乾燥作業','烘乾機作業不慎','烤火'],
'敬神祭祖':['敬神祭祖','敬神、祭祖','敬神','祭祖'],
'爐火烹調':['爐火烹調','爐火不慎','爐火烹調油鍋起火','爐火烹調乾燒'],
'車輛因素':['車輛因素','車輛電氣因素','車輛機械因素','引擎排煙管高溫','車輛人為疏忽','車輛電氣系統','車輛燃料系統',],
'燃燒廢棄物':['燃燒廢棄物','燃燒雜草、垃圾','自清','燒廢料','燃燒木材不慎','整地','引燃汽油','引燃枯草'],
'燃放爆竹煙火':['燃放爆竹','燃放爆竹煙火','施放爆竹煙火'],
'易燃液體接觸火源':['易燃液體接觸火源','易燃品自燃','化學物品','柴油洩漏接觸熱源','絕緣油接觸高溫','易燃液體'],
'其他或不明':['其他或不明','其他','其它','原因不明','不明']
}

原本的火災事件總共有 62 類,但我們把敘述相似的字串正規化以後,最後只剩下 25 類了。

1
2
3
4
5
原先所有類別數量 = 62
關聯分組類別數量 = 25
['乾燥作業' '交通事故' '其他或不明' '天然災害' '敬神掃墓祭祖' '敬神祭祖' '施工不慎' '易燃液體接觸火源' '機械設備'
'汙泥過熱' '燃放爆竹煙火' '燃燒廢棄物' '爐火烹調' '玩火' '瓦斯' '縱火' '自殺' '菸蒂' '蠟燭' '車輛因素' '遺留火種'
'除蜂不慎' '電暖器引燃可燃物' '電氣因素' '點蚊香不慎引火']

數據分析最難的是數學建模,但最煩瑣、最多人工的部份是資料前處理

這些障礙處理起來很煩瑣、痛苦,但是要處理完才能盡情的做分析。

那我們是一次就把這障礙一口氣處理完的嗎?其實很難,不太可能做得到。

通常是先處理一點點,開始分析以後才發現踩到雷,然後回過頭來處理新發現的資料缺陷。因為先前的分析是用有缺陷的資料,所以處理完再從頭開始分析…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。
本文最后更新于 天前,文中所描述的信息可能已发生改变