top of page

Tableau実践問題集 #TableauChallenge を作りました。

20200731 Tabelau鉄人対決感想戦

2020/7/31に開催されたTableau鉄人対決にご招待いただき、チャレンジャーとして参戦してきました。


そして有難いことに、視聴者の方々の投票でチャンピオンに選ばれることが出来ました。

投票いただいた方々、本当にありがとうございました。競技メンバーがご存じの通りつよつよメンバーのため、まさか勝ってしまったことに本人が一番驚いています。


また企画運営いただいた株式会社プリンシプルの方々、司会役で参加いただいた木村先生、データ提供いただいたSnowflakeのKTさんに厚く感謝申し上げます。


今回のブログでは上記イベントの感想戦として、自分の実際の20分間の操作ノーカット版動画の紹介(イベント後に記事用に撮った動画)と、使用したテクニックをいくつかまとめます。

 

(余談)今回の使用データとWorkbook公開など

ちなみに今回使用したデータのカラム等は以下ドキュメントにまとまっています。

元々はSnowflakeのMarket Placeという諸企業の公開データセットから取得したものです。


なおデータの公開等について諸条件があり、自分が30日間で切れるトライアルライセンスユーザーであることも鑑みて、今回はPublic等への公開は控えることにしました。(流し読みでの判断ですが・・・)

 

実際の作成の様子とテクニック解説

当日作成したものと細部は異なりますが、使用した技術は本番と同一です。


使用しているテクニックを列挙します。

小技系

  • フィールドのフォルダ整理、Sheetの命名(この辺りはこちらの記事でも言及しています)

  • ディメンションのデフォルト設定(色のデフォルト値設定)

  • クエリ停止による表示待ち時間の短縮

  • 「隠す」機能

  • レイアウトコンテナ(こちらの記事を参照ください)

計算・機能系

  • Parameter Actions / Dynamic Parameter (2019.2~ / 2020.1~)

  • LOD表現(各種ブーリアンフィールドに使用)

  • 空間関数 (MAKEPOINT: 2019.2~, DISTANCE:2019.3~)

  • 表計算(MoMの簡易表計算での算出&LAST関数での表示制御)

  • 表計算(任意の範囲でのランク計算:こちらの記事の応用ですが、こちらの表計算記事も理解に役立つと思います)

  • Set Actions (2018.3~(基本機能), 2020.2~(セットへの追加、除外))

  • Vector Map (2019.2~)


改めて自分が今回のWorkbookに使用した計算や機能にめちゃくちゃ上級向けのものは含まれておらず、イベント中でも言及したように「基本機能と新機能の組み合わせ」で成り立っています。


上記の中からいくつかをピックアップして本記事で解説します。

 

ディメンションのデフォルト設定

これはメジャーもそうなのですが、フィールドを右クリック→既定のプロパティを選択すると、いくつかデフォルトとして設定できる項目があります。

イベントではパラメータで選択されているかどうかをオレンジ/グレーで全Sheetで共通して表示させるため、各Sheet上ではなくこちらで色をTure/Falseに設定させています。

 

「隠す」機能

こちらはランクの計算で使用しました。

今回自分が必要だったのは選択店舗のみの情報、つまり「Selected Shop?の値がTrue」のものだけだったので、同フィールドの値がFalseのものは隠しています。


ちなみになぜフィルター等で「除外」しないかについて、これは表計算(RANK_UNIQUE計算)が流れる順番に起因します。

Selected Shop?はディメンションのため、もしフィルターとして使用してしまうと、ディメンションフィルターの後に流れる表計算に影響してしまうため、計算が一通り流れた後、単にマークを非表示にする「隠す」機能を使用して、ビューの表示制御を行っています。


ちなみに隠したマークを再表示する際には

  • 「分析タブ→非表示のデータを表示」または

  • 「マークを隠した際に使用したディメンションを右クリック→非表示のデータを表示」

で再表示できます。

 

LOD表現を使用した条件文と空間関数

いくつかLOD表現を使用したブーリアン計算フィールドは作成しましたが、特に初心者の方には解説が必要そうな式を取り上げます。まずは以下の二つです。


Latest Month

[Yearmonth] = {MAX([Yearmonth])}


Same State?

{MAX(IF [Selected Shop?] THEN [REGION] END)} = [REGION]


LOD表現の基本は割愛しますが(気になる方はこちらの記事をどうぞ)、{}のみでディメンションを指定しない{FIXED :}として使用できます。したがって出力結果はある種の定数になります。


つまり1番目の式は「データ全体の最新月を取得し、各レコードのYearmonthの値と比較」しており、また2番目は「データ全体からパラメータで選択されている店舗のREGIONを取得し、各レコードのREGIONの値と比較」しているわけです。

(この辺りの理解には「行レベル計算」の理解も必要)


そして似たような原理に「空間関数」を組み合わせた式が、以下の二つです。


Selected Shop Location

MAKEPOINT(

{MAX(IF [Selected Shop?] THEN [LATITUDE] END)}

, {MAX(IF [Selected Shop?] THEN [LONGITUDE] END)}

)


Nearby Shop?

DISTANCE(

[Selected Shop Location]

, MAKEPOINT([LATITUDE],[LONGITUDE])

, 'km')

<= [Distance]


MAKEPOINT関数は緯度経度から地図上の点を作成する関数です。

ここにLOD表現によって「定数」として取得した選択店舗の緯度経度を入力することにより、(パラメータ値が変わらない限り)普遍的な「選択店舗の位置」を取得できます。


上記で取得したSelected Shop Locationを使用して、DISTANCE関数を使用します。これは2点間の直線距離を算出する関数です。

式中のMAKEPOINT([LATITUDE],[LONGITUDE])は各レコードに対して計算されるので、ここでは「各店舗と選択店舗の直線距離」を算出しています。


その距離が数値型パラメータ:Distance以下であるかどうか、を求める計算フィールドが「Nearby Shop?」です。

直感的には「選択店舗から半径Distance km以内のデータかどうか」を求めています。


空間関数という新機能について、「特定地点との距離を出す」というアプローチのために基本機能であるLOD表現を組み合わせて使用しました。

 

簡易表計算を使用したMoM計算と表計算フィルター

MoM等の日付を使用した計算は、日付関数を使用して明示的に作成することが多いと思います。

ただ表計算を使うと楽できることが多いので、その方法をこちらでご紹介します。


今回自分が使用したデータにはYearmonthの項目があり、この項目をディメンションとして使用すると、データはYearmonthの値(今回は2020/1/1, 2020/2/1, 2020/3/1の3つ)でビュー内のデータが分けられます(つまりViz-LODがYearmonthということです)。


その状態で簡易表計算から「差の割合」を選択すれば(かつ表計算の実行方向がYearmonthであれば)、今回の場合はいわゆる「前月比: MoM」が算出できます。


ここで注意ですが、これはあくまでも「Viz-LODがYearmonthのみ、その状態でYearmonthに沿った差の割合の表計算の結果がMoMの計算と一致する」というだけであり、普遍的なMoMの算出方法でないことをご留意ください。

(表計算がViz-LOD依存であることを考えれば明らかなのですが、そのあたりの理解が必要な時点でこの方法は初心者向けでは無いですね)


さて、今回自分は最新月の値だけ欲しいので、他の月の数値は非表示にしたいです。

その場合、先ほどのように適当なディメンションを使って「隠す」機能を使用しても良いのですが、ここでは別の方法を試します。


LASTという表計算関数を使用します。これは例えばあるディメンションについて、例えば昇順で並んでいた場合、最後の値の順番を0としたときの順番の差を返します。

(詳細:表計算関数


今回はLAST() = 0の値のみ欲しいので、このLASTを表計算フィルターとして使用します。

表計算フィルターはTableau操作の順序では表計算実行後にかかるので、MoMの計算に影響しません。

このような形で、簡易表計算と表計算フィルターで簡単な指標は計算できます。

ある種の時短テクである以上に、Workbookの簡素化にも役立ちます。

 

Set Actionsを使用した値の除外(異常値除外)

まず前提として、Tableauはビュー上でマークを除外する機能はあります。

ただこの機能は「その機能を使用したビュー」のみに機能します。つまりフィルターがかかるのはそのビューのみです。


複数ビューに動的なフィルターをかけたい場合、多くの場合はフィルターアクションを使用すると思います。

ただしフィルターアクションは「どのディメンションの値を含めるか」が基本設計であり、今回やりたいような値の除外には基本的に向いていません。

(もちろん全選択→その値のみUnselectという手もあるのですが)


ということで、今回は2020.2で強化されたSet Actionsの機能「Setから値を除外」を使用しました。作り方は簡単で、以下4ステップで実装できます。


1.Setを作成したいディメンションを右クリック→「全てを使用」したSetを作成。


2.Set Actionsの起点にしたいSheetに「詳細」マーク等でSetに使用したディメンションを含める。


3.Set Actionsによりデータが除外されてほしいSheetのフィルターに作成したSetを入れる。

4.Set Actionsを設定する。

ところで今回の実装では「除外した値を戻す」ための仕掛けを作っていませんが(今回程度ならUndoで十分と判断)、一番簡単な方法はSetを表示→(すべて)を2回クリックしてもらう方法かなと思います。

(Setの値の表示も2020.2の新機能です)


さて、この機能の想定した使い方ですが、例えば以下の店舗のダッシュボードでは、近くにやたらVisitが多い店舗があったとします。

この店舗のせいで若干周辺店舗との傾向が見にくいので、実装したSet Actionsで除外させます。


似たような傾向のお店が見やすくなりました。

このような形で複数ビューからデータをフィルターできるようになりました。


ちなみに実装としてはParameter Actionsを使用する形でも異常値指定→データから除外は出来ますが、そこは実装の簡単さなどの使い分けということでひとつ。

 

最後に

この記事を書いて改めて思ったことは、本当に難しい計算式を一切使っていないんですね。

実装も比較的簡単なものに絞り、Tableauの基本理解がある方であれば簡単に再現可能なテクニックのみです。

だからこそ基本機能への理解の深さが重要になってきますし、かつ新機能の習得により自分のTableau力の幅を広げることも重要になってきます。


今回のイベントで自分がお見せしたことが、皆さまの今後のTableau学習に役立つものであれば幸いです。

ご質問等はTwitter、Linkedinへよろしくお願いします。それでは。

bottom of page