
Tableau 8つのハードルを越える㉜「LOD計算 その2 3種のLOD計算」

こんにちは
前号、「LOD計算 その1」では、粒度(LOD)とは何か解説させて頂きました。
前号はこちらです。
この記事作成に利用しているワークブックは下記にアップしています。
https://public.tableau.com/app/profile/satoshi.ganeko/viz/LOD_v2019_1/sheet0
さて、少し話は変わりますが、
Tableauの魅力は、ドラッグ&ドロップでこの粒度を自在に変え、自分の欲しい集計値を導き出し、分かり易く視覚化出来る事だと思います。
このように粒度が変わり、データを集計する部分の大きさが変化していく様子を
Tableauの資料(ホワイトペーパー:詳細レベル (LOD) 表現について)
https://www.tableau.com/ja-jp/learn/whitepapers/understanding-lod-expressions
では下図のように描いています。

最上段は、データ全体を全く切り分けず全体で集計する。つまり、粒度がもっとも粗いイメージです。
そして、下に行くほどデータが細かく切り分けられています。つまり粒度が細かくなっているという事です。
そして、最終的には、レコード一つ一つを全てバラバラにして扱うのが一番細かい粒度です。
例えば、「行ID」といった一行一行固有の値のディメンションがあり、それを粒度に利用した場合、1行1行バラバラに扱う事になります。いきなり行IDをVizに使えば、それだけで最も細かい粒度まで到達します。
そして、今、あるワークブックを作っていて、そのワークブックの粒度(Viz LOD)が下図、青部分の細かさとしましょう。

このワークブックを作っている時、「合計」や「平均」などメジャーの集計計算を行うと、このViz LODの細かさでデータが切り分けられ、集計が行われます。
通常、私たちはそのViz LODで集計した結果を用いてVizを作る事になります。
例えば、

などなど、集計計算をすると、すべてこのViz LODの粒度で計算されます。
多くの場合は、これで思うがままにVizを作れるのですが、
時々、このViz LODとは違う粒度で集計した値がViz作りに必要になる場合があります
そのような場合には、Viz LODとは違う粒度で集計計算を行わせる必要があります。
それならば、Viz LODを、その求めたい集計計算の粒度に変えてあげれば良いのでは?と思ったりしますが、Viz LODを変えると、ワークシート全体で集計計算の粒度が変わってしまいます。それはしたくないのです・・
そんな時に登場するのが「LOD計算」です。
LOD計算式の書き方は下記です。詳しい事は、この後解説しますが、まずは、こんな計算式なのか~ という点を感じて頂ければと思います。

例えば

などと書きます。
これを見ただけではさっぱり意味が分かりませんので、
具体的な意味を利用例とあわせて見ていきましょう。
Viz LODと違う粒度の集計が必要になる例 その1「粒度を追加したい!」
一つ目の例は、Viz LODより細かい粒度の集計が欲しくなる例です。
今、下記のVizで、カテゴリ毎の売上合計を表示しました。

そんなに難しいVizではないかと思います。
このVizでは、カテゴリ毎に売上の合計を集計しています。
Viz LODは「カテゴリ」のみです。
次に、見たい値をカテゴリ毎の売上合計ではなく、
「カテゴリ毎に見た、顧客別売上合計の中央値」にしたいと思います。
つまり、各カテゴリで、顧客毎にいくら購入しているかを集計し、その中央値を表示したいという事です。
(顧客の中には非常に高額の購入をしてくれている顧客もいそうなので、平均ではなく中央値で分析したいと思っています。)
この計算をするためには、データをカテゴリ毎に切り分けるだけでなく、顧客IDでも切り分けて集計する必要があります。
今のViz LODは「カテゴリのみ」なので、このままでは粒度が足りません。
このような場面で利用するのが、LOD計算。その中でも「INCLUDE」と言われる種類です。
INCLUDEは、Viz LODに別のディメンションを追加した粒度で集計を行う計算です。
書き方は、{ INCLUDE 粒度に追加するディメンション : 集計計算 } です。
今回は
{ INCLUDE [顧客 ID] : SUM ( [売上] ) }

となります。
イメージ図で考えてみましょう。LOD計算「INCLUDE」の働きは下図になります。
Viz LODに何か別のディメンションを加えた粒度で集計を行い、計算結果をViz上で利用する動きです。

具体的に、今回のVizでの流れを図示すると、

このようなイメージです。
この計算式[顧客毎売上_INCLUDE]を、列シェルフにあった合計(売上)の代わりに置きましょう。

上図、オレンジ枠のように、[顧客毎売上_INCLUDE]が合計され表示されました。
ここが合計のままだと、顧客毎の売上合計をさらに合計しているだけなので、元のVizの「カテゴリ別、合計(売上)」と同じ値です。
この集計方法「合計」を「中央値」に変更しましょう。

これで完成です(下図)。ラベルでも値を表示してみました。

さて、ここで一つ見て頂きたいのですが、作ったLOD計算式には
{INCLUDE [顧客 ID]:SUM([売上])}
と、集計であるSUM()が使われています。
その計算式をVizに置いて、さらに中央値にするという集計が行われています。
集計で求めた値を、さらに集計していますね。
この事はLOD計算で疑問を感じやすいポイントです。具体的な説明は、後の記事で行いますので少々お待ちください。
ここでは、INCLUDEで計算した結果を、Vizに持っていく場合はデフォルトで再び合計する設定となる。目的に応じ、この集計方法は設定する必要がある。とだけ、書かせていただきます。
*補足
今回、顧客別売上合計の中央値を表示するためLOD計算式を用いました。
もし、この表示したい値が「顧客別売上合計の平均」であった場合は、LOD計算式は必要なく
SUM(売上) / COUNTD(顧客ID)
つまり、売上合計を顧客IDの数で割ったもの、で求めることができます。
Viz LODと違う粒度の集計が必要になる例 その2「粒度を粗くしたい!」
続いては、Viz LODより粗い粒度の集計計算が欲しい例です。
今、下記のVizを作りました。

これは、
ディメンションに関しては、行にサブカテゴリ、色に地域、
メジャーに関しては、列に合計(利益)を置き
マークタイプを円にしたものです。
サブカテゴリ別に、地域毎利益合計がどう分布しているのかを表示したものです。
青丸の関西は、安定的に利益をあげている一方、黄丸の中部地方のテーブルで赤字が突出しています。
このVizのViz LODは、「サブカテゴリ と 地域」です。
このVizでサブカテゴリのラベルの横に、下図のようにサブカテゴリ毎の
地域全体での合計利益も表示したいと思ったとします。

この時、この表示したい「地域全体利益」は、データ全体をサブカテゴリ毎に切り分けし集計した値です。つまり、粒度が「サブカテゴリ」の集計計算をしたいのです。
一方、このVizのViz LODは、「サブカテゴリ と 地域」でした。
なので、このViz LODのうち「地域」が余計です。地域を粒度から取り除いて集計計算をしたいところです。
これも、Viz LODと違う粒度で計算したい場面の一例です。そして今回は、何かをViz LODから取り除き一段階粗い粒度にしたい例です。
この場面で利用するのが、LOD計算の中の「EXCLUDE」と言われる種類です。EXCLUDEは、Viz LODから何かディメンションを取り除いた粒度で集計を行う計算です。
書き方は、{ EXCLUDE 粒度から取り除くディメンション : 集計計算} です。
今回は
{ EXCLUDE [地域] : SUM ( [利益] ) }

となります。再びイメージ図で考えてみましょう。
LOD計算「EXCLUDE」の働きは、下図です。
Viz LODから何かディメンションを取り除いた粒度で集計を行い、計算結果をViz上で利用するという動きです。

具体的に、今回のVizでの流れを図示すると、

このようなイメージです。
この計算式 [地域全体利益_EXCLUDE] を、行のサブカテゴリの横に置き
不連続にすると

このようなVizになります。
さて、ここで上図のオレンジ囲みを見てみて下さい。作成した計算式
[地域全体合計_EXCLUDE]の集計方法が「属性」となっています。
計算式の中で
{EXCLUDE [地域] : SUM([利益])}
とすでに集計SUM()が使われていますが、Vizに利用するとき属性という集計計算が自動で行われています。ここについても、後の記事で解説いたします。
まずは、「EXCLUDEで計算した結果を、Vizに持っていくと自動で属性になる。特に変更の必要ない。」とだけ理解しておいて頂ければ大丈夫です。
Viz LODと違う粒度の集計が必要になる例 その3「Viz LODとは関係なく粒度を決めたい」
次は、LOD計算の中のFIXEDを利用する例です。FIXEDは、集計に利用したい粒度をViz LODと関係なく指定し、常にその粒度で計算を行うためのLOD計算です。
この例としては、コフォート分析と言われる例がとても有名ですのでご紹介します。
いま、年毎の売上を下記のVizにしました。

このVizのViz LODは、列に置かれた「年(オーダー日)」です。
この売上を、「それぞれの顧客が何年に新規顧客として購入してくれた顧客か」で色分けしたいと思います。
それぞれの顧客について、「何年に新規顧客として購入してくれた顧客か」は、
顧客ID毎に「MIN(オーダー日)」を計算すれば、求められそうです。
さっそく、計算式 MIN(オーダー日) を作り、これをマークの色に置いてみます。
すると、

上図のようになってしまいます。
現在のViz LODは、「年(オーダー日)」ですので、
それぞれの年の中で MIN(オーダー日) を計算し、色分けしてしまっています。それぞれの年で1月1日が計算結果になっています。
これは、求めたい値ではありません。
Viz LODは、「年(オーダー日)」ですが、行いたい計算の粒度は「顧客ID」です。Viz LODに何か加えるわけでも、取り除くわけでもありません。
こういう場合に利用するのが、LOD計算のFIXEDです。FIXEDは、Viz LODと関係なく粒度を決めて集計を行う計算です。
書き方は、{ FIXED 粒度に指定するディメンション : 集計計算 } です。
今回は
{ FIXED [顧客 ID] : MIN ( [オーダー日] ) }

となります。再びイメージ図で考えてみましょう。
LOD「FIXED」の場合、下図のイメージです。
Viz LODと関係なく粒度を決めて集計し、結果をViz上で利用するという動きです。

具体的に、今回のVizでの流れを図示すると、

このようなイメージです。
この計算式[顧客毎初回購入日_FIXED] を、マークの色に置くと

上図のように、各年の売上が[顧客毎初回購入日_FIXED]の年、で色分けされました。
これで完成です。どうやら、2015年に購入開始してくれた顧客が、大きな割合を占めているようですね。
さて、この例は、これまでのINCLUDE、EXCLUDEと例と大きく違う点があります。
それは、このFIXEDによる計算結果がメジャーでなく、ディメンションとして利用されている点です。
FIXEDの特徴として、結果をディメンションとしても利用できるという点があります。
なお、FIXED計算の計算結果をメジャーとして利用する場合には、INCLUDEやEXCLUDEの場合のように、Vizに利用するときに再び集計が必要です。これについても、後の記事で解説します。
以上、今回は3つのLOD計算
・INCLUDE
・EXCLUDE
・FIXED
の働きを解説いたしました。
ご精読ありがとうございます。
「LOD計算 その3」は下記になります。
*連載記事すべてへのリンクは、こちらのマガジンにまとめています。
By ritz_Tableau
2020-2023 Tableau Zen Master | 2019-2021,2023 Tableau Public Ambassador |2021 certified as Tableau Certified Professional | DATA Saber
X(Twitter) : @ritz_Tableau
Tableau Public : https://public.tableau.com/profile/satoshi.ganeko#!/
*記事の中に不正確な点などありましたら、是非、X(Twitter) Direct Messageでお知らせ下さい。よろしくお願いします。m(__)m

おことわり
当記事のコンテンツについて、商用利用でない場合は許可なく転載して頂いて構いません。(ハードル画像および他のサイトから引用している画像は除く)
転載の際は、当記事へのリンクを掲載し転載であることを明記してください。商用利用の場合は許可なく転載しないで下さい。
当記事のコンテンツについて、可能な限り正確な情報を掲載するよう努めていますが、誤情報が含まれたり、情報が古くなっている可能性があります。当記事に掲載された内容、および、当記事からリンクやバナーによって移動したサイトに掲載された内容によって生じた、損害等の一切の責任を負いかねますのでご了承ください。よろしくお願いします。