先日公開した日本の🦠コロナウイルス情報 Web APIに📈感染者数 予測APIを追加した話



 先日公開した記事「🇯🇵日本を対象とした🦠コロナウイルス情報 Web APIが無かったので2日間で公開した話」で紹介させていただいた「covid19-japan-web-api」 は現在多くの方から利用報告を受けています

 実際にAPIを利用報告をいただいたプロジェクトはこちら「Project using this API」に掲載しています。
(ここに載っているプロジェクト以外にもより多くの方が利用しているようです。APIを利用している方でご連絡またはプルリクエストをいただければこちらに掲載させていただきます。)

 ある程度の需要があることも分かったので、日々夜な夜なアップデートを行なっております。今回はそのアップデートの中で感染者予測APIを追加した話をしようと思います。

🚀リポジトリ:https://github.com/ryo-ma/covid19-japan-web-api

実現方法

 まず前回の記事でも同じようなことを書きましたが最初はシンプルにスモールに手早く公開するというスタンスで行いました。そこで今回は手早く試せそうだと考え、この記事「東京での感染爆発をざっくり予測する」の前提を一部利用させていただきました。(余談ですがこの方の記事の文章は言葉一つ一つの選択にセンスを感じます)
 利用した数式は以下のような2つのパラメータを持った指数関数(定数倍と累乗)です。細かい数式の説明は上記の記事で説明しているので割愛します。

y = ae^{bx}

 指数関数における2つのパラメータを推定したいので今回はscipycurve_fit(曲線近似)を利用します。
また、推定に利用するデータは過去28日間(潜伏期間の2倍)の感染者数です。もちろん、もっと考慮すべき点は考えれば多くあるとは思いますが、今回はこの内容で予測していきます。

データソース

有志が公開してくれているデータです。対象は日本全国の感染者数データを利用します。
* https://github.com/swsoyee/2019-ncov-japan/

実装

import pandas as pd 
from scipy.optimize import curve_fit

DOMESTIC_DAILY_REPORT = 'data/2019-ncov-japan/Data/domesticDailyReport.csv'
DAY_RANGE = 28


def predict(data_y):
    array_x = range(1, DAY_RANGE + 1)
    array_y = data_y[len(data_y) - DAY_RANGE: len(data_y)]
    return curve_fit(nonlinear_func, array_x, array_y)                                                                                                                                                                                        

def nonlinear_func(x, a, b): 
    return b * np.exp(a*x)


total_df = pd.read_csv(DOMESTIC_DAILY_REPORT,
                       na_values='0',
                       encoding='utf-8').fillna(0).astype(int)
param, _ = predict(total_df['positive'].array)

# このコードでは1日先だけの予測ですが、実際は30日先までの予測を出力しています。
result = nonlinear_func(DAY_RANGE + 1, param[0], param[1]) 

感染者数を日々予測したいのでこのスクリプトをGitHub Actionのscheduleに組み込みます。

前回の記事「🇯🇵日本を対象とした🦠コロナウイルス情報 Web APIが無かったので2日間で公開した話」で記述した図に3番のプロセスが追加されました。

感染者数予測API

 2020/4/16日時点で30日先までの日本全国合計の感染者数予測データを取得できます。5月中旬には10万人以上の感染者となる予測です。
※クルーズ船、チャータ、検疫職員は予測データに含めていません。

Endpoint: https://covid19-japan-web-api.now.sh/api/v1/total?predict=true

[
  {
    "date": 20200417,
    "positive": 9761.573359691847,
    "death": 129.69262383884256
  },
  {
    "date": 20200418,
    "positive": 10700.879339710007,
    "death": 136.29822133282812
  },
  {
    "date": 20200419,
    "positive": 11730.569901351153,
    "death": 143.24025984374282
  },
...
...
  {
    "date": 20200513,
    "positive": 106392.39467139919,
    "death": 471.9141314262626
  },
  {
    "date": 20200514,
    "positive": 116629.98740987679,
    "death": 495.94999955550384
  },
  {
    "date": 20200515,
    "positive": 127852.69102402021,
    "death": 521.2100797145482
  }
]

その他既存のAPI

まとめ

 今回は日本のコロナウイルス情報WebAPIに感染者数予測APIを追加しました。
予測モデル自体はざっくりなので真面目にやるならば考慮すべき点は多くあると思いますが、これはこれで一つの指標となると考えております。また、オープンソースなのでコンセプトを見せつけることにより賛同してくれる方が何らかの形でサポートしてくれると考えての行動です。

やりたいことは多いのですがなかなか手が回っていない状態なので、プルリクエスト等はいつでも歓迎しております。
🚀リポジトリ:https://github.com/ryo-ma/covid19-japan-web-api