前回は日付テーブルの基礎として、設定の必要性、設定をしなかった場合の副作用、ネーミング規則等について解説をしました。今回は日付テーブルを使って期間をフィルターする際にモヤモヤする事例及びその解決法を紹介したいと思います。
日付テーブル: 月次ベース vs 日次ベース
こちら、下記記事ですでに解説した通りですので、特に月次ベースで分析を行う必要がある場合には熟読して頂くことをお勧めします。
簡単にまとめると、月次ベースの日付テーブルは、1行が1ヶ月を表す日付テーブルです。このテーブルはシンプルに作成できるのが魅力ですが、副作用も伴うため、それを理解した上で使用することが重要です。
月次テーブルは、月次データにしか対応できないため、異なる粒度のデータ(例: 日次の売上データ、週次の在庫残高データなど)には対応できません。そのため、異なる粒度のデータが混在する場合は、最初から日次ベースの日付テーブルを作成することをお勧めします。
また、月次ベースの日付テーブルを使用する場合、月のキーには「2024/6/30」のような月末日ではなく、「2024/6/1」のように月の初日を設定してください。これにはいくつかの理由があります。例えば、うるう年では2月29日が存在する一方で、通常年では2月28日しかないため、月末日をキーにすると不整合が生じる可能性があります。また、時系列チャートにおいても、月末をデータポイントにすると表示がずれてしまうことがあります(下図参照)。
なお、上図はどちらも日付型の列を使用していますが、利点はチャートの幅を調整した際に、年月表示も自動調整されるところです。
下図はテキスト軸(YM)をX軸にプロットしたケースですが、ご覧の通り、すべての年月が必ず表示されるようになります。
全ての内容を表示させるには便利ですが、注意しないとスクロールバーが表示されてしまう可能性があります。
日付テーブルが1/1から12/31までカバーする理由
日付テーブルを作る際、データが存在する、しないにかかわらず、最も古い日付のその年の1月1日から最も最新時点の12月31日までカバーすることが重要となります。また、日付テーブルは途中で抜けている日付があってはいけません。
- 分析の一貫性と完全性
月別の売上トレンドを分析する際、データがない月が欠落していると、グラフや表にギャップが生じ、見栄えが悪くなったり、誤解を招いたりすることがあります - タイムインテリジェンス機能の活用
Power BIのタイムインテリジェンス機能をフルに活用するためには、完全な日付テーブルが必要です。これにより、前年同期比や月次推移、季節性分析などが正確に行えます。例えば、前年同月比を計算する場合、前年の同じ月が日付テーブルに存在しないと計算ができません - 将来のデータ追加への対応
データが将来追加される可能性を考慮して、予め広い範囲の日付テーブルを作成しておくと、後から日付テーブルを修正する手間が省けます。これにより、長期的なメンテナンスが簡単になります。また、1~12月までが会計年度の場合、実績数値は6月までしかないが、予算数値が12月まである場合に、予算数値だけを表示させておくパターンや、実績+残り6か月の予算数値を組み合わせた分析も可能となります
基本的には、すべての期間をフルでカバーすることが重要です。ただし、分析の用途によっては将来の期間が不要な場合もあります。その際は、上記にて述べた制限を認識しつつ、必要な期間だけに絞って日付テーブルを作成するように心掛けると良いでしょう。
フルカバーゆえの悩み
日付テーブルをすべての期間でフルにカバーすることの重要性について述べましたが、これに従うことでビジュアル(例えば、ダッシュボードやレポート)の表示が思い通りにならない場合があります。次に、そのようなケースについて考えてみましょう。
例えば、直近月(この例では2021年3月)までの日付カレンダーを使用している場合、日付範囲スライサーに表示される日付は2021年3月までとなります。したがって、それ以降の日付が表示されないため、スライサーの範囲も2021年3月までに制限されます。
一方、日付カレンダーが2021年12月まで伸びている場合、日付範囲スライサーには将来の日付も表示されます。しかし、実際のデータは上の例と同じく2021年3月までしか存在しないため、スライサーに無駄な日付が含まれることになります。
日付範囲スライサーを使って期間を短く設定しても、実際のデータ期間は変わりません。そのため、例えば2021年2月までにフィルターを設定したい場合、スライサーの○アイコンを手動で動かす必要があり、非常に手間がかかります。
日付テーブルに、実際のデータが存在しない将来や過去の日付が含まれている場合、不要な日付が日付範囲スライサーに表示されます。その結果、スライサーを使用した際に、不要な日付の部分まで表示されるため、ユーザー体験が悪くなります(下図を参照)。
ちなみに、日付範囲スライサーだけでなく、ドロップダウン型のスライサーにもこれらの不要な日付がすべて表示されるようになります。同様に、値が入っていないテーブルビジュアルにも、データのない日付が表示されてしまいます。
不要な期間を除外する方法
上記の問題に対処する方法はいくつかありますが、シンプルなものを1つ紹介します。
- 日付テーブルに紐づくFactテーブルから作られたメジャーを1つ決める
- スライサーをフィルターするためのメジャーを作る
1つのFactテーブルではなく、複数のFactテーブルがある場合、両方を考慮
まず、Factテーブルから作られたメジャーですが、SalesAmtとします。ここから以下のメジャーを作ります。
こちらのメジャーをdCalendarテーブルで作り、テーブルビジュアルに持っていくと、以下のようになります。
この状態(テーブルビジュアルが表示されている状態)では、テーブルビジュアルで True として指定すれば、False となっている月を除外することができます。しかし、残念ながらフィルターペインではこの操作を直接選択することができません。これは、フィルターペインでのフィルター条件が基本的に数値で設定されるため、Blooean値(True/False)を用いたフィルターがサポートされていないためです。
そこで上記メジャーを以下のように変更します。
これにより、テーブルビジュアルに表示されていた True と False の値を 1 と 0 に変換できます。テーブルフィルターで 1 を設定することで、すべての 0 が除外され、実際にデータが存在する年月だけが抽出されるようになります。
同様に、日付範囲スライサーにもこのフィルターを適用することで、下図のように、不要な日付が除外され、実際にデータが存在する期間のみが表示されるようになります。
ただし、複数のテーブルがある場合、この方法には注意が必要です。例えば、売上データは3月までしかないが、在庫データは4月まで存在する場合などです。例えば、次のような場合を考えます。この方法では、SalesAmt(売上高)メジャーだけを使用してフィルターを設定しているため、売上の期間に基づいてフィルターが適用されます。その結果、InvAmt(在庫高)はチャートに反映されず、表示されない状態となってしまいます。これにより、データの一部が欠けた状態で表示されることになります。
この問題の解決策は、シンプルに、メジャーを以下のように変更することです。
ここで、|| は論理演算子のORを表します。つまり、「SalesAmtもしくはInvAmtが空白でない場合」には1という値が返されます。このようにすることで、売上データだけでなく在庫データにも対応したフィルターが設定されます。
設定を行っても、日付範囲スライサーが2021年12月1日に固定されてしまう問題がありますが、この場合、期間を少し戻してみると、2021年4月1日からしか選択できない状態になります。
この手法は、日付範囲スライサーだけでなく、カテゴリーなどの他のスライサーにも適用することができます。これにより、売上や在庫が存在しないカテゴリーを非表示にすることができます。
最後に
今回は、日付テーブルの特性と、日付範囲スライサーの使い勝手を向上させる方法についてご紹介しました。次回は、タイムインテリジェンス関数が正しく機能しない場合について解説します。