【Tableau】PerformanceのBest Practice③～計算フィールド～

前回・前々回の投稿の前置きでもお話ししましたが（以下既に読んでいる人はとばして下さい！）
Tableauはセルフ分析に優れており、データアナリストでなくてもビジュアライズを実現する事が可能です。　
そのため色んな立場の人がTableauに触れる可能性があるからこそ、パフォーマンスの知識を備え、皆が使いやすい環境を築いていくのが大切です。
今一度**「自分や周囲の人が作っているダッシュボードはPerformanceのBest Practiceを理解して作成できているか」**を考え、改善していくためのきっかけになれば嬉しいです。

今回は、実践で使える計算フィールドのパフォーマンス知識についてお伝えしていきます。

**■performance関連の投稿は3部構成（予定）**
・**[【Tableau】PerformanceのBest Practice①～基本要素を知る～](https://qiita.com/t_misaki1029/items/b473b4fdcbafeab0a2ab#form　"【Tableau】PerformanceのBest Practice①～基本要素を知る～")**
・**[【Tableau】PerformanceのBest Practice②～データソース～](https://qiita.com/t_misaki1029/items/e29e8c5e2b38c577d95a#form　"【Tableau】PerformanceのBest Practice②～データソース～")**
**・【Tableau】PerformanceのBest Practice③～計算フィールド～　←今回ここ！**

まだ過去のPerformanceのBest Practice①・②を読んでいない方は、よければ上記リンクから是非読んでみてください。

またTableauのバージョンが古いものを利用している場合、オプションが対応されていない場合があります。
ご了承ください。（投稿者は2020.2を利用していますので、それ以降のバージョンであれば問題ないと思います）

#■計算フィールドを理解する
Tableauにはいくつかの「計算」の種類があります。
ここで説明するのは**集計計算・行レベル計算・表計算**です。
前回のデータソースの投稿で**「DB側・Tableau側どちらの処理なのか？」がパフォーマンスを考慮する上で重要**になるとお伝えしました。
その為、以下の図を参考に**何がどこで処理されているのか？に注目**しながら、それぞれの計算式について確認していきましょう。
![計算種類.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/da956882-0e67-065b-e6d6-6054c3da6c75.png)


###行レベル計算
■どんな計算？
　・粒度がまとめられておらず、**行単位で計算式**が組まれているもの
　・行レベル計算は[スケーラビリティ](https://e-words.jp/w/%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3.html#:~:text=%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%81%A8%E3%81%AF%E3%80%81%E6%A9%9F%E5%99%A8%E3%82%84,%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B%E3%80%82#form　"スケーラビリティ")が高い
　　→DBチューニング思索が効果を出しやすいとも言われている

　ex )
　　・[Sales] / [Profit]
　　・IF [Sales]='0' THEN '〇' END

■どこで処理されている？
　**データベース側**で計算処理

###集計計算
■どんな計算？
　・**集計関数**を利用し、**粒度が集計**されている計算式。
　　※集計関数を単体で計算しているものも、集計関数を組み合わせて計算しているものも対象。

　ex )
　　・SUM([Sales])
　　・AVG([Profit])
　　・SUM([Sales]) / SUM([Profit])

　現在[Tableau で利用可能な集計関数](https://help.tableau.com/current/pro/desktop/ja-jp/calculations_calculatedfields_aggregate_create.htm#form"Tableau で利用可能な集計関数")は公式で確認できます。

■どこで処理されている？
　**データベース側**で計算処理

###表計算
■どんな計算？
　・ビューに表示されているものに基づいて **Tableau上で計算を行う**計算式。
　・行レベル計算や集計計算に比べてTableauの計算負荷が高い。
　
　現在[Tableau で利用可能な表計算関数](https://help.tableau.com/current/pro/desktop/ja-jp/functions_functions_tablecalculation.htm#form　"Tableau で利用可能な表計算関数")は公式で確認できます。

　ex )
　　・INDEX()
　　・RUNNING_SUM(SUM([Profit])) 

私は表計算関数を全て覚えていないので、簡易表計算の機能を良く活用しています。
![表計算.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/7c4b3ab9-0703-3777-0622-92a60dd39c69.png)

■どこで処理されている？
　データベースからクエリ結果を受取り、**Tableau**が計算処理

##パフォーマンスに関わるポイント
■データ型はパフォーマンスへの影響が大きい。整数が一番速い。
　**整数＞ブール＞文字列**

■パラメータ
　パラメータの値は**数値に置き換える**と良い。
　条件式でパラメータを参照する際に、文字列ではなく数値であることでパフォーマンスが向上する。
![パラメータ参考.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/74e09dad-7ce7-d80c-3d9a-01209696302e.png)

■ロジック計算にはブール値をうまく活用

 ex )
　・悪い例
　　　IF [DATE] = TODAY() THEN "TODAY" ELSE "NOT TODAY" END
　・良い例
　　　[DATE] = TODAY()

■文字検索の速さ
　**ワイルドカード照合＞CONTAINS()＞FIND()**

■行レベル計算と集計計算を分割
→一つの計算フィールド内で、行レベル計算を集計計算で囲うこともやろうとすれば可能
　しかしそれだと、再利用が難くなってしまうので分けた方が◎
　・計算フィールドで行レベル計算の作成を行い、その後新たな計算フィールドで集計計算を行う


##計算フィールドとTableauオプション機能どちらを選ぶ
**Tableauオプション機能(ネイティブ機能)は計算フィールドよりも速い**ことが多いです。
計算フィールドでは自由に計算式を組むことが出来るので、
つい何でも計算フィールドで済ませたくなる人もいるかもしれませんが
Tableauオプション機能を活用した方がパフォーマンスは向上します。
なぜならば、**Tableauの得意なSQLで動くように設計**されているからです。
参考として以下の機能があげられます。

■グループ
　・デイメンションメンバーのグルーピング

■別名の編集
　・デイメンションメンバーの名前変更

■ビン
　・メジャー値のカテゴリ化

##おわりに
今回、集計計算・行レベル計算・表計算のご紹介しました。

表計算は負荷は高いものの、複雑な計算が可能になるので用途によって使いこなしていく必要があります。
ここを完全理解し、思い通りに活用する事が自分的にはかなり大変で、まだまだ勉強中です。
その為、取り急ぎざっくりと特徴を記載しましたが、需要があればもっと具体的な活用例も追記しようかなと思います。