とうとうPythonで「新型コロナの曜日別の年代ごと陽性者数」を出すことに成功


このエントリーをはてなブックマークに追加

ここからちょっと広告です。

広告は以上です。

相変わらず、「Tellus×TechAcademy 初心者向け Tellus 学習コース」で、とりまPythonの基礎を学習し続けている僕です。
素晴らしい学習教材です。シンプルなのが僕に向いてます。

今回、ついに成し遂げました……

前回やった、イマイチ腑に落ちなかった前回のPythonプログラム「曜日別に、年代ごとのコロナ陽性者数を出す」について、かんいちさんから、

「pivot_tableとreindexを使えばできるんじゃないか?」

と、ご丁寧にサンプルコードつきでアドバイスいただきました。

● pivot_table とは?
ピボットテーブル、そう、エクセルのあのピボットテーブルと同じことが、Pythonでもできるようなのです。
詳しくは記事下のリンクで。

● reindex とは?
エクセルで言うと、行や列を並べ替える機能です。
詳しくは記事下のリンクで。

で、これらと格闘すること1週間。

結果としては、見事成功! かんいちさんマジすごいっす! ありがとうございます!

やり方は、概要で書くと以下の通り:

  1. 東京都のサイトからcsvデータを読み込む
  2. 「曜日」と「患者_年代」でピボットテーブルを作る
  3. reindexで希望通りの並びにする
  4. データを整理する。特に「NaN」を別の扱いやすいもの(0とか)に変えるのは大事らしいです(詳しくはわからない)
  5. グラフを描く

コードは以下の通り:

###ライブラリ読み込み
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
import japanize_matplotlib
###csv読み込む
covid_data = pd.read_csv("(都合によりURLのあちこちにスペース入ってるけど、使う時はスペース除いてください)https:// stopcovid19. metro. tokyo. lg. jp/ data/ 130001_tokyo_covid19_patients. csv", index_col="公表_年月日", parse_dates=True)
###曜日と患者_年代のピボットテーブルにする
covid_pivot = pd.pivot_table(covid_data, index="患者_年代", columns="曜日", values="都道府県名", aggfunc="count")
###行と列を並び替える
covid_pivot_alignment = covid_pivot.reindex(index=["10歳未満","10代","20代","30代","40代","50代","60代","70代","80代","90代","100歳以上","不明","-"], columns=["月","火","水","木","金","土","日"])
###NaNを0で埋める
covid_pivot_alignment_fill = covid_pivot_alignment.fillna(0) 
###不明と-を足して年齢不明にし、不要な行や桁を削除
covid_pivot_alignment_fill.loc["年齢不明"] = covid_pivot_alignment_fill.loc["不明"] + covid_pivot_alignment_fill.loc["-"]
covid_pivot_fix = covid_pivot_alignment_fill.drop(["不明", "-"]).round().astype(int)
###グラフ描画
plt.figure(figsize=(20,20))
plt.rcParams["font.size"] = 18
print("曜日別の年代ごとcovid19陽性者数")
for i in range(len(covid_pivot_fix)):
    plt.subplot(4, 3, i+1)
    plt.title(covid_pivot_fix.index[i])
    plt.plot(covid_pivot_fix.iloc[i])

結果は以下の通り。

Covid_data

優勝! 期待通りの結果を出せました。

本当は、曜日はちゃんとシステムに「これは曜日だ」と理解して欲しかったのですが、なんか weekday_name のバグ?らしく、修正が大変そうなので、今回は諦めました。
これで充分でしょう。

あと、このピボットテーブルが合ってるかどうか確認するために、こっそりエクセルのピボットテーブルで検算してみたのは内緒です……
いやPhtyhonを信用していないわけじゃないのよ。自分の腕を信用していないんです。

ところで、このグラフから読み取れることは……

ないですね! 特にない。
全員「水曜から土曜にかけて上がっていくのね」という、既知の情報以外ない。

お疲れさまでした自分。以上!って感じのプログラミングでした。

いやープログラミング面白いですね。フッと気がついたらアッという間に2〜3時間経ってるという、ゲーム的な時間の歪みがある。
これはかなり自分を律してやらないと、身体壊すなー。
10代とか20代のうちにこの面白さに目覚めて、エンジニア目指せばよかったなー。

さて、そろそろ復習は止めて、前に進まなければなりません。
次は、どちらに進もうか?

  1. 諦めて機械学習の勉強をはじめる
  2. このデータをWebから誰でも見れるように、AWSなどをやる
  3. なんか手元に「退屈なことはPythonにやらせよう」っていう辞書みたいな厚さの本がある。手を出す?

悩ましい…どれも今までみたいに雰囲気だけではできない、茨の道っぽい……

ps.thx!
Pandasのデータを格納するオブジェクトDataFrameを理解する - DeepAge
Pandasでピボットテーブルを手軽に作成するpivot_table関数の使い方 - DeepAge
Pandasでインデックスを再設定するreindex関数の使い方 - DeepAge
pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出 | note.nkmk.me
pandas.DataFrameの行・列を指定して削除するdrop | note.nkmk.me
pandas.DataFrameに列や行を追加(assign, appendなど) | note.nkmk.me
pandasで行数、列数、全要素数(サイズ)を取得 | note.nkmk.me
pandas データフレームの行名・列名の参照と変更と追加 | AVILEN AI Trend
matplotlibでグラフの文字サイズを大きくする - Qiita
かんいちさん
そしていつもの「Tellus×TechAcademy初心者向け Tellus 学習コース

Ads by Google

コメント

コメントは、Twitterやはてブに、以下のボタンから本記事のアドレスつきでツイート/ブクマしていただくと、上にあるzenbackのウィジェットに反映されます。
  このエントリーをはてなブックマークに追加
または同ウィジェット内のFacebookコメントでお願いしますー。

Facebookのシェアは……されても誰だかわからないのですが、シェア自体は嬉しいので、下にボタンを置かせていただきます。よろしくお願いします。