📊

Tableau うるう年、会計年度、前年同日対比、前年同曜日対比 メモ

2021/11/11に公開

うるう年、会計年度、前年同日対比、前年同曜日対比 メモ

はじめに

およそ4年に一度来るうるう年、これのTableauに与える影響と回避策をメモします。
Tableauで明確に影響が出るのは、日次レベルの表示を行う際のグラフになります。

tableauのうるう年を気にする時は例えば以下のシチュエーションです。
・会計年度
・前年同日対比

これを、ひとつずつ見ていきます。

会計年度について

日本企業では会計年度の始まりが4月の場合が多いと思います。
Tableauの日付表示のデフォルトは1月始まりのため、これを変える必要があります。
そこで、会計年度の開始月を変えたとき、年の日付フィールドが示す年度が、
例えば、2017年1月~3月は2017年度、2017年4月~12月は2018年度と表示されてしまいます。
これでは日本の会計年度の考え方より1年度大きくなってしまいます。
そこで、DATEADD("year",-1,[年月日])や、DATE(DATEADD("month",-12,[年月日]))を適応したくなります。

しかしこれを適応したとき、日次レベルの時にどんな問題が起きるのかというと、
閏年の日(2020/02/29)の情報がその前日(2020/02/28)に丸め込まれます。

うるう年366日の情報を通常年365日の枠に圧縮するような計算をした際に、うるう年の日があふれるので
日次レベルの時にはtableauはうるう年の日はその前日に丸めています。

こんなときの会計年度の対処方法については、以下の記事が詳しく解決方法を示してくれています。(感謝)
Tableau 会計年度と閏年(うるうどし)
https://web-kaizen.co.jp/2018/04/05/tableau-会計年度と閏年(うるうどし)/

前年同日対比について

前年同日対比については、以下のブログ記事が詳しいです。
日次YoYと曜日調整YoYと移動合計YoY
https://www.yarakawa.com/single-post/daily_yoy

このメモではその補足をします。

対比の例一覧を表にしますと、以下の通りになります。
※2020年はうるう年です

当年の説明 当年の例 前年同日
うるう年の前年 2019年2月28日 2018年2月28日
うるう年のうるう日前 2020年2月28日 2019年2月28日
うるう年のうるう日 2020年2月29日 2019年2月28日 または 2019年3月1日
うるう年の翌年 2021年2月28日 2020年2月28日

補足としては、ブログ内で、うるう年の判定は簡易的なものでした。これを完全なものにします。
閏年のWikiに、プログラミングにおける判定方法がありましたのでそれをTableauで表現しています。

以下の計算式を利用ください。

"うるう年判定"
MIN(YEAR([年月日])) % 4 = 0 AND
NOT MIN(YEAR([年月日])) % 100 = 0 OR
MIN(YEAR([年月日])) % 400 = 0
"前年がうるう年か判定"
MIN(YEAR([年月日])) % 4 = 1 AND
NOT MIN(YEAR([年月日])) % 100 = 1 OR
MIN(YEAR([年月日])) % 400 = 1
"売上額 前年同日"
// うるう年の2/29は、の2/28と対比させます
LOOKUP(
    SUM([売上額]),
    // うるう年の2/29以降と、うるう年翌年の2/28までの場合-366日前を取得します
    IF ([うるう年判定] AND MIN([年月日]) >= MAKEDATE(MIN(YEAR([年月日])), 2, 29)) OR
       ([前年がうるう年か判定] AND MIN([年月日]) <= MAKEDATE(MIN(YEAR([年月日])), 2, 28)) THEN
        -366
     ELSE
        -365
     END
)

これで、うるう年を正確に判定した前年同日を表現できました。

前年同曜日対比について

前年同曜日の考え方は2つほど考えられます。
・52週前の前年同曜日
・前年同週同曜日

これをひとつずつ見ていきます。どちらが正解かはその場によると思います。
特に後者は計算式はなく概念の紹介に留めます。

52週前の前年同曜日について

これは以下の計算式で表現できます。

"52週前の前年同曜日"
LOOKUP(SUM([売上額]),-364)

なぜ-364日前か簡潔に説明します。

特定の日の7日前は、同じ曜日です。
7日間で曜日が一周するのは変わりません。
一年間は約52週間です。
よって、52*7で導かれる364、これを引いています。
ちなみにこの場合うるう年の有無でルールは変わらないため考慮は必要ありません。

「一年間は約52週間?なにか引っ掛かる」
そうですね、その通りです。一年間は53週間と考えることもあります。
ただ、ここでは単純に52週間前の日を"前年"として、前年同曜日としています。

そして、この52週前か53週間前かを考慮した場合、結果的に前年同週同曜日を考えていることになるはずです。

前年同週同曜日について

これは、前年の第1週目とした週の同曜日と比較するというものです。
年末年始付近の前年同曜日が、52週前の前年同曜日と比較して変わってきます。
以下は例です。

当年の例 52週前の前年同曜日 前年同週同曜日
2022年12月18日 2021年12月19日 2021年12月19日
2022年12月25日 2021年12月26日 なし
2023年1月1日 2022年1月2日 2021年12月26日
2023年12月24日 2022年12月25日 2022年12月18日

前年同週同曜日は単純ではなく、何をもって第1週目とするかについても定義の確認が必要になります。
参考: グレゴリオ暦と ISO 8601 規格
https://help.tableau.com/current/pro/desktop/ja-jp/functions_functions_date.htm#グレゴリオ暦と-iso-8601-規格

グレゴリオ暦と ISO 8601 規格とはなにかについては以下も参考になると思います。
https://www.jeki-ddl.co.jp/blog/20191125_analytics_datetype2/

Discussion