今回は生年月日から年齢を算出する方法について紹介する。
顧客管理システムなどでは、画面に年齢が表示されているが、いざTableauに接続してデータを取得してみると
「生年月日しか取得できない、、、」
ということがよくある。
「使いたいのは年齢なのに、、、」
と嘆きたくなるが、その場合は計算フィールドを駆使して生年月日から年齢を算出する必要がある。
例えば、下記のようなデータだ。
本記事では生年月日から年齢を作り出す計算フィールドを紹介した上で、数式の意味まで詳しく解説していきたいと思う。
生年月日から年齢を作りだす方法
生年月日のデータから年齢を作り出すには下記計算フィールドを作成する。
1 2 3 4 | IF DATEADD('year', DATEDIFF('year', [生年月日], TODAY()), [生年月日])> TODAY() THEN DATEDIFF('year', [生年月日], TODAY())-1 ELSE DATEDIFF('year', [生年月日], TODAY()) END |
上記の計算フィールドを適用すれば、下記のように生年月日から年齢が作り出すことが出来る。
上記計算フィールドの数式をコピペして、対象のカラムを置き換えれば、他のデータでも同様に年齢を算出できるはずだ。
Tableau Prepの場合、現状はDATEADD関数やDATEDIFF関数とIF関数を1つの計算フィールドで組み合わせられない。
そのため、DATEADD関数の式やDATEDIFF関数の式をそれぞれ個別の計算フィールドで作成しておく必要があるので注意してほしい。
ただ、上記計算フィールドはやや複雑なため、ぱっと見だとなかなか理解できないと思う(私がそうだった(笑))
よりTableauスキルを高めたい方はこれから数式の解説をしていくので是非参考にしてみて欲しい。
計算フィールドの解説
生年月日から年齢を算出する計算フィールドの数式がどんな意味になっているかを確認していこう。
IF関数での条件分岐
まず大きな構成として、IF関数での条件分岐がある。
IF関数は下記のように条件によって、値を出し分けてくれる論理関数だ。
ちなみにELSEIFは省略が可能で、今回の計算フィールドでも省略されている。
実際に年齢を算出する計算フィールドに当てはめてみよう。
1つ1つの条件式や値を算出する式が長い。
そのため、構造がかなり分かりにくいが、下記のような構造になっている。
ELSEIFが省略された形のIF関数による条件分岐になっていることがお分かりいただけると思う。
IF関数の詳細は下記にまとめている。
さて、構造は整理できたので、ここから1つずつの各条件式や値を算出する式を細かく見てみよう。
条件式①の意味
条件式①の部分が非常にわかりにくいのだが、この式で「今年誕生日を迎えているかどうか?」を判定している。
DATEADD関数の中にDATEDIFF関数が入り込んでいる形なので、構造がわかりにくいのだ。
条件式を整理してみると、下記のように3つの要素が入っている。
①DATEDIFF関数で生年月日と今日の日付の差の年数を算出
①においては、DATEDIFF関数を使用して今日の日付(TODAY関数で算出)と生年月日の期間を算出して、その年数を取得している。
実際にこのDATEDIFFの式部分だけを取り出してみると下記のような結果になる。
今日の日付(2022年12月30日)の年は2022年なので、2022から各顧客の生年月日の年を引いて数値を出している。
例えば、会員番号10000001の谷奥 大地さんの生年月日は1989年4月20日なので、年は1989となる。
そのため、DATEDIFF関数で取得している年は2022-1989=33 となる。
DATEDIFF関数の使い方を詳しく知りたい方は下記にまとめているので参考にして欲しい。
②DATEADD関数で①で取得した年数を生年月日に足す
②においては、DATEADD関数を使用して、①で取得した年数を生年月日に足している。
これにより、今日の日付と比べられるように年を合わせている。
ここがかなりわかりにくいと思うが、具体的な数値を入れてみるとわかりやすくなる。
例えば、会員番号10000001のデータ(生年月日が1989/4/20)を②の式に当てはめてみると、下記のようになる。
このようにDATEDIFFの式で取得する値を具体的に当てはめてみると、単純なDATEADD関数の式になるので理解しやすくなるはずだ。
DATEADD関数の使い方を詳しく知りたい方は下記記事で詳しく解説しているので参考にして欲しい。
③ ②で計算した日付と今日の日付を比較する
条件式①の最後は②で計算した日付と今日の日付を比較するだけなので、①と②が理解できていれば簡単だ。
数式の結果としては下記だ。
DATEADD関数の式で取得した値とTODAY関数から取得した今日の日付を比べている。
この2つを比較して、
「今日の日付より②で取得した値が大きかった場合はTRUEを返す」=「今日の時点で誕生日を迎えていない場合はTRUE、迎えている場合はFALSEを返す」
というのが条件式①の意味だ。
値①の意味
前述した条件式①がTRUEだった場合=今年誕生日をまだ迎えていない場合に表示させる年齢が値①となる。
この式の意味も確認しておこう。
正直、条件式①が理解できれば、これ以降はすごく簡単だ。
①のDATEDIFF関数の部分は条件式①でDATEADD関数の式の中に組み込まれていた式と全く一緒だ。
つまり、「今日と生年月日の期間を算出してその年数を取得する」という意味になる。
それを②の-1で1年マイナスしている。
例えば、下記の場合、正しい年齢は32歳だ。
- 生年月日:1989年4月20日
- 今日:2022年4月19日
※誕生日を迎える前日
まず、①のDATEDIFF関数の式で年数が33と計算される。
それを-1するので、値①の結果は32となり、正しい年齢となる。
誕生日を迎える前は生年月日と今日の年数差からマイナス1するのが正しい年齢になるため、このような計算式になっているのだ。
値②の意味
値①は誕生日を迎える前の年齢を算出するための値だった。
一方で値②に関しては既に今年誕生日を迎えた人の年齢を算出するための値である。
数式は条件式①にも値①にも出てきたDATEDIFF関数の式なので、全く一緒だ。
生年月日と今日の日付の年数差を取得しているだけだ。
計算フィールドの意味
今まで説明してきた内容を整理したのが下記だ。
つまり、条件式①で今年誕生日を迎えているかどうかを判定する。
誕生日をまだ迎えていなければ、生年月日と今日の年数差をマイナス1して表示する。
もし既に誕生日を迎えている場合は生年月日と今日の年数差をそのまま表示させる。
これが生年月日から年齢を算出する計算フィールドの意味だ。
まとめ
だいぶ長くなってしまったが、今回は生年月日から年齢を作り出す方法を紹介した。
単純に計算フィールドをコピペして使うのではなく、
「なぜこの関数を使う必要があるのか?」
まで理解できると応用の幅が広がっていく。
数式を明確に理解しておけば、自分でその計算フィールドを修正して使うことが出来るようになっていく。
是非そのレベルまで理解することを目指してほしいと思う。
他のTableauに関するよくある質問は下記でまとめているので少しでも参考になれば幸いだ。