Ord10まで行った今こそ振り返り!~Ord8編~
LOD地獄。
Q1
一つのダッシュボート内で3つのグラフを切り替えて表示する設問です。
■ パラメータとフィルターで、指定した時のみ表示されるようにする。
1.表示を切り替えたいシート分のパラメータを作成します。
2.パラメータに連動する用の計算フィールドを作成する
↓そのまま作成したパラメータを計算フィールドに突っ込む
[どのグラフを表示しますか]
3.各シートで、対応するパラメータを設定した後、2で作成した計算式をフィルターに入れます。
4.ダッシュボートに垂直コンテナを入れて、各シートを配置します。
5.これでパラメータを切り替えると、使用しないシートは圧縮され、見たいシートだけが見れる状態に!
Q2
① 顧客IDごとの最後のオーダー日を出しつつ
②全体の最後のオーダー日と比較する。これを顧客IDのディメンションなしで実現する。
ディメンションで使っていない項目で、ディメンションごとに値を縛りたい(LODを計算式でコントロールする)場合
{FIXED[顧客 Id]:MAX([オーダー日])}
また、ディメンションで縛られない、全体のオーダー日の最大値は
{ FIXED:MAX([オーダー日])}
⇒ 更にはFIEXDも省略可能 ⇒ FIXEDがないと集計粒度が合わないのでDATEDIFFでエラーになります。
①、②の差を求める
DATEDIFF('day',[顧客ごとの最後のオーダー日],[全体の最新オーダー日])
後はこれを60日刻みのビンとして作成し、0~59のビンの中に含まれる顧客IDの数を求めればよい。
Q3
「顧客の購入回数」によって説明される、「当該購入回数に属する顧客の数」という被説明変数の構造になる(またはその逆)。全体の購入回数分布というディメンションで見る必要がある以上、「顧客別の購入回数」を見るのに顧客IDをディメンションに含めることができない(顧客IDで区切ってはならない)。従って、ここでも計算式によるLOD計算を行う必要がある。顧客ごとの購入回数は以下の計算フィールドになる。
{FIXED[顧客 Id]:COUNTD([オーダー Id])}
上記を購入回数帯のビン(1回ずつの刻み)を作成し、これらのビンに属するオーダーの個別カウントの数を求めればよい。
ついでに、最大値の色を強調するためにマークシェルフで次の計算式を作成して色にすれば分かりやすい。
WINDOW_MAX(COUNTD([オーダー Id]))=COUNTD([オーダー Id])
Q3(オプション:FIXEDとINCLUDEの違い)
解説動画ではINCLUDEで合計した売上の平均を出すことと、単純な売上平均を出すことの違いのみが説明されていましたが、個人的には、なぜFIXEDではなくINCLUDEなのかに引っかかっていました。
まず、FIXEDとINCLUDEの違いがよく分かる解説サイトのリンクです。
FIXEDはディメンションを無視して、基準となる項目全てに対して集計します。
INCLUDEは、ディメンションに影響を受けつつ、そのディメンションの中で基準となる項目に対して集計をします。
今回、FIXEDにすると何が問題なのか。FIXEDで指定したオーダーIDに対して売上を集計すると、「そのオーダーIDに紐づく顧客IDの購入回数に関係なく、当該購入回数に含まれるオーダーID全ての売上」が集計されます。
たとえば1回というビンに含まれるオーダーID自体は、他の回数のビンにおいても存在しています。というのも、オーダーIDに紐づく顧客IDは1種類とは限らず、複数回購入している顧客IDに紐づいていることもあるからです。
今回、「x回購入している顧客間においての、1オーダーの平均売上」を求めたいですが、FIXEDでオーダーIDを縛って合計売上を出してしまうと、1回購入に含まれるオーダーIDのうち、他の回数に含まれるオーダーIDもまとめて売上として集計されてしまいます(1回購入の顧客IDというディメンションを無視して集計される)。
そこで、購入回数に応じた(=購入回数というディメンションに影響を受けた)オーダーIDの平均売上を求めるには、FIXEDではなくINCLUDEが適切となります。
データの詳細を理解していないと、FIXEDを使うべきなのか、INCLUDEを使うべきなのかの判断が難しいところですね。LODにつかう基準が、設定しているディメンションに影響を受けるべきか、受けないべきかの判断が問われるところかと思います。
Q4
顧客ごとの売上帯で顧客が最も多いのがどれかを求める。
ビン×個別カウント で解決。
顧客ごとの売上をビンで分けて、それに属する顧客IDの個別カウントをする。今回、顧客に説明される売上と、売上に属する顧客数という3要素が登場するので、ディメンションを一つ削るため、顧客ごとの売上はLOD計算で解決する。また、影響を受けさせたいディメンションは他にないのでFIXEDで問題ナシ。
Q5
顧客の毎の初回購入日で、2013年に初回購入した顧客が2016年の売上に占める割合を求める問題です。解説を聞くと簡単ですが少してこずりました。
顧客ごとの初回購入日はLOD計算で求まりますが、あとは各年の売上に占める割合をどう出すかです。
① オーダー日を列に、売上を行に入れます。
② 色に作成したLOD計算を突っ込みます。
③ 売上を「合計に対する割合」にします(表計算の向きに注意)
Q6
初めて購入した顧客が2回目を購入するまでに、どれくらいのQ空いているかを求める問題。"2回目の購入"をどうやって求めるかがカギです。また、顧客IDの個別カウントをするのに、どう行と列を設定するのかも地味に難しいところです。
① 顧客ごとの初回購入日を求めるLOD計算を作成(Q5で実施済)
② 条件式で、①より大きい日付を求める計算式を作成
IIF([オーダー日]>[各顧客の初回購入日],[オーダー日],NULL)
③ ②のオーダー日の中で顧客ごとの最も古い日付が、2回目の購入日となる。(1回目の購入日より上の購入日の中で、最も古い購入日=2回目)
{FIXED[顧客 Id]:MIN([2回目以降の購入日])}
④ ①と③での日付の差をQ単位で取得する
DATEDIFF('quarter',[各顧客の初回購入日],[各顧客の2回目購入日])
⑤ 初回購入のQごとに、次の購入までにかかるQ数にどれくらいの顧客が属するかを見る(行のQ、差の数で説明される(ラベリングされる)顧客IDの個別カウントをしたいので、軸の各値は独立させる必要があるので不連続にします)
個人的に、地味に「連続」と「不連続」の扱いが改めて難しいなと感じたので、理解促進につながる解説記事を置いておきます。
Q6(桁数が大きく異なる凡例を別々で表示する)
同じ分類で顧客1名あたりの売上が大きいのはどのグループか、というオプション問題。分類もグループもピンと来なかったのですが、オプションなので、同じQという分け方で、初回から2回目の購入にかかるグループという解釈です。
まず、メジャーバリューを詳細に持っていきます(個別カウントは入っていないのでここに入れる)。不要なメジャーを取り除いて、メジャーバリューを色に設定。メジャーネームを行シェルフに持っていくことで、売上と個別カウントの二つを表で作成できます。
なお、凡例が売上金額に大きく引っ張られて、個別カウントにグラデーションがつかなくなります。
そういう時は、凡例の元になっているメジャーバリューをクリックして、「別の凡例を使用」とすれば、それぞれの凡例で強弱をつけてくれます。あとは、売上のカラーを別にすれば見分けやすいですね。
色が濃いところ、初回購入から大体5Q以内に買ってもらうよう力を入れるべきということが分かります。
Q7
月×曜日の組み合わせで1日あたりの売上平均が高い組み合わせを求める。
オプション問題でLODを使わない方法を考えますが、この問題単体で出されたらLOD使わない気がします。そして、特に触れられていないものの、「平均(売上)」を使うと間違えます。
1日あたりの売上平均を求めたいわけですが、単純に売上を平均してしまうと、その月における曜日全体の売上平均になります。「1日あたりの」ということは、その月の中の曜日の数で平均を取る必要があるので、売上平均は
SUM([売上])/COUNTD([オーダー日])
LOD計算を使う場合、ディメンションに含まれるオーダー日の中で、オーダー日ごとに集計した売上の平均を求める必要があるのでINCLUDEになります。
(FIXEDでも同じ結果になりますが、オーダー日の組み合わせyyyy/MM/dd 曜日が唯一無二なので、結果として基準となるオーダー日が他になくディメンションを無視しても結果は変わらないのであり、やりたいことの意図としてはINCLUDEの方が適切だと思います)
{INCLUDE[オーダー日]:SUM([売上])}
あとは、この集計結果を平均すればOKです。
Q8(EXCLUDE)
とても難しい問題。カテゴリ別に売上の差を並び替える問題。
通常、表計算をディメンションで並び替えができません。
表計算結果を疑似的に並べるテクニックとして紹介されていたのが、EXCLUDEとパラメータを利用するものです。
選んだカテゴリに応じて並び替えを発生させるようにします。
表計算を並び替えられないならば、表計算と同じ結果をディメンションに表示させ、ディメンションを並び替えれば良いという発想です。
では、単純に売上の差をディメンションに入れるとどうなるか。
各カテゴリで、無関係の値(別のカテゴリの値)が表示されてしまいます。
そこで、カテゴリ別に切り替えるパラメータに影響を受け、カテゴリ別にディメンションが切り替わる計算式を作成し、ディメンションに設定します。
{EXCLUDE [カテゴリ]:SUM(IF [カテゴリ]=[ソートカテゴリ] THEN [売上] END)}
EXCLUDEについての解説記事は以下のサイトが分かりやすいです。
上記は「カテゴリ」というディメンションの存在を排して全体を集計対象としつつ、各列のカテゴリが「パラメータ」のカテゴリと一致した場合にのみ売上を集計します。これで、無関係なカテゴリは集計から外されます。
あとは、このソート用カテゴリ別売上を差(表(下)、不連続で左端の行に置くことで、パラメータの切替によってカテゴリ別に自動ソートされます。
あくまで表に表示されている棒グラフは、列にある売上の差ですが、並び替えは行にあるEXCLUDEの計算式のもので行われています。
無関係なカテゴリは、対象カテゴリがEXCLUDE計算式によって並び変わって変動した年/四半期の変動によって動いています。
Q8(FIXED)
EXCLUDEを使ってカテゴリ全体を排して関係あるカテゴリの売上だけを集計する以外に、FIXEDを使って四半期ごとに関係あるカテゴリの売上だけを集計する方法もあります。
{FIXED DATETRUNC('quarter', [オーダー日]):SUM(IF [カテゴリ]=[ソートカテゴリ] THEN [売上] END)}
Q9
最初の購入から最後の購入までの差(月)を購入回数で割り、購入間隔平均を求めてビンを作成し、それらに属する顧客数と顧客の売上を把握する。
DATEDIFF('month',[各顧客の初回購入日],[顧客ごとの最後のオーダー日])
ROUND([顧客ごとの最終購入と初回購入の差]/[顧客ごとの購入回数])
Q10
新規顧客の累積チャートを地方別で変化で見ていきます。新規顧客の獲得日は、顧客IDごとの初回購入日で分かりますので、あとは顧客IDの個別カウントを累積させ、マークフィールドに「地方」を入れればOKです。
が、この「地方」に関して、問題には「顧客の住所が誤っていたので、Customer_Masterに、ブログで取得した地域を結合させてください」と記載があります。
これがかなりてこずりポイントでした。解説動画とはTableauのバージョンが違うので、あくまで現バージョンに合わせた我流の結合方法を整理します。
① 「注文」と「Customer_Master」を顧客IDで結合します。
② Qiitaブログの「地方区分付き都道府県リスト」をコピーします。
③ データソースのシートに②をペーストします。
④ ③のデータソースのメニューより「フィールドを自動に生成」します。
⑤ 「Customer_Master」と④を結合関係にし、結合線をダブルクリックして 「Customer_Master」側の項目は「都道府県」を選びます。④側の結合項目のドロップダウンリストから「計算の編集」を押し、以下を入力します。[F1]はフィールドの自動生成によりできたものです。(-1は、区切られた文字の最後の1行という意味です)
TRIM(SPLIT([F1],"/",-1))
⑥ これで、「Customer_Master」と④が結合されます。あとは④をクリックし、F1を「カスタム分割」で「/」の最初の1行にし、生成した列名を「地方」にします。
Q11
平均割引率が15%を超えているサブカテゴリ、及びメーカーを一目見て分かるようにする問題。VizにこだわらなければLOD計算なしでも何とかなりますが、Vizを意識する場合、サブカテゴリとメーカーというLODがあるため、これらが基準値を超えているかどうかを同時に見せる工夫が必要です。
サブカテゴリというディメンションの中に、15%を超過しているメーカーがいくつ含まれるかを同時に見せるテクニックとして、「INDEX()」が用いられる。INDEXとは、表示されるデータの順番に紐づく要素番号です。
INDEXと、15%を超えるメーカーを組み合わせることで、INDEXの数の分だけ、このデータの数が分かるというのを利用します。
いくつかポイントを説明すると…
① INDEX側に、以下計算フィールドを突っ込んでいます。
IIF({FIXED[サブカテゴリ],[メーカー]:AVG([割引率])}>=0.15,[メーカー],NULL)
② INDEXの幅調整は、マイナス倍して左に寄せつつ、0.05を書けることで割引率と幅が合うようにしています(軸の同期も必要)
③ INDEXはデータ番号で基本表(下)に計算していますが、今回は該当するメーカーの個数を出すので①で追加したフィールドに対して計算するように変更します。
④ 対象メーカーが1件もないサブカテゴリから、メーカーの○を削るのに、NULLを「除外」ではなく、表上の要素として非表示にするには、上記計算フィールドを色に入れて、「NULL」を非表示にします。
④ 最後の色は、以下計算フィールドを色に入れています。
AVG([割引率])>=0.15
この記事が気に入ったらサポートをしてみませんか?