LoginSignup
27
13

More than 3 years have passed since last update.

実際にCOVID-19の状況をデータセットを使って可視化してみる

Last updated at Posted at 2020-04-04

はじめに

上陸して猛威を振るい出した新型コロナウイルスによる肺炎(COVID-19)ですが、都市部を中心に広がっておりなお感染者数が増加しています。報道番組を見ても知りたいデータもなく頭が痛くなるだけなので、どうせならPythonを使っていろいろしようと思いました。(は?) 作ったのはこれだけ。

つかうもの

実行環境ですが、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'

image.png

成功すると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_datetimedatetime64にフォーマット変換します。すべてYYYY/MM/DD型とのこと(参照)なので"%Y/%m/%d"を指定します。

df["公表日"] = pd.to_datetime(df["公表日"], format = "%Y/%m/%d")

pd.get_dummiespd.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

左のファイルのところに保存されてるので右クリックからダウンロードします。
image.png

日付の形式を直したかったんですが、csvを直接編集した方が早いことがわかったのでcsvをテキストエディタで開き"2020-" >> """-" >> "/"と順に置換。
これでFlourishにかませれば完成です。1位の東京のデータが未更新だったので対策サイトのデータを入れました(※追記:編集当時のため変動している可能性が高いです)。こちらも有志の方が編集されているということで頭が上がりません。この前台湾のIT担当相の唐鳳さんが一文字修正のプルリク送って話題になってましたね... 唐鳳さん、GitHubにもちゃんと草生やしているらしくてほんとうにすごいお方...

おわりに

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さまのフォーラムにおける成果物及びその一部・コピー・改変・リミックスなどであるため、ライセンスが継承されています。

免責

参考文献のリンク先及びこの記事はそれらが必ずしも厳密に正しい情報であることに責任を負っていると示すものでは一切ありません。

27
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
13