Amazon Lookout for Metrics によるデータ異常検出

# はじめに

たまたま **Amazon Lookout for Metrics** というサービスについて触れることがあったので検証した内容をまとめてみました。


# Amazon Lookout for Metrics とは？
機械学習を使用してメトリクス内の異常を自動的に検知してくれる AWS サービスです。

https://aws.amazon.com/jp/lookout-for-metrics/


# 検証内容
今回は以下の記事を参考に行っています。

https://aws.amazon.com/jp/blogs/machine-learning/build-a-loyalty-points-anomaly-detector-using-amazon-lookout-for-metrics/

## 概要説明
あるファーストフードチェーンが一部の店舗でポイントプログラムを導入しました。
そのプログラムの内容は以下です。
- 商品を購入するとその金額に応じてポイントが溜まる
- 溜まったポイントは割引券や特典と交換することができる

このポイントの獲得と交換パターンにおいてパターン異常を検知する設定を行うという内容です。

## データ概要
ここで取り扱うデータの項目とその内容については以下となります。

|項目           |説明|
|:---          |:---|
|TIMESTAMP     |データの取得日です。<br>今回は **yyyy-MM-dd** を扱っています。|
|LOCATION_ID   |ポイントプログラムが導入された店舗の ID です。<br>**A-1001 ~ A-1008** の 8 店舗が集計対象です。|
|EARNED_POINTS |獲得ポイントです。<br>顧客が商品を購入して得られたその日の総数です。|
|REDEEM_POINTS |交換ポイントです。<br>顧客が店舗で交換したその日のポイントの総数です。|


# 設定 
今回の構築ステップは大きく分けて以下の 3 ステップとなります。
1. Amazon S3 バケットの作成と解析データのアップロード
2. Detector の作成
3. データセットの作成

## S3バケットの作成とサンプルデータのアップロード
ここでは **Amazon Lookout for Metrics** で解析するためのデータ置き場とそのデータの準備を行います。
利用するデータは AWS Samples というところにあるデータを利用します。

https://github.com/aws-samples

- まず、AWS Samples より、 [loyalty.csv](https://github.com/aws-samples/build-a-loyalty-points-anomaly-detector-using-amazon-lookout-for-metrics/blob/main/loyalty.csv) というファイルのダウンロードをします。

![download-dataset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/78f559f5-da9b-892a-ccad-3b811e715a57.png)

- 次に S3 バケットを作成し、先ほどダウンロードし loyalty.csv をアップロードします。

![upload-file01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/4ef65a72-3677-21ca-eb3e-cfd36c39bada.png)

![upload-file02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/be6256c1-e7cd-8e58-8a14-15f048b9d27a.jpeg)

![upload-file03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/2538daeb-3fbe-e76f-920d-0d441c0f4453.png)


## Detector の作成
対象となるデータセットの監視と検出をするための Detector を作成します。

- まず、 `AWS マネジメントコンソール > Amazon Lookout for Metrics` をクリックします。

- 次に `Create detector` をクリックします。

![create-detector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/aa84d8c5-e752-030d-92d7-5fd0245feee7.png)

### Create detector
Detector details で Detector の情報を入力します。
- **Detector name** に **loyalty-point-anomaly-detector** を入力します。
- **Interval** は Detector がデータセットを分析する間隔なので、今回の利用データは一日単位のため **1 day intervals** を指定します。
- `Create` をクリックします。

![create-detector02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e1ae4d82-15d0-4d64-ef84-2147068b61ba.jpeg)


## データセットの作成
ここではデータの場所と Detector へ異常を伝えるためのデータセットを作成します。

- Detector の作成が完了すると以下の画面が表示されるので `Add a dataset` をクリックします。

![create-dataset01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/6780797a-5348-b5f4-7881-6fbd7112e030.png)

- **Name** に `loyalty-point-anomaly-dataset` を入力します。
- **Timezone** に `Asia/Tokyo` を指定します。

![create-dataset02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/cba675b1-c601-f4b5-08c8-9cdfad39448a.png)

- **Datasource** に `Amazon S3` を選び、**Detector mode** に `Backtest` を選択して先ほどアップロードしたデータソースのファイルパスを入力します。

- `[Detect format settings]` をクリックします。

![create-dataset03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/4bef3a2d-72c9-fea0-bbd9-8e89f0acc303.png)

- 全てデフォルトの状態で `Next` をクリックします。

![create-dataset04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/415d4f2b-c2c7-6d9f-9f8e-b01ab500fa1c.png)
![create-dataset05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/f071168e-5248-6deb-87a5-8044828d5506.png)

## meaures と dimensions の設定

**Mesures** は *KPI (Key Performance Indicator : 重要業績評価指標)* を設定する項目で、**Dimensions** は *カテゴリー* や *セグメント* を設定する項目になります。
- **Mesures** で `EARNED_POINTS` と `REDEEM_POINTS` を指定します。
- **Dimensions** では地域別に計測したいので `LOCATION_ID` を指定します。

![Configure-dataset01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/979020f9-be22-c8d9-491c-456a2d2b9884.png)

## timestamps の設定
**Timestamp** はデータの *タイムスタンプ* が記録されている項目とそのフォーマットを指定します。
- **Timestamp** は `TIMESTAMP` という項目を指定し、 **Format** では `Enter a timestamp format` を選んで **Timestamp format** に `yyyy-MM-dd` を入力します。

![Configure-dataset02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/b5c7c5f7-76ca-3c3d-8f8f-f344a8504c7d.png)

### コストの見積もり
**Cost Estimate** を利用すると検知にかかる費用を事前に見積もることができます。
今回の場合、 Measures 数が 2 つで Dimension 数が　8　つのため、Metrics 数は `2 (Measures) × 8 (Dimension) = 16 (Metrics)` になります。
また、*1 Metrics* あたり *$0.75* になるのため、発生する費用は `16 (Metrics) × $0.75 = $12.00` となります。

![Configure-dataset04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/d67bb690-73fa-78cd-9758-4abb024958c5.jpeg)

※ ここで見積もりを間違うと請求が大変なことになるので気をつけましょう。

https://aws.amazon.com/jp/lookout-for-metrics/pricing/

- `Next` をクリックします

![Configure-dataset05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/d511e279-9b73-0deb-9b2d-4452f7d87168.jpeg)

## Review and create
- 内容を確認して問題なければ `Save and activate` をクリックします。

![Configure-dataset06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/2dbacc08-ebde-88d0-0ee4-4ec90dd2ed17.jpeg)

- **Activate your detector** という確認画面がポップアップされるため、 **confirm** を入力して `Activate` をクリックします。

![Configure-dataset07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/58393ee4-7181-e205-645b-b1bba9406ff0.png)

**Activate detector** の項目が `Activating backtest...` から `Backtest complete` となったら完了です。

![Configure-dataset08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/cf99d93b-2b5e-c4f1-f55e-49b0be79ca65.png)


# 解析結果
バックテストが完了したら検出した異常について確認します。

- `Amazon Lookout for Metrics > Detectors > loyalty-point-anomaly-detector > Anomalies` をクリックします。

- すると `REDEEM_POINTS Impacted` というのが表示されているのでクリックします。

![Check01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/46ee679d-3977-7162-c6c1-9f8678a6ed2d.png)

**Severity score** は検知した異常の重大度を示し、 **Start time detected** は異常を検知した時刻（TIMESTAMP値）が表示されます。
ここでは重要度が `91` の異常を `Sep 01, 2022 00:00 JST` に検知しています。

![Check03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/311f5556-227c-02c2-ad2c-e9c28a61aace.jpeg)

また、異常に対する寄与率も確認できます。
今回は異常の全てが `A-1002` からのものということを表しています。

![Check04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/1deb967e-8dd5-d77b-0000-0fab74f3f6dc.jpeg)


# おわりに
データを S3 に置くだけで簡単に異常検知を行ってくれるのでとても便利だなと感じました。
ただ、 Dimensions はうっかり間違うと大変なことになるため注意が必要です。

---
### 参考
https://docs.aws.amazon.com/ja_jp/lookoutmetrics/latest/dev/lookoutmetrics-welcome.html

https://aws.amazon.com/jp/lookout-for-metrics/pricing/

https://aws.amazon.com/jp/blogs/machine-learning/build-a-loyalty-points-anomaly-detector-using-amazon-lookout-for-metrics/

https://github.com/aws-samples/build-a-loyalty-points-anomaly-detector-using-amazon-lookout-for-metrics/blob/main/loyalty.csv