Tableau Tips:計算式編
あーもう全然覚えられないよ!どうしよう~!!
普段からデータと向き合っている営業さんたちは、みるみるTableauの機能を実務に活かしつつ、ツールの使い方を吸収していっているようなのですが、普段なかなか数値データと向き合う機会のないわたしのような人間には本当に苦しい戦いです。
前回も言ったようにⅠ日触らないだけでツールの使い方を結構忘れていくので、普段から業務で使う、使わないってかなり大きいと思います。
でもそんなこと言ってられませんね。今日も息子の寝かしつけが終わったのでTableau勉強を始めたいと思います!
(そして隣でいびきをかく夫。うらやましい・・・涙)
*******************************************************
今回はTableau Boot Campの試験目前となったので、
AdvancedⅡまでにでてきた計算式をまとめておきたいと思います。
KTさん動画では当たり前のように飛び出してくる関数計算。
初心者にはハードル高くないですか?
苦手意識を払拭するためにも、丁寧に1つずつ見ていきたいと思います。
-------------------------------------------------
■Tableau計算式まとめ(一部抜粋)
- 日付関数(DATEADD/DATEDIFF/DATEPART)
- 倫理関数(IF/IIF)
- 表計算関数(WINDOW_MAX)
- 集計関数(FIXED/INCLUDE/EXCLUDE)
-------------------------------------------------
▼日付関数(DATEADD/DATEDIFF/DATEPART)
初期から登場する日付関数です。
日付関数はその名の通り、日付を操作しよう、どうこうしようという時に使います。
1)DATEADD
DATEADDは、対象となる日付に日・月・週・月・年単位で日付を増やすことが出来る関数です。
・構文の書き方
DATEADD(date_part, interval, date)
→DATEADD( 日付の基準単位, 加算する日数, 加算したい日付 )
1つ目の【日付の基準単位】とは、'day'、'week'、'month'、'year' などを指します。
2)DATEDIFF
2つの日付の差異を教えてくれる関数です。
・構文の書き方
DATEDIFF(date_part, date1, date2, [*start_of_week])
→DATEDIFF(日付の基準単位, 日付1, 日付2, [*省略可能])
最後の[start_of_week]は、date_partに'week'を指定した際に、
週の始まりと見なす曜日を指定できます。それ以外の場合は省略可能です。
・使用例
>Fundamental編Q16
「家具」カテゴリにおいて一番出荷までの平均日数が長い地域に面する地域の中で、最も出荷までに時間がかかる地域を調べてください。その地域の「事務用品」カテゴリでの出荷にかかる日数は何日ですか?
→この時『出荷にかかる日数』を調べるために下記のような計算式を使用しましたね。
DATEDIFF("day", [オーダー日], [出荷日])
オーダー日と出荷日の差を”日数の単位”で教えてください。というものでした。
3)DATEPART
指定した日付値から、特定の日付単位(年、月、日など)の「値」を取り出すことができる関数です。
・構文の書き方
DATEPART(date_part, date, [*start_of_week])
→DATEPART(日付の基準単位, 日付1, [*start_of_week])
DATEDIFFと同じく、最後の[start_of_week]は省略可能です。
・使用例
>IntermediateⅠ編Q9
2016年の売上を昨年の売上と比較します。昨年の売上はカテゴリごとに見る必要はありません。今年の売上はカテゴリごとに色分けしたいです。これと同時に、今年のカテゴリごとの売上の累計を表示したいです。バラバラにグラフを作ることはできたのですが、これを重ねて一個のグラフにすることはできるでしょうか?
この時、2015年/2016年の売上をそれぞれ下記のように作成しました。
IF DATEPART('year', [オーダー日])=2016 THEN [売上] END
IF関数に関してはあとで説明するので、ここではDATEPART('year', [オーダー日])について。この一部で、オーダー日から年の値だけを取り出してください、というお願いをしている構文になりますね。
▼倫理関数(IF/IIF)
1)IF
最初に提示する条件に対しての答えが、Ture Or Falseによって結果を出し分けることが出来る構文です。
・構文の書き方①~単一条件の場合~
IF <expr> THEN <then> ELSE <else> END
→IF (条件) THEN (条件に合致した時に返す値)
ELSE (条件に合致しなかった時に返す値)
END
・構文の書き方②~複数条件の場合~
IF <expr> THEN <then> [ELSEIF <expr2> THEN <then2>...] [ELSE <else>] END
→IF (条件1) THEN (条件1に合致した時に返す値)
ELSEIF (条件2) THEN (条件2に合致した時に返す値)
ELSE (いずれの条件にも合致しない場合に返す値)
END
・使用例
>IntermediateⅡQ1
サブカテゴリの売上を以下のように分類し、それぞれのサブカテゴリがどこに属するかわかりやすいように表現してください。また、サブカテゴリはカテゴリごとにまとめておいてください。
①2000万円以上 ②1000万円以上 ③500万円以上 ④500万円以下
この時に、色分け用に使用した分岐が下記のIF構文(複数条件)でした。
IF SUM([売上])>=20000000 THEN"2000万以上"
ELSEIF SUM([売上])>=10000000 THEN"1000万以上"
ELSEIF SUM([売上])>=5000000 THEN"500万以上"
ELSE "500万以下" END
2)IIF
最初に提示する条件を満たしているかどうかを確認し、True の場合と False の場合で異なる値を返します。そして、不明な場合は任意の 3 番目の値もしくは NULL を返す構文です。こうやって聞くとIF構文とかなり似てますよね?何が違うんでしょうか。
1番の違いとしては、IIFは2分岐しか対応できないという点です。
なのでIF構文で説明した『単一条件の場合』の構文はIIFでも書けます。でも『複数条件の場合』はIF構文でしか書けない、ということを覚えておきましょう。
・構文の書き方
IIF(test, then, else, [unknown])
→IIF(条件, 条件に合致した時に返す値, 条件に合致しなかった時に返す値, [それ以外NULL])
・使用例
>IntermediateⅠQ11
地域、カテゴリ、オーダー年ごとの売り上げ実績と予算を対比して、家電カテゴリにおいて、すべての年で売り上げ目標を達成していない地域を教えてください。また、その未達成度合いはどのくらいでしょうか。50%にも満たない年があるようであれば教えてください。
ここでは、予算が実際の売上実績よりも高ければ”達成”、低ければ”未達成”という分岐を色と凡例で表示させたかったので下記のような数式を書きました。
IIF(SUM([予算 (サンプル - スーパーストア)].[予算])>SUM([売上]),'未達成','達成')
▼表計算関数(WINDOW_MAX)
WINDOW関数はWINDOW_MAXがfundamental時代からよくでてきていたので、
皆さん結構おなじみじゃないでしょうか。
下記の図のように、最大値のグラフに色を付けるという時によく使いますね。
計算式としては、
WINDOW_MAX(式,[開始,終了])
マークの[色]メニューに「WINDOW_MAX(SUM([売上]))=SUM([売上])」という式を追加します。
これはウィンドウ内のSUM([売上])で最大値のものがあれば真(True)を返し、それ以外は偽(False)を返すというものです。
つまり最大値のみを簡単に色分けすることができるのです。
ほかのWINDOW関数は下記の通りです。
・WINDOW_MAX = ウィンドウ内の式の最大値を返す
・WINDOW_AVG = ウィンドウ内の式の平均値を返す
・WINODW_SUM = ウィンドウ内の式の合計値を返す。
▼集計関数(FIXED/INCLUDE/EXCLUDE)
あえてLOD計算についての概要はここで説明しません。わたしのような初心者には逆に混乱したため、あえてここでは関数計算の1つとしてまとめさせていただきます。
概要を詳しく勉強したい方はたくさんの方がブログでまとめていますので、
そちらをご参照ください!
1)FIXED
◎◎ごとの△△を教えて欲しい、という時に利用します。
・構文の書き方
{ FIXED[ディメンションの宣言 ]: [集計式] }
※ディメンションの宣言は2つ、3つと追加可能。
たとえば、
{FIXED [顧客名] : SUM([売上])} 顧客ごとの売上を教えて!
{FIXED [地域] : SUM([売上])} 地域ごとの売上を教えて!
など結構便利ですよね。
・使用例
>AdvancedⅠQ2
データ内の最も新しい日付を基準日としたとき、最終購入日から基準日までの日数が
60日未満の顧客は何名いるでしょうか?
ここでは、顧客ごとの最終購入日を調べるために下記の式を作成しました。これで顧客ごとの最終購入日=最大オーダー日がわかりますね。
{FIXED[顧客 Id]:MAX([オーダー日])}
2)INCLUDE
こちらもFIXEDと同じく、
◎◎ごとの△△を教えて欲しい、という時に利用します。
FIXEDとの違いは、
最初に指定されたディメンションのみを考慮するのがFIXED構文に対して
最初に指定されたディメンションだけではなく、画面上のビューに配置された
ディメンションについても考慮して返してくれるのがINCLUDEになります。
ディメンションフィルタの前に実行されるのがFIXED
ディメンションフィルタの後に実行されるのがINCLUDE/EXCLUDEのため
このような結果の違いが起こるようです。
・構文の書き方
{ INCLUDE[ディメンションの宣言 ]: [集計式] }
※ディメンションの宣言は2つ、3つと追加可能。
書き方はFIXEDと全く同じですね!ややこしい!!
・使用例
>AdvancedⅠQ3
顧客の購入回数別で、最も顧客数が多い購入回数はどれですか?
【オプション問題】1回のオーダーにおける金額の平均が高いのは何回購入している顧客ですか?
こちらのオプション問題を解く際に、
1オーダーあたりの売上を出すために下記の数式を書きました。
{ INCLUDE [オーダー Id]:SUM([売上])}
3)EXCLUDE
ビューに配置された「集計に不要なディメンション」を除外して集計する時に使う関数です。
・構文の書き方
{ EXCLUDE [ディメンションの宣言 ]: [集計式] }
※ディメンションの宣言は2つ、3つと追加可能。
これまた書き方は同じですね!
それぞれざっくりと違いをまとめると下記のようになります。
{FIXED[カテゴリ]:SUM([売上])}
→ カテゴリごとの売上を教えてくれる
{INCLUDE[カテゴリ]:SUM([売上])}
→ 画面上のほかのディメンションに従って、カテゴリごとの売上を教えてくれる
{EXCLUDE[カテゴリ]:SUM([売上])}
→ 画面上のほかのディメンションに従って、カテゴリを除外して売上を教えてくれる
・使用例
>AdvancedⅠQ8
年 四半期ごとに、「カテゴリ」で「売上」の差を表示しています。
この差の大きさにより年 四半期をソートしたいです。ソートは選択した「カテゴリ」に応じて変わりますが、3つのカテゴリは同時に表示しておいてください。
カテゴリ”家具・家電・事務用品”を1つずつ選択できるパラメーター(ソートカテゴリ)を作成したので、そこでチェックをいれたカテゴリの売上だけを教えて欲しい。ほかの2つは除外してね、という式を下記のように書きました。
{ EXCLUDE [カテゴリ]:SUM(IF [カテゴリ]=[ソートカテゴリ*]then[売上]END)}
※ソートカテゴリは、ここで作成したパラーメータ名なので人それぞれの名前となります。
長くなったので、今日はここまで。