[Power BI] DAX入門(3) 相対日付 (Relative date) の実装 -地震速報の可視化-

Microsoft Japan Data Platform Tech Sales Team

土井

DAX 入門 第 3 回目では、前回の応用として、相対日付の実装について触れます。

今回は 地震速報 データを使って、今日何時に地震が起きたか? 昨日起きた地震の最大震度は? 直近一週間何件地震があったか?といった形で相対日付で可視化するレポートを作ってみます。

作成するレポートは以下のようなイメージです。スマホで閲覧されている場合は こちらのリンク を参照ください

 

■データの取得

まず、前回の記事で作成したカレンダーテーブルを使うので こちら からダウンロードください。

pbix ファイルを開いて、”データを取得” メニューから “Web” を選択します。

image

 

URL に https://typhoon.yahoo.co.jp/weather/jp/earthquake/list/ を入力し、OK をクリックします。 (データ出典:Yahoo! Japan 天気・災害)

image

 

ナビゲーター画面では “Table 0” のチェックボックスを選択し、”編集”をクリックします。

image

 

■データの加工

取得したデータを分析しやすい形にするため、加工をしていきます。

まず、“発生時刻” 列を選択した状態で、”変換” メニューの ”値の置換” をクリックし、”ごろ” を削除します。

image     image

 

“ホーム” メニューから ”データ型” を選択し、”日付/時刻” に設定します。これにより、日付・時刻に関する各種 DAX 関数が利用可能になります。

image

 

“列の追加” メニューから”日付”->“日付のみ” を選択します。

image

 

同様に “時刻” を追加します

image

 

次に “震源地” 列を地図上で可視化できるように加工していきます。

実際には緯度・経度を基に地図上にプロットすべきですが、ここではあくまでサンプルのため、都道府県名でプロットするよう加工していきます。

“震源地” 列をクリックして、”変換” メニューから “値の置換” をクリックします。

image

検索する値 = 県

置換後 = 県,

とし、OK をクリックします。

image

 

さらに、”列の分割” –> “区切り記号による分割” を選択し、

image

 

コンマで列を区切ります

image

 

震源地.2 列は不要なので、削除します。

image

 

次に、震源地.1 列を選択した状態で、”列の追加” メニューから “条件列” を選択します。

image

 

下記のように 1 都 1 道 2 府を例外処理します。また、都道府県名を含まない震源地については、今回は “その他” として処理します。

image

 

“震源地” 列が追加されました。 “震源地.1” 列は不要なので、削除します。

image

 

ここまでの加工のステップは全て “適用したステップ” として記録されています。プロパティから、クエリの名前を ”地震速報” と変更し、”ホーム” メニューから ”閉じて適用” をクリックします。

image       image

 

カレンダーテーブルの ”日付” 列と地震速報テーブルの ”Date” 列のリレーションを張ります。

image

 

■相対日付列の作成

さて、前置きが長くなりましたが、ようやく本題に取り掛かります。

DATEDIFF 関数 を使ってふたつの日付型列から差を取得することができます。

 DATEDIFF(<start_date>, <end_date>, <interval>)

※ interval には年、四半期、月、週、日、時、分、秒 のいずれかの単位を指定できます。

 

今回は下記のように、TODAY関数を使って本日から何日前か、を計算します。

 DATEDIFF('カレンダー'[日付],TODAY(),DAY)

これと、SWITCH 関数や IF 関数を使ってカレンダーテーブルに対して列を追加していきます。たとえば、

 相対日付 = SWITCH(DATEDIFF('カレンダー'[日付],TODAY(),DAY),0,"本日",1,"昨日",2,"おととい","3日以前")

あるいは

 一週間以内 = IF(DATEDIFF('カレンダー'[日付],TODAY(),DAY)<=7,"TRUE","FALSE")

といった列を作成可能です。

 

また、前回の記事 で作成した週番号列を使って、相対週の算出もできます。

 相対週 = SWITCH(IF('カレンダー'[年]-YEAR(TODAY())=0,WEEKNUM(TODAY(),21)-'カレンダー'[週番号],-1),0,"今週",1,"先週",2,"先々週","3週間以前")

 

これにより、冒頭のレポートのような、相対日付でのスライサーを配置することが可能になります。

image

 

■更新日時列の作成

今回のように、定期的にデータソースが更新される場合、更新日時をレポートに表示したいといった要件があるかと思います。

Power BI Desktop で現在の時刻を取得する方法はいくつかありますが、今回は DAX で取得する例をご紹介します。

“ホーム” メニューの “データの入力” をクリックします。

image

“テーブルの作成” 画面で、1 行 1 列目に適当な値を入れます。下記の例では “1” を入力しています。

テーブルの名称を ”更新日時” とし、”読み込み” をクリックします。

image

テーブルが作成されました。 “列1” 自体は不要なので、”レポートビューの非表示” で隠してしまいましょう。

image

 

“モデリング” メニューから “新しい列” をクリックし、以下のふたつの列を追加します。

image

 更新日時 (UTC) = NOW()

 

 更新日時 (UTC+9) = NOW()+9/24

NOW 関数 は実行環境のロケールにおける現在時刻を返します。 Power BI Desktop を日本語環境でお使いの場合は時差を意識する必要はありませんが、

クラウド (Power BI Service) にレポートを発行する場合、Power BI Service 内では UTC で時刻を取得する動きとなります。そのため、日本時間に合わせるために上記のような列を作成する必要があります。

 

これにより、冒頭のレポートのように、更新日時を表示することが可能になります。

image

 

■まとめ

記事がかなり長くなってしまったので、レポートの作成については端折ります。皆様のセンスで、自由にレポートを作成いただければと思います。

冒頭で埋め込んだサンプルコンテンツは こちら からダウンロード頂けますので、もしよろしければご活用ください。