2024 國道智慧交通管理創意競賽 資料ETL
2024 國道智慧交通管理創意競賽 資料ETL¶
這次參加的是高公局舉辦的競賽,主題是針對國道交通事故資料分析以及對處理時間的預測
訓練資料為2023 台灣國道事故資料
測試資料為2024 1-2月事故資料
來源: https://freeway2024.tw/links#links
第一步是確認資料外觀: 兩份資料的column 數目不一致,test data 50 columns, train data 49 columns, 主要差異是"分局",透過觀察可以發現分局與"簡訊內容"互有呼應,關係為以下,如此一來就可以讓column數一致,並且將兩個test/train data 新增"TAG"之後合併再一起,方便後續資料整理。
{1:北控,2:中控,3:南控,4:屏控,}
第二步處理資料內容異常: 例如#VALUE!或#REF!或是隱藏空格,可以簡單地透過
def clean_string(s): if isinstance(s, str): return s.replace('\n', '').replace('\r', '').replace('#VALUE!','OTHER').replace('#REF!','OTHER').replace('"','') return sdf = df.applymap(clean_string)
第三步處理丟失值: 不同分局填寫的資料也不大一致,例如"事故類型",有些分局就沒有填寫值,但可以透過"簡訊內容"讀取關鍵字做判斷回補
第四步將column的內容統一降低分析難度:
例如在肇事車輛部分,名詞相當多,光是車種就有三十多種,透過群組將車輛降低複雜度;類似的還有國道名稱/方向
mes_to_number = { '北控通報': 1, '中控通報': 2, '高公局中': 2, '南控通報': 3, '高公局南': 3, '高公局北': 1, '坪控通報': 4, '北通報3': 1, '中控通2': 2,}#test data had no 分局 columndf['分局'] = df['簡訊內容'].str[0:4].map(mes_to_number)
當資料到目前已經處理得差不多,但透過觀察可以發現不同事故的車輛數目不一定一致,而且是以wide table形式儲存,不利於訓練;另一個想法是只記錄發生車禍的數目,然後把先前分好的車輛群組用百分比的方式,去紀錄一個車禍裡面不同車輛的占比,這樣不管是圖表分析或是後續機器學習,都會相對容易
再來是提取特徵,把死亡/受傷再提取出是否受傷/死亡
# Add 'is_death' column where it's True if 'dead' is not 0, otherwise Falsedf['is_death'] = df['死亡'] != 0# Add 'is_injury' column where it's True if 'injury' is not 0, otherwise Falsedf['is_injury'] = df['受傷'] != 0
最後再把我們已經不需要的column 給drop,減少column跟雜訊,下一步就可以開始資料分析以及機器學習了~
Comments
Loading comments…
Leave a Comment