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

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

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">せっかくなので作ったんだけど、東京都の感染者数、すごい伸び... <a href="https://t.co/iCPIQktLJi">pic.twitter.com/iCPIQktLJi</a></p>&mdash; Orangeat (@orange_aus) <a href="https://twitter.com/orange_aus/status/1246332258266443776?ref_src=twsrc%5Etfw">April 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#つかうもの
実行環境ですが、**[Google Colaboratory](https://colab.research.google.com/notebooks/intro.ipynb?hl=ja)**（以下Colab）を使います。Python3（とPandas）で書きますが、オンラインでだれでも書けるようになっているのでインストールは何も必要ありません。直感的だしすぐ使える神サービスです。
細かいことは[こちら](https://qiita.com/karaage0703/items/0e24f332dcda7d7730b5)を参考にさせていただきました。（追記：リンクして頂きました。感謝...）

オープンデータについては、SIGNATEさんの[**COVID-19チャレンジ**（フェーズ1）](https://signate.jp/competitions/260)のものをつかいます。有志の方々の涙ぐましい努力によって日々更新されているデータベースです。データセット（SIGNATE COVID-19 Dataset）の直リンクは[こちら](https://docs.google.com/spreadsheets/d/1CnQOf6eN18Kw5Q6ScE_9tFoyddk4FBwFZqZpt_tMOm4/edit?usp=sharing)。

可視化に使うのはFlourishさんの**[Bar chart race](https://app.flourish.studio/)**というサービス。csvからお馴染みのBar-chart-raceのアニメーションをつくってくれます。

使うのはこれだけ。

#やってみる
###データインポート
まずColabで ファイル から新ノートブックを作ります。
早速書いていきます。まず、Colabにデータを読み込ませます。!から始まるマジックコマンドでいけるっぽいです。
`$URL$`をスプレッドシートの編集リンクの`/edit`... 以前の部分に置き換えてかきます。
要は ...`ta.csv https://docs.google.com/spreadsheets/d/1CnQOf6eN18Kw5Q6ScE_9tFoyddk4FBwFZqZpt_tMOm4/ex`... みたいに書けば大丈夫みたい。`?gid=`の値はシートによって違います。使いたかった罹患者のシートは`0`だったのでここでは`0`です。

```Python
!wget --no-check-certificate --output-document=data.csv '$URL$/export?gid=0&format=csv'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599184/6e6d69ac-6706-29f3-a5c2-4e02d6b95c53.png)

成功するとColab側に保存されます。
次にこの.csvをpandasに読ませます。pandasをインポートしてdfに変換後ファイルを渡します。

```Python
import pandas as pd

df = pd.read_csv("data.csv")
```

###前処理
公表日と受診都道府県の行だけ`loc`を使って抽出します。
片方でも欠けていれば無効データとみなし`dropna`ちゃんで消去します。


```Python
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`型とのこと（[参照](https://signate.jp/competitions/260#rule)）なので`"%Y/%m/%d"`を指定します。

```Python
df["公表日"] = pd.to_datetime(df["公表日"], format = "%Y/%m/%d")
```
`pd.get_dummies`と`pd.concat`（横結合なので`axis = 1`）を使って受診都道府県のフラグ列を作ります。
`index`の数字は必要ないので公表日をインデックスにします。

```Python
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`をかませれば延べ人数が出ます。

```Python
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におろします。なんかエラー出たけどいけた。ようわからん。

```Python
df_cs.T.to_csv("tog.csv")
tog.csv
```
```Python
---------------------------------------------------------------------------
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599184/4ab92364-1b34-2689-e0b4-a58e87a94bdb.png)

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

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">東京都のcovid19 githubにオードリーたんが降臨して1文字修正PRしてる！ <a href="https://twitter.com/hashtag/%E5%94%90%E9%B3%B3?src=hash&amp;ref_src=twsrc%5Etfw">#唐鳳</a><a href="https://t.co/lA7goT4snu">https://t.co/lA7goT4snu</a></p>&mdash; Yusuke Kawasaki / THE GUILD (@kawanet) <a href="https://twitter.com/kawanet/status/1236632326039166976?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# おわりに
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/

####ライセンス
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています。この記事の内容はSIGNATEさまのフォーラムにおける成果物及びその一部・コピー・改変・リミックスなどであるため、ライセンスが継承されています。

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