Python 練習: 以地圖顯示癌症死因資料(I)

在前一篇文章『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 :

import pandas as pd

讀入資料

cancer_death = pd.read_csv('DeathByCancer/cancer105.csv')

列出前五行 :

cancer_death.head()

先來要轉換 county 這個欄位為實際地名,所以先讀入 county code 資訊:

county_code = pd.read_csv('DeathByCancer/County_Code_100.csv')
county_code.head()

從county_code 裡,我們可以看到每個代碼所代表的地區名稱。要如何把這資訊加到cancer_death這個資料表裡呢 ? Pandas 裡的 merge 函式,可以達到這個需求 。以 cancer_death裡 county 這欄位和 county_code 表格裡 county 欄位為key,將這兩個表結合:

cancer_death_new = pd.merge(left=cancer_death, right=county_code, left_on='county',right_on='county')
cancer_death_new.head()  #列出前五行

列出結果如下:

目標是台中市的資料,所以要從"鄉鎮市區"欄位裡把所在的縣市挑出來才能比較:

cancer_death_new['city'] = cancer_death_new['鄉鎮市區'].apply(lambda t: t[:3])

接下來,找出在臺中市的資料:

taichung_cancer_death=cancer_death_new[cancer_death_new['city']=='臺中市']
taichung_cancer_death.head()  #列出前五行

經過上述步驟,已先把台中市範圍內的資料找出已完成。接下來,轉換癌症死因的代碼為實際癌症名稱。

載入癌症代碼與名稱對照表:

cancer_code = pd.read_csv('DeathByCancer/CancerCode_97.csv')
cancer_code.head()

不需要ICD-10這欄位,所以把這欄位去掉。

cancer_code=cancer_code.drop(['ICD-10'], axis=1)

接下來就是要把 taichung_cancer_death 這表格和 cancer_code 這表格結合在一起,前者是以 'cause' 為key,後者是以' 97年以後cause'為key。

taichung_cancer_death1=pd.merge(left=taichung_cancer_death, right=cancer_code, left_on='cause',right_on='97年以後cause')

再從中找出只有男生的資料:

taichung_cancer_death_M = taichung_cancer_death1[taichung_cancer_death1['sex']==1]
taichung_cancer_death_M.head()

其中'cause'、'county'、'sex'、'97年以後cause'、'city' 這幾個欄位都不需要了,

taichung_cancer_death_M=taichung_cancer_death_M.drop(['cause','county','sex','97年以後cause','city'],axis=1)

經過以上步驟,已經把105年台中市男性因癌症死亡統計數目計算出來了,下圖是截圖:

最後,先將結果輸出成另一個 csv檔案,接下來地圖顯示時就會用到。

taichung_cancer_death_M.to_csv('DeathByCancer/105_台中癌症死亡.csv')

 

 

 

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *