Tableau(タブロー)のWINDOW_COUNTのDISTINCTをどうする?
(1)問題の所在
移動しながらある特定の範囲を“ユニーク”カウントしたい場合、どう対応するか?
下記Vizでは、上段では月別で受注顧客数をユニークカウントしており、下段では各月を基準として、過去12ヶ月の範囲で月別ユニークカウントされた顧客数を移動合計しております。
※ 例えば、下段は2017年1月において、2016年2月〜2017年1月の各月でユニークカウントされた顧客数を合算しております。
ここで今回のお題です。
各月を基準として過去12ヶ月の範囲内で購入顧客を移動ユニークカウントするにはどうすれば良いか? これが意外と難題です。言い換えると、WINDOW_COUNTDの関数が無いので、じゃ、どう代替するか? となります。
先ほどのVizは、繰り返しになりますが、上段は、あくまで各月で顧客をユニークカウントした数値であり、また、下段では各月を基準とした過去12ヶ月の範囲内で移動合計された数値が示されただけです。
WINDOW_SUM(COUNTD([顧客名]),-11,0)
つまり、ここでは過去12ヶ月の範囲内で顧客はあらためてユニークカウントされておりません。
下図では、過去12ヶ月(… ,11,0の部分)の範囲内で3カウントされており、この範囲において重複カウントされております。
(2)問題の場合分け
a) 移動計算が不要な場合
移動計算を考慮不要な場合(=今回でいうと、各月を基準として過去12ヶ月の範囲内での移動ユニークカウント)、下記の対応方法があります。ぜひ、参考にしてみてください。※ INCLUDE, EXCLUDEの使い方のひとつのヒントにもなります。
他社様記事はこちら)
b) 移動計算ユニークカウントが必要な場合
ある特定期間の範囲内で、移動計算ユニークカウントを実施する場合は下記の対応を実施すると良いです。
‘https://kb.tableau.com/articles/howto/calculating-a-running-count-distinct?lang=ja-jp
‘https://community.tableau.com/thread/122852
今回のゴールは下記のとおりです。2016/2〜2017/1の特定12ヶ月の範囲内の顧客ユニークカウントが530となります。
別シートで顧客ユニークカウントを検証)
(3)手順
それでは、早速、実施していきましょう。大まかな手順は下記の通りとなります。ただし、特殊な設定を用いますのでそれなりの制約事項が伴います(表示速度が明らかに減衰するなど)。
【手順】
① 過去12ヶ月の範囲で顧客をユニークでカウントするためにWINDOW_MAXを用意する
② ①を合計するWINDOW_SUM関数を用意する
③ 返されるレコードを1つにするためのFIRST==0 関数を作成する
④ 特定のディメンションを使って、詳細レベルを割り当てる
① 過去12ヶ月の範囲で顧客をユニークでカウントするためにWINDOW_MAXを用意する
計算名称:WINDOW_MAX(MAX(1),-11,0)
WINDOW_MAX(MAX(1),-11,0)
② ①を合計するWINDOW_SUM関数を用意する
計算名称:WINDOW_SUM([WINDOW_MAX(MAX(1),-11,0)])
WINDOW_SUM( [WINDOW_MAX(MAX(1),-11,0)] )
③ 返されるレコードを1つにするためのFIRST==0 関数を作成する
計算名称:FIRST()==0
FIRST()==0
④ 特定のディメンションを使って、詳細レベルを割り当てる
下記の手順で配置した後、特定のディメンションを調整します。
・WINDOW_SUM([WINDOW_MAX(MAX(1),-11,0)]) を行に配置する
・月(オーダー日):不連続(カスタム:年/月)を列に配置する
・詳細に、「顧客名」を配置する
ここで、行に配置したWINDOW_SUM([WINDOW_MAX(MAX(1),-11,0)]) を表計算の編集を実施して、「ネストされた計算」で下記のように設定する。
●WINDOW_MAX(MAX(1), -11,0) は特定のディメンションで「オーダー日の月」と関連付ける
●WINDOW_SUM([WINDOW_MAX(MAX(1),-11,0)])は、特定のディメンションで「顧客名」と関連付ける
・フィルターに、FIRST()==0 を配置、特定のディメンションに対して下記のように設定する
フィルターに配置したFIRST()==0フィールドを右クリック、編集して、「真」を選択。
「特定のディメンション」についてはこちらが参考になります。「表計算」においてもっとも攻略が難しいテーマだと思いますので、別途、深掘りしたい方におすすめです。
他サイト記事)
https://www.yarakawa.com/post/tableau_tablecalculations
http://blog.livedoor.jp/tab_hiro/archives/19821936.html
‘https://data-viz-lab.com/tableau-lod
今回の完成図は下記の通りです。
(4)発展編
購入回数区分で区分けしたい場合は、下記の計算式を「色」へ配置すると実現可能です。
計算式名:購入回数区分
IF {FIXED [顧客名]: COUNTD([オーダー Id])} = 1 THEN “1回”
ELSEIF {FIXED [顧客名]: COUNTD([オーダー Id])} = 2 THEN “2回”
ELSEIF {FIXED [顧客名]: COUNTD([オーダー Id])} = 3 THEN “3回”
ELSEIF {FIXED [顧客名]: COUNTD([オーダー Id])} >= 4 THEN “4回以上”
END
まとめ
今回は、移動計算ユニークカウントをかなり変則的な計算式を用いて実現しました。ここは、WINDOW_COUNTDの実装を待ちたいと思います。気になる人は、こちらに投票してみてください。
https://community.tableau.com/ideas/1344