Tableau Prep の使い方 - LOD 表現的な計算をしてみる

#Tableau Prep とは
[Tableau 社](https://www.tableau.com/ja-jp) が提供している データ準備ツール です。元々 Project Maestro というコードネームで開発が進められていましたが、2018/4/24 に Tableau Prep として製品版がリリースされました。Tableau Desktop を使っているユーザであれば誰でも使えるようになってます。
データ加工をフロー形式で定義することができるため、可読性、生産性の高いツールになってます。詳細は製品ページを参照ください。
[製品サイト](https://www.tableau.com/ja-jp/products/prep)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/97b25e9a-c6b2-3ffe-63ac-ecffe2fb2b29.png)

#LOD 表現 とは
Tableau ではビューの表示に使われるディメンションの粒度とは異なる粒度で集計テーブルを作成できる機能があります。 LOD 表現と呼ばれ、従来の BI ツールでは中間テーブルを作成しないと表現ができなかった計算を実現できます。
[LOD 表現トップ 15](https://www.tableau.com/ja-jp/about/blog/LOD-expressions)

ただし、データ量が多くなった場合や複雑な計算をする場合に、レスポンスタイムが落ちてしまうことがある、というのが LOD 表現を使用する際の注意点となります。

#Tableau Prep で疑似的に LOD 計算をしてみる
ようやく本題に入ります。動的に LOD 表現をするとレスポンスタイムが落ちる場合があるので、 Tableau Prep で前処理をしてしまいましょう。
Tableau Prep では Tableau Desktop の関数がほぼほぼ使えるのですが、現在提供されているバージョンでは一部対応していません。~~その中でも LOD 関数と呼ばれる、Fixed、Exclude、Include 関数は未対応です。ただ、そもそも LOD 表現というのはビューと異なる粒度の集計テーブルを一時的に作るものであって、 Tableau Prep においてはフローの中でそれらのテーブルを定義してしまえばよいのです。
[How to mimic the magic of LOD expressions in Tableau Prep](https://www.tableau.com/about/blog/2018/5/how-mimic-magic-lod-expressions-tableau-prep-88650)~~

2019/11 追記: Tableau Prep Builder 2019.4.1 にて Fixed 関数 に対応しました。


---以下は古い情報となりますが、役立つ部分もあるかと思いますので、そのまま残しておきます---

##顧客ごとの直近売上金額に応じて顧客属性の判定を行う
LOD 表現に慣れている方であれば、Fixed 関数を使って顧客ごとの売上金額を下記で表現できることは想像できるかと思います。
```{Fixed [顧客ID] : SUM([売上金額])}```

この式を組み合わせて直近の売上金額が高い人を判定して、ロイヤルカスタマーとしてフラグを立てる、といった感じです。
この流れをおなじみのサンプルスーパーストアを使って Tableau Prep で表現してみましょう。
###今四半期の顧客ごと売上を集計
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/41f5a3fb-53d2-dedb-d053-226532e14239.png)
・Tableau Prep を起動し、サンプルスーパストア.xls に接続します。注文表をドラッグアンドドロップで定義します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/f3a2d00f-01da-7a05-3c0d-31c8427618e2.png)
・Tableau Prep ではフローの定義を進めていく中で快適に動作するよう、データをサンプリングしています。今回の Excel ファイルのようにデータ量がそれほど多くない場合は Data Sample から、 Use all data を明示的に指定すると、フローの中ですべてのデータを扱うことができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/91b8a6ff-9a1e-9bc7-7e59-b5f800bf30d2.png)
・Add Step を選択し、データの加工をはじめていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/8bf114a2-13b2-8601-110b-d5424f819be8.png)
・オーダー日 列で右クリックし、 Filter -> Relative Dates を選択します。これにより相対日付での絞り込みができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/b40c6f6f-737c-272b-5525-4efb903c7941.png)
・Quarters -> This quarter を選択し、現四半期におけるデータに絞り込みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/44688bea-6025-e84d-d283-0bae36f9352b.png)
・Add Aggregate を選択し、データの集計を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/a8250697-0b15-d385-1b3f-cda137be06e5.png)
・Grouped Fields に オーダー日、顧客 ID を選択、Aggregated Fields に 売上 を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/c8c1ab77-9ff9-4ec1-0c81-159dee04c51a.png)
・オーダー日 を四半期として扱いたいので、GROUP をクリックして、Group by level -> Quarter Start を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/bb3a5335-ae58-654e-c9e3-586dcd20e0b0.png)
・Add Step をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/c2f966f0-2cc4-0dfe-6c58-9a2e4c6c03cc.png)
・売上 列を 今四半期売上 に列名変更。
・オーダー日 を右クリック -> Remove Field で削除します。
・ここまでのタスクを日本語で説明を書きましょう。可読性が上がり、他の人がこのフローを見た際にどんな処理が組まれているかぱっと見でわかるようになります。
###前四半期の顧客ごと売上を集計
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/abf427c5-ea27-cefc-ffd7-0649f1e9b7da.png)
・最初に定義した 注文 表に戻って、 Add Branch をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/d19c8482-1fb6-6e09-9034-e4e7356258b3.png)
・これまでの流れと同じように、今度は前四半期の売上を顧客ごとに集計します。
###顧客 ID の重複排除
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/ff0b3e16-511e-96d4-7590-3f58c43f634e.png)
・最初に定義した 注文 表に戻り、 Add Aggregate をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/9edb7ec8-1b13-1154-d14d-3dba9cbcc152.png)
・ここでは顧客 ID のみを Grouped Fields にドラッグアンドドロップします。Aggregate (集計) の機能なのですが、このようにディメンションだけ置くことで重複排除にも使えます。
###顧客テーブルと顧客ごと売上テーブルを結合 (JOIN)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/2a3dc01d-939b-232d-b124-90b5a5d9c51f.png)
・今四半期の顧客ごと売上 を 重複排除された顧客 ID 表の右側にドラッグアンドドロップします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/bf9a90a8-4fa4-3ee8-cb83-5ce0de31cb43.png)
・Join Type は LEFT OUTER JOIN (左外部結合) とします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/9557c276-1ea6-4112-ffd2-c72367238bc2.png)
・同様に前四半期の顧客ごと売上 を先ほどの JOIN 結果テーブルの右側にドラッグアンドドロップし、LEFT OUTER JOIN (左外部結合) します。
###顧客属性の判定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/a3c02e54-080c-bc9c-817f-b785d9edcb36.png)
・JOIN 結果から、Add Step をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/a6b4b691-37e4-1a7c-06f5-4affcdc5f346.png)
・不要な列 (顧客 ID-1、顧客 ID-2) を削除します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/3789c1c6-8fbd-a1b3-b7b6-dffc12ed6489.png)
・Create Calculated Field をクリックして計算列を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/5c8e5c2f-c2f9-aa1b-3bce-32f435678b30.png)
・一見複雑そうに見えますが、中身は単純です。前四半期と今四半期の売上を比較して、顧客属性を判定します。
###アウトプットの作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/463a5cb1-1caa-41be-b9c0-0191b3a2abb8.png)
・判定結果テーブルを最初に定義した注文テーブルの右側にドラッグアンドドロップして、LEFT OUTER JOIN (左外部結合) します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/c9c25fe3-4527-cfcf-8e92-7199b236d6f5.png)
Join 結果から Add Output を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/f1ab1c7e-19a4-064f-48de-8d6e098c6ba8.png)
Tableau Prep からは Tableau Server/Online にデータソースをパブリッシュしたり、ファイル (.hyper, .tde, .csv) を吐き出すことができます。

##まとめ
Tableau Prep で LOD 的な計算をしてみました。サンプルスーパーストアはデータ量が少ないので、パフォーマンス、という観点では Tableau Prep で事前に集計・判定するメリットがあまり感じられないかもしれませんが、可読性という観点ではフローをたどることでどういったロジックで顧客属性を判定しているのか、というのは非常にわかりやすく実装ができているかと思います。

Tableau Prep はまだ初期リリースということもあり、今後の機能拡張に期待したいところです。とりいそぎ日本語 UI とスケジューリング機能は早く欲しいですね。今回はいきなり LOD ということで少し難しい内容かもしれません。UI が日本語化されたら初級者向けの使い方記事を書こうと思います。

##リソース
[Tableau Prepで出来る事のまとめ](https://dev.classmethod.jp/business/business-analytics/tableau-prep-matome/)
[Tableau Prep の使い方 - コマンドラインによる自動化](https://qiita.com/tab123/items/e7a37a683ad4bce234c5)
[Tableau Prep Online Help](https://onlinehelp.tableau.com/current/prep/en-us/prep_welcome.html)
[はじめてのTableau Prep](https://www.sharp-sbs.co.jp/bi/tableau-prep-text.html)