跳到主要內容

使用python繪製視覺化--熱圖(Heatmap)


熱圖簡言之就是將數值的大小用顏色深淺來呈現,將量化數據透過視覺化的方式傳遞,讓閱讀者可以快速獲取資訊。
在這基本概念下利用pythonPlotly套件來繪製熱圖。這次以20191月到8月空氣品質數據為例做二維圖表的熱圖(資料來源為環保署的監測網)

空氣品質議題受到全球關注:
隨著科技發展的同時,環境相關的議題也受到國際重視,包含空氣品質對於健康之衝擊等議題,其中以PM2.5對健康的影響最為受到關注。唯影響空氣品質的因素複雜,需立基於全球觀點共同探討空氣汙染、氣候改變對健康的衝擊,因此探討對於健康之影響並非本篇著墨的重點。空氣品質的議題固然龐大,基於民眾的立場,我們應該具備基礎認知以及對生活環境的關注,以因應大環境的變化。

即時空氣品質指標(AQI)
空氣品質指標(AQI)是描述空氣品質的指數,全世界並沒有針對這個指標有一致的規定,各國可以依據不同的情況調整,制定適合的空氣指標,因此不同國家會有不同的AQI指標,例如加拿大與美國AQI指標就不太一樣。但指標都有一致共通點,當指標數值越高皆表示空氣品質越差。
目前臺灣環保署所採用的即時空氣品質指標(AQI)則是參考美國環境保護署標準而制定。

加拿大空氣品質指標
(參考來源:加拿大政府網站)

美國空氣品質指標
(參考來源:美國環境保護署)
臺灣空氣品質指標

臺灣環保署偵測O3PM2.5PM10COSO2 NO26個測項之即時副指標值,各副指標皆有不同的濃度計算方式,有興趣的人可連結至臺灣環保署網站查詢(https://taqm.epa.gov.tw/taqm/tw/b0203.aspx),計算後的濃度值對應到「污染物濃度與即時副指標值對照表」,取其中最大值為即時空氣品質指標,該汙染物則為指標污染物。


空氣品質監測資源
(1)  環保署的監測網提供空氣品質監測資料(https://taqm.epa.gov.tw/taqm/tw/)
(2)  民間自立架設監測之空氣品質監測資料(https://airbox.edimaxcloud.com/)
(3)  全球空氣品質監測網站(https://waqi.info/tw/),覽全球10,000多個觀測站的即時空氣品質。
除了這些網站外,手機上也有許多的空氣品質即時資料的App可以提供下載,讓民眾可以隨時掌握最即時的資訊,做好初步防範。

操作步驟
1.選定主題,準備素材
20191月至8月測站測得AQI>100之天數資料(資料來源為整理環保署的監測網開放資料),因各月份基本天數不同,再將取得的天數資料除以該月份天數轉換成百分比,也就是每個測站測得AQI>100的天數佔該月的多少百分比。假定數值為50,表示該月有一半天數出現AQI>100(對敏感族群不健康)的情況。但測站數量較多,因此僅取幾個測站資料做呈現。

2.確認繪圖需要用到的參數:
X(x):(month)
Y(y):各測站

3.繪製熱圖
這邊要說明一下報表數值的部份是由Z參數採用矩陣的方式帶入,帶入的規則演示如下:
import plotly.graph_objs as go
import plotly.offline as py
x=["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月"]
y=["基隆-基隆測站","臺北-中山測站","新北-板橋測站","桃園-桃園測站","新竹-新竹測站","苗栗-苗栗測站","臺中-豐原測站","南投-南投測站",
   "彰化-彰化測站","雲林-斗六測站","嘉義-嘉義測站","臺南-臺南測站","高雄-前金測站","屏東-屏東測站"]
z=[df["ID_1"],df["ID_2"],df["ID_3"],df["ID_4"],df["ID_5"],df["ID_6"],df["ID_7"],df["ID_8"],df["ID_9"],df["ID_10"],df["ID_11"],df["ID_12"],df["ID_13"],df["ID_14"]] #z為矩陣
annotations = go.Annotations()
for n, row in enumerate(z):
    for m, val in enumerate(row):
        annotations.append(go.Annotation(text=str(z[n][m]), x=x[m], y=y[n],
                                         xref='x1', yref='y1', showarrow=False)) #讓熱圖畫面可以直接代入數據
        
colorscale=[[0.0, '#5DAC81'],[0.3, '#A8D8B9'], [0.5, '#EEA9A9'], [0.7,"#EB7A77"],[1.0, '#CB4042']] #除了選擇plotly提供的現成設定外,可以自行做顏色設定
trace=go.Heatmap(x=x,y=y,z=z,
                 colorscale=colorscale)

fig = go.Figure(data=go.Data([trace]))
fig['layout'].update(
    title="2019年1月至8月AQI>100天數佔該月份之百分比(%)",
    annotations=annotations,
    xaxis=go.XAxis(ticks='', side='top'),
    yaxis=go.YAxis(ticks='', ticksuffix='  '),  # ticksuffix is a workaround to add a bit of padding
    width=1200,
    height=700,
    margin=go.Margin(
     l=150, 
     r=160, 
     b=50, 
     t=100, 
     pad=3 
    ),
    autosize=False
)
plot(fig, config={"displayModeBar": False}, show_link=False,filename='basic-heatmap')


留言

這個網誌中的熱門文章

如何快速註冊統合分析題目~以PROSPERO為例

初步檢索心中的愛 當心目中有一個理想題目時,為避免地球上另一個人也同時跟你想的一樣,而且還比我們早發表,若等我們發表時才發現,當下一定很扼腕,有了註冊系統除了幫自己先占好位子,也可以同時確認這個題目是否已經有人正在做了,不用浪費時間投注在上面。很多人其實不曉得實際上到底要如何註冊,以下一起註冊吧。 什麼是 PROSPERO??   PROSPERO (International prospective register of systematic reviews) 是一個國際前瞻性系統性文獻回顧評價系統,由美國國立衛生研究院 NIHR ( National Institute for Health Research )資助,由英國約克大學 CRD(Centre of Reviews and Dissemination) 創立,針對將已完成的評價或正進行中的計畫做紀錄。 目的:避免重複並減少報告偏見的機會,增加透明性。                 步驟流程 Step 1 :檢索主題 先確認其他人是否對這主題感興趣,有人捷足先登了嗎 ?? 也可以確認目前流行的趨勢是哪類型的研究等。 Step 2 :註冊帳號 ID 先到 PROSPERO 官網 ,填寫基本資料後註冊 ID 。 Step 3 :點選註冊文獻 review 要需先有帳號後才能註冊題目,進入頁面後依指示一步一步操作。 以下是網頁步驟,依研究對象是人群還是動物選擇按鈕點選,一般我們都是人群研究,選紫色。同時須確認以下五步驟是否都經過檢驗了。 第 1 步 檢查納入標準。 第 2 步 確保您的 protocol 處於(接近)最終形式。 第 3 步 搜尋 PROSPERO ,以確保評論尚未被註冊。 第 4 步 搜尋 PROSPERO ,以確保您沒有不必要地重複由另一個團隊進行的審核或先前已註冊的審核 第 5 步 開始註冊 Step 4 :點選相關事前準備工作進度。 這裡有一系列問題須皆回答完,才能進行下一步。 以上填完後,終於可以進入 Stage of review ,這裡依指示點選進度。 Step 5 :填寫註冊表格

Python與SAS資料處理入門-變項合併與名稱修改

將舊有的變項合併創建新變項 在處理大數據時常常會遇到需橫跨多個資料庫間進行資料串連,因此可能會遇到幾個問題 : (1) 不同資料庫間串連的鍵值欄位可能有多個,例如 :ID 與生日相同的資料才可互相串連。 (2) 不同資料庫間串聯的鍵值不盡相同。 (3) 要串聯的檔案之間有名稱相同的欄位,前幾篇文章有提到欄位合併的處理在 SAS 的語法上要注意檔案合併時欄位名稱相同會覆蓋的問題。 針對第 1 跟第 2 個問題,可先依據串聯不同資料庫鍵值的欄位需求先合併成一個 unique id ,後續直接用這個鍵值進行串連。合併後的新鍵值除了做為串檔用外,當資料處理時遇到原先鍵值不 unique 的情況,也會 透過變項合併產生新的 unique id 來取代原先的 id 鍵值 。 對於問題 3 ,檔案合併遇到命名相同的欄位產生 相互覆蓋 的問題,這部分會透過變更名稱的方式來處理。 以簡單例子進行練習 手上有 2 種檔案 : (1) 調查的基本資料,裡面包含 ID 、 Gender 、 Birthday 、 City( 戶籍地 ) 等資訊。 (2) 調查的結果,裡面包含 ID 、 Birthday 、 City( 收案地點 ) 、 Q_date( 受訪日期 ) 以及問卷題項。 問題 1: 鍵值不 unique 觀察第一份資料可以發現 ID 編號為 007 的有兩個且生日不同,因此判定可能是不同的人,編號重複編列,在這樣的情況下如果僅用 ID 串聯結果可能會是這樣。 在基本資料 (A) 的那兩筆 ID 為 007 的資料同時都會與調查結果 (B) 中 ID 為 007 那筆資料串連,但很明顯的是 B 資料的 007 合併生日判斷後可以發現不屬於 A 檔另一筆 007 的數據,因此原本 unique 的 ID 不為 unique ,因此合併 ID 與 Birthday 成為一個新的 unique ID 做為鍵值。 問題 2: 不同檔案有相同的名稱 這兩個檔案中有 2 個欄位名稱相同, Birthday 與 City 。在考量 Birthday 與 ID 將合併為新鍵值後,可暫擱一邊不需特別處理。但 City 部分的問題就比較大了,雖名稱相同但實際上代表的含意不同,如

python與SAS資料處理-歸人與排除重複

  歸人顧名思義就是將一個人多筆的資料整合,每人只留下 1 筆。   通常取得的資料都是原始資料,並未經過整理。例如手上有疑份顧客購物紀錄,裡面有每個顧客在這 1 年內的每筆消費紀錄,這是一份以每次消費紀錄為 1 筆的紀錄形式,所以一個人可以有多筆的消費紀錄。當我們想要知道這些消費紀錄源自於多少顧客的購買時,這時候就需要用到歸人的概念,將資料轉換為每一個人只有 1 筆資料的紀錄形式 ( 如下圖所示 ) 。 以 SAS 進行資料歸人 歸人留 1 筆消費紀錄 proc sort data =cost; by ID time; run ; /* 在規筆前依照 ID 跟消費日期做排序 */ data cost_1; set cost; by ID; if first.id; run ;   /* 保留第一筆資料 */   之前已經有針對 proc sort 的排序語法進行說明,有需要可參考這篇 文章 , SAS 排序的設定值為升冪,也就是說每個人都會從最早那次的紀錄開始往後排序,所以用 first.id 就可以留下每個人最早那次的消費紀錄。 這邊也可以用排除重複的概念保留 1 筆資料 proc sort data =cost out =cost_2 nodupkey ; BY ID; run ; 利用 nodupkey ,將 ID 重複的資料刪除,僅保留每個 ID 第一次出現的該筆紀錄。   歸人累計所有消費金額 proc sort data =cost; by ID time; run ; data cost_1; set cost; by ID; if first.id then count= 0 ;/* 每個人第一筆資料都令 count=0*/ count+NT;/* 同 ID 累計 NT 數值 */ if last.id; run ;   除了要歸人以外,還要累計每個仁所有的消費金額,所以這邊就會創建一個 count 欄位,每一個人的第一筆 ID 令 count=0 ,在同樣 ID 時累加 NT 的數值,最後每個人保留最後一筆 ID ,也就是最後累計的總額。 以 Python 進行資料歸人 歸人留 1 筆消費紀錄 cost.sort_v