今回はクエリパイプラインについて、ざっくり理解しつつまとめていきたいと思います。
Tableauをやるならクエリパイプラインは暗記すべし! 的な記載もよく見かけますが、今回はまず、
「クエリパイプラインってなんのこっちゃ」
「なにがそんなに大事なのさ?」
というところが理解できれば良いくらいの温度感で整理したいと思います。
ので、あまり細かいところは書きません。
クエリパイプラインってなんのこっちゃ?
クエリのパイプライン…?
Tableauの用語ってわりと日本語訳されてることが多いと思うんですが、こいつはカタカナ語のままなのでなんとなくイメージしづらい用語だなと思います。
端的に言えば、Tableauがデータを取ってきて表示するまでの処理順 のことです。
何かの機能名とかではなく、概念を指す言葉なのです。
公式ドキュメントには↓の図が載っていますが、この順番に処理が進んでいくよー、ということですね。  (出典 https://help.tableau.com/current/pro/desktop/ja-jp/order_of_operations.htm)
日本語ドキュメントだけどこの図は英語なのでちょっと身構えてしまいますが、例えばDimension Filters(ディメンションフィルター)はTable Calc Filters(表計算フィルター)より上にある(=先に実行される)とかがわかります。
なんだそれだけか、という感じ。
特に難しい話ではありませんね。
なにがそんなに大事なのさ?
では、Tableauの処理の実行順が、なんでそんなに大事なのか?という話です。
Tableauが勝手にやるんだから別に知らなくていいじゃん、と思わなくもありませんが、これを理解しているとしていないとでは、Vizを作る上で
「ああ! もう! なんでそうなるんだよ!」
と憤怒する回数が大きく変わってきます。
例 フィルターしたら表計算の値が変わった!
個人的によくぶつかるのが、表計算でうまく行かないケースです。
なぜかというと、上記のクエリパイプラインの図にあるように、表計算(Table Calc)は実行順がかなり下の方。
つまり、他の計算の影響を受けやすい位置にいるからです。
例えば、サブカテゴリごとに表計算の「合計に対する割合」を使って↓のようなグラフを作るとします。
よしよし、家具と事務用品だけになったな!
…と思ってよく見ると、「椅子」の値が21%になっています。
フィルターをかける前は13%だったのに、値が変わっている! となるわけです。
この挙動を期待していたなら万事OK!なのですが、あくまで全カテゴリの中の割合をみたいケースでは、困ってしまいます。
なんでこうなるのか?
お察しの通り、21%というのは家具と事務用品カテゴリの合計に対しての割合です。
家電がなくなった分、分母が減ったので相対的に椅子の割合が増えたわけですね。
クエリパイプラインの話で言うと、
- カテゴリのフィルター(ディメンションフィルター)を適用して、家電を除外する
- 「合計に対する割合」の表計算を適用して、割合を計算する
と言う順序なので、割合を計算する時点で家電が既に除外されてしまい、家具と事務用品だけの件数を100%とした値になるわけです。
どうすればよい?
これを解消するには、フィルターと割合計算の順番を逆にする必要があります。
「合計に対する割合」の計算式を見てみると、↓のようになっています。
SUM([売上]) / TOTAL(SUM([売上]))
分子であるSUM([売上])
は、サブカテゴリのディメンションの影響を受けて、サブカテゴリごとに売上合計になります。
そして分母の方にあるTOTAL
関数は、各ディメンションのSUM([売上])
の合計を求める表計算関数です
こいつが表計算関数なので、ディメンションにフィルターがかかった後、つまり「家電」カテゴリが除外された後に実施されることになります。
なので、この分母を求める式を変えて↓のようにしてみます。
SUM([売上]) / MAX({FIXED: SUM([売上])})
{FIXED: SUM([売上])}
は、LOD関数であるFIXED
を使って、ディメンションで区切らずに(つまり全体の)売上合計を求めています。
ちなみに、LOD関数はその結果が非集計として扱われるため、集計関数であるSUM([売上])との混在ができません。
なので、無理やり集計関数にするためにMAXをつけています。(値は全て同じなのでMINでもAVGでも良い)
話を戻すと、このFIXEDを使った表現は、ディメンションをまたいで合計を求めると言う点ではTOTALと同じですが、クエリパイプライン上では大きく意味が異なります。
前述のクエリパイプラインの図をみると、FIXEDの処理はディメンションフィルターよりも1つ上に位置しています。
つまり、このFIXEDを使った合計の計算は、「家電」カテゴリを除外する前の全カテゴリを対象とした合計になるわけです。
Vizの方を変更してみると、今度は想定どおり、椅子が13%のままで家電カテゴリを除外できていることがわかります。
まとめ
Tableauのデータ処理順であるクエリパイプラインが、Vizを作る上でどう影響してくるかのなんとなくのイメージがつきましたでしょうか?
特にフィルター周りで、期待していた結果となんか違う! というケースは、このクエリパイプラインが関係している場合が多いと思います。
パイプラインを丸暗記はしなくても良いと思いますが、怪しいなと思ったらあの図を参照してみるということができれば、課題解決力がぐんとアップするはずです。
この記事で6本目なのでDataSaberのお題としてはクリアなのですが、やっぱり記事にアウトプットすると自分の理解もクリアになるので、ゆるりと続けていきたい気持ちです。