インフォマティカのCloud Data Profilingでデータプロファイリングしてみた（その3） ～クレンジングしてみた🧹～

# 1. はじめに

以下の記事ではプロファイリングを行い、データの問題を確認しました。

https://qiita.com/tsuru_/items/ed4e349ebee56b9ae08c

何が問題なのかが判明したので、それを受けてどのようにクレンジングを行っていくのかをこの記事では見ていきたいと思います。

# 2. クレンジング方針の検討

まずはプロファイリング結果のおさらいです。

| カラム名 | プロファイリング結果 |
|:-|:-|
| No  | :o: NULLなし<br> :o: 重複なし<br> :o: 数値型（桁数は1～4）  |
| last_name<br>first_name  | :o: NULLなし<br> :o: 重複はあるが問題ない<br> :o: 文字列型<br>:x: 半角スペースや全角スペースが含まれるデータが存在する（本来、半角スペース・全角スペースは含まれていはいけない）  |
| phone  | :o: NULLなし<br> :o: 重複なし<br> :x: 数値型がほとんどだが、文字列型のデータも存在する（本来は全て数値型）<br> :x: ハイフンと丸括弧が含まれるデータが存在する（本来、数字以外は含まれてはいけない）  |
| date_of_birth  | :x: NULLあり<br>:o: 重複はあるが問題ない<br>:o: 文字列型<br>:o: NULLでないデータは全てyyyy/mm/dd形式<br>:x: 未来の日付が入っているデータが存在する |
| address  | :o: NULLなし<br>:o: 重複はあるが問題ない<br>:o: 文字列型（桁数は3もしくは4）<br>:x: 都道府県名ではない値（具体的には"XXX"と"あああ"）が入っているデータが存在する  |

:x:は全て問題点ですので、「No」カラム以外は何かしらクレンジングする必要があります。
クレンジングの実装方法はいくつか考えられますが、今回は以下の方針でクレンジングを行います。

| カラム名 | クレンジングの実装方針 |
|:-|:-|
| No  | 何もしない（クレンジング不要）  |
| last_name<br>first_name  | クレンジングトランスフォーメーションを利用して、半角スペース、全角スペースを削除  |
| phone  | クレンジングトランスフォーメーションを利用して、ハイフンと丸括弧を削除  |
| date_of_birth  | 前回記事で作成したルール仕様（※1）を利用して、「有効日付」と出力されないデータは削除（※3）<br>（「NULL」や「未来日」となるデータは削除） |
| address  | 前回記事で作成したルール仕様（※2）を利用して、「VALID」と出力されないデータは削除（※3）<br>（都道府県名が正しくなくて「INVALID」となるデータは削除）  |

（※1）出力される値は「有効日付」、「未来日」、「NULL」の3種類。
（※2）出力される値は「VALID」、「INVALID」の2種類。
（※3）クレンジング後のデータからは削除するが、削除したデータはエラーデータとして別ファイルに出力する。

# 3. クレンジング処理の作成と実行結果

## 3.1 事前準備（クレンジングアセットの作成） 
「last_name」カラム、「first_name」カラム、「phone」カラムではクレンジングトランスフォーメーションを使いますが、そのためにはCloud Data Qualityの[クレンジングアセット](https://docs.informatica.com/ja_jp/data-quality-cloud/cloud-data-quality/current-version/_cleanse-assets_cloud-data-quality_current-version_ditamap/GUID-C960D872-A529-4F62-AAD1-4ABE3BB8A979.html)を作成しておく必要があります。
そのため、以下の2つのクレンジングアセットを用意します。

- 半角スペース、全角スペースを削除するクレンジングアセット（「last_name」カラムと「first_name」カラムで利用する）
- ハイフン、丸括弧を削除するクレンジングアセット（「phone」カラム用で利用する）

クレンジングアセットはマイサービスで「データ品質」を開き、続けて「新規...」、「クレンジング」をクリックすることで作成できます。
![2023-02-24-10-01-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/5f77cc2f-d9c3-8d05-c308-fa4002c3526e.png)

半角スペース、全角スペースを削除するクレンジングアセットの設定は以下です。
![2023-02-24-10-35-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/1c88e252-a8a1-7d6c-27e8-6c15c9b81ce0.png)
そして、ハイフン、丸括弧を削除するクレンジングアセットの設定は以下です。
![2023-02-24-10-36-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/0636aad4-c833-1ee4-e086-e5c4ed37a8b3.png)

事前準備はこれで終了です。

## 3.2 マッピングの作成

クレンジング処理というと何か特別の処理のように聞こえてしまいますが、やっていることは普通のETL処理です。そのため、クレンジング処理はCloud Data Integrationでマッピングを作成することで実現します。

マッピングを作成するためには、 マイサービスで「データ統合」を開き、続けて「新規...」、「マッピング」タブで「マッピング」をクリックします。
![2023-02-24-10-52-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/225631e3-d6db-aadd-857d-528c23c14ab9.png)
そして、以下のようなマッピングを作成します。
![2023-02-24-14-27-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/38712e32-8691-7417-a5d5-a5984047ba20.png)
各トランスフォーメーションの概要は以下の通りです。
| 番号 | 説明 |
|:-: |:-|
| ① | クレンジング対象の疑似顧客データ。 |
| ② | クレンジングトランスフォーメーションで「last_name」カラム、「first_name」カラムの半角スペース・全角スペースを削除する。 |
| ③ | クレンジングトランスフォーメーションで「phone」カラムのハイフン・丸括弧を削除する。 |
| ④ |  ルール仕様トランスフォーメーションで「date_of_birth」カラムの日付が未来日かどうか判定する（同時にNULLかどうかの判定も行う）。 |
| ⑤ | ルール仕様トランスフォーメーションで「address」カラムが正しい都道府県名かどうか判定を行う。 |
| ⑥ | エラー用のカラムを追加し、「date_of_birth」カラムが正しくないときは"DATE_ERROR"、「address」カラムの値が正しくない場合は"ADDRESS_ERROR"という値を入れる。 |
| ⑦ | エラーカラムをチェックして、エラーがなければクレンジング後データファイルに出力し、エラーがあるときはエラーデータファイルに出力する。 |
| ⑧ | クレンジングされたデータ。 |
| ⑨ | エラーと判定されたデータ。 |

## 3.3 実行結果の確認

マッピングを実行したところ次のような結果となりました。
![2023-02-27-15-10-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/5b1e49e0-58f3-7e85-3b3d-e1e8870f0ea8.png)
エラーデータに34件出力されています。
以下はエラーデータをExcelで開いて、わかりやすいように色をつけたものです。
![2023-02-27-15-40-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/e42aaa1e-0152-bb42-4c61-992dc2e01175.png)
たしかにどれも不正なデータであることがわかります。
（"DATE_ERROR"は「date_of_birth」カラムがNULLもしくは未来日となっているデータ、"ADDRESS_ERROR"は「address」カラムが不正な値となっているデータです）

:::note warn
人名や電話番号は全て架空のものです。
:::

それではクレンジングされたデータも見てみましょう。
クレンジング後のデータを対象にプロファイリングを行い、正しくクレンジングされているか確認します。

- **「last_name」カラム**
![2023-02-27-16-46-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/e1a8fc0d-bc49-4029-3d5c-b5cb43bca3b5.png)
半角スペースや全角スペースを含んだパターンがなくなっています。
<br>


- **「first_name」カラム**
![2023-02-27-16-48-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/57d0283f-26fd-28cf-b2b1-d9f3cbf6e2ed.png)
こちらも半角スペースや全角スペースを含んだパターンがなくなっています。
<br>


- **「phone」カラム**
![2023-02-27-17-01-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/e2cdda57-53d1-efb1-b88f-f1fdeb15e498.png)
ハイフンや丸括弧を含んだパターンがなくなり、すべて数値になっています。
<br>


- **「date_of_birth」カラム**
![2023-03-02-17-09-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/79e2a464-defc-2849-2023-80da265e749c.png)
「NULL」や「未来日」がなくなり、全て「有効日付」になっています。
<br>

- **「address」カラム**
![2023-03-02-17-12-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/0872055b-a4f1-3395-a8b6-fd01db7777b4.png)
「INVALID」がなくなり、全て「VALID」になっています。
<br>

どのカラムも思った通りにクレンジングされました！

# 4. プロファイリング再び

「[3.1 事前準備（クレンジングアセットの作成）](#31-事前準備クレンジングアセットの作成)」では2つクレンジングアセットを作成しました。クレンジングアセットはプロファイリングのルールとして利用することができるので設定しておくことにします。

プロファイリングの画面を開き、半角・全角スペースを削除するクレンジングアセットを「last_name」カラム、「first_name」カラムに、ハイフン・丸括弧を削除するクレンジングアセットを「phone」カラムに設定します。
![2023-03-09-13-49-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/ed19e7f4-0321-01b2-6b3d-f8054be753d0.png)

この設定を保存して、改めてプロファイリングを実施すると以下のようにクレンジングされた結果が出力されます。
下図は「first_name」カラムに半角・全角スペースを削除するクレンジングアセットを適用した結果です。
![2023-03-09-13-50-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025212/850cc614-2f9f-229e-64d2-344b6394966a.png)

この記事では先にクレンジング処理を実施していましたが、クレンジング処理を実施する前にクレンジングアセットをルールに設定してプロファイリングをしておくと事前にクレンジングアセットの効果を確認できて便利です。

# 5. 最後に
クレンジング処理を実施してみました。淡々とクレンジング処理を実装して実行するだけで終わってしまいましたが、このように淡々と作業できるのは、事前にプロファイリングを行い、何が問題なのかを把握できているからです。事前のプロファイリングが十分に行われていないと、どんな処理を実装していいか検討することも難しいでしょう。プロファイリングは地味で時間のかかる作業なのでとても大変ですが、しっかりとプロファイリングを行うことはとても重要なことだと思います。


# 仲間募集中！

[NTTデータ Data&Intelligence事業部](https://enterprise-aiiot.nttdata.com/) では、以下の職種を募集しています。

<details>
<summary>1. 「クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)」の募集</summary>
クラウド/プラットフォーム技術の知見に基づき、ITアーキテクトまたはPMとして、DWH、BI、ETL領域における、ソリューション開発の推進や、コンサルティング工程のシステムグランドデザイン策定時におけるアーキテクト観点からの検討を行う人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=808
</details>

<details>
<summary>2. AI／データ活用を実践する「クラウド・ソリューションアーキテクト」</summary>
AI／データ活用を実践する「クラウド・ソリューションアーキテクト」として、クラウド先進テクノロジーを積極活用し、お客様のビジネス価値創出活動を実践。AI／データ活用の基本構想立案コンサルティングからクラウドプラットフォーム提供・活用を支援しています。お客様のAI・データ活用を支援するクラウド・ソリューション提案、アーキテクチャ設計・構築・継続活用支援（フルマネージドサービス提供）、および最新クラウドサービスに関する調査・検証で、クラウド分析基盤ソリューションのメニュー拡充を実施する人材を募集します。

https://nttdata.jposting.net/u/job.phtml?job_code=807
</details>

また、取り扱う主なソリューションについては、以下のページも参照ください。

# ソリューション紹介

<details>
<summary>1. NTTデータとInformaticaについて</summary>
データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。

https://enterprise-aiiot.nttdata.com/service/informatica
</details>

<details>
<summary>2. Trusted Data Foundationについて</summary>
～データ資産を分析活用するための環境をオールインワンで提供するソリューション～

https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。
</details>