Dataiku AcademyのAdvanced Prepare Recipe Usageをやってみました。（前編）

皆さん、Dataiku使ってますか？
私も少し前までは抵抗を感じることもあったのですが、日々使っていくことで、Dataikuの良さを実感しています。
Dataikuの良さは色々ありますが、真っ先に思いつくのは「レシピ」でデータ加工が簡単にできることではないでしょうか？
今回は、そのなかでも「Prepare（準備）レシピ」の発展的な使い方を紹介している、[Advanced Prepare Recipe Usage](https://academy.dataiku.com/advanced-prepare-recipe-usage)をやってみたので、その内容を紹介します。


## 対象の読者
明確な決まりはないですが、以下に挙げたレベル程度にDataikuに慣れ親しんでいると、内容がよくわかると思います。
- Dataikuの基本的な操作がわかる
- Dataikuでチュートリアルを実施したことがある

## Advanced Prepare Recipe Usageの内容について
このコースは以下の7つで構成されています。
・[The Prepare Recipe](https://academy.dataiku.com/advanced-prepare-recipe-usage/513254) - 導入
・[Handling Decimal Notations](https://academy.dataiku.com/advanced-prepare-recipe-usage/513255) - Dataikuの10進数表記について 
・[Enriching Web Logs](https://academy.dataiku.com/advanced-prepare-recipe-usage/513256) - ログの解析について
・[Applying Prepare Steps to Multiple Columns](https://academy.dataiku.com/advanced-prepare-recipe-usage/513257) - 複数列への同じ操作の適用について
・[Performing Joins in the Prepare Recipe](https://academy.dataiku.com/advanced-prepare-recipe-usage/513258) - データの結合について
・[Become a Master of Dataiku DSS Formulas](https://academy.dataiku.com/advanced-prepare-recipe-usage/513259) - 数式について
・[Custom Python functions in the Prepare Recipe](https://academy.dataiku.com/advanced-prepare-recipe-usage/513260) - データセットに対しての行単位の演算について

今回は、このうち「Handling Decimal Notations」「Performing Joins in the Prepare Recipe」の内容を紹介します。残りの項目は後編で紹介します。

## Handling Decimal Notations
一般的には、「1,234,567.89」 のような表記で、大数や小数の数値を表します。
しかし、国によってはこの表記とは限らないそうです。
（例えば、「1234567.89」「1 234 567,89」など。）
Dataikuでは、これらの数字をどのように扱うのでしょうか？
結論としては、Dataikuではコンピュータ記法の数字だけを、小数として扱います。
そのため、冒頭の「1,234,567.89」は、Dataikuでは数値ではなく、文字列として扱われます。

下記の例を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/58b9e199-3af6-4ac2-9c7c-b882b2594c67.png)
左側のus_notationのカラムの意味は、「Decimal（10進数）」と予測されていますが、最初の2つの値が無効（背景色が赤）となっています。
一方、fr_notationのカラムについては、「Decimal (comma) 」の意味を予測しています。
Dataikuでは、このような国による標記の違いを統一する仕組みがあるようです。

実際に、Prepareレシピでそれを実現できました。
fr_notationのところでクリックすると、画像のようにタブが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/85fb25cf-894e-37f0-6f25-fdc14b226b21.png)
この中央付近に「Convert French format to regular decimal」という項目があるので、それをクリックします。
すると、下の画像のように、自動で表記が修正されました。
また、カラムの意味もDecimal(comma)から、Decimalに変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/8a551ae1-2385-889a-d7b5-a414d125b78f.png)

また、us_notationの列も、修正することができます。
「+ ADD A NEW STEP」>「Convert number formats」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/d430cf70-bd8f-4b62-8a04-2e9a70a8d745.png)

Convert number formatsで、下記のように設定を行います。
・Column 「us_notation」
・Output column 「us_notation_converted」
・Input format 「English」
・Output format 「Raw」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/53cc6b77-f7c7-db4c-98b4-da8b600cd558.png)

すると、下記のように新しいカラムが作成されます。
先ほどのfr_notationもfr_notation_convertedとして新しいカラムを作成しました。
これで、同じ数値で異なる表記が異なる場合でも、それを統一できることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/3c9395e1-9c46-34ee-313e-a211114f5608.png)

以上の方法で、私たちとは異なる数値表現をするデータに出くわした際には、このようにボタン一つで解決ができそうです。


## Performing Joins in the Prepare Recipe
Dataikuでデータセットの結合を行う場合、何を選択されているでしょうか？
結合を考えるとき、真っ先に思い浮かぶのがJoinレシピだと思います。しかし、比較的小さなデータセットの左結合の場合は、Prepareレシピを使用して実行することができます。
また、Prepareレシピでは、ファジー結合とジオ結合を実行することもできるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/13a6a415-ab8a-721b-19b6-4482c92c38d9.png)

「Haiku-Tshirts」チュートリアルのデータを参考に確認してみましょう。
「Orders」データセットを選択し、prepareレシピを選択します。Output datasetの名前「Orders_prepared」として、レシピを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/7292d31a-06b3-080e-ebbc-67c3a6d39b27.png)

画面左下の [+ ADD A NEW STEP] から、[Processors library] の [join] にチェックを入れると、joinレシピの選択肢が3つ出てきます。その中から、[Join with other dataset(memory-based)] を選択します。この機能は、その名の通り、同じプロジェクト内の別のデータセットとの結合を実現してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/2e0a121a-9862-5473-4d5c-f54416af02c7.png)

このステップでの各設定は以下のようにします。
 ・Join column　「customer_id」
 ・Dataset to Join with　「Customers」
 ・Join column(in other dataset)　「customerID」
 ・Columns to retrive　「gender」「ip_address」
 ・Prefix all copied column names with this　「join_」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/d87e77fb-6bc6-8bfc-fba3-950f918d0a22.png)
以上のステップを加えると、「別データセットCustomersの列 customerIDと、このデータセットの列 customer_idを結合する」という指定ができました。

これを反映したデータセットを見てみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652854/99f55d4d-0677-141e-346b-49cead08b1bb.png)
右側二列に、Customersデータセットから持ってきたデータに「join_」を付けたカラム「join_gender」「join_ip_address」が作成できました。

簡単なデータの結合の場合は、このようにPrepareレシピで実施することで、フローが大きくならずに済みそうです。



## まとめ
今回行ったチュートリアルでは、Prepareレシピの便利な使い方が紹介されていました。Dataikuには、まだ知らない便利な機能がたくさんあるんだなと実感しています。後編では、このチュートリアルの残りの項目について紹介します。