IT初心者がAmazon Forecast を使ってシャンプーの売上傾向を予測【誰でも出来る】

#はじめに
2020年！AIぽいことしたいなーということでAWSのMachineLearningらしいサービスを使ってみました。
初心者さん、機械学習に詳しくない方でも使えるので、その使い方を分かりやすくご紹介していきます！

#Amazon Forecastとは？

過去の何らかの時間単位で整列されたデータ(時系列データ)から価格、PR、経済的業績指標などを利用し、予測をすることができるサービスです。

*  完全マネージド型
*  オートML機能によって予測できる
*  モデルを構築するための機械学習の専門知識いらず
*  サーバーをたてたり、機械学習モデルの構築、トレーニング、デプロイも不要
*  実際に使用した分に対してのみ料金が発生
*  自動的にデータのロードと検査、適切なアルゴリズムの選択、モデルのトレーニング、正確なメトリクスの提供、予測の生成
*  予測をコンソールで可視化できる
*  バッチでエクスポートしたり、API を使用してビジネスアプリケーションに統合ができる

#小売業の活用例

- 製品の需要、リソースのニーズ、財務業績といった、将来のビジネス成果を正確に予測
- 簡単なスプレッドシートから、複雑な財務計画ソフトウェアに至るまで、あらゆるツールを活用
- 価格、PR、来店者数などと関連する製品の特徴、陳列場所、店舗の場所などのデータを組み合わせ、それらの間の複雑な関係を判断

製品の機能や店舗の場所などの、可変的なデータと時系列データが、どのように影響し合うかまで確認することができるのです。


#いざやってみる
予測に必要なのは過去のデータと、予測に影響を与える可能性があるデータです。
できるだけ多く、長い期間のデータがあると精度の良い予測ができそうです。

[フリーデータセット](https://github.com/jbrownlee/Datasets)を使って、マネージメントコンソールからシャンプーの売上予測をしていきます。

##データセットドメインについて

使用するデータは、予測したい内容によって中身を整える必要があります。
以下のデータセットドメインがサポートされています。

- **RETAIL**
    - 小売の需要予測。
    - 特定の日に商品が受け取った価格やウェブヒット数など、関連するデータセットを Forecast に提供できます
    - 情報が多いほど、予測はより正確になります。
- **INVENTORY_PLANNING** 
    - 原材料の需要を予測し、特定の商品の在庫をどれだけ確保するかを決められます。
- **EC2 CAPACITY**
    -  Amazon Elastic Compute Cloud (Amazon EC2) キャパシティの予測
- **WORK_FORCE** 
    - 従業員の労働力の需要がどのくらいかを予測します。
- **WEB_TRAFFIC**
    - 今後のウェブプロパティまたは、一連のウェブプロパティへのウェブトラフィック(情報量)の見積もり
- **METRICS**
    - 収益、売上、キャッシュフローなどの収益予測
- **CUSTOM**
    - その他すべての時系列予測のタイプ

#ステップ 0:データの準備

今回は売上予測なので、METRICSドメインを使っていきます。
CSVファイルのデータを必須カラムのみ含まれているように、以下の列名を加えます。

- metric_name (文字列)
-  timestamp (タイムスタンプ)　
    -  後ほどのタイムスタンプのフォーマット設定に合わせる必要がある
- metric_value (浮動小数点整数)
    -  Forecast が予測を生成する target フィールド(例:特定の日に生成される収益額)

名前のカラムと、日付と秒単位の時間を付け加えました。
metric_name　「shampoo」
timestamp    「1998-01-01 00:00:00」
metric_value 「266.0」（売上数）

![2020-01-07_16h34_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/0a93c13a-8937-d095-5fec-c5c52a325ec0.png)


S3にデータをアップロードしていきます。
バケットを作成。
![2019-12-27_11h05_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/c189aae9-d77e-47cd-d036-b2b0427b83b0.png)

今回はデフォルトのままで大丈夫です。
バケット名を決めて東京リージョンで設定し、そのまま左下の作成ボタンを押してください。
![2019-12-27_11h06_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/abb98663-0ee4-32b3-1989-31518f3e8ebc.png)
作ったバケットのリンクを押してCSVデータのアップロードへ
![2019-12-27_12h45_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/82a0a2fb-839a-b531-fdef-92f128cb053a.png)
アップロードを押したら
![2019-12-27_12h42_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/1cb4e880-cae8-115c-fd1e-96055c829150.png)
CSVデータを追加したらこちらもデフォルトの設定のままでOKなので左下のアップロードを押していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/54a3c88a-d7c8-9673-4528-0a35f5f69785.png)
追加したデータのチェックマークを押すと右にポップアップが出てきます。
後ほど使いますので、パスをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/18ed41bf-f6b0-1615-bcc4-d98651959e26.png)


#ステップ 1:トレーニングデータをインポート
Amazon Forecast コンソールからCreate dataset group （データセットグループの作成）を選択。
Dataset group name （データセットグループ名）の名前を入力し、ドロップダウンメニューから使用する予測ドメインを選択。今回使うのはMetrics。
![2020-01-06_09h25_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/97939864-0baa-c2a0-48ca-1e0e377cb47b.png)

次にCreate target time series dataset （ターゲット時系列データセットの作成）
グループの名前を入力します。
「Frequency of your data (データの頻度)」 この設定は、入力時系列データの設定と一致している必要があります。

デフォルトの 1 のままにして、今回のサンプルデータは一日ごとなのでドロップダウンメニューから [day] を選択します。
データスキーマはデータタイプと順序を設定します。
事前に準備した時系列データの列に一致するように更新します。


![2020-01-06_09h58_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/ed5e0f17-eedc-6a54-4981-966c24e85753.png)

次は「　Import target time series data (ターゲット時系列データセットのインポート)」ページの
「Dataset import job details (データセットインポートジョブの詳細) 」に情報を入力します。

データセットの名前を入力。
「Timestamp format (タイムスタンプ形式)」はデフォルトのままにしておきます。
この形式は、入力時系列データの設定と一致している必要があります。

IAM ロールはデフォルトのままか新しく作成でOK。
Data location (データの場所)は**データの準備**でコピーしたS3のパスを貼り付け。
![2020-01-06_11h06_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/e08f377a-08fa-23a4-4f95-498c5ffbfc1a.png)

Start importを押したら、作成が始まりダッシュボードページに変わります。

![2019-12-27_09h58_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/5c681921-58ec-ef77-d61c-f003bc415a55.png)
Create pendingからActiveになれば、次のステップのトレーニングのstartができるようになります。
![2019-12-27_10h05_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/88308ce0-f19b-1b00-ee5a-d53b43c36b4d.png)


#ステップ 2: トレーニングモデルの作成
予測に使うトレーニングモデルをつくります。
予測子の名前を入力します。
Forecast horizon で今後予測したい期間を選択。
この数値に、ステップ1で指定したデータ入力頻度 (day) を乗算して、今後予測を実行する期間が決定されます。

**注：予測できる期間は与えたデータ期間の、３分の１の期間でしか指定できません。
なので与えたデータと同じ期間分予測しようとするとエラーになります。**

私自身画像のように９０日で指定しましたが、予測できる範囲を超えてしまったのでエラーになりました。
Forecast frequency で予測頻度を指定。
デフォルト値の 1 のままでドロップダウンメニューから [Day] を選択。
この設定は、入力時系列データの設定と一致している必要があります。

![2019-12-27_10h06_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/278a27dd-1dd7-8747-d6e1-4a8510b65f45.png)
Algorithm selection でアルゴリズムの選択。 Automatic (AutoML) を使います。これで機械学習はおまかせあれ。
他はいじらずに　train predictor　をクリック。
![2019-12-27_10h13_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/cf414d15-0415-ff48-f3a2-6a46aca5c908.png)

予測子のトレーニングが完了するまで(データのインポート同様Activeになる)時間が結構かかります。
３０分以上は待ちました。

#ステップ 3: 予測を作成
Predictor training が Active になったら推論データの作成にかかります。
「Create a forecast (予測の作成)」ページの 「Forecast details (予測の詳細)」に予測の名前を入力します。
ドロップダウンメニューから、ステップ２の Train a Predictor で作成した予測子を選択します。
残りの設定はオプションなので、デフォルトのまま create a Forecast を押します。
![2019-12-27_13h18_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/9e42b451-4915-c1fd-6d5d-139ca2a855f5.png)


#ステップ 4: 予測を取得
ダッシュボードで Forecast generation が Active になったら予測のルックアップを選択します。

ここでまたエラー。
**開始日はデータの最終日と被せなければならないようです。**
ステップ２のForecast horizon の設定と同じく、２ヶ月半のデータなので予測できる期間も２０日間がMAXです。
![2019-12-27_14h35_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/6a03fcee-3c89-a55b-a6a7-569421621064.png)

ドロップダウンメニューから、ステップ3の Create a Forecast で作成した予測を選択。
start date-開始日とend date-終了日を指定して、範囲はステップ2のTrain a Predictor で指定した予測期間に合わせます。
Choose which keys （予測キー）の追加を選択。
Forecast keyでドロップダウンメニューから [metric_name] を選択します。
Valueで特定したいデータ項目、[shampoo]を入力。

![2019-12-27_14h43_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/225de900-03f5-b503-c27d-dd0fcd585715.png)

#結果がこちら
真ん中が平均的な予測で、上が上位１０％の予測で下が下位１０％の予測です。
P50 の予測値が、実際の需要にもっとも近い値であるようです。
上位と下位でかなり差が出ていますが、月半ばと給料日前あたりが売上が下がっていきそうなのが予測できました。

この時期を目処に前もって対策できれば売上を下げるのを抑止できて、
平均的に見ると毎日３００は売れそうなので、仕入れの最低数なども考えられそうですね。

![2019-12-27_14h46_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/0034ca7b-51e8-4769-08d0-8c51e21920fb.png)

#感想

３パターンのグラフ予測のおかげで、最高売上と最低売上が予測できるので、特定日の対策も考えやすくなり、
仕入れの需要数なども簡単に予想できるサービスでした。
データをより詳細になるべく多く用意すること、データの形式と予測する期間や頻度さえ気をつければ、とても手軽に予測ができたのでぜひとも皆様もお試しください！

他のAWS AI系のサービスの検証なども多数、弊社の技術ブログで記載しているので、ぜひともこちらもご参照ください。
[ナレコムレシピ](https://recipe.kc-cloud.jp/)

#公式サイトリンク
[Amazon Forecast 開発者ガイド](https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/what-is-forecast.html)
[Amazon Forecast](https://ap-northeast-1.console.aws.amazon.com/forecast/home?region=ap-northeast-1#landing)