Glue DataBrewを試してみた

# 背景・目的
私は最近、機械学習（※1）を学び始めているデータエンジニアです。
まだまだ初心者ですが、機械学習では学習前にデータの欠損や外れ値の除去、およびスケーリング等の処理が重要と学びました。
そこで、[2020年の11月頃に発表されたAWS Glue DataBrew](https://aws.amazon.com/jp/blogs/news/announcing-aws-glue-databrew-a-visual-data-preparation-tool-that-helps-you-clean-and-normalize-data-faster/)を使用して、機械学習の前処理として何ができるを確認したいと思います。

※1 最近まとめた記事は以下のとおりです。
- [【初心者】データのスケーリングを調べてみた](https://qiita.com/zumax/items/ca7184dcf4e7fd242128)
- [【初心者】探索的データ解析とは何かを調べてみた](https://qiita.com/zumax/items/52c97307bf18f407bb6e)

# まとめ
- Databrewを使うことで、データの特徴をインタラクティブに、素早く把握することが出来ます。

# 概要
## Glue Data Brewとは
- AWS Glue DataBrew（以降、DataBrewと呼びます。）は、コードを書かずに以下のことができる視覚的なデータ準備ツールです。
    - クリーンアップ
    - 正規化
- 分析と機械学習（ML）用のデータの準備にかかる時間を最大80％短縮できるとのこと。
- 250を超える既製の変換から選択して、以下を自動化できるらしいです。
    - 異常のフィルタリング
    - データの標準形式への変換
    - 無効な値の修正
- ビジネスアナリスト、データサイエンティスト、およびデータエンジニアなどの各ロールのコラボレーションを助け、生データから洞察をることができるとのことです。
- DataBrewはサーバーレスのため、インフラ管理が不要。
- 直感的なDataBrewインターフェースで、、生データをインタラクティブに検出、視覚化、クリーンアップ、および変換できる。
- DataBrewは、見つけるのが難しく、修正に時間がかかる可能性のあるデータ品質の問題を特定するのに役立つ提案を行う。
- DataBrewがデータを準備することで、時間を使って結果に基づいて行動し、より迅速に反復することができます。
- 変換をレシピのステップとして保存できます。これは、後で他のデータセットで更新または再利用でき、継続的に展開できます。

## コンセプト
- DataBrewには、以下のコンセプトがあるようです。

### Project
- DataBrewのインタラクティブなデータ準備ワークスペースはプロジェクトと呼ばれます。
- データプロジェクトを使用して、関連するアイテムのコレクション（データ、変換、スケジュールされたプロセス）を管理します。

### Dataset
- データセットとは、単にデータのセット、つまり列またはフィールドに分割された行またはレコードを意味します。
- DataBrewプロジェクトを作成するときは、変換または準備するデータに接続するか、データをアップロードします。 
- DataBrewは、フォーマットされたファイルからインポートされた任意のソースのデータを処理でき、増え続けるデータストアのリストに直接接続します。
- DataBrewの場合、データセットはデータへの読み取り専用接続です。 
- DataBrewは、データを参照するための一連の記述メタデータを収集します。 DataBrewが実際のデータを変更または保存することはできない。

### Recipe
- レシピは、DataBrewに作用させたいデータの一連の指示またはステップです。
- レシピには多くのステップを含めることができ、各ステップには多くのアクションを含めることができます。
- レシピの完成品を確認する準備ができたら、このジョブをDataBrewに割り当ててスケジュールします。 
- DataBrewはデータ変換に関する指示を保存しますが、実際のデータは保存しません。
- 他のプロジェクトでレシピをダウンロードして再利用できます。レシピの複数のバージョンを公開することも可能とのこと。

### Job
- レシピを作成したときに設定した命令を実行することにより、データを変換する仕事を引き受けます。
- これらの命令を実行するプロセスは、ジョブと呼ばれる。
- ジョブは、事前設定されたスケジュールに従ってデータレシピを実行に移すことができる。(オンデマンドでジョブを実行することも可能。)
- 一部のデータをプロファイリングする場合は、レシピは必要なく、その場合は、プロファイルジョブを設定してデータプロファイルを作成できる。

### Data lineage 
- ビジュアルインターフェイスでデータを追跡して、データリネージと呼ばれるその起源を特定する。
- このビューは、データが最初に来た場所からさまざまなエンティティをどのように流れるかを示しています。その起源、影響を受けた他のエンティティ、時間の経過とともに何が起こったか、どこに保存されたかを確認が可能とのこと。

### Data profile
- データをプロファイリングすると、DataBrewはデータプロファイルと呼ばれるレポートを作成する。
- このサマリでは、以下を説明する。
    - コンテンツのコンテキスト
    - データの構造
    - 関係
- データプロファイルジョブを実行することにより、任意のデータセットのデータプロファイルを作成可能とのこと。

# 実践
- [Getting started with AWS Glue DataBrew](https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/getting-started.html)を参考に実践してみます。

## Prerequisites
- 設定済みなのでスキップします。

## Step 1: Create a project
### トップページ
- DataBrewのマネコンで、「プロジェクトを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cb0739b1-39b6-a2a9-4814-b622d5c82af7.png)

### プロジェクトの作成
- プロジェクトの詳細で、以下を入力します。
    - プロジェクト名：chess-project
    - レシピ名:chess-project-recipe（※サジェストで勝手に入ります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8c77b09c-7354-84e5-7924-6e62a42209cb.png)
- データセットを選択で、サンプルファイルを選択し、有名なチェスゲームの動きを選択します。
- データセット名は、chess-gamesが自動で入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0e20b535-ca47-eb99-9001-32290c919498.png)
- パーミッションで、「新しいIAMロールを作成」を選択し、新しいIAMロールのサフィックスで「Tutorial」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ad5bbddf-ded2-1be7-c6f0-c9656571d84d.png)

- 最後に、「プロジェクトを作成」をクリックすると、画面が切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fc60a12a-41ae-471e-723f-81095a09135b.png)
- 数分以内に、完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c1c2bd2f-92cb-7b76-9513-79aecb6fa225.png)

### 眺めてみる
- 画面上部を見ると、17カラム、500行のデータセットがあることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eff5faa4-1917-2122-089a-f0af46205b36.png)

- グリッド。各カラムのサマリが上部に、下には、各データが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/844923a5-eeef-5dcf-6405-867ede01e5d8.png)

- スキーマ。各カラムのデータ型、品質（これはなんだ？）、値の分散、数値については、Boxプロットが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/95901f12-a247-f89c-f2fe-3570344da6ef.png)

- プロフィール。データプロファイルを実行のボタンがある。この先のチュートリアルで実行しそうなので、現時点では触れるのは控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2050be9c-8764-64d0-cbe5-21a05a36f51a.png)

## Step 2: Summarize the data
### フィルタリング
- WhiteとBlackのレーティング1800以上のデータに絞り込みます。
- フィルタを選択し、条件別＞次以上をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9fdf9db5-41d2-ab34-2fe6-4722371f4f51.png)

- 右にフィルター値のペインが表示されるので、カラムをwhite_rating、フィルター条件に1800を入力し、適用をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/788b8ffb-59e4-b501-8743-3d074d4108a4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b31f2420-8c2e-1fa9-72f3-45e5ebe3e12a.png)

- 上記と同様の手順で、カラムをblack_ratingを選択し、フィルター条件に1800を入力し、適用をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d9811edb-7ec2-b964-7930-6c1da990a6bb.png)

### サマライズ
- 各サイド（ブラック、ホワイト）が勝った数をサマライズします
- ツールバーのグループをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8e41eab0-f735-2014-eef3-5ad032ccc04e.png)

- グループに以下を入力します。
    - 1行目の列：winner、集計：グループ化
    - 2行目の列：victory_status、集計：グループ化
    - 3行目の列:winner、カウント（数）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/49399a2f-367b-d570-2de9-55d0be59db24.png)

- グループタイプを「新しいテーブルとしてグループ化」を選択すると、プレビューが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8a6abc2f-2cbd-7672-9d4a-1f61c9a97c5b.png)

- 最後に、終了をクリックすると、画面が切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b516c412-0739-986d-49c8-6a3d68e639c7.png)

- レシピペインで発行をクリックします。
- レシピの公開でバージョンの説明欄に「First version of my recipe」と入力し、発行をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6a1da521-88b3-b2f7-13d8-cf6de8fd07a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/faca1a8e-8924-13af-a608-b97568c219ad.png)

## Step 3: Add more transformations
- 条件を変更し、別バージョンとしてレシピを公開します。

### フィルターの追加
- フィルターをクリックし、条件別＞「次ではない」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aa77ef37-f6b1-01f7-74ab-fb994a9480ef.png)

- フィルター値に、以下の条件を入力し「適用」をクリックします。
    - ソース列をvictory_statusを選択する。
    - フィルター条件に、次ではない
    - 個別の値でdrawを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ebb84133-81e4-7c7b-6a42-67edb85687e9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/de3259b3-bc51-e1de-6ee2-57b486c948ed.png)

### 値の置換
- 意味のある値に置換します。mateをcheckmateに置換します。
- クリーン＞値またはパターンの置き換えをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5a229fbd-872a-dc49-fc62-9a080285eac6.png)
- 右のペインが表示されるので、以下を入力し適用をクリックします。
    - ソース列：victory_status
    - 置き換える値を指定します：値またはパターン
    - 置き換える値：カスタム値を入力で「mate」
    - 値に置き換えられる：「checkmate」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e200cc0d-2404-ad8c-41d7-5a54ea329647.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c5b09725-7b81-7e19-be3b-fc4f73c3b105.png)

- 真ん中の列「victory_status」の値が、checkmateに置きかわりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5d498495-be3d-5053-de3b-60723822e649.png)

### 2つ目の置換（regign → other player resigned）
- 上記と同様に、置換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3e9ab37e-c5f1-278e-4e55-913a8c5133cb.png)
- 変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/77855345-02c6-343f-a397-2a24f5aa5dc3.png)


### 3つ目の置換（outoftime → time ran out）
- 上記と同様に、置換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2f64f1c1-5ae2-01aa-ca61-09d07e86326d.png)
- 変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/803fc62e-fc3c-a8d8-5356-48ff9bc77dc4.png)


- 最後に発行をクリックし、レシピを公開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/586d40aa-6885-566e-ea95-6e49061883bb.png)

## Step 4: Review your DataBrew resources
- DataBrewリソースを確認します。

### データセットの確認
- ナビゲーションペイン（画面左）のデータセットをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4eddcf52-f30e-3edd-1445-aee6f08927e0.png)
- S3にxlsx形式で保存されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/61ce17ed-2582-2a9b-cf9b-69758e843a98.png)
- データセット名をクリックすると、詳細が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/21f9b70f-4141-70f7-8d21-4ee2f22b4eb7.png)
- データ系列タブをクリックすると、系統が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/25d40b81-db6d-c824-0e34-24944196bf9c.png)
- CloudTrailログをクリックすると、イベントが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/85b15b9c-b27d-72ca-a6b5-c9c368fb4fda.png)

### プロジェクトの確認
- ナビゲーションペイン（画面左）のプロジェクトをクリックします。
- プロジェクトの一覧が確認できます。
    - 先程作成した、プロジェクト、関連付けたデータセット、アタッチされたレシピが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cf7d264b-060e-9945-c27a-bd20092f4391.png)

- レシピ名をクリックすると、以下の内容が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a3cfa1bb-c17f-711e-ed7a-6c262c58d28a.png)

### レシピの確認
- ナビゲーションペイン（画面左）のレシピをクリックします。
- レシピの一覧が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/af128923-063c-c0d6-aa96-6770c111a3d8.png)
- レシピをクリックすると、レシピの内容が確認できます。左側には、現在のバージョンと、最初（1.0）のバージョンが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/81fd7f5a-32c8-8f9f-6cf4-8d928bb4f7ab.png)
- バージョン1.0をクリックすると、以前のレシピのステップが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a7d83dfb-ff9e-c8e0-aa11-2ee4b0b4316c.png)
- データ系列タブをクリックすると、系統が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0d679f83-f3c4-d7de-de53-f0633ffbe870.png)

## Step 5: Create a data profile
- プロファイルを作成します。
- ナビゲーションペイン（画面左）のジョブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a51dc089-71be-351e-845b-a687d9e50654.png)
- 未だ何もありません。ここでプロファイルジョブのタブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aeefb249-e189-94ba-d9e4-2dbb02be7a15.png)
- 「ジョブを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f03a94f3-bd7a-0939-b52d-1f5fbbc6e57f.png)
- 以下を入力します。
    - ジョブの詳細：ジョブ名に「chess-data-profile」
    - ジョブタイプ：「プロファイルジョブを作成する」
    - ジョブ入力：データセットを選択「chess-games」
    - ジョブ実行サンプル：そのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4f3658f1-1918-7409-0aa3-29b1229270dd.png)

- ジョブ出力設定では、以下を入力します。
    - S3バケット所有者アカウント：現在のAWSアカウント
    - S3の場所：自分のバケット

- Permissionでは、事前に作成したロールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3090ca32-adab-205e-5b45-fe05103d3cad.png)

- ジョブを作成し実行するをクリックし、しばらくするとジョブ実行履歴画面に切り替わり、実行ステータスが「実行中」であることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3988f0ec-0413-2ffb-4444-09ab1e056c30.png)

- しばらくすると、成功に変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fc165f69-bd2a-db17-b6bb-9de61ee873e4.png)

- プロフィールを表示をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/987dc933-a716-9dd5-810b-8a1596461700.png)

### プロファイルの確認
#### サマリと相関関係
- 重複行が5件あることがわかりました。欠損はありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bcaed61e-58c3-e19a-848e-df80a58b9a82.png)


#### 値の分布を比較
- スケーリング（正規化）されて表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5e6ba284-69ef-261b-6cae-132c3b1d0cab.png)

### 列の統計
- 列の統計タブをクリックします。
- データインサイトでUnique、外れ値、欠落が分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6176ea0b-fc85-5877-93c1-311e9f48488d.png)

### データ系列
- データ系列タブをクリックします。
- 系列が分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/75ce3068-a8d4-8d36-6e70-899d95f3a4d1.png)

## Step 6: Transform the dataset
- データセット全体を書き換えるジョブを作成します。

### To create an S3 bucket and folder to capture job output
- 出力用のs3バケットに、databrew-outputフォルダを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c6b11022-b437-6150-b5c7-86e7a20485ca.png)

### To create and run a recipe job
- レシピジョブを作成します。
- ナビゲーションペインで、ジョブを選択＞レシピジョブタブで、ジョブを作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/47b1fc65-e848-27bb-f497-fb81488ad1b9.png)

- ジョブの作成画面では、以下を入力します。
    - ジョブ名「chess-winner-summary」
    - ジョブタイプ：レシピジョブを作成
    - ジョブ入力：データセット
    - データセット名：chess-games
    - レシピ名とバージョン：chess-project-recipe2.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ecb35b3e-0d75-d33b-57e0-29bae5183b03.png)

- ジョブ出力設定では、以下を入力します。
    - 出力先：S3
    - ファイルタイプ：CSV
    - 区切り文字：カンマ
    - 圧縮：None
    - S３の場所：s3://バケット名/databrew-output/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/47f85818-60fe-0cc9-2793-478aeb93adf2.png)

- Permissionにロール名を指定して、ジョブを「作成して実行する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3d2860a5-7a5e-1129-0b36-c51269447e93.png)
- 完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/95c87c67-2e3a-e1fd-e084-cde890b74345.png)

### ファイルの確認
- 出力先バケットのフォルダに、CSVファイルが出来ていました。一つ選びS3SELECTを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a0623eaa-764a-beaf-e8eb-8f280214030c.png)

- 結果が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1a3ed0ab-c22b-165e-5b0f-c966f51306b1.png)

# 考察
- Dataｂrewを使うことにより、データの特徴が可視化され、探索的データ解析が簡単に楽にできると感じました。
- また、ジョブを実行することで前処理も簡単にできそうです。
- 今回、チュートリアルとして動かしましたが、次回以降は、プロダクションレベルで利用ができるか。具体的には、GlueのPySparkなどと組み合わせながら実行できるか。またはどのような前処理ができるのか等を確認したいと思います。

# 参考
https://aws.amazon.com/jp/blogs/news/announcing-aws-glue-databrew-a-visual-data-preparation-tool-that-helps-you-clean-and-normalize-data-faster/

https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/what-is.html

https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/getting-started.html