COVID-19のオープンデータを手軽に可視化したい
新型コロナウイルスのニュースが多いですね。ただマス向けのテレビ報道に自分が知りたいデータの情報が無いと感じる方も多いのではないでしょうか?
かのマリー・アントワネットも
「データがないならデータを作ればいいじゃない」
と言ったとか言わないとかということで、手軽にGoogle Colaboratoryを使ってCOVID-19関連のオープンデータを可視化してみる方法を紹介したいと思います。
Google Colaboratoryに関して
Google Colaboratory(以下Google Colab)に関しては、以下記事参照ください。
ざっくり言うと、ブラウザだけで使える環境構築不要のPython実行環境です。ブラウザさえあれば、データ分析や可視化ができてしまいます。最高ですね。これを使ってCOVID-19関連のデータを可視化・分析していきます。
COVID-19関連オープンデータ
個人的に以下のページに関連情報をまとめています。オープンデータの項目に、様々なデータをまとめています。
オープンデータの形式は、大きく以下3つあります。
- Google Spread Sheet(csvファイル)
- jsonファイル
- GitHubリポジトリ
GitHubリポジトリに関してはgit cloneするだけなので、今回は主にGoogle Spread Sheetとjsonファイルに関して説明をします。
Google Spread Sheetのデータの分析
Google Spread Sheetのオープンデータに関しては、SIGNATEさんがCOVID-19チャレンジ(フェーズ1)というCOVID-19のオープンデータの整備を目的に行ったコンペティションの成果物を題材にします。
Google Spread Sheetで公開されていて、頻繁にアップデートされています。
SIGNATE COVID-2019 Dataset(Spreadsheet)
Google Spread Sheetのデータは、Google Colab上で、以下のようにマジックコマンド(最初に!をつけて)でwgetを実行することでcsvファイルとしてダウンロードできます。
!wget --no-check-certificate --output-document=data.csv 'https://docs.google.com/spreadsheets/d/10MFfRQTblbOpuvOs_yjIYgntpMGBg592dL8veXoPpp4/export?gid=0&format=csv'
gid=0
はシートのNoを表します。Google Spread Sheetのシートによってgid
の値が異なるので確認してからダウンロードしましょう。当然普通のcsvファイルも同じ要領でwgetコマンドでダウンロードできます。
csvがダウンロードできたら、あとはpandasで好きなように読み込むだけです。
import pandas as pd
# SIGNATE COVID-2019 Dataset からデータを読み込み、ステータスと性別を抽出
df = pd.read_csv("data.csv")
df = df[["ステータス","性別"]]
pandasに関しては、以下ブログ記事等参照下さい。
Python/pandas/matplotlibを使ってcsvファイルを読み込んで素敵なグラフを描く方法(Mac/Raspberry Pi)
そのあとの分析は、SIGNATEさんのCOVID-19チャレンジ(フェーズ2)フォーラムの死亡率と性別の関係のサンプルが参考になります。
例えばBar Chart Raceと呼ばれる手法での下図のような可視化が簡単にできます。
新型コロナウイルスの都道府県別の累積罹患者数の3月の推移を、SIGNATEのフォーラムを参考にGoogle Colabで可視化。東京の伸びがエグいhttps://t.co/2tMXoaj8Nn pic.twitter.com/vnFphc3UeQ
— からあげ (@karaage0703) April 4, 2020
Google Colab上で実行できるノートブックも作成しました。すぐ試したい方は以下リンク先から試してみて下さい。
jsonファイル
東京都の公式の感染動向を可視化したサイトが、日本全国でforkされて各県の感染動向を可視化したサイトが生まれています。こちらで使用されている元となるデータはjsonファイルとなります。各県での詳しい状況が知りたい場合や、県ごとの比較がしたい場合に便利なデータとなります。県ごとのサイトのリンクは以下ページを参照して探して下さい(全ての県であるわけではありません)。
新型コロナウイルス感染症に関する可視化情報等の個人的なまとめ
これらのサイトはGitHubで公開されているので、GitHubでjson形式のファイルへのリンクを探します。見つけたら、あとはSpread Sheetのときと同様、wgetでダウンロードします。東京の場合は以下です。
!wget --no-check-certificate --output-document=covid19_tokyo.json 'https://raw.githubusercontent.com/tokyo-metropolitan-gov/covid19/development/data/data.json'
jsonファイルもcsv同様pandasで以下のように簡単に読み込めます。
import pandas as pd
data = pd.read_json('covid19_tokyo.json')
例えば、検査実施回数の日付データは以下で取得できます(# 以下は実行結果です)。
date_data = []
for i in range(len(data['inspection_persons']['labels'])):
date_data.append(data['inspection_persons']['labels'][i][0:10])
print(date_data)
# ['2020-01-24', '2020-01-25', '2020-01-26', '2020-01-27', '2020-01-28', '2020-01-29', '2020-01-30', '2020-01-31', '2020-02-01', '2020-02-02', '2020-02-03', '2020-02-04', '2020-02-05', '2020-02-06', '2020-02-07', '2020-02-08', '2020-02-09', '2020-02-10', '2020-02-11', '2020-02-12', '2020-02-13', '2020-02-14', '2020-02-15', '2020-02-16', '2020-02-17', '2020-02-18', '2020-02-19', '2020-02-20', '2020-02-21', '2020-02-22', '2020-02-23', '2020-02-24', '2020-02-25', '2020-02-26', '2020-02-27', '2020-02-28', '2020-02-29', '2020-03-01', '2020-03-02', '2020-03-03', '2020-03-04', '2020-03-05', '2020-03-06', '2020-03-07', '2020-03-08', '2020-03-09', '2020-03-10', '2020-03-11', '2020-03-12', '2020-03-13', '2020-03-14', '2020-03-15', '2020-03-16', '2020-03-17', '2020-03-18', '2020-03-19', '2020-03-20', '2020-03-21', '2020-03-22', '2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26', '2020-03-27', '2020-03-28', '2020-03-29', '2020-03-30', '2020-03-31']
matplotlibを使って以下で検査実施回数の時系列グラフが得られます。
import matplotlib.pyplot as plt
plt.figure(figsize=(9,6))
plt.bar(date_data, data['inspection_persons']['datasets'][0]['data'])
東京都のサイトと、見比べて正しそうな可視化ができていることが分かります。
続いて、陽性の患者数のグラフを可視化します。検査実施回数のようにそのままグラフ化できないので、一旦以下のようにリストにデータを格納します(もっとスマートな方法あれば教えて下さい)
patients_data = []
for i in range(len(data['inspection_persons']['labels'])):
patients_data.append(data['patients_summary']['data'][i]['小計'])
あとは、以下でグラフ化します。
plt.figure(figsize=(9,6))
plt.bar(date_data, patients_data)
ここで、ここ最近の「検査実施数に対する陽性患者数の割合」を知りたいとします。リストはそのまま割り算できないので一旦numpy配列に変換してから計算します。
import numpy as np
np_patients_data = np.array(patients_data)
np_inspection_persons = np.array(data['inspection_persons']['datasets'][0]['data'])
np_patients_inspection_ratio = np_patients_data / np_inspection_persons
以下でグラフ化します。
plt.figure(figsize=(9,6))
plt.xlim(60, 65)
plt.ylim(0, 1)
plt.bar(date_data, np_patients_inspection_ratio)
かなり高い割合ですね。
なお、愛知での同じ日の検査実施数に対する陽性患者数の割合は以下です。
Google Colabのノートブックは以下です。
covid19_visualization_json.ipynb
データが間違っているかもしれないから意味がない?村上春樹ならこう言うでしょう
「完璧なデータなどといったものは存在しない。完璧な絶望が存在しないようにね。」
なんらかの前提があるのではないか?足りないデータがあるのではないか?データを読み解き、必要なら正しいデータを予測・取得していきましょう。
まとめ
新型コロナウイルス感染症のオープンデータをGoogle Colabで手軽に可視化・分析する方法を紹介しました。
データは見せ方によっては人に恐怖を与えたり、被害を与える凶器になることを認識しましょう。ただ、データは決して専門家だけが扱える特殊なものではなく、多くの人が広く利用し、議論することで世の中をより良くすることができるものだと考えています。正しく責任を持ってデータを扱いましょう。自戒をこめて書きました。
新型コロナウイルス、長期的に向き合わないといけない様相を呈してきています。誰もが自分でデータに向き合い、自分の頭で考え、知見を共有して議論してデータリテラシーを高め、自分で判断して行動することが世界をよりよくするのではないかなと思っています。
分析して得られた知見は、例えばSIGNATEさんのCOVID-19チャレンジ(フェーズ2)のフォーラムなどで共有するのが良いかもしれませんね。
関連リンク
この記事を参考に、データ可視化してくださっている記事の紹介です。