[ご注意] ブラウザによっては更新(再読み込み)しても古い画像が表示されることがあるようです。いわゆる「スーパーリロード」([Shift] + [更新] または [Control] + [更新])をお試しください。
番外編1,番外編2も参考になるかもしれません。もう変化のないクルーズ船ダイヤモンド・プリンセス号は別ページにしました。
日本では「新型コロナウイルス感染症」と呼ばれている COVID-19(コービッド・ナインティーン)についての最新のデータを収集し,Python でグラフにする。COVID-19 は病名で,ウイルス名は当初 2019-nCoV と呼ばれたが現在は SARS-CoV-2(サーズ・シーオーブイ・ツー)が公式名である。
Python コードの繰返し現れる部分は省略してあるところがある。完全なコードとデータも置いてある(頭に COVID が付いているファイル)。GitHub にも同じものを置いている。例えばデータは これ。
WHO の Coronavirus disease (COVID-2019) situation reports に基づいて集計したデータ COVID-19.csv を Python でグラフにする。
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("https://oku.edu.mie-u.ac.jp/~okumura/python/data/COVID-19.csv",
index_col='Date', parse_dates=['Date'])
これで df.plot()
とすれば全部のコラムがプロットできるが,見にくいので,もうちょっとがんばってみる:
import matplotlib.dates as mdates
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
fig, ax = plt.subplots()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
cmap = plt.get_cmap("tab20")
ax.bar(df.index, df['Global Confirmed'], color=cmap(3))
ax.bar(df.index, df['China Confirmed'], color=cmap(2))
ax.bar(df.index, df['Global Deaths'], color=cmap(6))
ax.legend(['Global Confirmed', 'China Confirmed', 'Global Deaths'])
fig.savefig('COVID-19.svg', bbox_inches="tight")
2020-02-17から湖北省については laboratory-confirmed だけでなく clinically diagnosed も含めたので急増している。
対数グラフにするには ax.bar()
の部分を次のように変える:
ax.plot(df.index, df['Global Confirmed'], "s-", color=cmap(3))
ax.plot(df.index, df['China Confirmed'], "o-", color=cmap(2))
ax.plot(df.index, df['Global Deaths'], "s-", color=cmap(7))
ax.plot(df.index, df['China Deaths'], "o-", color=cmap(6))
ax.set_yscale('log')
日本のデータもグラフに含めてみた。
以上は累計値である。差分(1日あたりの値)は次の通り。Confirmed の定義が変わった 2020-02-17 の差分は表示していない。この前後での比較は要注意。
import numpy as np
dt = (df.index.to_series().diff() / pd.Timedelta(days=1))
c = df['Global Confirmed'].diff()
c[df.index == '2020-02-17'] = np.nan
ax.bar(df.index, c / dt, width=-dt, align='edge', color=cmap(3), edgecolor="white")
ax.bar(df.index, df['Global Deaths'].diff() / dt, width=-dt,
align='edge', color=cmap(6), edgecolor="white")
ax.legend(['Confirmed', 'Deaths'])
中国でのピークは2月上旬で過ぎていることがわかる。なお,こういう図をエピカーブ(epidemic curve, epi curve)という。エピカーブの横軸は発病日が一般的だが,ここでは報告日である。
日本については,上記 WHO の日報から拾ったものを COVID-jp.csv として置いておく。なお,2022-02-05 の数は 33 となっていたがこれは明らかに 23 の誤記だと思われるので訂正しておいた。
累積
差分(2020-03-18からWHOはその日の00:00 CET(08:00 JST)時点での各国からの報告に基づくようになったので,日本・中国・韓国などは2020-03-17と2020-03-18との差分はゼロになっている)。
同じ WHO の最新の日報から,番外編1で解説した方法で,国ごとの確定数,死亡数(500人以上)をプロットしたものも挙げておく。灰色の対角線は中国と同じ死亡数/確定数のラインである。オレンジと緑の線は中国と日本の履歴である。中国の履歴が突然右に飛んでいるのは 2020-02-17 に Confirmed の基準が変わったためである(上述)。さらに突然上に飛んでいるのは死者数が大幅に更新されたためである。
Johns Hopkins 大学の Center for Systems Science and Engineering (CSSE) は Coronavirus COVID-19 Global Cases by Johns Hopkins CSSE という COVID-19 可視化サイトを早くから立ち上げている。データについては GitHub の 2019 Novel Coronavirus COVID-19 (2019-nCoV) Data Repository by Johns Hopkins CSSE で公開している。そのデータのプロット例を番外編1の後半で示した。最新の図をこちらにも載せておく。まずは確定数。黒丸マーカーを付けたものが日本である。
差分(つまり1日ごとの増分):
死亡数:
差分(つまり1日ごとの増分):
厚労省はCOVID-19関係のデータをオープンデータとして公開するようになった。PCR検査陽性者数・実施人数は厚労省のページにグラフがあるが,独自に描いたものを以下に挙げておく。なお,以前ここにあったものはCOVID-19についての厚労省の(ほぼ)日報(アーカイブ)に移した。
都道府県ごとにPCR検査件数(または検査人数)・陽性数が報告されているが,おのおの報告の基準が違うため,比較するのは困難である。推移を見るだけに留めたい。
けんもねずみ (kenmo_economics) さんのこちらのサイトでは公表されている全都道府県のグラフが見られる(不明日は線形補間してあることに注意)。データは都道府県別の検査数の公表状況(根拠URL付)からダウンロードできる。
厚労省も都道府県別のデータをPDFで公表するようになった。新型コロナウイルス感染症についてのページから「PCR検査実施人数(都道府県別)」「PCR検査総実施件数(都道府県別)」のような形でリンクされている。
東京都は都内の最新感染動向(covid19-tokyo.netlify.com のCNAME)で情報提供を始めた。ソースはGitHubでオープンソースとして開発されている(https://github.com/tokyo-metropolitan-gov/covid19)。データは東京都オープンデータカタログサイトで公開されている。
上の東京都のソースを使った最新感染動向サイトが各地にできている(北海道,神奈川県,愛知県,埼玉県,三重県,福岡市,兵庫県など。最新のリストはHackMDにまとめられている)。
東京都の元情報は東京都防災ホームページや東京都福祉保健局から発信され,それをもとに都内の最新感染動向が作られているようだ。それらより早くマスメディアで毎日の感染確認者数が発表されるので,それをもとに COVID-tokyo.csv を作成している。そのグラフ:
累積(倍加時間を見るために最終日の値とその半分を点線で示した):
三重県はこちらからCSVでデータが提供されるようになった:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import requests
import re
r = requests.get('https://www.pref.mie.lg.jp/YAKUMUS/HP/m0068000066_00002.htm')
r.encoding = 'utf-8'
a = re.findall(' href="(.*?\.csv)"', r.text)
url = 'https://www.pref.mie.lg.jp' + a[1]
df = pd.read_csv(url, encoding='cp932', parse_dates=['日付'])
fig, ax = plt.subplots()
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
ax.bar(df['日付'], df['検査件数'])
ax.bar(df['日付'], df['陽性'])
ax.legend(['Negative', 'Positive'])
fig.savefig('COVID-mie.svg', bbox_inches="tight")
Last modified: