感染症拡大予測 Prophet

感染症拡大予測

Prophetを使用して感染症の拡大予測を行うための例を示します。

ここでは架空のデータを使用していますが、実際のデータを用いて同様の手順が適用できます。

まず、必要なライブラリをインポートします。

1
2
3
4
import pandas as pd
import numpy as np
from prophet import Prophet
import matplotlib.pyplot as plt

次に、時系列データを作成し、Prophetで予測を行います。

以下は架空の感染症拡大データの例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# データの作成
data = pd.DataFrame({
'ds': pd.date_range(start='2023-01-01', periods=180, freq='D'),
'y': np.concatenate([np.random.randint(100, 1000, size=90), np.random.randint(1000, 5000, size=90)])
})

# モデルの初期化
model = Prophet(daily_seasonality=True)

# モデルの学習
model.fit(data)

# 予測のためのデータフレーム作成
future = model.make_future_dataframe(periods=30)

# 予測の実行
forecast = model.predict(future)

最後に、結果をグラフ化してみましょう。

1
2
3
4
5
6
# 予測結果のグラフ化
fig = model.plot(forecast)
plt.title('Infectious Disease Spread Forecast')
plt.xlabel('Date')
plt.ylabel('Number of Cases')
plt.show()

このコードを実行すると、感染症の拡大予測のグラフが表示されます。

[実行結果]

ここでは架空のデータを使用しましたが、実際の感染症データを同様の方法で扱うことができます。

結果のグラフから、将来の感染症の拡大傾向を視覚的に把握することができます。

コード解説

コードの各部分を詳しく説明します。

1. ライブラリのインポート:

1
2
3
4
import pandas as pd
import numpy as np
from prophet import Prophet
import matplotlib.pyplot as plt

必要なライブラリをインポートしています。

pandasはデータ操作のために、numpyは数値計算のために、Prophetは時系列予測のために、matplotlibはグラフ化のために使用されます。

2. データの作成:

1
2
3
4
data = pd.DataFrame({
'ds': pd.date_range(start='2023-01-01', periods=180, freq='D'),
'y': np.concatenate([np.random.randint(100, 1000, size=90), np.random.randint(1000, 5000, size=90)])
})

ここでは、180日間の時系列データを作成しています。

‘ds’列には日付が、’y’列には架空の感染症のケース数が入力されています。

最初の90日間は100から1000の範囲の乱数で、残りの90日間は1000から5000の範囲の乱数でデータが生成されています。

3. モデルの初期化と学習:

1
2
model = Prophet(daily_seasonality=True)
model.fit(data)

Prophetモデルを初期化し、daily_seasonalityをTrueに設定して日次の季節性をモデルに含めます。

その後、作成したデータを使用してモデルを学習させます。

4. 予測のためのデータフレーム作成:

1
future = model.make_future_dataframe(periods=30)

モデルによる予測を行うための、未来の日付を含むデータフレームを作成します。

ここでは、30日分の日付が追加されたデータフレームを作成しています。

5. 予測の実行:

1
forecast = model.predict(future)

作成した未来の日付を持つデータフレームを使用して、Prophetモデルによる予測を実行します。

予測結果はforecastに格納されます。

6. 予測結果のグラフ化:

1
2
3
4
5
fig = model.plot(forecast)
plt.title('Infectious Disease Spread Forecast')
plt.xlabel('Date')
plt.ylabel('Number of Cases')
plt.show()

予測結果をグラフ化して表示します。model.plot()関数は予測結果をグラフとして描画します。

plt.title()plt.xlabel()、およびplt.ylabel()関数でグラフにタイトルと軸ラベルを設定し、plt.show()でグラフを表示します。

結果解説

実行結果として表示されるグラフの詳細な説明を示します。

1. x軸 (Date):

グラフの横軸は日付(Date)を表しています。
時系列データのため、日付ごとにデータがプロットされています。
元のデータと予測の期間が表示されています。

2. y軸 (Number of Cases):

グラフの縦軸は感染症のケース数(Number of Cases)を表しています。
この軸に沿って、感染症のケース数の推移が示されています。

3. 青い点線(Observed Data):

グラフ上に描かれた青い点線は実際の観測データを示しています。
元のデータセットに含まれる感染症のケース数が点線でプロットされています。

4. 青い曲線(Trend):

青い曲線は感染症のケース数のトレンド(Trend)を表しています。
これは元のデータから学習されたトレンドを示しており、将来の動向を予測するための基準となります。

5. 黒い点線(Forecast):

黒い点線は未来の期間における感染症のケース数の予測を示しています。
これにより、モデルが予測した将来の動向を示しています。

6. ライトブルーの領域(Uncertainty Interval):

ライトブルーの領域は予測の不確かさを示しています。
モデルが予測する未来のケース数の幅を示しており、不確かな要因が影響する可能性を示唆しています。

7. 土曜日(Saturday)のウィークリーシーズナリティ(Weekly Seasonality):

グラフ上に土曜日ごとに現れる縦の帯があります。
これは週ごとの周期性を表しており、感染症の週末と平日のパターンを示しています。

このグラフは、元のデータから学習されたトレンドと週次パターンをもとに、未来の感染症の拡大傾向を予測したものです。

不確かさの範囲も考慮されており、将来の予測の信頼性がどれだけあるかを示しています。