【AWSの呼吸 肆ノ型】Amazon Forecastで 新型コロナウイルスの感染者数を予測してみる

今回はAmazon Forecastを用いて、新型コロナウイルス感染症(COVID-19)の陽性者数を予測してみたいと思います。

※あくまでAWS機械学習サービスの勉強の一環ですので、科学的な根拠に基づいて何か提唱するような記事ではありません。

目次

Amazon Forecast」とは?

時系列データを基に機械学習で将来の数値の予測ができるサービスです。

例えば、EC2インスタンスのキャパシティや電力の使用量の予測が可能です。

aws.amazon.com

予測結果

先に結果からお見せしてしまうと、こんな感じになりました。

来月には全国の陽性者数が1万人を超えるという予測です。

f:id:wingfair:20210117143244p:plain
result of forecast

  • P10:10パーセンタイル (下振れ値)
  • P50:50パーセンタイル (中央値)
  • P90:90パーセンタイル (上振れ値)

利用したデータ

  • 厚生労働省が一般公開している日本国内の陽性者数のデータを利用します。
  • 今回のCSVデータの内容は以下の通りです
    • 期間:2020/1/16~2021/15
    • レコード数:366
    • レコード内容: 日次の陽性者数

抜粋するとこんな感じのシンプルな時系列データです。

日付,PCR 検査陽性者数(単日)
2021/1/12,4521
2021/1/13,5841
2021/1/14,6598
2021/1/15,6741

Forecastで予測する期間

30日間 (2021/1/16~2021/2/14)

Forecastでの予測の流れ

ざっくりとデータ投入⇒学習⇒予測という流れです。

以降はこの流れにそって手順を説明していきます。

f:id:wingfair:20210116210639p:plain
Forecast Flow

データ投入

Forecast用のデータ準備

データ加工

Forecastにデータを投入するためには事前にForecastで指定した形式にデータを加工しておく必要があります。 今回のケースでは以下の属性を含むデータとしました。

  • item_id:予測対象の識別子 (string)
  • timestamp:タイムスタンプ (yyyy-MM-dd形式)
  • target_value:予測対象の数値 (float)

先述したCSVデータでは形式が合わないので、以下のように加工しています。(抜粋)

item_id,timestamp,target_value
pcr_positive,2021-01-12,4521
pcr_positive,2021-01-13,5841
pcr_positive,2021-01-14,6598
pcr_positive,2021-01-15,6741

S3アップロード

後述の"dataset"からデータを参照できるように加工したデータを任意のS3バケットにアップロードしておきます。

datasetgroup作成

ここからいよいよForecastの設定に入ります。

AWSマネジメントコンソールから[Amazon Forecast] > [Create dataset group]を選択し、時系列データのグループを定義します。

下記の画面のように入力し、[Next]を押します。

f:id:wingfair:20210117122335p:plain
create dataset group

  • dataset group name:時系列データのグループ名
    • 任意の名前でOKですが、ハイフンを使えないのでアンスコで区切る必要があります
  • Forecasting domain:EC2キャパシティなどForecastのプリセットの時系列データのタイプ
    • 今回は該当のタイプがないため、"Custom"を指定しました

dataset作成

次に時系列データの項目を定義します。

f:id:wingfair:20210117123554p:plain
create dataset

  • Dataset name:時系列データ名
    • 任意の名前でOKですが、ハイフンを使えないのでアンスコで区切る必要があります
  • Frequency of your data:時系列データの間隔
    • デフォルトで1day=日次になっているはずです
    • 今回は日次データを扱うので、そのままでいきます
  • Column:時系列データの列項目
    • Forecasting domainCustomの場合はitem_id,timestamp,target_valueが自動で定義されています
    • TimestampFormatは元データに時間がないため、yyyy-MM-dd形式に変更しました

次に下記のようにインポートする時系列データを選択し、[Start Import]を押します。 今回のデータでは完了までに2~3分ほどかかりました。

f:id:wingfair:20210117124358p:plain
dataset import details

  • Dataset import name:インポートする時系列データ名
    • 任意の名前でOKですが、ハイフンを使えないのでアンスコで区切る必要があります
    • インポート済みの名前と重複する場合はエラーで怒られます
    • インポートするCSV名に合わせて名前を変えていくと管理上よいかと思います
  • Data location:インポートする時系列データのS3バケット上のパス
    • 先ほどアップロードしたCSVファイルのパスを指定しました
  • IAM role:Forecast用のIAMロール (S3アクセス用)
    • 今回はお試しなので、自動生成のロールをそのまま使ってます

処理が完了したら下図の通りダッシュボード上のステータスが"Active"となります。

"Active"が確認できたら、"Predictor Training"の[Start]を押して次に進みましょう。

f:id:wingfair:20210117125149p:plain

学習

predictor作成

先ほどインポートした過去の時系列データを基に予測の判断材料をつくります。

下図の通り、predictorの設定を行います。

f:id:wingfair:20210117130557p:plain
predictor settings

  • Predictor name:作成するPredictor名
    • 任意の名前でOKですが、ハイフンを使えないのでアンスコで区切る必要があります
  • Forecast horizon:予測したい期間
    • 今回は予測したい期間を30日間としたいので、30を指定しました

以降、predictorの学習方法について詳細を設定していくのですが、今回はお試しなので全てデフォルト設定で次に進みます。

f:id:wingfair:20210117131142p:plain
predictor details

  • Forecast horizon:学習アルゴリズム
    • カスタマイズしたい人はManualで指定できるようですが、今回はお試しなのでお任せのAutomaticにしました。

他にも色々とオプションはありますが、すっ飛ばして、最後に[train predictor]を押します。

レコード数がそれほど多くないのですぐ終わるかなと思っていたのですが、完了するまでにそれなりに時間かかります。

夜に放置して次の日の朝に終わっていることを確認したので、正確な時間は分からないですが、今回のケースでは少なくとも1時間以上はかかってます。

処理が完了したら下図の通りダッシュボード上のステータスが"Active"となります。

"Active"が確認できたら、"Forecast generation"の[Start]を押して次に進みましょう。

f:id:wingfair:20210117132205p:plain
Predictor training

予測

forecast作成

予測の定義を作ります。

下図のforecastの詳細を指定して、[Create new forecast]を押します。

今回のケースでは完了までに30分ほどかかりました。

f:id:wingfair:20210117134859p:plain
create forecast

  • Forecast name:作成するForecast名
    • 任意の名前でOKですが、ハイフンを使えないのでアンスコで区切る必要があります
  • Predictor:利用するpredictor
    • 先ほど作成したpredictorを指定しました

処理が完了したら下図の通りダッシュボード上に[Lookup forecast]のボタンが現れるので、押して次に進みましょう。

f:id:wingfair:20210117135607p:plain
lookup forecast

予測結果の参照

ここまできたらあとは結果をグラフで表示させるだけです。

下図のように見たい項目と期間を選んで、[Get Forecast]を押します。

f:id:wingfair:20210117144539p:plain
get forecast

  • Forecast:利用するForecast名
    • 先ほど作成したものを指定します
  • Start date:表示させたい開始日時
    • 今回はForecast horizonで30を指定している関係で投入したデータの30日前まで指定可能になっていると思われます
  • End date:表示させたい終了日時
    • 今回はForecast horizonで30を指定している関係で投入したデータの30日後まで指定可能になっていると思われます
  • Value:表示させたい項目
    • datasetで投入したデータのitem_idの値="pcr_positive"を指定しました

すると冒頭でお見せした結果が取得できます!

f:id:wingfair:20210117140622p:plain
forecast result

参考にしたページ

以上。