# Prophet を使用した売上予測のための時系列分析の例

Treasure ワークフロー は、Facebook Prophet を使用して、売上収益やページビューなどの時系列値の予測を提供します。機械学習アルゴリズムは、スケジュールされたワークフローの一部として、カスタム Python スクリプトから実行できます。時系列分析と売上データ予測には、Python カスタムスクリプトで [Facebook Prophet](https://facebook.github.io/prophet) を使用します。

Prophet は時系列データを予測するための手順です。不完全なデータセットやトレンドの変化から確率分布を学習できます。これらの例のデータの詳細は、[Prophet の公式ドキュメント](https://facebook.github.io/prophet/docs/non-daily_data.html#monthly-data)で確認できます。

![](/assets/image-20191007-173703.ef21fb3c08a9110670a4b3b5da0c2bacab34f7d6070295e67de7c1b0bb1e1ba7.2e4f387b.png)

これらの例は、Facebook Prophet の時系列分析を使用して、過去のデータを使用して連続値を予測し、売上データを予測します。S3 と Slack へのアクセス状況に応じて、使用する例を選択してください。

## S3 と Slack を使用した将来の売上を予測するワークフロー例

ワークフロー：

* Treasure Data から過去の売上データを取得します
* Prophet でモデルを構築します
* 将来の売上を予測し、Treasure Data に書き戻します
* 予測図を Amazon S3 にアップロードします
* Slack に通知を送信します


### 前提条件

* Treasure アカウントでカスタムスクリプト機能が有効になっていることを確認してください。
* TD Toolbelt と TD Toolbelt Workflow モジュールをダウンロードしてインストールしてください。詳細については、[Treasure ワークフロー クイックスタート](/products/customer-data-platform/data-workbench/workflows/treasure-workflow-quick-start-using-td-toolbelt-in-a-cli)を参照してください。
* Treasure ワークフロー の構文に関する基本知識
* S3 バケットと関連する認証情報
* Slack の [webhook](https://api.slack.com/incoming-webhooks) URL を作成します


### ワークフロー例の実行

1. この[リポジトリ](https://github.com/treasure-data/treasure-boxes/tree/master/machine-learning-box/sales-prediction)からプロジェクトをダウンロードします
2. コマンドラインターミナルウィンドウで、timeseries ディレクトリに移動します。例：


```bash
cd timeseries
```

1. *data.sh* を実行してサンプルデータを準備します。timeseries というデータベースと retail_sales というテーブルが作成されます。


```bash
./data.sh
```

1. 以下のようにワークフロー例を実行します：


```bash
td workflow push prophet

td workflow secrets \
--project prophet \
--set apikey \
--set endpoint \
--set s3_bucket \
--set aws_access_key_id \
--set aws_secret_access_key \
--set slack_webhook_url
# Set secrets from STDIN like: apikey=x/xxxxx, endpoint=https://api.treasuredata.com, s3_bucket=$S3_BUCKET,
# aws_access_key_id=AAAAAAAAAA, aws_secret_access_key=XXXXXXXXX,  slack_webhook_url=https://hooks.slack.com/services/XXXXXXX/XXXXXX/XXXXXX
# Where XXXXXXX/XXXXXX/XXXXXX is the value of the slack URL where you want information to be populated automatically. $ td workflow start prophet predict_sales --session now
```

予測結果の通知が Slack に送信されます：

予測結果は timeseries データベースの predicted_sales テーブルに保存されます。

Treasure コンソール で以下の SQL を使用して、予測された売上値を検証します：

```sql
SELECT
  ds,
  yhat,
  yhat_lower,
  yhat_upper
FROM
  timeseries.predicted_sales
ORDER BY
  ds DESC LIMIT 100
```

そのカラムで予測された売上数を確認できます。

## S3 や Slack なしで将来の売上を予測するワークフロー例

この例は、S3 や Slack にアクセスできない場合に使用します。

ワークフロー：

* Treasure Data から過去の売上データを取得します
* Prophet でモデルを構築します
* 将来の売上を予測し、Treasure Data に書き戻します


### 前提条件

* Treasure アカウントでカスタムスクリプト機能が有効になっていることを確認してください。
* TD Toolbelt と TD Toolbelt Workflow モジュールをダウンロードしてインストールしてください。詳細については、[Treasure ワークフロー クイックスタート](/products/customer-data-platform/data-workbench/workflows/treasure-workflow-quick-start-using-td-toolbelt-in-a-cli)を参照してください。
* Treasure ワークフロー の構文に関する基本知識


### ワークフロー例の実行

1. この[リポジトリ](https://github.com/treasure-data/treasure-boxes/tree/master/machine-learning-box/sales-prediction)からプロジェクトをダウンロードします
2. コマンドラインターミナルウィンドウで、timeseries ディレクトリに移動します。例：


```bash
cd timeseries
```

1. *data.sh* を実行してサンプルデータを準備します。timeseries というデータベースと retail_sales というテーブルが作成されます。


```bash
./data.sh
```

```bash
td workflow push prophet

td workflow secrets \
--project prophet \
--set apikey \
--set endpoint
# Set secrets from STDIN like: apikey=x/xxxxx, endpoint=https://api.treasuredata.com


td workflow start prophet predict_sales_simple --session now
```

予測結果は Treasure Data に保存されます。

### ワークフローのカスタム Python スクリプトの確認

Treasure ワークフローサンプルを表示する権限を持つ git アカウントにサインインしていることを確認してください。

ディレクトリの内容を確認します：

* [predict_sales.dig](https://github.com/treasure-data/workflow-examples/blob/master/machine-learning/time_series/predict_sales.dig) - 売上予測と Slack への通知のワークフロー例。
* [predict.py](https://github.com/treasure-data/workflow-examples/blob/master/machine-learning/time_series/predict.py) - Prophet を使用したカスタム Python スクリプト。Amazon S3 に図もアップロードします。


Slack に通知を送信する必要がない場合は、predict_sales.dig の "*+send_graph*" ステップを削除できます。

この例では売上データのデータセットを使用しています。read_td 関数のクエリを変更した後、Treasure Data の独自のデータを使用できます。

*ds*（日付スタンプ）カラムと *y* カラムを準備する必要があります。y カラムは、売上値やウェブサイトのページビュー（PV）など、予測対象の数値を表します。

以下はページビューログのサンプルコードです：

```python
import pytd.pandas_td as td

engine = td.create_engine('presto:sample_datasets')

start_date = '2014-01-01'
end_date = '2018-12-31'

df = td.read_td(f"""select  TD_TIME_FORMAT(TD_DATE_TRUNC('minute', time), 'yyyy-MM-dd HH:mm:ss') as ds,  count(1) as yFrom  www_accessWhere  TD_TIME_RANGE(time, '{start_date}', '{end_date}', 'PDT')group by  1Order by  1""",engine)

m = Prophet(changepoint_prior_scale=0.01).fit(df)

future = m.make_future_dataframe(periods=5, freq='M')

fcst = m.predict(future)
```