Ledge Tech Blog

We're the data scientists and AI engineers behind Ledge.

【Tableau】 Workout Wedesday 2021W2を解いてみた

こんにちは。レッジインターン生の大熊です。 第2回目はWorkout Wednesday2021 Week2について解説していきます。 Workout WednesdayはTableauのコミュニティ活動の1つであり、お題にあるVizを再現することでTableauのスキルを磨くことを目的としています。 以下のページから今回のチャレンジへアクセスできます。

2021W2のページ:http://www.workout-wednesday.com/2021w02tab/

2021W2の課題

今回のお題は「Can you build a Customer Lifetime Value Matrix?」というもので、以下のコホート図のようなダッシュボードを作成するのが目標です。コホートと異なるのは、セルの中身が顧客生涯価値(CLTV)となっており、表の横方向に累積された売上を、顧客数で除して算出されている点です。そしてポイントは、値が存在しないはずの表の右下三角を空白にする点です。

またその他条件は以下のようなものです。公式ページにあるものを引用しています。

  1. ダッシュボードのサイズ:1400px x 1000px。
  2. シート数は自由。
  3. 顧客生涯価値マトリックスを作成する。
    1. 各顧客は、取得四半期(第1四半期)ごとに分類される。
    2. 初購買日からの四半期単位での顧客一人当たりの生涯価値を計算する
  4. ツールチップとフォーマットを一致させる。
    1. カラーパレットはこちらの「PuBuGn」を使用する。
    2. CLVが表示されていないマークの背景は白。
  5. 応用
    1. 2019年第2四半期と2018年第3四半期の両方の空白を埋める。

顧客一人あたりのLTVの算出はLOD計算を使用すれば簡単に算出できそうです。詰まる点としては「いかにして右下を空けるか」という部分かと思われますが、今回はINDEX()を使用して(y軸方向のINDEX)>(x軸方向のINDEX)が保持されるように表現してみます。

このようにすると、各四半期の最後の四半期で、直近の四半期からの増減が0であっても値を表示してくれます。ペインの中の値の増減に着目するやり方もありますが、この場合四半期間での増減が0であると上手く表示されない場合があります。データの特性ともくてきに応じて使い分けたいところです。

以下、具体的に手を動かしながら作成していきましょう。なお、手順がわかりやすいよう各計算フィールドに番号を振っている関係で、お題の表記とは若干異なりますのでご了承ください。

さっそく作成してみる

1.データの読み込みと整形

ダウンロードしたデータをTableauに読み込んだら、作業しやすくするために以下のようにいくつか設定をします。

  • 「Customer Name」,「Order Date」,「Sales」以外は非表示にする。
  • (もし「Sales」で$により文字列と認識されてしまう場合、)「Sales」を右クリック→変換→分割で数値だけの列を作成し、列名を「Sales_rm$」とする。

2.四半期毎の初購買顧客数と、各購買と初購買四半期の期間幅を求める

今回求められるビューは、➀「各四半期が最初の購買日であった顧客が何人」で、➁「当該四半期が最初の購買日であった顧客がt四半期後までに平均いくら支出したか」という2点を表したものです。

そのため、まずは「各顧客の初購買日の四半期」を求めます。これは「各顧客の初購買日を特定」→「その初購買日を四半期に変換」の流れで求められ、以下のようにLODを使用することで求まります。

1.AQUISITION QUARTERS

DATETRUNC('quarter', {FIXED [Customer Name]:MIN([Order Date])})

次に、各顧客のその後の購買日が、初購買日から四半期単位でどれだけ離れているかを求めます。DATEDIFF()を使用した以下の計算フィールドを作成します。

2.QUARTER SINCE BIRTH

DATEDIFF('quarter', [1.AQUISITION QUARTERS], [Order Date])

さらに各四半期において、その四半期が初購買日であった顧客のユニーク数を求めます。先ほど「1.AQUISITION QUARTERS」で各顧客の初購買四半期を求めているので、これをその四半期ごとで集計し、顧客のユニーク数をCOUNTED()で求めればOKです。計算フィールドの中身は以下の通りです。

3.CUSTOMERS

{ FIXED [1.AQUISITION QUARTERS]:COUNTD([Customer Name])}

ここまでで作成したもので、ビューを作成してみます。下図のように配置します。

いい感じにできてきました。後はラベルであるCLTVをどう作るかです。

3.CLTVを求める

CLTVは比較的簡単に求まります。各四半期(AQUISITION QUARTER)における総LTVは、先ほどの図ではSalesを横に累積していくことで求まります。例えば2016Q1が初購買四半期の顧客の1四半期後(つまりQUARTER SINCE BIRTHが1)の総LTVは、初購買四半期におけるSalesの合計(つまり2016Q1の行かつQUARTER SINCE BIRTHが0の列のセル)と、初購買四半期の翌四半期におけるSalesの合計(つまり2016Q1の行かつQUARTER SINCE BIRTHが1の列のセル)を足し合わせた値になります。

後は総LTVを各CUSTOMERSの値で割ってあげれば良いです。

以下のように計算フィールドを作成します。

4.RUNNING SUM

RUNNING_SUM(SUM([Sales_rm$]))

5.CLTV

[4.RUNNING SUM]/WINDOW_AVG(MAX([3.CUSTOMERS]))

それではマークを「四角」にし、これらを以下のように配置して確認します。

左上のほうを見てみると、お題の数値と同じことがわかります。しかし、右下が空白にならず、累積された値が表示されてしまいます。

したがって、次は右下の不要な箇所をINDEX()を使用して除外していきます。

4.INDEX()を使用して左上のみを保持

左上のみ保持するということは、座標平面のように考えると、対角線を引いたときにy>xとなる領域を保持することと同じです。この発想を利用して、マトリックスの左下を基点として各セルにx,y軸方向のINDEX()の値を付与し、y>xとなるINDEX()を持つセルのみを保持することでお題のレイアウトを表現できそうです。

したがって、まず横方向用と縦方向用のINDEX()をそれぞれ用意します。

6.INDEX X

INDEX()

7.INDEX Y

INDEX()

次にy>xとなるような計算フィールドを作成します。

8.KEEP INDEX

[6.INDEX X]<=[7.INDEX Y]

これで空白を作成する準備ができたので、「8.KEEP INDEX」をフィルターに入れ、「真」にチェックを入れ、OKをクリックします。

「8.KEEP INDEX」は「6.INDEX X」と「7.INDEX Y」の2つの表計算を使用したフィールドなので、この2つの表計算がどのような規則で計算するかを指定する必要があります。フィルターに入れた「8.KEEP INDEX」を右クリックし「表計算の編集」を選択して、それぞれ以下のように設定を行います。

再度フィルターの編集を行い、「真」のみにチェックを入れれば、以下のようになるはずです。

これでお題とほぼ同じのができました!あとは細かいレイアウトを整えるだけです。

なお、なぜこのようにフィルターをかけると上手いこといくか理解が難しい場合は、フィルターをかける前に「6.INDEX X」と「7.INDEX Y」を「ラベル」にいれ、それぞれに対し表計算の編集を同様に行うと、y>xの関係性がわかりやすくなります。

5.レイアウトの調整

ここでは、わかりにくい以下の3か所を解説します。

  • 「2016 Q1」→「Q1 2016」のように年と四半期の表示順序を入れ替える。
  • 表の値に「$」を表示する。
  • 指定の色を使用する。

まず年と四半期の表示順序は、行シェルフの「1.AQUISITION QUARTERS」を右クリック→書式設定→ヘッダーの日付→カスタムに「"Q"q yyyy」と入力すればOKです。

次に「$」の表示は、「5.CLTV」に既定で表示されるように設定します。左のサイドバーの「5.CLTV」を右クリック→既定のプロパティ→数値形式→数値(カスタム)でプレフィックスに「$」を入力をすればOKです。

以下のGIFでも操作を確認できます。

最後に指定された色を設定します。今回のお題ではこちらのページからPurple/Blue/Green(PuBuGn)の色を選択します。

デフォルトのインストールパス指定でTableauをダウンロードした場合、ドキュメント配下にある「My Tableau Repository」フォルダの中にPreferences.tpsというファイル名でファイルが存在していると思います。何のエディタでも良いのでPreferences.tpsを開き、以下のコードをの間に挿入し、保存します。

<preferences>
    <color-palette name="CB_PuBuGn" type="ordered-sequential">
        <color>#fff7fb</color>
        <color>#ece2f0</color>
        <color>#d0d1e6</color>
        <color>#a6bddb</color>
        <color>#67a9cf</color>
        <color>#3690c0</color>
        <color>#02818a</color>
        <color>#016c59</color>
        <color>#014636</color>
    </color-palette>
</preferences>

この後、Tableauを1回閉じ、もう一度起動させることでカラーパレットが追加されます。

6.完成

細かい調整をすると、最終的に以下のようなビューができ上がります(ツールヒントの設定を忘れないようにしてください)。なお、手順がわかりやすいように各計算フィールドの番号を振ってあるため、お題とは若干表記が異なってしまっています。ご了承ください。

まとめ

本記事ではWorkout Wedesday 2021W2を解くプロセスについて解説しました。Tableauにおいて欠損値の扱いは表現方法の幅を増やすのに非常に重要なスキルです。空白の表現方法はいくつかやり方があるので、余裕のある方は是非他の表現方法でもトライしてみてください。