こんにちわ@Yoshimiです。
Tableauの初級から中級への一歩としてLOD計算・表現があります。
Tableauの紹介ブログでも多く見かけるLOD。LOD計算、LOD表現と呼称がありますが、本エントリーではLOD表現と呼称を統一していきたいと思います。
Contents
LOD(エルオーディー)表現とは
LODとは「Level of Detail」の頭文字を取ったものです。計算したいデータ集計の粒度(細かさ)をコントロールして表現することをいいます。通常、ビュー(ワークシート)に設定している「行」や「列」ディメンションの中から一番細かい粒度で計算を行います。
LOD表現が使えるようになるとVizの表現力もグッと上がり、よりユーザーに対して理解しやすいVizの提供が可能となります。
データを把握すること
Tableauはドラッグ&ドロップで簡単に可視化できるとはいえ、扱っているのはほとんどが表記式のデータです。ですので、どのようなデータなのか、「データの一行一行は何を意味しているのかを理解する」ことは非常に大切です。
まず、データを理解しましょう。
下記データは行idで一意のデータ、重複しないデータになっています。オーダーIDでも重複していないのでは?と思うかもしれませんが、1オーダーで複数購入していることもあるので、オーダーidで一意のデータ、重複しないデータにはなりません。
ですので、この場合のデータのLODは、行idです。と言えるかもしれませんが、可視化するのに、行idを使うことは少ないはずです。カウントするとかはあると思いますけどね。
実際に、実務レベルでLODを確認します。「1オーダーで複数購入していることもある」が確認できます。
オーダーidは同じですが、製品idが異なります。この場合、オーダーidと製品idを組み合わせることで一意のデータになります。従いまして、LODはオーダーid、製品idとなります。
LODが決まる場所
サンプルスーパーストアのデータを利用し、具体的にみてみましょう。
(1)メジャー「売上」を行シェルフに持っていきました。
データ全体の売上が縦棒グラフで表示されました。売上の合計が29,108,330であることがわかります。
(2)ここにディメンション「カテゴリー」を列シェルフに入れます。
カテゴリー別に売上合計が集計されました。
(3)さらに、ディメンション「サブカテゴリ」をマークの色に入れてみます。
カテゴリーごとの縦棒グラフに色でサブカテゴリに分かれました。
(1)〜(3)のデータ粒度は下記になります。
(1)データ全体の売上合計の集計:粒度(LOD)なし
(2)カテゴリー毎での売上合計の修正:粒度(LOD)はカテゴリー
(3)サブカテゴリー毎に色で区分けし、売上合計の修正:粒度(LOD)はカテゴリーとサブカテゴリ
となります。
冒頭で説明した通り、「ディメンションの中から一番細かい粒度で計算」がポイントです。
ディメンションを追加・削除することでLODは変化します。
具体的には、下記赤枠の部分に配置したディメンションで粒度が決定します。
LOD関数を使ってLOD表現を理解しよう
LOD表現をTableauで表現するには、3つの関数を利用します。
FIXED関数 | INCLUDE関数 | EXCLUDE関数 | |
---|---|---|---|
できること | ディメンションを無視したレベルで集計する | 粒度をディメンションより細かなレベルにして集計する | 粒度をディメンションより大きなレベルにして集計する |
粒度の変化 | 細かくすることも粗くすることも可能 | 細かくするのみ | 粗くするのみ |
計算フィールドを使い以下のような計算式を作成します。
{関数名 "ディメンション名" : "集計式"}
FIXED関数
FIXED関数はLOD関数の中では別格に利用頻度が多いです。
FIXED関数は、ビューの中で使われているディメンションと関係なく、指定したディメンションでメジャーを集計します。FIXEDを訳すと「固定した」という意味になるので、意味自体は把握しやすいと思います。
計算式は下記の通り
{FIXED "ディメンション名" : "集計式"}
では、サンプル – スーパーストア.xlsで確認していきましょう。
「売上」をマークのテキスト。
「地域」を行シェルフに入れ、地域の順番を上から北海道〜九州に並び替えておくと見やすいと思います。
「都道府県」を行シェルフ。
に入れて、都道府県別に売上を確認します。
地域ごとの集計を列に追加したいと思います。
計算フィールドの作成で、下記計算式を入力し、計算フィールドのメジャーを作成してください。
{FIXED [地域]:SUM([売上])}
作成したメジャーをワークシート・ビュー内の売上の列に入れてみてください。
下記のように列が追加されます。
f_地域_FIXED関数の列には、各地域単位で同じ値が入っていることがわかります。
別のシートで下記図のようにピルを入れてみてください。
地域ごとの売上を出してみました。
ダッシュボードで確認してみると値が一致していることがわかります。
つまり、f_地域_FIXED関数では、地域単位で売上を合計していることが確認できました。
では、同じように都道府県単位で売上合計の集計をしてみたいと思います。一度作成した「f_地域_FIXED関数」を複製し、「地域」をディメンション「都道府県」に置き換え、名前を変更するとサクッと作れます。数値の確認したいため、小計を表示しています。表示方法は、上のメニューバーから「分析 > 合計 > 全ての小計を表示」です。
見方の説明をします。
(1)FIXED関数でディメンション「都道府県」単位での売上合計になります。当然のことながら一番左の列「売上」と一致します。
(2)「f_地域_FIXED関数」の影響は受けていないことがわかります。
(3)当然のことながら小計の値も一致しております。
小計の補足
気になった方もいるかもしれません。
1列目は合計が出ている模様。2列目は平均が出ている模様。合計ではない。3列目は合計が出ている模様。
「各列で違う計算方式で集計されているの?」となりませんか?
実は、ここはTableauがよしなに自動で集計方法を調整してくれております。ですので、「小計」の理解が必要になり、Vizとして提供する場合は説明がないと間違った解釈をしてしまう方もいると思います。
もちろんこの「小計」は調整すること可能ですので、あるべき姿に設定してあげてください。
INCLUDE関数
INCLUDE関数は、LOD計算の中で指定したディメンションを加えて、ビューのLODよりも詳細な粒度で計算するものです。
書き方ははFIXED関数は同じです。
{INCLUDE "ディメンション名" : "集計式"}
では、サンプル – スーパーストア.xlsで確認していきましょう。
計算フィールドで下記2つのメジャーを作成し、画像のようにシートに追加してください。
{FIXED [地域]:SUM([売上])}
{INCLUDE [地域]:SUM([売上])}
売上の値は同じです。
行シェルフに「都道府県」を入れてみます。
FIXED関数で作成した「F_売上_合計」の列の値は集計に変化ありませんが、INCLUDE関数で作成した「I_売上_地域」は追加されたディメンションを加味し、集計結果が変化しています。
これが「LOD計算の中で指定したディメンションを加えて、ビューのLODよりも詳細な粒度で計算する」になります。
EXCLUDE関数
EXCLUDE関数は、LOD計算の中で指定したディメンションを除外して、ビューのLODよりも荒い粒度で計算するものです。
書き方ははFIXED関数は同じです。
{EXCLUDE "ディメンション名" : "集計式"}
では、サンプル – スーパーストア.xlsで確認していきましょう。
計算フィールドで下記2つのメジャーを作成し、画像のようにシートに追加してください。
{FIXED [地域]:SUM([売上])}
{EXCLUDE [地域]:SUM([売上])}
まず、「地域」の「売上」をみてみましょう。
加工をしていない「売上」とEXCLUDEの「売上」は一致しています。行シェルフに「都道府県」を追加します。
加工していない「売上」は都道府県単位に細分化されたのに対し、EXCLUDEの「売上」は粒度は無視されいます。
これが「LOD計算の中で指定したディメンションを除外して、ビューのLODよりも荒い粒度で計算する」になります。
データの注意点(一意のデータを意識しよう)
LOD関数で作業している時に、詰まったこと、悩んだことがありました。
それは、データの構造、データの中身を理解していないと、正しいLODの値を算出することができないということです。
下記動画をご覧ください。
この時、留意しなくてはいけないポイントとしてFIXED関数に投入した「市区町村」が、それ単位で一意であるかどうかです。
下記のように新しいシートでピルを投入してみてください。
求めているデータとしては、市区町村でも一意のデータであることなのですが、都道府県に同じ名称の市区町村があるので、それが合計されているので、{FIXED [市区町村]:SUM([売上])}では、集計が増えてしまっている。ということになります。
ですので、この場合は、
{FIXED [市区町村],[都道府県]:SUM([売上])}
とし、「都道府県」と「市区町村」の二つを評価し、一意であるデータで集計させることが必要になります。
データ把握しないと詰まるポイントです。
SQLだとこんな感じ
LOD表現はSQLでいうwindow関数に似ているなという感じでした。
window関数 OVER句([PARTITION BY句][OREDER BY句][フレーム句])無名ウィンドウ構文
window関数とは、
分析関数(ウィンドウ関数ともいいます)は、行のグループに対して値を計算し、各行に対して 1 つの結果を返します。これは、行のグループに対して 1 つの結果を返す集計関数とは異なります。分析関数には、評価対象の行を囲む行のウィンドウを定義する OVER 句が含まれています。各行について、選択された行のウィンドウを入力として使用して分析関数の結果が計算され、場合によっては集計が行われます。
端的にいえば、PARTITIONで区切られた部分をwindow関数で集計やらランク付けするというものです。
TableauでいうディメンションがPARTITIONと考え、集計式がwindow関数となるのかな〜。と感じました。
最後に
SQL経験者は、window関数を経験していれば、FIXED関数はイメージがしやすいかもしれませんが、INCLUDE関数、EXCLUDE関数は何回か使い動作を確認しながら理解していくのが良いなと感じました。
でも、このような関数が用意されているということは、LOD表現において有効とtableau社が判断しているので、覚えとくと素晴らしいViz表現ができるのだと思います。