🌊

コロナ感染者数の時系列分析

2024/04/16に公開

2023年5月までコロナ感染者数については全数調査が実施されており、そのデータに基づいて時系列分析を実施した。
分析にはpythonのprophetを利用し、分析を実施した。

1.課題
一時期、新型コロナウイルスの感染拡大により社会は混乱しておりました。
機械学習の手法を使って、新型コロナウイルス感染者が今後どのようになるかを予測するモデルを作成したいと思います。
visual studioコードを利用して実施します。
2.必要なライブラリ

pandas
matplotlib
prophet

3.利用するデータ
https://www.mhlw.go.jp/stf/covid-19/open-data.html
厚労省の公表する過去のオープンデータを利用した。
4.必要なライブラリのインポート

import seaborn as sns
import matplotlib.pyplot as plt
from prophet import Prophet
from prophet.diagnostics import cross_validation
from prophet.diagnostics import performance_metrics

5.データの読み込み

df=pd.read_csv(’インストール先’)
time=pd.to_datetime(df['Date'])
df.rename(columns={'Date': 'ds', 'ALL': 'y'}, inplace=True)

6.モデルの作成・調整

#prophetモデルで祝日のデータを調整させる設定
holidays = pd.DataFrame({
  'holiday': 'holiday_name',
  'ds': pd.to_datetime(['2023-01-01', '2023-12-25']),
  'lower_window': 0,
  'upper_window': 1,
})
#予測値の最大値、最小値を設定。最小がマイナスになることはない
df['cap'] = df['y'].max() * 1.2
df["floor"] = 0
model = Prophet(growth='logistic',
                seasonality_mode='multiplicative',
                yearly_seasonality=True,
                weekly_seasonality=True,
                daily_seasonality=True,
                holidays=holidays)

7.モデルフィッテング

model.fit(df)
future = model.make_future_dataframe(periods=30, freq='D')
future['cap'] = df['cap'].max() * 1.2  # 未来のデータにも同じ上限を設定
future['floor'] = 0
forecast = model.predict(future)
fig_forecast = model.plot(forecast)
plt.show()

8.モデルを学習データとテストデータに分けます

#学習データとテストデータに分ける
#時系列クロスバリデーションを実施する
cutoffs = pd.to_datetime(['2021-02-21', '2022-03-31'])
#トレーニングデータ: 2020年1月16日から2021年2月21日まで、テストデータ: 2021年2月22日から2022年3月31日まで
#トレーニングデータ: 2020年1月16日から2022年3月31日まで、テストデータ: 2022年4月1日から2023年5月8日まで
df_cv = cross_validation(model, horizon = '403 days', cutoffs=cutoffs)
df_p = performance_metrics(df_cv)

9.モデルのcoverage

sns.lineplot(x='horizon', y='coverage', data=df_p)
plt.show()

10.結果・考察
感染者数が少ない時のcoverage割合が低かった。
感染者の割合を正確に予測することは色々な要因がかみ合っているため、難しいが、全体的なトレンドを示すことは出来ていたと考えた。

Discussion