Tableau入門: 関数はまずこれを覚えましょう ~その2 文字列・日付関数編~

Truestarたまるです。 
今回も初心者がつまづきやすい「関数」について~後半~です。
(第1回は こちら から!)

*そもそも「関数」とは?
 …色々な機能を持った「トンネル」のようなものと思って下さい。
    とあるトンネルに”値”を通すと、色々と処理を施した後に、新しい形で”値”を返してくれる、そんな便利な道具です。

https://onlinehelp.tableau.com/current/pro/desktop/ja-jp/functions.htm
こちらでTableauの全関数を確認できますが、その数なんと 100個以上!!
(ちなみにExcelでは400以上あります)

右も左もわからない!という方に全部覚えて下さい、というのは酷ですし
そもそも使用頻度の高いTableau関数というのもある程度決まっています。

Tableau関数は 以下 をまず覚えましょう!(厳選19個)

 1, SUM (サム) …「合計」を出す
 2, AVG  (アベレージ) …「平均」を出す
 3, COUNTD  (カウントディー) …とあるディメンションの「値の種類」を出す
 4, ZN  (ゼットエヌ) …計算結果がNULLになる場合でも「ゼロ」にする

 5, IF (イフ) … 条件によって別の結果を返す
 6, IIF  (アイアイエフ) …条件によって別の結果を返す (2分岐のみ) 
 7, CASE  (ケース) …ひとつのフィールドの各値に対して一対一の結果を返す
 8, CONTAINS  (コンテインズ) …特定の文字列を含む/含まない を評価する
 9, LEFT (レフト) … 文字列の左からn文字を返す
10, REPLACE  (リプレイス) …条件にあてはまる文字列を指定した文字列に置換する
11, FIND  (ファインド) …特定の文字列の出現位置を返す
12, SPLIT  (スプリット) …ひとつのフィールド値を2つ以上のフィールドに分割する
13, STR  (エスティアール) …データ型を文字列に変換する
14, TODAY (トゥデイ) …”今日”の日付を返す
15, YEAR  (イヤー) …日付から”年”を取得して返す 
16, MONTH  (マンス) …日付から”月”を取得して返す
17, DATETRUNC  (デイトトランク)…日付を指定したレベルに丸める
18, DATEDIFF  (デイトディフ) …2つの日付にの差を返す
19, DATEADD  (デイトアド)…特定の日付に任意の年数・日数を足す・引く


用途ごとにざっくり分類し、2回に分けて解説していきたいと思います。
それでは前回に引き続き、解説スタートです。(必要に応じてエクセルと対比していきます)


文字列関数 (5個)


1, LEFT (レフト) … 文字列の左からn文字を返す
2, REPLACE  (リプレイス) …条件にあてはまる文字列を指定した文字列に置換する
3, FIND  (ファインド) …特定の文字列の出現位置を返す
4, SPLIT  (スプリット) …ひとつのフィールド値を2つ以上のフィールドに分割する
5, STR  (エスティアール) …データ型を文字列に変換する

文字列型(日付型でも数値型でもないもの)のデータを検索したり、変換したり、という事ができる関数です。




1, LEFT (レフト) … 文字列の左からn文字を返す
図書館で以下のような分類表を見た事があるでしょうか。
https://www.kknews.co.jp/kenko/2015/1019_8b.html
学校図書館表
これに沿って「目」から「類」・「網」のディメンションをつくりたい時には

[類]
    LEFT( [目] , 1 )
*目の頭1文字を取得する…LEFT( 460 , 1 ) = 4

[網]
    LEFT( [目] , 2 )
*目の頭2文字を取得する…LEFT( 460 , 2 ) = 46

というような書き方が出来ます。「規則性のあるコードや名称から、一部を取り出す」と事が得意な関数です。
「お尻から〇文字を取得」が出来るRIGHT関数、ももちろん存在します。これらはExcelとも全く同じなので覚えやすいですね。




2, REPLACE  (リプレイス) …条件にあてはまる文字列を指定した文字列に置換する
指定した文字列に「置換」とありますが、特定の文字列を「削除」したい時にも使えます。
例えばコードの途中にある不要な記号(ハイフン)がついている場合
        280-1122
Tableauに「郵便番号」と認識して貰うためには”-“を除外する必要があります。そんな時に活用できるのがREPLACE関数です。

    REPLACE ( “280-1122” , “-” , “”)
*文字列”280-1122″の”-“(ハイフン)を””(空文字)に置換する = “2801122”

正規表現を駆使してもっと複雑かつ複数の条件を指定できるREGEXP_REPLACE関数などもありますので、
中級者以上の方は是非活用下さい。
Excelで対応する関数はSUBSTITUTE関数です。全然違う姿なので少し忘れがちですね…。




3, FIND  (ファインド) …特定の文字列の出現位置を返す
例えば下記のようなフィールドがあった時に
 ”filename_2018″

 FIND ( “filename_2018” , “_”  )
*”filename_2018″から”_”(アンダースコア)を検索し、出現位置を取得する

と書けば  9 (数値) を取得する事ができます。
単独ではあまり用途が思いつかないかもしれませんが、上記のLEFT関数などと組み合わせて活用できます。
Excelでも同様にFINDはFINDですね。




4, SPLIT  (スプリット) …ひとつのフィールド値を2つ以上のフィールドに分割する
指定した区切り文字でフィールドを分割したい時、
 ”filename_2018″  ,  “filename_2019” …
例えば上記のようなフィールドがあった時に

 SPLIT ( “filename_2018” , “_” , 1 )
*”filename_2018″を”_”(アンダースコア)で分割して1つ目を取得する

と書けば”filename”を分割して取り出す事ができ

 SPLIT ( “filename_2018” , “_” , 2 )
*”filename_2018″を”_”(アンダースコア)で分割して2つ目を取得する

と書けば”2018″ (文字列) を分割して取り出す事ができます。

上記の例以外でも”T中 S男”のようなデータを”  “(スペース)で分割する事で
「姓」「名」に分割する、というのももちろん可能です。





5, STR  (エスティアール) …データ型を文字列に変換する
そもそもTableauには大きく分けて「文字列」,「日付」と「数値」というデータの”型”があります。
データ型についてはまた別の記事で説明する予定ですが、「文字列」と「数値」では数式の中で扱いが異なる、という点だけ理解してください。

例えば
「氏名」 =  “T中 S男” (文字列型)
「年齢」 =   28  (数値型)
という項目を持つデータがある時に

    「 T中 S男 さんは 28歳 です。 」

という「コメント」のフィールドを作る場合、計算式は以下のようになります。

 [氏名] + “さんは” + STR( [年齢] ) + ”歳です。”
*Tableauでは文字列結合は ”+” で可能です。Excelでは”&”ですね。

ここでSTRが必要になっている理由は、+でつなげるのは「同じデータ型同士でないといけない」というTableauのルールのためです。(数値同士であればもちろん通常の足し算が行われます)
もし文字列としての足し算をしたい時に

 文字列 および 整数 値を追加できません

このようなエラーが出たら、STR関数で数値をはさんでみて下さい。




文字列関数は以上です。次は日付の関数です。


日付関数 (6個)


1, TODAY (トゥデイ) …”今日”の日付を返す
2, YEAR  (イヤー) …日付から”年”を取得して返す 
3, MONTH  (マンス) …日付から”月”を取得して返す
4, DATETRUNC  (デイトトランク)…日付を指定したレベルに丸める
5, DATEDIFF  (デイトディフ) …2つの日付にの差を返す
6, DATEADD  (デイトアド)…特定の日付に任意の年数・日数を足す・引く

日付型のデータを加工する便利な関数です。ややこしいのですが、使えると多様な時系列分析が出来るようになります。





1, TODAY (トゥデイ) …”今日”の日付を返す
その名の通り、データ内の特定の日付と、今日の日付を比較したい時に使用します。
Excelでも同じTODAY()ですね。





2, YEAR  (イヤー) …日付から”年”を取得して返す 
3, MONTH  (マンス) …日付から”月”を取得して返す
日付型データから、年/月 を 「数値」として取り出します。この2つはセットで覚えると楽です。

 YEAR( #2019-01-01# ) = 2019 
*対象日から「年」(頭4ケタ)を 数値型 で取得する
*Tableauでは #で囲むと日付データとして認識してくれます。覚えておきましょう。

 MONTH( #2019-01-01# ) =  1
*対象日から「月」(中2ケタ)を 数値型 で取得する

IF文と合わせて特定期間の条件式を組む時には必須です。
(シリーズとしてDAY関数というのもあり、こちらは「日」を取得できます)





4, DATETRUNC  (デイトトランク)…日付を指定したレベルに丸める
日付を丸める、というのはイメージがつきづらいので
2019/08/31 を「基準日」として例を見てみましょう。

 DATETRUNC ( “year” , [基準日] ) = 2019/01/01
*基準日を “年”の単位で丸める (2019 までは保持し、月日を1月1日として切り捨てる)

 DATETRUNC ( “month” , [基準日] ) = 2019/08/01
*基準日を “月”の単位で丸める (2019/08 までは保持し、日を1日として切り捨てる)

以上、引数を “year” と “month” にした例ですが、
「手元のデータは”日”別に持っているけど、1日でも31日でも、特に区別したくないんだよな~」
という時には “month” で丸めた計算フィールドを作成して使うと、扱いやすくなります。

” “の中には他にも quarter / week などが使えます。





5, DATEDIFF  (デイトディフ) …2つの日付にの差を返す
DIFF は difference(差)という事で、2つの日付の「差」がどのくらいか、を取得できます。

 DATEDIFF (“day” , TODAY() , #2019-12-31#)
*今日から 2019年の大晦日まで何日 (”day”) あるか

 DATEDIFF (“month” , [入社日] , [退社日] )
*入社から 退社 まで何か月 (”month”) 在籍したか

DATETRUNCと同様にこちらも” ”の中を何にするかで、取得する「差」の単位を変更できます。
2つの日付のどっちが過去でどっちが未来?と迷うのですが

 DATEDIFF (“day” , [過去の日付] , [未来の日付] )
                 過去           ⇒              未来

という時間の流れを思い描くと覚えやすいです。
*ExcelにもDATEDIF( F が一つ少ない)はあるのですが、Tableauは精度を求めると微妙にひと癖ある?ようなので注意が必要です
  例えば 「2018/12/31」と 「2019/1/1」をyear で差を取るとき、返り値は 1 となります。(何月何日同士であろうと、単純に年4ケタの差が計算される)

6, DATEADD  (デイトアド)…特定の日付に任意の年数・日数を足す・引く
DATEDIFFとは逆に add(足す) なので日付の足し算が出来ます。

TODAYを基準に、「来月の同日」を取得するときは

 DATEADD ( ”month” , 1,  TODAY ()  ) 
*今日の日付に、1 か月 足した日 を取得する

ですし、
DATETRUNCと組み合わせて、「来月の1日」を取得したいとすると、

 DATEADD ( ”month” , 1,  DATETRUNC( ”month” , TODAY ())  ) 
*今日の日付を 月 で丸めて(1日にして)、1 か月 足した日 を取得する

となります。





【おまけ】 (上記の内容を十分理解した方向けになります)
Tableauには「月末日」を取得する関数がありません。 (Excelには EOMONTH があるんですが…)
ですが、DATEADD と DATETRUNC を応用して、簡単な計算式で算出する事は可能です。

 DATEADD ( ”month” , 1,  DATETRUNC( ”month” , [基準日]  ) - 1
*今日の日付を 月 で丸めて(1日にして)、1 か月 足した日 から 1 日マイナスする

– 1 の記述は少し例外的ですが、1日分引いた日付を取得できるので
 ①「今月の1日」に丸める (DATETRUNC)
 ②1か月プラスして「来月の1日」にする (DATEADD)
 ③1日マイナスすると「今月の末尾」となる ( – 1 )
という考えとなります。
(ぶっちゃけるとそういう関数作って欲しいですが) これで 月末日起点の集計も楽々ですね!




おわり 


Tableauでデータを読み込んだ後につまづいてしまう点が「関数」かと思いますが、まずは上記の関数達からスタートし「Tableauでのデータの扱い方」を身に着けるのをおすすめします。
Excelにはない考えなども多く頭を悩ます部分もあるかと思いますが、きっと役に立つはずです。