在前一篇文章『Python 練習: 處理癌症開放資料』裡,最後我有提到想處理癌症死因資料。這資料相當的複雜,而我最後的目的,是想在地圖上直接以顏色來表式癌症死亡數字在各地區的多寡。經過一番嚐試,得到了初步的結果。我會將操作過程分享,分成兩個文章來說明 :(I)是針對資料前處理的地方,(II)是在地圖顯示部份。
有先上網查有沒有範例可以參考,發現有一篇很完整詳盡的實作範例及說明,而且就是以台灣本土資料為範例。對我有很大的幫助。有興趣的請一定要看一下:From Pandas to GeoPandas – 地理資料處理與分析。
資料來源:癌症死因統計資料: https://data.gov.tw/dataset/8154
從政府開放資料網站下載「癌症死因統計資料.zip」,解開以後,可以看到很多的.csv檔案。從民國80年到105年的都有。我以cancer105.csv為對象。打開後可以看到內容如下 :
地區和癌症死因都是用代碼表示。如果,由以上資料,我想要以資訊地圖形式來顯示105年台中各行政區因口腔癌死亡的男性病患數目。要如何透過 Python 達成?
我的步驟,是先把County 和 Cause 這兩欄,轉成實際文字表示。然後,找出以臺中市的行政區內的癌症死因數字,最後在地圖上顯示口腔癌的資訊。
要查代碼的意思,得從「欄位說明.xls」這excel檔案去查。將「欄位說明.xls」打開,選擇"cause(cancer)"這個分頁,因為我是以105年度資料為目標,所以將右半"97年以後cause"部份複製,貼到新的分頁後,再匯出成csv檔案,本例是存成"CancerCode_97.csv"。要注意的一件事,存下來的csv編碼為BIG5,用pandas讀取時會有問題,所以記得先轉換成UTF-8格式(我是用notepad++來轉換)。
同上步驟,也把county那分頁裡的地區代碼對照表(100年~鄉鎮市區) 匯出成 csv (檔名: County_Code_100.csv)。
經過以上步驟,就可以用Python Pandas來處理資料了。
接下來是操作過程,先載入 pandas :
讀入資料
列出前五行 :
先來要轉換 county 這個欄位為實際地名,所以先讀入 county code 資訊:
county_code.head()
從county_code 裡,我們可以看到每個代碼所代表的地區名稱。要如何把這資訊加到cancer_death這個資料表裡呢 ? Pandas 裡的 merge 函式,可以達到這個需求 。以 cancer_death裡 county 這欄位和 county_code 表格裡 county 欄位為key,將這兩個表結合:
cancer_death_new.head() #列出前五行
列出結果如下:
目標是台中市的資料,所以要從"鄉鎮市區"欄位裡把所在的縣市挑出來才能比較:
接下來,找出在臺中市的資料:
taichung_cancer_death.head() #列出前五行
經過上述步驟,已先把台中市範圍內的資料找出已完成。接下來,轉換癌症死因的代碼為實際癌症名稱。
載入癌症代碼與名稱對照表:
cancer_code.head()
不需要ICD-10這欄位,所以把這欄位去掉。
接下來就是要把 taichung_cancer_death 這表格和 cancer_code 這表格結合在一起,前者是以 'cause' 為key,後者是以' 97年以後cause'為key。
再從中找出只有男生的資料:
taichung_cancer_death_M.head()
其中'cause'、'county'、'sex'、'97年以後cause'、'city' 這幾個欄位都不需要了,
經過以上步驟,已經把105年台中市男性因癌症死亡統計數目計算出來了,下圖是截圖:
最後,先將結果輸出成另一個 csv檔案,接下來地圖顯示時就會用到。