2
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.

Tokyoコロナ:オープンデータから指数関数curve_fitで単純な予測を行ってみる

Last updated at Posted at 2020-04-05

コロナ感染が広まっております。
何も対策をしない(もしくは効果がなかった)場合、一般的には指数関数に沿って感染者数が広がっていきます。

東京コロナサイトでは感染実数が日々公表されておりますが予測は出ておりません。

指数関数curve_fitにより、将来予測値を算出しグラフ描画をここでは行います。
(もちろん、結果通りになることは望んでおらず対策により一日も早く収束に向かうことを切に願っております。土日は外出せずこもってます)

う〜ん、まずい。指数関数にかなりフィットしている直感。決定係数を別途計算する予定。
TokyoCorona_20200403.png

データは公式サイトから。
https://stopcovid19.metro.tokyo.lg.jp/

通常は夜更新されているようですが、翌日にてグラフ描画の前提です。
月曜日数値は前日日曜日が検査機関お休みのところが多く実数よりかなり小さく出る傾向があります。周期要因として取り除くもありですがここでは一旦ありのままに描画することにします。

import pandas as pd
from pathlib import Path
from datetime import datetime
BASEDIR = Path('.')
FILE_PATH = 'https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv'
df = pd.read_csv(str(FILE_PATH))
# 予測期間
TO_PERIODS = 7

# グラフ描画のための諸々を生成します
target_columns = ['公表_年月日','患者_年代']
df_select = df[target_columns]
list_now = list(df_select.groupby('公表_年月日').count().index)
today = datetime.today()
today.strftime('%Y-%m-%d')

list_to = list(pd.date_range(today.strftime('%Y-%m-%d'), periods=TO_PERIODS, freq='D').strftime('%Y-%m-%d'))
list_total = list_now + list_to

curve_fitを用いて指数関数fit前提として演算

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt

# 近似式の定義
def nonlinear_fit(x, a, b):
    return a * x ** b

# 一旦仮のx軸データを生成
array_now_x = np.linspace(0, len(list_now)-1, len(list_now))

# 指数関数を想定してcurve_fit実行
param, cov = curve_fit(nonlinear_fit, array_now_x, array_now_y,maxfev=1000)

指数関数fit処理により得たパラメータで先日付値を算出する

list_total_y = []
for num, values in enumerate(list_total):
    list_total_y.append(nonlinear_fit(num, param[0], param[1]))

# 公表データから日毎の感染者数を算出
array_now_y = df_select.groupby('公表_年月日').count()['患者_年代'].values

グラフ描画します。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.set_style('whitegrid')

fig, ax = plt.subplots(1, 1, figsize=(15, 10))
ax.bar(list_total, list_total_y, color='blue')
ax.bar(list_now, array_now_y, color='red',alpha=0.75)
plt.xticks(rotation=90)
plt.show()

2
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
2
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?