新型コロナウィルスの感染者増加が止まりません。

このまま行ったらどうなるのかを
データから予測してみました。


解説動画はこちら



さて
今回は予測モデルを使って未来の予測を行います。

用いるライブラリとしては
pandas
matplotlib
fbprophet
になります。

一番初めにデータを読み込んでみましょう。

pandasでデータの提供元(奥村研究所)から
ダウンロードしてデータ化します。
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline

df = pd.read_csv("https://oku.edu.mie-u.ac.jp/~okumura/python/data/COVID-19.csv",
                 index_col='Date', parse_dates=['Date'])

これでデータフレームにデータが読み込まれます。

データは4列あるようです。

まずは感染者数の推移を見てみましょう。
df.iloc[0:,0:2].plot(figsize=(16,9))
plt.show()
download

直近での推移が爆裂していますね。
増加率も見てみましょう。
pandasの関数 pct_changeで増加率を算出できます。

df['diff_Global Confirmed'] = df['Global Confirmed'].pct_change()
df['diff_Global Deaths'] = df['Global Deaths'].pct_change()
plt.figure(figsize=(16,9))
plt.bar(df.index,df['diff_Global Confirmed'],alpha=0.3,label="Confirmed")
plt.bar(df.index,df['diff_Global Deaths'],alpha=0.3,label="Deaths")
plt.legend()
plt.show()
download-1

1月末ごろから
中国での大流行があったことが
みて取れます。


中国を抜かした世界の推移を見てみましょう。
別の列を用意してあげます。
df['Confirmed2']=df['Global Confirmed'] - df['China Confirmed']
df['Deaths2']=df['Global Deaths'] - df['China Deaths']
df.iloc[0:,6:8].plot(figsize=(16,9))
plt.show()

download-2

中国以外は3月の頭くらいから
急激に増えているようですね。

増加率も見てみると

df['diff_Confirmed2'] = df['Confirmed2'].pct_change()
df['diff_Deaths2'] = df['Deaths2'].pct_change()
plt.figure(figsize=(16,9))
plt.bar(df.index,df['diff_Confirmed2'],alpha=0.3,label="Confirmed")
plt.bar(df.index,df['diff_Deaths2'],alpha=0.3,label="Deaths")
plt.legend()
plt.show()
download

2月の手前に急激に増えた日がありますね。
ここら辺が起点になっているようです。

次に死亡率です。
df['Death Rate'] = df['Deaths2'] / df['Confirmed2']
plt.figure(figsize=(16,9))
plt.bar(df.index,df['Death Rate'],alpha=0.8,label="Death Rate")
plt.legend()
plt.show()
download-1

直近では5%近くなっていてどんどん上がってきてもいます。

このまま増え続けるとどうなるのか
感染者数の推移を予測してみます。
facebookのprophetを用います。

これはインストールをしないと使えないので
お気をつけください。
from fbprophet import Prophet
import warnings

warnings.simplefilter('ignore',)
model_df = df[['Confirmed2']]
model_df = model_df.reset_index()
model_df = model_df.rename(columns={'Date':'ds','Confirmed2':'y'})
model_df.head()
予測用のデータは
ds,yの2列を用意してあげます。
dsは日付、yは感染者数です。


ds
y
02020-01-204
12020-01-215
22020-01-2310
32020-01-2416
42020-01-2523


モデルを作ります。
model = Prophet()
model.fit(model_df)

最後に予測です。
予測したい日数分の空のデータフレームを用意します。

空のデータフレームを使って
学習したモデルで予測します。
future_df = model.make_future_dataframe(600)
forecast_df = model.predict(future_df)
model.plot(forecast_df)

可視化もできます。
結果は
スクリーンショット 2020-03-29 17.17.04

このままの推移が続くと
今年の終わりには600万人
来年の6月にはその倍くらいにはなっています。

すでに対策を始めていますので
ここまでにはならないと思いたいですが
不要不急の用事がない限りは
あまり出歩かない方が良いでしょうね。

死亡率も5%近くということで
20人のうち一人亡くなると考えると
無視できない確率かなと
個人的には思います。

リモートワークが続いて
ずっと家にいるわけですが

早く
収束してくれることを
願うばかりであります。