3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

COVID-19の感染者数をProphetで予測

Last updated at Posted at 2020-11-25

#概要
GoogleがダッシュボードでCOVID-19の予測データを公開し始めた
二番煎じだが、Prophetはどう予測するかやってみた
国内感染者数データはKaggleにあったのでこれを使用した

  • 実施: 2020年11月24日
  • パケージ:Prophet

##Prophetで感染者数予測
データセット
期間: 2020/2/6 ~ 2020/11/20
(3日ごとに最新に更新されているみたい)
Domestic: 国内
Airport: 空港検査
Returnee: 帰国者
Positive: 陰性者数
Tested: 検査者数
他にもcolumnはあるがデータ欠損が散見されたので、今回はDomesticとAirportのPositiveを使用する

import numpy as np 
import pandas as pd 
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot

df = pd.read_csv('covid_jpn_total_1124.csv')
df_dom = df[df['Location'] == 'Domestic']
#print(df_dom.isnull().sum())
df_air = df[df['Location'] == 'Airport']
#print(df_air.isnull().sum())

df_air = df_air.dropna(how='any')
print(df_air.describe)

image.png

生データは累積になっていたので日ごとに差分をとる
pos_def: Positive数/日
test_def: Tested数/日
 (陰性率の予測に使用するつもりだが、今回は使わない)

arr3 = [0]
arr1 = np.array(df_dom.iloc[1:,2])
arr2 = np.array(df_dom.iloc[:-1,2]) 
arr3 = np.append(arr3, arr1 - arr2)
df_dom['pos_def'] = arr3

arr3 = [0]
arr1 = np.array(df_dom.iloc[1:,3])
arr2 = np.array(df_dom.iloc[:-1,3]) 
arr3 = np.append(arr3, arr1 - arr2)
df_dom['test_def'] = arr3

Prophetの仕様に合わせDataframeを用意する

df_test = pd.DataFrame()
df_test['ds'] = pd.to_datetime(df_air['DS'])
df_test['y'] = df_air['pos_def']
print(df_test)
df_test.iloc[:,1].plot()

image.png

Prophetのモデルを用意したデータにfitさせ、向こう30日分まで含め予測実行

m = Prophet(yearly_seasonality=False, weekly_seasonality=True, daily_seasonality=True)
m.fit(df_test)
future = m.make_future_dataframe(periods=30, freq='D', include_history=True)
#future.tail()
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

結果を描画

fig = m.plot(forecast, figsize=(20, 10))
ax = add_changepoints_to_plot(fig.gca(), m, forecast)
ax = fig.gca()
ax.set_title("Positive", size=16)
ax.set_xlabel("date", size=16)
ax.set_ylabel("# Positives", size=16)
ax.tick_params(axis="x", labelsize=14)
ax.tick_params(axis="y", labelsize=14)

image.png

黒点は実際のデータ(GroundTruth)
薄青域は95%信頼区間の上限下限を示す
グラフのとおりモデルはデータを正確にトレースできている
12月上旬に感染者数3000人を少し超えたところで、今回の第3波は収束する予測となった

誰が見ても楽観的過ぎるが、データが過去の感染者数推移だけではこのような予測となってしまう
日本人の行動変容などあまたの要因を含めた波形を入力しているのでも、同じように今後も日本人が感染予防行動をとれば、案外12月上旬でピークアウトするのかもしれない。

Prophetは四季変動もとらえてくれるが、使ったデータが1年に満たないので冬だから感染者数が増える、といった傾向は見つからない
3,4年コロナが蔓延していればそういった傾向がデータ上見えてくると思うが、願い下げだね
他の説明変数*1も加えmultivalidateでなければ精度は期待できない

*1) 陰性率、重症者数、退院者数、入国者数など、1,2ヵ月で変化してくれる複数の変数かな
  政治家や役人の質の低さ、無能さはconstantなのでデータサイエンスでも役に立たない

尚、Googleの今(11/24)の予測は下図のようになっている
Prophetの結果と同様12月上旬で3000人を超えるがそれ以降も単調に増加している

image.png

ついでに、Prophetの空港検査でのPositive判定予測は下図となった
image.png

2,3週間後、4000人を超えたあたりかな、同じコードで再予測し今回の結果と比較することとする

3
4
0

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
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?