見出し画像

Power BI -移動平均(Moving Average)の計算/レポートの設定方法

<使用したDAX関数>
IF(), ISBLANK(), SUM(), CALCULATE(), LASTDATE(), DATESINPERIOD(), SELECTVALUE()

1. 使用するサンプルデータ

今回はMicrosoftのサンプルデータのうち、financials.xlsxを使用します。同じファイルは下記にあります。

2. Power BI desktopに取り込んで、カレンダーテーブルも作っておく

今回使用するサンプルデータはエクセルブックなので、ここから取り込みます。(サンプルデータはfinancialsというテーブル名があらかじめ設定されているので、それを選択。Query上は何も編集せず、そのまま読み込み)

画像1

取り込んだら、(移動平均の計算を説明するだけであれば不要だが、一応実務で使用する場合はカレンダーテーブルを用意していると思うのでそれに合わせて)カレンダーテーブルを別途設定する。

モデリング>新しいテーブル から、テーブル名dim_periodでカレンダーテーブルを作成します。

画像2

dim_period = CALENDARAUTO()

テーブルができたら、リレーションシップを設定します。Dimentionテーブルであるdim_periodからFactテーブルであるfinancialへ、DateとDateを結びつけます。

画像3

これで、メジャーを作成する準備が整いました。

3. 移動平均を計算するためのメジャーを作成する

メジャーを作成する際は、どんなレポートを作りたいのかを先にイメージする必要がある。今回は、financialテーブルのSegment や Country や Product別に、時系列でProfitの移動平均を算出することを目的としてみます。(つまり、グラフのX軸は時間(dim_period)で、縦軸はProfitということ)

(参考)使用するのは緑の列と、黄色の列だけ(その他は、使わないからメジャーの作成方法を理解することが目的なので、消してもOK)

画像4

今回の例は移動平均の計算期間(12カ月とする)におけるProfitの合計を、データ数で除算するという単純な内容なので、以下のDAX式でメジャーを作ればいい。(でも、少しだけエラー対処のため工夫している)

Profitの12カ月移動平均 = 
VAR interval = -12
RETURN
   IF (
       NOT ISBLANK ( SUM ( financials[Profit] ) ),
       DIVIDE (
           CALCULATE (
               SUM ( financials[Profit] ),
               DATESINPERIOD (
                   dim_period[Date],
                   LASTDATE ( dim_period[Date] ),
                   interval,
                   MONTH
               )
           ),
           CALCULATE (
               COUNTA ( financials[Profit] ),
               DATESINPERIOD (
                   dim_period[Date],
                   LASTDATE ( dim_period[Date] ),
                   interval,
                   MONTH
               )
           )
       )
   )

※VARを書いたらRETURNを必ず書くこと。

ここで、仮に時系列分析で最も過去に近い時点に差し掛かった時に、過去12か月分のデータがそろわない期間が出てくる。そんな時でもエラーを出さずに、「あるデータだけで」移動平均を算出させるため、IF~NOT ISBLANK~ を入れている。

4. 実際に使う場合は、移動平均の計算区間をレポート上で調整できるようにしておく

VARで設定している変数「-12」は、メジャーに置き換えても機能する。つまり、別途12、24、36 を持つテーブルを作ったら、それをフィルターにして、選択された値の計算期間(12カ月 or 24カ月 or 36カ月)を集計できるようにしてもいい。一応、やってみると以下のようになる。

filter用のテーブル(filter_計算区間)を作成して、

画像5

※リレーションは設定しない(フィルターのためだけに使用するテーブルは、たいてい独立して(リレーションシップを持たずに)存在させる)

画像6

で、メジャーはこんな感じで適当に修正する。
(修正したのは、VARの箇所だけです。(あと、メジャーの名前も))

Profitの移動平均 = 
VAR interval = SELECTEDVALUE('filter_計算区間'[計算区間],12)  //<--ここだけ修正
RETURN
   IF (
       NOT ISBLANK ( SUM ( financials[Profit] ) ),
       DIVIDE (
           CALCULATE (
               SUM ( financials[Profit] ),
               DATESINPERIOD (
                   dim_period[Date],
                   LASTDATE ( dim_period[Date] ),
                   interval,
                   MONTH
               )
           ),
           CALCULATE (
               COUNTA ( financials[Profit] ),
               DATESINPERIOD (
                   dim_period[Date],
                   LASTDATE ( dim_period[Date] ),
                   interval,
                   MONTH
               )
           )
       )
   )

レポートを作成する際は、filter_計算区間をフィルターとして設定し、メインの移動平均は、横軸にカレンダーテーブルのDate、値として上記で作成した[Profitの移動平均]を入れる。

画像7


次は、標準偏差をRollingで算出するDAXについて書く予定です。


この記事が気に入ったらサポートをしてみませんか?