Data analysis

練習專案六:奔跑的長條圖 1


專案介紹(Introduction)

練習專案六:奔跑的長條圖

本專案展示如何以動態長條圖的方式,更直觀地呈現不同對象(如候選人、國家、投資報酬率)在時間維度上的變化趨勢。
初期以 Plotly Express 進行概念驗證(效果不佳,因此改用 raceplotly 製作最終成品),使長條圖能隨著時間自動更新,形成連續的「奔跑效果」。

專案說明:本專案聚焦於奔跑的長條圖,不包含進一步的統計分析


本專案的長條圖分為兩個部分:

  • 2024年總統大選:依各投開票所的開票時間,進行累積的票數計算,顯示各候選人的票數和排名。
  • 各國每日確診數:依每日確診人數排序,呈現每日確診數前 10 名的國家隨時間變化的趨勢。

資料來源:



數據準備(Data Preparation)

數據來源(Data Sources)



數據結構(Data Structure)

  • covid_19_confirmed
    • reported_on:日期
    • country:國家名稱
    • confirmed:累計確診數

  • cumulative_votes_by_time_candidate
    • collected_at:時間
    • candidate:候選人名稱
    • sum_votes:單次票數
    • cumulative_sum_votes:累計票數


數據導入(Data Import)

資料皆採用前期專案建立的 SQLite 資料庫。
詳細清理與建置過程可參考附錄與先前專案紀錄。

完整程式碼:create_bar_chart_race_data.py
清理過程參考 1:COVID_19.db
清理過程參考 2:taiwan_presidential_election_2024.db

核心重點
  • 選舉資料:使用 cumsum() 累加開票進度

    • 需先合併 全國投開票所完成時間,以模擬票數逐步增加的真實過程。
    • 透過 cumsum() ,能計算每個時間點的「累積開票進度」,讓長條圖呈現連續的變化軌跡。
      # 候選人(candidate) 為群組,依照索引(index)的順序累加票數。
      votes_by_collected_at_candidate['cumulative_sum_votes'] = (
        votes_by_collected_at_candidate.groupby(['candidate'])['sum_votes'].cumsum()
        ) 
      

  • 疫情資料:使用 nlargest() 篩選每日確診前十名

    • 資料範圍:採用 2020-12-31 前的資料,這段期間變化幅度較大,能更清楚觀察疫情發展趨勢。
    • 疫情資料的 confirmed 已是累積數據,不需再累加。
    • 因國家數量龐大,若全部顯示會使圖表過於擁擠,因此透過 nlargest(10) 篩選保留每日確診人數最高的前 10 名國家,使視覺呈現更聚焦、易於比較。
      # nlargest(10) 找出每日 confirmed 前10 的 index。
      nlargest_index = covid_19_confirmed.groupby("reported_on")["confirmed"].nlargest(10).reset_index()["level_1"].values
      
      # 依 nlargest_index 重新篩選並排序 covid_19_confirmed 資料。
      covid_19_confirmed = covid_19_confirmed.loc[nlargest_index, :].reset_index(drop=True)
      

    心得:很有趣的使用方法,以nlargest 找出目標資料的 index。過去只使用**布林(boolean)**的方式來篩選資料,對我來說是一個很新的應用方法。


下一章