#はじめに
上陸して猛威を振るい出した**新型コロナウイルスによる肺炎(COVID-19)**ですが、都市部を中心に広がっておりなお感染者数が増加しています。報道番組を見ても知りたいデータもなく頭が痛くなるだけなので、どうせならPythonを使っていろいろしようと思いました。(は?) 作ったのはこれだけ。
せっかくなので作ったんだけど、東京都の感染者数、すごい伸び... pic.twitter.com/iCPIQktLJi
— Orangeat (@orange_aus) April 4, 2020
#つかうもの
実行環境ですが、Google Colaboratory(以下Colab)を使います。Python3(とPandas)で書きますが、オンラインでだれでも書けるようになっているのでインストールは何も必要ありません。直感的だしすぐ使える神サービスです。
細かいことはこちらを参考にさせていただきました。(追記:リンクして頂きました。感謝...)
オープンデータについては、SIGNATEさんのCOVID-19チャレンジ(フェーズ1)のものをつかいます。有志の方々の涙ぐましい努力によって日々更新されているデータベースです。データセット(SIGNATE COVID-19 Dataset)の直リンクはこちら。
可視化に使うのはFlourishさんの**Bar chart race**というサービス。csvからお馴染みのBar-chart-raceのアニメーションをつくってくれます。
使うのはこれだけ。
#やってみる
###データインポート
まずColabで ファイル から新ノートブックを作ります。
早速書いていきます。まず、Colabにデータを読み込ませます。!から始まるマジックコマンドでいけるっぽいです。
$URL$
をスプレッドシートの編集リンクの/edit
... 以前の部分に置き換えてかきます。
要は ...ta.csv https://docs.google.com/spreadsheets/d/1CnQOf6eN18Kw5Q6ScE_9tFoyddk4FBwFZqZpt_tMOm4/ex
... みたいに書けば大丈夫みたい。?gid=
の値はシートによって違います。使いたかった罹患者のシートは0
だったのでここでは0
です。
!wget --no-check-certificate --output-document=data.csv '$URL$/export?gid=0&format=csv'
成功するとColab側に保存されます。
次にこの.csvをpandasに読ませます。pandasをインポートしてdfに変換後ファイルを渡します。
import pandas as pd
df = pd.read_csv("data.csv")
###前処理
公表日と受診都道府県の行だけloc
を使って抽出します。
片方でも欠けていれば無効データとみなしdropna
ちゃんで消去します。
df = df.loc[:, ["公表日", "受診都道府県"]]
df.dropna(how = "any", inplace = True)
試しに出力して確認してみます。(AtCoderの標準出力に慣れてたんですがオブジェクト単体でOutputできるんですね...)
df
>> Output
公表日 受診都道府県
0 2020/01/28 北海道
1 2020/02/14 北海道
2 2020/02/19 北海道
3 2020/02/19 北海道
4 2020/02/20 北海道
... ... ...
2423 2020/03/24 沖縄県
2424 2020/03/26 沖縄県
2425 2020/03/28 沖縄県
2426 2020/03/28 沖縄県
2427 2020/03/30 沖縄県
[2396 rows x 2 columns]
公表日をPandaに読ませるために.to_datetime
でdatetime64
にフォーマット変換します。すべてYYYY/MM/DD
型とのこと(参照)なので"%Y/%m/%d"
を指定します。
df["公表日"] = pd.to_datetime(df["公表日"], format = "%Y/%m/%d")
pd.get_dummies
とpd.concat
(横結合なのでaxis = 1
)を使って受診都道府県のフラグ列を作ります。
index
の数字は必要ないので公表日をインデックスにします。
df = pd.concat([df, pd.get_dummies(df["受診都道府県"])], axis = 1)
df.set_index("公表日", inplace = True)
df
>> Output
受診都道府県 三重県 京都府 佐賀県 兵庫県 北海道 ... 長野県 青森県 静岡県 香川県 高知県 鹿児島県
公表日 ...
2020-01-28 北海道 0 0 0 0 1 ... 0 0 0 0 0 0
2020-02-14 北海道 0 0 0 0 1 ... 0 0 0 0 0 0
2020-02-19 北海道 0 0 0 0 1 ... 0 0 0 0 0 0
2020-02-19 北海道 0 0 0 0 1 ... 0 0 0 0 0 0
2020-02-20 北海道 0 0 0 0 1 ... 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2020-03-24 沖縄県 0 0 0 0 0 ... 0 0 0 0 0 0
2020-03-26 沖縄県 0 0 0 0 0 ... 0 0 0 0 0 0
2020-03-28 沖縄県 0 0 0 0 0 ... 0 0 0 0 0 0
2020-03-28 沖縄県 0 0 0 0 0 ... 0 0 0 0 0 0
2020-03-30 沖縄県 0 0 0 0 0 ... 0 0 0 0 0 0
[2396 rows x 45 columns]
###算出
もちろん記録がない日もあるので再サンプリングします。時系列データの日別リサンプリングでは.resample("D")
が使えます。累積和.cumsum
をかませれば延べ人数が出ます。
df_cnt = df.resample("D").sum()
df_cs = df_cnt.cumsum()
df_cs
>> Output
三重県 京都府 佐賀県 兵庫県 北海道 千葉県 ... 長野県 青森県 静岡県 香川県 高知県 鹿児島県
公表日 ...
2020-01-15 0 0 0 0 0 0 ... 0 0 0 0 0 0
2020-01-16 0 0 0 0 0 0 ... 0 0 0 0 0 0
2020-01-17 0 0 0 0 0 0 ... 0 0 0 0 0 0
2020-01-18 0 0 0 0 0 0 ... 0 0 0 0 0 0
2020-01-19 0 0 0 0 0 0 ... 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2020-03-30 10 56 1 137 178 116 ... 7 8 8 2 15 1
2020-03-31 10 56 2 148 178 124 ... 7 8 8 2 17 1
2020-04-01 10 56 3 162 183 125 ... 7 8 8 2 20 2
2020-04-02 10 56 3 169 186 125 ... 7 8 8 2 21 3
2020-04-03 10 56 3 169 191 125 ... 7 8 8 2 21 3
[80 rows x 132 columns]
###グラフ化
最後にcsvでダウンロードします。ここでFlourish側が読み込んでくれるデータは向きが固定されていることにやっと気づいたので、転置($D^\top$)してから.csvにおろします。なんかエラー出たけどいけた。ようわからん。
df_cs.T.to_csv("tog.csv")
tog.csv
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-148-2cb118b16e21> in <module>()
1 df_cs.T.to_csv("tog.csv")
----> 2 tog.csv
NameError: name 'tog' is not defined
左のファイルのところに保存されてるので右クリックからダウンロードします。
日付の形式を直したかったんですが、csvを直接編集した方が早いことがわかったのでcsvをテキストエディタで開き"2020-" >> ""
、"-" >> "/"
と順に置換。
これでFlourishにかませれば完成です。1位の東京のデータが未更新だったので対策サイトのデータを入れました(※追記:編集当時のため変動している可能性が高いです)。こちらも有志の方が編集されているということで頭が上がりません。この前台湾のIT担当相の唐鳳さんが一文字修正のプルリク送って話題になってましたね... 唐鳳さん、GitHubにもちゃんと草生やしているらしくてほんとうにすごいお方...
東京都のcovid19 githubにオードリーたんが降臨して1文字修正PRしてる! #唐鳳https://t.co/lA7goT4snu
— Yusuke Kawasaki / THE GUILD (@kawanet) March 8, 2020
おわりに
1時間弱で書いたので適当な記事になっちゃった!外に出れない分、現状を把握するのに努めたいなと思いました!!!
ライセンスなど
####参考文献/使用リンク
https://signate.jp/competitions/260
https://qiita.com/karaage0703/items/0e24f332dcda7d7730b5
https://docs.google.com/spreadsheets/d/1CnQOf6eN18Kw5Q6ScE_9tFoyddk4FBwFZqZpt_tMOm4/edit?usp=sharing
https://stopcovid19.metro.tokyo.lg.jp/
####ライセンス
この 作品 は クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。この記事の内容はSIGNATEさまのフォーラムにおける成果物及びその一部・コピー・改変・リミックスなどであるため、ライセンスが継承されています。
####免責
参考文献のリンク先及びこの記事はそれらが必ずしも厳密に正しい情報であることに責任を負っていると示すものでは一切ありません。