テクテク日記

テクテク=テクノロジー&一歩ずつ(テクテク)

Power BIの差別化要素5 -時系列操作関数の扱いやすさ

Power BIの差別化要素その5はDAX言語を使って、簡単に時系列分析を行うことが可能になることです。時系列を扱うDAXはタイム・インテリジェンス関数(Time Intelligence)と言い、Power BIやExcel Powe Pivotを活用する場合で最も頻度の高い使用関数となります。

  •  ツール費用(無料)
  • モデリング機能(データモデル、複合モデル)
  • ETL機能( Power Queryによるステップ記録機能で完全自動化)
  • Excelで分析」機能
  • 時系列操作関数の扱いやすさ
  • 関数言語(Excelから継承した関数の数々)及びクエリ言語
  • 計算エンジン(SSAS Tabularモデルをベースとした強力な分析エンジン)
  • Microsoftの他のサービスとの連携
  • 1つのテクノロジー(BIとしてのExcel
  • SaaS型BIソリューション

BI構築のプロセス

タイム・インテリジェンス関数の話を始める前に、まずはBI構築のプロセスについておさらいをしておきます。Power BIでレポートを作成するまでのプロセスは以下の通りです。

f:id:marshal115:20210613173428p:plain
図の通り、流れとして、

  1. Power BIから必要となる様々なデータソースにアクセスする
  2. Power Queryで使用できる形にデータをクレンジング(ETL)する
  3. テーブル同士にリレーションシップを作り(データモデリング)、DAX言語で指標(売上、利益率、在庫、回転率等)を計算する
  4. 切り口(例:年月、分類、店舗等)別にデータを可視化させ、分析レポートを作り上げる

このプロセスはPower BIを利用して目的別にレポートを作り上げる上で必須のプロセスであり、タイム・インテリジェンス関数を使用するのは③の部分に当たります。 

タイム・インテリジェンス関数の使用

タイム・インテリジェンス関数は時系列の計算を可能にするDAX言語です。例えば、Power BIで月次売上を以下のようにテーブルに表示したとします。

f:id:marshal115:20210613181746p:plain

この場合、売上が年月別に時系列で並んでいますが、前年同月の売上を抽出したい場合、どうすれば良いでしょうか?先に結果だけ表示させますと、以下の通りになります。

f:id:marshal115:20210613184700p:plain

タイム・インテリジェンス関数を使用すると、上表のように[SalesAmt](売上)という指標の横に[Sales.PY](前年売上)を計算できるようになります。なお、留意すべき点はSales.PYの赤枠内の上にある数字は07/01~07/12までの売上であり、これらの数字も抽出されており、直近2年分の比較ができるようになっていることです。

上記テーブルに在庫金額も入れて可視化したものが以下のチャートとなります。時系列で在庫・売上のトレンドを確認できるようになるため、月別の推移やバラツキを素早く把握することが可能となります。

f:id:marshal115:20210613183139p:plain

タイム・インテリジェンス関数の構文

上表と上図は同じ結果を異なるビジュアル*1で表現したものです。表よりもチャートのほうが瞬時に情報を把握しやすく、これがBIを活用する大きなメリットの1つですが、前年数字を算出するための関数は以下のものとなっています。

SalesAmt = SUM ( Sales[SalesAmount] )

Sales.PY = CALCULATE ( [SalesAmt], SAMEPERIODLASTYEAR ( dCalendar[Date] ) )

見ての通り、[SalesAmt]SUMというDAX言語を使用して、SalesというテーブルのSalesAmountという列を合計しています。一方、[Sales.PY]はこの式で計算された[SalesAmt]というメジャーを再利用すべく、CALCULATEというDAX言語を用いて、dCalendarテーブルにあるDate列に対して、時点が前年同期(SAMEPERIODLASTYEAR)になるよう、09/12であれば08/12、09/01であれば08/01時点の[SalesAmt]を計算しています。

詳細は割愛しますが、CALCULATEDAX言語において最も使用される関数であり、時点を変更して数値を算出したり、特定の分類に帰属する数値だけを抽出したりする機能を持っています。

もう一つ例を挙げてみます。例えば前年ではなく、3ヵ月前の売上実績を算出したいとします。先ほどはSAMEPERIODLASTYEARを使いましたが、今度はDATEADDというDAXを使用し、dCalendarという日付テーブルに対して、-3とMONTHというパラメータを指定してあげるだけで算出できるようになります(下図)。

f:id:marshal115:20210613185552p:plain

このように、タイム・インテリジェンス関数(SAMEPERIODLASTYEARDATEADD、その他多数)を使えば、時系列を操作して希望する時点の値を簡単に算出することができます。

時点把握の重要性

レポートにあるビジュアルが時系列で表記されている場合、特に気にする必要はないですが、実はBIレポートを作る際、常に

今見えているビジュアル(チャートやテーブル)がどの時点を指しているかを意識

することが重要です。現在の時点を把握できてこそ、タイム・インテリジェンス関数で算出された数値がいつ時点のものを指しているかが分かるわけです。

例を1つ挙げてみます。下記テーブルに上記と同じように、[SalesAmt]がCategory別に入っていますが、この売上高はいつからいつまでの実績でしょうか?

f:id:marshal115:20210613190403p:plain

これだけ見ても恐らく分からないでしょうから、横にある[MAT.Sales](Moving Annual Total Sales)は移動年次累計(=直近12ヵ月売上高)というメジャーを並べてみました。この[MAT.Sales]は12ヵ月の累積売上高なので、[SalesAmt]が1年間の売上合計ではないことが分かりましたが、[MAT.Sales]はいつからいつまでの累積値でしょうか?

このように、ビジュアルに出ている数値、実はいつ時点のものかを把握することが非常に重要であり、この概念を把握できないままPower BIでレポートを作成していくと、どこかでつまずく可能性が高くなります。

そこで、試しに下図のように切り口別を追加してみてみると、対象時点がはっきり分かるようになります。

f:id:marshal115:20210613191013p:plain

[SalesAmount]は2008~2009年の合計、[MAT.Sales]は2009年時点(2009年12月まで)の年間合計、であったことが分かります。ここで面白いのは、年ベースの表にある[MAT.Sales]は2009年時点と合計の数字が同じ857.7Mになっていることです。

合計は合計にあらず

ということになりますが、DAXExcelのPivotのように、合計はその上のセル(2007~2009年まで)に入っている値を集計しているわけではないのです。詳細は省きますが、この機能があるからこそ、また、[MAT.Sales]で使用されたDATESINPERIOD関数(こちらも説明を割愛)が、見えているビジュアルにおいて一番最後の年月(=09/12)から遡って12ヵ月をベースに[MAT.Sales]を算出しているからこそ、ビジュアル表示させた数値を柔軟にコントロールできるのです。

時点把握は今回トピック(時系列操作関数)とは違いますが、無視できない要素ですので例にとってみました。

まとめ

  • DAXのタイム・インテリジェンス関数を使用すれば、求めたい時期の数値を簡単に算出することができる
  • ビジュアル内の数値の時点を把握することが何よりも重要である
  • DAXで計算された結果は、ExcelのPivotのように、セル内の合計を行っているものではない
  • タイム・インテリジェンス関数を操るためには、日付テーブル(今回の例ではdCalendar)を用意することが必須となる

*1:テーブルやチャート等の総称