AWS Glue Data Quality のanomaly detectionとdynamic rulesを試してみた

# 背景・目的
2023年11月末に、[AWS Glue Data Quality announces anomaly detection and dynamic rules](https://aws.amazon.com/about-aws/whats-new/2023/11/aws-glue-data-quality-anomaly-detection-dynamic-rules/?nc1=h_ls)が発表されました。しばらく経ってしまいましたが、興味がある分野でしたので試してみたいと思います。

# まとめ
:::note info
- 2023 年12月16日現在
    - プレビューです。
    - 下記のリージョンで利用が可能です。
        - 米国東部 (オハイオ州、バージニア北部)
        - 米国西部 (オレゴン州)
        - アジアパシフィック (東京)
        - ヨーロッパ (アイルランド)
    - Glue4.0のETLとGlue Studio Visual ETLのみ提供されています。
:::
- 過去の統計を分析し、パターンを観測してレポートする
- Glue MLアルゴリズムにより識別される
- 統計の収集は3回実行してから開始される。
- 下記のような事ができます。
    - ルールを作成せずに、データの異常を検出する
    - 品質ルールだけでは検出できない潜在的な問題を検出する
    - 経時的に変更されるデータを検出する

# 概要
[Anomaly detection in AWS Glue Data Quality](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/data-quality-anomaly-detection.html)を元に整理します。

> AWS Glue データ品質の異常検出はマシンに適用されます 異常を検出するための経時的なデータ統計の学習 (ML) アルゴリズム パターンや隠れたデータ品質の問題を検出するのは困難です。 ルール。現時点では、異常検出は AWS Glue 4.0 でのみ利用可能です。この機能は現在利用可能です AWS Glue Studio Visual ETL と AWS Glue ETL のみ。この能力 AWS Glue Studio ノートブック、インタラクティブ セッション、AWS Glue データ プレビューでは機能しません。

- Anomary detectionは、Glue4.0のみ対応可能
- ETLのみ

## How it works
>データ品質ルールを評価する際、AWS Glue は必要なデータ統計を取得します。 データがルールに準拠しているかどうかを判断します。たとえば、Data Quality は次のように計算します。 データセット内の個別の値の数を調べ、その値を期待値と比較します。

>データ品質ルール エンジンは、統計値を定義されたしきい値と比較します。 そして品質要件を評価します。これらの統計は時間の経過とともに収集されるため、 ETL パイプラインで異常検出を有効にして、AWS Glue に異常検出を学習させることができます。 過去の統計を分析し、隠れたパターンを観察としてレポートします。観察は未確認の洞察であり、 AWS Glue の ML アルゴリズムが識別します。これらには、推奨されるデータ品質ルールが付属しています。 検出されたパターンを監視するためにルールセットに適用できます。でジョブを実行することをお勧めします。 定期的なスケジュール (時間ごと、毎日など)。不規則な実行では、不十分な洞察が得られる可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b63ab1fd-db99-45d6-28b9-6b0bb0b6734d.png)
※出典：[AWS Glue Data Quality announces anomaly detection and dynamic rules](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/data-quality-anomaly-detection.html)

- 過去の統計を分析し、パターンを観測してレポートする
- Glue MLアルゴリズムにより識別される

## Using analyzers to inspect your data
> データ品質ルールを作成する時間がない場合もあります。ここでアナライザーが役に立ちます。 アナライザーはルールセットの一部であり、構成は非常に簡単です。たとえば、ルールセットに次のように記述することができます。

```
Analzyers = [
      RowCount,
      Completeness “AllColumns”
]
```

> これにより、次の統計が収集されます。
> - データセット全体の行数
> - データセット内のすべての列の完全性

>しきい値を気にする必要がないため、アナライザーを使用することをお勧めします。データを実行できます パイプラインを実行し、3 回実行すると、AWS Glue Data Quality が生成を開始します。 異常を発見した場合には、観察とルールの推奨を行います。を確認できます。 観察、関連する統計を分析し、ルールの推奨事項を簡単に組み込むことができます。 あなたのルールセット。始めるには、以下を参照してください 異常検出の構成と洞察の生成 。 アナライザーはデータ品質スコアに影響を与えないことに注意してください。これらは、時間をかけて分析して観察を生成できる統計を生成します。

- しきい値を設定することが面倒であれば、アナライザーが使える。
- 3回の実行でGlue Data Qualityが生成を開始する。
- observationsとルールのレコメンデーションを行う。



## Using the DetectAnomaly Rule
> 場合によっては、異常が検出されたときにジョブを失敗させたい場合があります。制約を強制するには、次のことを行う必要があります。 ルールを設定します。アナライザーはジョブを停止しません。代わりに、彼らは統計を収集し、 データを分析します。のルール セクションで DetectAnomaly ルールを設定します。 ルールセットは、ジョブがスキャン内のすべてのルールに合格しなかったことが DQ スキャンによって報告されたことを確認します。


- anomary detectionは、ジョブの制御は行わない。


## Benefits and use cases of Anomaly Detection
> エンジニアは、いつでも何百ものデータ パイプラインを管理できます。各パイプラインはさまざまなソースからデータを抽出でき、 それをデータレイクにロードします。各パイプラインは異なるソースからデータを抽出してデータ レイクにロードする可能性があるため、 データの形状が大きく変わったか、既存の傾向から逸脱したかなど、データに関するフィードバックを即座に得るのは困難です。

> 過去には、上流のデータ ソースがデータ エンジニアリングへの警告なしに変更されました。 チームがこのプロセスに追跡困難な「データ バグ」を持ち込むことになります。 Data Quality ノードを追加することによって 問題が見つかるとジョブが失敗するため、これにより作業が大幅に楽になります。ただし、これでは削除されません データ チームが懸念しているすべての障害モードは、他のデータ バグが侵入する扉を開いたままにしています。

>障害モードの 1 つはデータ量に関するものです。企業のデータ ストアが時間の経過とともに増加するにつれて、データ パイプラインによって生成されるレコードの数も増加します 指数関数的に成長する可能性があります。データ チームは毎週、ETL ジョブを手動で更新して、データ品質ルールを設定する各データ品質ルールを強化する必要がある場合があります。 取り込まれる行数を制限します。

> もう 1 つの障害モードは、データ品質ルールの制限の一部が非常に広いことです。 取引量が曜日によって異なるという事実に対応します。の上 週末はトランザクションがほとんどなく、月曜日には約 3 倍のトランザクションが発生します 他の平日よりも。データ チームには 2 つの選択肢があります。どちらかが、ロジックを実装してデータを変更します。 日によってその場でルールを設定したり、非常に幅広い期待を設定したりすることもできます。


- データに関する件数の確認が難しいのは、下記のように動的にデータが変動することである。
    - データ量によるもの。経時的に増えたり、突発的に増える。
    - 曜日によって取引量が異なる。

> 最後に、データ チームは、明確に定義されていないデータのバグにも懸念を抱いています。モデルは特定の特性を持つデータでトレーニングされており、 そして、これらが予期せぬ方向に歪み始めた場合、チームはそれを知りたいと考えています。たとえば、 2 月 企業がモンタナ州に進出する可能性があるため、「MT」コードを含む取引が開始されました より頻繁に現れます。これにより、ML 推論が壊れる可能性があり、その結果、モデルが誤って作成される可能性があります。 モンタナ州の取引はすべて詐欺であると予測しました。

- 突発なイベントにより、データの外れ値によりモデルが誤って判断される。

> ここで、データ品質の異常検出がこれらの問題の解決に役立ちます。データ品質異常検出の利点のいくつか 含む：
> - スケジュールベース、イベント駆動ベース、または手動ベースでのデータのスキャン。
> - 意図しないイベント、季節性、または統計的異常を示す可能性のある異常の検出。
> - データ品質異常検出によって検出された観察に対してアクションを実行するためのルール推奨事項を提供します。

> これは次のような場合に役立ちます。
> - データ品質ルールを作成することなく、データの異常を自動的に検出したいと考えています。
> - データ品質ルールだけでは検出できない、データ内の潜在的な問題を検出したいと考えています。
> - 数の制限など、時間の経過とともに進化する一部のタスクを自動化したい データ品質監視のために取り込まれた行。


- ルールを作成せずに、データの異常を検出する
- 品質ルールだけでは検出できない潜在的な問題を検出する
- 経時的に変更されるデータを検出する

# 実践
## GlueでAnalyzerを設定する
1. Glueのページで、ジョブを新規に作成します。
1. 「Evaluate Data Quality」を追加します。
1. 「Anomaly detection」タブをクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a9b7c5f9-3abb-03de-c190-132c7b43aa4a.png" width=600 />

1. 「Add analyzer」タブをクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b048a9e5-3d55-bcd9-c3b2-b9284282de97.png" width=500 />

1. ポップアップが上がるので、「RowCount」を選択し、Add analyzerをクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fac9707c-a868-06c0-eef5-252179444097.png" width=500 />

1. 次に「Ruleset editor」タブをクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/90108498-3ca4-ff49-83ed-45fa982c0ea9.png" width=500 />

1. 下記のようなコードを書きます。過去3回の最小値と、過去3回の最大値の間に入ることを確認します。
    ```
    # Example rules: Completeness "colA" between 0.4 and 0.8, ColumnCount > 10
    Rules = [
     RowCount between min(last(3)) and max(last(5)),
     DetectAnomalies RowCount
    ]
    Analyzers = [
        RowCount 
    ]
    ```
## 実行
1. 一回目を実行します。ファイルは50件です。
    ```
    $ ls -l test.json ; wc -l test.json;tail test.json                                           
    -rw-r--r--  1 XXX  YYY  491 12 16 13:48 test.json
          50 test.json
    {"id":41}
    {"id":42}
    {"id":43}
    {"id":44}
    {"id":45}
    {"id":46}
    {"id":47}
    {"id":48}
    {"id":49}
    {"id":50}
    $
    ```
1. 実行完了しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1c8095a5-b3bb-7c7c-c241-d2f108130e0f.png)

1. エラーになっていました。３回実行される前ですがエラーになっていたようです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/40cf0377-a4f4-7916-879e-74de7cac080e.png)
1. observationsをクリックすると、未だクラフ化はされていません。3回実行する必要があると記載されています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a4ff8d35-4fec-02ea-731e-db44828be504.png)

1. 二回目を実行しました。変わらずエラーになっていました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7da3ca2e-369d-733a-2d0e-220bad5423bd.png)

1. 三回目を実行しました。変わらずエラーになっていました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a6562d25-2ec0-56c3-f956-611e42a43710.png)
1. やはり、未だグラフはできてません。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/36a41fda-1ca1-3fbf-2fdb-df523f0f1c26.png)

1. 四回目を実行しました。エラーになっています。50回〜50回の間に入るのでエラーにならないかと思っていましたが。設定を間違えたのかも。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4d7c491a-aec0-8d73-e5c0-af2e753735ae.png)
1. 変わらずグラフ化されていません。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eed9fbe4-a3b8-ceb9-2eac-0f1e2b937729.png)

1. 〜8回まで実行しました。変わらずでした。
1. 100件に増やしてアップしてみます。
    ```
    $ ls -l test.json ; wc -l test.json;tail test.json                                            
    -rw-r--r--  1 XXX  YYY  992 12 16 15:13 test.json
         100 test.json
    {"id":91}
    {"id":92}
    {"id":93}
    {"id":94}
    {"id":95}
    {"id":96}
    {"id":97}
    {"id":98}
    {"id":99}
    {"id":100}
    $
    ```
1. 実行しました。Anomalies RowCountがエラーになりました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/199b6ebe-8a73-9734-4263-79fd42a244e8.png)

1. Observationsが、できていました。
    - Dataset.*.RowCount
        - ActualValue: 100.00
        - ExpectedValue: 50.00
        - LowerLimit: 50.00
        - UpperLimit: 50.00
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/83e8b9e3-13f9-4c66-b8fe-55fca09e9298.png)

1. リンクをクリックします。トレンドがわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/960d6233-371e-d157-e21c-1f7c11921618.png)

1. 実行しました。DetectAnomailes　RowCountがPassになりました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2484acfd-70e5-09ba-d794-53b451e9a01c.png)

1. min 68〜 max 136です。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dc73058f-e324-4323-1e37-159d8f3a0748.png)

1. 件数を90件に変更し、実行します。
    ```
    $ ls -l test.json ; wc -l test.json;tail test.json                                           
    -rw-r--r--  1 XXX  YYY  891 12 16 15:44 test.json
          90 test.json
    {"id":81}
    {"id":82}
    {"id":83}
    {"id":84}
    {"id":85}
    {"id":86}
    {"id":87}
    {"id":88}
    {"id":89}
    {"id":90}
    $
    ```

1. 両方、パスしました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7ce6c369-b4b3-15e9-a411-dec630a0d859.png)


# 考察
今回、anomaly detectionとdynamic rulesを試してみました。ジョブのミスなど早々に気付けるようになりそうです。とても良いですね。

# 参考

https://aws.amazon.com/about-aws/whats-new/2023/11/aws-glue-data-quality-anomaly-detection-dynamic-rules/?nc1=h_ls

https://aws.amazon.com/jp/blogs/aws/use-anomaly-detection-with-aws-glue-to-improve-data-quality-preview/