
ゆうき( @BASEBALLY15 )です^^
世界中で,新型コロナウイルスが流行っていて,怖いです・・・
今後,どのようになるのか,予測は出来ないですか・・・?
Pythonを使うと,未来予測を行うことが出来ますよ^^
今回は,Pythonを使って,新型コロナウイルスの未来予測を行う方法をご紹介します.
よろしくお願いします・・・
(※あくまで予測なので,信じすぎないようにお願いします.)

目次
コロナウイルスとは?
哺乳類や鳥類に様々な疾患を引き起こし,人の場合,風邪などの呼吸器感染症を引き起こします.
最近話題になっている『新型コロナウイルス』は,過去に人に感染しなかった新種のウイルスが原因となっています.
新型コロナウイルス拡大の未来予測
今回の未来予測は,
- 全世界
- 日本国内
の2つの観点から行っていきたいと思います.
予測結果が判りやすいように,グラフで示したいと思います^^
未来予測に使ったデータ
今回の未来予測では,以下のサイトのcsvファイルを利用しました.
このサイトのcsvファイルを使う際は,初期登録をする必要があります.
https://www.kaggle.com/sudalairajkumar/novel-corona-virus-2019-dataset/data
それでは,コードを見ていきましょう^^
ライブラリ
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
#統計モデルの推定
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid")
%matplotlib inline
statsmodelsは,統計モデルの推定や統計テストと統計データの調査を行うためのものです.
これを使って,未来予測を行っていきます^^
コード
まず,ダウンロードしたcsvファイルを以下のコードで読み込みます.
#csvファイルの読み込み
file_name = "2019_nCoV_data.csv"
corona_df = pd.read_csv(file_name)
#実行
corona_df.head()
すると,以下の表が表示されます.ちなみに,head()で上から5つのデータのみを表示します.
Sno | Date | Province/State | Country | Last Update | Confirmed | Deaths | Recovered | |
---|---|---|---|---|---|---|---|---|
0 | 1 | 01/22/2020 12:00:00 | Anhui | China | 01/22/2020 12:00:00 | 1.0 | 0.0 | 0.0 |
1 | 2 | 01/22/2020 12:00:00 | Beijing | China | 01/22/2020 12:00:00 | 14.0 | 0.0 | 0.0 |
2 | 3 | 01/22/2020 12:00:00 | Chongqing | China | 01/22/2020 12:00:00 | 6.0 | 0.0 | 0.0 |
3 | 4 | 01/22/2020 12:00:00 | Fujian | China | 01/22/2020 12:00:00 | 1.0 | 0.0 | 0.0 |
4 | 5 | 01/22/2020 12:00:00 | Gansu | China | 01/22/2020 12:00:00 | 0.0 | 0.0 | 0.0 |
1.全世界のデータから未来予測
このデータから,日ごとの新型コロナウイルスの感染者数を取り出したいと思います.
.groupby()を使うことで,それが可能になります.
#日ごとの感染者数(合計)
corona_amount = corona_df.groupby("Date")["Confirmed"].sum()
#データフレーム化
pd.DataFrame(corona_amount)
今回は,本サイトに表を張り付けるためにデータフレーム化しました.
データフレーム化しなくても,グラフを表示させることは可能です.
Confirmed | |
---|---|
Date | |
01/22/2020 12:00:00 | 555.0 |
01/23/2020 12:00:00 | 653.0 |
01/24/2020 12:00:00 | 941.0 |
01/25/2020 22:00:00 | 2019.0 |
01/26/2020 23:00:00 | 2794.0 |
01/27/2020 20:30:00 | 4473.0 |
01/28/2020 23:00:00 | 6057.0 |
01/29/2020 21:00:00 | 7783.0 |
01/30/2020 21:30:00 | 9776.0 |
01/31/2020 19:00:00 | 11374.0 |
02/01/2020 23:00:00 | 14549.0 |
02/02/2020 21:00:00 | 17295.0 |
02/03/2020 21:40:00 | 20588.0 |
02/04/2020 22:00:00 | 24503.0 |
このように,日にちごとの数をまとめることが出来ました.
この結果をグラフに示したいと思います.
corona_amount.plot(figsize=(12,4), marker="o", title="Confirmed")

この結果から,日が経つにつれて,感染が拡大していることが分かります.
しかも,急激に拡大していることが分かります.
新型コロナウイルスって,本当に怖いですね!
もし,このまま何も対策をしなかったらどうなるのでしょうか?
このまま対策をしなかった場合の,新型コロナウイルスの拡大状況を未来予測によって確認していきたいと思います!
今回の未来予測では,インポートしたstatsmodels.apiのSARIMAというものを使いたいと思います.
ちなみに,SARIMA( 季節自己回帰和分移動平均 )とは,時系列分析を行う際に,有効的です.
それでは,以下のコードを記述します.
#SARIMAモデルを使う(季節自己回帰和分移動平均モデル)
coronamax = sm.tsa.SARIMAX(corona_amount, order=(2,1,3),
seasonal_order=(0,2,2,12),
enforce_stationarity=False,
enforce_invertibility=False).fit()
このコードの解説をします.
sm.tsa.SARIMAX(予測に使いたいデータ, order=(p, d, q),
seasonal_order=(P, D, Q, S),
enforce_stationarity=False,
enforce_invertibility=False).fit()
- p→自己回帰(0~3程度) Pも同じ
- d→差分の次数(0~2)
- q→平均移動 (0~3程度) Qも同じ
- S→周期(季節周期=12カ月なので12を代入)
となります.
詳しい解説は,以下を参考にしてください^^
そして,以下のコードを記述し,グラフを表示させたいと思います.
#予想する
prediction = coronamax.forecast(10)
#グラフを描写
plt.figure(figsize=(10,5))
#corona_amountをプロット
plt.plot(corona_amount, marker="o", label="actual transition")
#predictionをプロット
plt.plot(prediction, label="change in forecast", marker="x", linestyle="--")
#凡例を最適な場所に表示
plt.legend(loc="best")
すると,以下の様に未来予測が出来ています^^

このグラフは,2月4日以降の10日間の未来予測を行っています.
これを見ると,何も対策をしなかった場合にどんどん拡大してしまうことが分かります.
新型コロナウイルスの拡大を防ぐためにも迅速な対応が必要ですね^^
2.日本国内のデータから未来予測
もう一度,全体の表を表示させます.
corona_df.head()
Sno | Date | Province/State | Country | Last Update | Confirmed | Deaths | Recovered | |
---|---|---|---|---|---|---|---|---|
0 | 1 | 01/22/2020 12:00:00 | Anhui | China | 01/22/2020 12:00:00 | 1.0 | 0.0 | 0.0 |
1 | 2 | 01/22/2020 12:00:00 | Beijing | China | 01/22/2020 12:00:00 | 14.0 | 0.0 | 0.0 |
2 | 3 | 01/22/2020 12:00:00 | Chongqing | China | 01/22/2020 12:00:00 | 6.0 | 0.0 | 0.0 |
3 | 4 | 01/22/2020 12:00:00 | Fujian | China | 01/22/2020 12:00:00 | 1.0 | 0.0 | 0.0 |
4 | 5 | 01/22/2020 12:00:00 | Gansu | China | 01/22/2020 12:00:00 | 0.0 | 0.0 | 0.0 |
ここから,日本のデータのみを取り出したいと思います!
#日本のデータを抽出
coronajapan_df = corona_df[corona_df["Country"]=="Japan"]
このコードは,『corona_df』内の『Country』というコラムから,『Japan』という文字を取り出したものを『coronajapan_df』と定義する,
ということを意味しています.
すると,以下の表が表示されます.
Sno | Date | Province/State | Country | Last Update | Confirmed | Deaths | Recovered | |
---|---|---|---|---|---|---|---|---|
35 | 36 | 01/22/2020 12:00:00 | NaN | Japan | 01/22/2020 12:00:00 | 2.0 | 0.0 | 0.0 |
73 | 74 | 01/23/2020 12:00:00 | NaN | Japan | 01/23/2020 12:00:00 | 1.0 | 0.0 | 0.0 |
118 | 119 | 01/24/2020 12:00:00 | NaN | Japan | 01/24/2020 12:00:00 | 2.0 | 0.0 | 0.0 |
159 | 160 | 01/25/2020 22:00:00 | NaN | Japan | 01/25/2020 12:00:00 | 2.0 | 0.0 | 0.0 |
205 | 206 | 01/26/2020 23:00:00 | NaN | Japan | 01/26/2020 23:00:00 | 4.0 | 0.0 | 1.0 |
252 | 253 | 01/27/2020 20:30:00 | NaN | Japan | 01/27/2020 20:30:00 | 4.0 | 0.0 | 1.0 |
304 | 305 | 01/28/2020 23:00:00 | NaN | Japan | 01/28/2020 23:00:00 | 7.0 | 0.0 | 1.0 |
357 | 358 | 01/29/2020 21:00:00 | NaN | Japan | 01/29/2020 21:00:00 | 11.0 | 0.0 | 1.0 |
413 | 414 | 01/30/2020 21:30:00 | NaN | Japan | 01/30/2020 21:30:00 | 11.0 | 0.0 | 1.0 |
472 | 473 | 01/31/2020 19:00:00 | NaN | Japan | 01/31/2020 19:00:00 | 17.0 | 0.0 | 1.0 |
526 | 527 | 02/01/2020 23:00:00 | NaN | Japan | 2020-01-02 18:53:00 | 20.0 | 0.0 | 1.0 |
593 | 594 | 02/02/2020 21:00:00 | NaN | Japan | 2020-01-02 18:53:00 | 20.0 | 0.0 | 1.0 |
660 | 661 | 02/03/2020 21:40:00 | NaN | Japan | 2020-01-02 18:53:00 | 20.0 | 0.0 | 1.0 |
731 | 732 | 02/04/2020 22:00:00 | NaN | Japan | 2020-04-02 16:43:00 | 22.0 | 0.0 | 1.0 |
見事にJapanのみが表示されています^^
ここからは,全国のデータから未来予測をしたときと同じ流れになります.
解説は,割愛させていただきます。
#日と感染者数のデータを抽出
coronajapan_amount = coronajapan_df.groupby("Date")["Confirmed"].sum()
#日本の感染者数を予測する
coronajapanmax = sm.tsa.SARIMAX(coronajapan_amount, order=(2,1,3),
seasonal_order=(0,2,2,12),
enforce_stationarity=False,
enforce_invertibility=False).fit()
#予測した結果をグラフに表示する
pred_japan = coronajapanmax.forecast(10)
plt.figure(figsize=(10,5))
plt.plot(coronajapan_amount, marker="o", label="actual transition", color="red")
plt.plot(pred_japan, marker="x", label="change in forecast", linestyle="--", color="green")
plt.legend(loc="best")

このグラフから,日本国内でも,今後新型コロナウイルスの拡大が予想されます.
全世界だけでなく,日本国内においても,迅速な対応が求めれるのではないかと思います.
(追記)未来予測と実際の比較
(2020/3/3更新)
2月21日までの実際の推移がネットに載っていたため,未来予測と比較してみました.(全世界)
実際の推移がこちらです.

そして,SARIMによって,未来予測した結果がこちらです.
#予想する(2月4日から2月21日の17日間)
prediction = coronamax.forecast(17)
prediction
#グラフを描写
plt.figure(figsize=(10,5))
plt.plot(corona_amount, marker="o", label="actual transition")
plt.plot(prediction, label="change in forecast", marker="x", linestyle="--")
plt.legend(loc="best")
#2月21日の感染者数を表示
print(str(prediction[30])+"人")

77884.3366143767人
上の結果を見ると, 21日時点で,未来予測の場合は約7万7千人という結果になり,
実際の推移を見ると,7万5千人以上という結果なので,近い値になっているのではないでしょうか!?
グラフの形に違いはあるものの,未来予測と実際の感染者数は同じような結果になっていることが分かりました^^
終わりに
今回は,今年大流行している『新型コロナウイルス』の拡大について,未来予測してみました.
インフルエンザなどでも言えますが,やはり個人で対策することが大切ですね^^
それでは・・・