Amazon Forecast を利用して、お店の商品の売り上げ予測をする。

# はじめに
今回は、kaggle の Store Item Demand Forecasting Challenge のデータを使用して、お店の商品の売り上げ予測を Amazon Forecast で行います。

- Store Item Demand Forecasting Challenge  
https://www.kaggle.com/c/demand-forecasting-kernels-only  
このデータセットには2013/1/1~2017/12/31日までの毎日の売り上げが、各店の各商品ごとに用意されています。  
店舗は10店、商品は50品用意されています。  
以下、データの初め5行になります。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/05e94ab4-0c9f-31a7-3304-382a1c5523f9.png)


# Amazon Forecast とは
Amazon Forecast とは、機械学習を使用して精度の高い予測を行うフルマネージド型のサービスで、履歴のあるデータセットであれば、どのような時系列データからでも予測結果を生成できます。







# 今回利用するデータ
今回はStore Item Demand Forecasting Challengeの train データから以下のデータを抽出し、学習テストデータとして利用します。

#### 学習データ
- store 1 の item 1 
- 2013/1/1~2017/10/31 までの毎日の売り上げ

#### テストデータ
- store 1 の item 1 
- 2017/11/1~2017/12/31 までの毎日の売り上げ

# 実践

- awsコンソールから forecast を開きます。  
<img width="630" alt="001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ff69a111-b3a8-f598-7c4e-877a78b5adf0.png">

### データセットグループの作成
- Create dataset group をクリックし、データセットグループの作成をします。  
<img width="941" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/9ae6c4e2-733d-1172-f382-3b953b5c4c6d.png">

- データセットグループの設定を行います。
    - Dataset group name : 任意のデータセットグループ名を入力します。
    - Forecasting domain : データセットドメインの設定。今回は小売り予測のため Retail を選択します。  
    データセットドメインの詳細は[こちら](https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/howitworks-domains-ds-types.html)を参照してください。  
<img width="577" alt="003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/9961b149-71ba-4f25-fc98-4b2e0d171160.png">

### データセットの設定

- データセットの設定を行います。
    - Dataset name : 任意のデータセット名を入力します。
    - Frequency of your data : 時系列データの区切りを選択します。今回のデータは日にち区切りなので 1day を選択します。  
<img width="624" alt="004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/fba6283b-f260-aabe-393a-389fb05fabdb.png">

- Data schema : データの保存形式に合わせてスキーマを設定。データドメインごとに必要な情報が変わるので、先ほどのドメインからデータセットタイプを参照してください。  
<img width="435" alt="005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f5492104-52ea-9d82-a736-ca0a1be6c14e.png">

### データセットのインポート設定

- データセットのインポート設定を行います。
    - Dataset import name : データセットインポート時の名前を入力します。
    - Timestamp format : 入力データに合わせてタイムスタンプを設定します。
    - IAM Role : 読み込みを行う、対象のs3バケットへの権限を付与したIAMロールを指定します。
    - Data location : s3 に保存している、入力ファイル(csv)パスを入力します。
<img width="445" alt="006.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f20af3d6-bbf3-9412-2407-49b19b546c57.png">

### 予測子の作成

- Target time series data のステータスが Activeになったら、Predictor training の Start をクリックし、予測子の作成をします。
※他にも、item metadata data や Related time series data といったデータをインポートできます。データセットドメインごとに、各データに推奨される項目があり、推奨項目を入力することで精度があがるとされています。今回はインポートしません。
<img width="749" alt="007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/7f3ae074-6753-cc5b-7a83-af291d4aae11.png">

- 予測子の設定を行います。
    - Predictor name : 予測に付ける名前を入力します。
    - Forecast horizon : どれだけ先まで予測を行うか設定します。
    - Forecast frequency : 予測の区切りを設定します。
    - Algorithm selection :アルゴリズムの設定をします。今回は、最適な手法を自動で見つけてくれるAutomaticを選択します。
    - Forecast dimentions : 通常予測はitem_id毎に行われますが、必須ではないパラメータを入力として与えていた場合、そちらを対象に予測を行えます。
    - Country for holidays : 国ごとの祝日を考慮するように設定できます。
    - Number of backtest windows: 学習時の検証用データをいくつ切り出すか設定します。
    - Backtest window offset : 切り出す検証用データのデータ数を設定します。
<img width="439" alt="008.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d95fd6ed-606d-cba0-2a7a-31086a61353b.png">
<img width="423" alt="009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/bd296305-fe8a-0d97-dbc4-faf8c4e9fff0.png">

- Predictor training が Active になったら、予測子の作成が完了です。
<img width="702" alt="010.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f7cffbc7-cddf-962d-f96b-d2dc3225639e.png">

- サイドバーからPredictor をクリックし、予測子の詳細を確認できます。
<img width="935" alt="010-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/2c6f681b-fb7c-b2a4-e5d7-0a454eacc988.png">

- 予測子を開くと、AutoMLで選ばれたアルゴリズムや、精度の指標となるwQLやRMSEなどを確認できます。
- 結果を確認したら、右上の Create a forecast をクリックし、予測を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/989f3f15-eb8e-4909-4394-fa07b2b736cb.png)

### 予測

- 予測の設定を行います。
    - Forecast name : 予測の名前を入力します。
    - Predictor : 利用する予測子を選択します。  
<img width="445" alt="011.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b26f6924-bece-2e50-a035-292f6f2a18ff.png">

### 予測結果の可視化

- 予測が完了すたら、Dash board から Lookup forecast をクリックします。
<img width="742" alt="012.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/5fdf5771-6e9a-3f1f-e581-4cffffa5d191.png">

- 予測の表示設定を行います。
    - Forecast : 利用する予測を指定します。
    - Start date : 表示するデータの開始時間を設定します。
    - End date : 表示するデータの終了時間を設定します。
    - Choose the keys you want to use to filter your forecasts : 予測結果を表示する item を選択します。
<img width="759" alt="013.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/081f22a4-2120-9c88-f19b-e531e1731fae.png">

- 実行すると以下のように設定した範囲のデータが表示されます。
左側の黒いグラフが学習データ、右の色つきのグラフが予測結果になります。
予測が正確か確認するために、予測結果をダウンロードし、テストデータと比べます。
<img width="737" alt="014.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/958666d3-8975-401e-e1be-df463019b72d.png">

### 予測結果のエクスポート

- サイドバーから Forecasts を選択し、作成した予測をクリックします。
<img width="925" alt="015.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f30602fe-52a6-857b-2b38-02e9efda7a4d.png">

- 右下の Create forecast export をクリックします。
<img width="921" alt="016.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/5241e430-372b-bb12-9e67-e082218604d0.png">

- エクスポート設定を行います。
    - Export name : エクスポートの名前を入力します。
    - Generated forecast : エクスポートする予測を選択します。
    - IAM Role : 対象のS3への書き込み権限のあるIAMロールを設定します。
    - S3 forecast export location : 予測結果を保存する s3 パスを入力します。 
<img width="414" alt="017.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/66c6c07d-3032-d840-5f8d-9e2a2bd668fc.png">

- export が Active になったらエクスポート完了です。
<img width="765" alt="018.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/a2d3355f-2e6d-f7dc-824f-8c737f78e9a2.png">

- 対象の s3 パスに無名のフォルダが作成され、フォルダ内に予測結果が csv 形式で保存されています。
<img width="899" alt="019.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/487af67d-7027-34ce-0666-a1b07f7c6a35.png">

### 予測結果の比較

- p50 の予測結果をテストデータ と比べてみます。
青がテストデータ、オレンジが予測結果となります。
おおむね、特徴はとらえられているかと思います。
![020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/1008cc0e-453f-ccac-093b-816f2044cdf3.png)

- 上記グラフにp10、p90 を追加したグラフが以下になります。
![021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ba34dfcd-e81c-18d4-1e07-1f46330850d4.png)

# Amazon Forecast の料金
以下にAmazon forecast の費用を示します。

|項目|料金|
|:--|:--|
|予測作成|予測1000個あたり0.6$|
|アップロードする学習データサイズ|1GBあたり0.088$|
|トレーニング時間|トレーニング1時間につき0.24$|

- 今回の検証にかかった金額

|項目|値|料金|
|:--|:--|:--|
|予測作成数|1つ*3(分位点が3つあるため)|0.6$|
|アップロードした学習データサイズ|30KB|0.0000072$|
|トレーニング時間|約30分|0.12$|
|合計||0.1800072$|

# おわりに
今回は、Amazon forecast を利用して小売り予測をしてみました。
時間、商品番号、売り上げデータのみで、これだけ予測が得られるのには驚きました。
更にパラメータを追加することで精度が上がるようなので、もう少し複雑なデータセットで試してみてもいいかもしれないです。