テクテク日記

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

指標別推移の計算(フィールドパラメータ使用)

Power BIのフィールド パラメータ(公式)はいろんな切り口でデータを可視化できることですが、今回は以下のチャート(本年と前年推移)を作ってみたいと思います。本年売上高だけであれば非常にシンプルですが、前年数値も入れることになるため、ちょっとだけヒネリが必要です。

フィールド パラメータによる切替

フィールド パラメータは非常に便利であることを以前紹介しました。

もう一度おさらいをしますと、フィード パラメータは大きく分けて、

  • 切り口別
  • メジャー別

に動的に指標の結果を表示させることができるようになります。

今回の例は後者のメジャー切り替えになりますが、前年数値も織り込んだチャートになりますので、合計で3つ、フィールド パラメータを(含むテーブルを)構築する必要があります。

  1. スライサー(メジャーフィルター用)
  2. 本年数値(スライサー選択に呼応する本年数値)
  3. 前年数値(スライサー選択に呼応する前年数値)

本年数値だけであれば2を作れば終わりですが、前年数値も同じチャート内で見せることになりますので、1のスライサーで2と3のフィールドパラメータで生成された結果を絞れるようにしてあげれば良いことになります。

最終的なアウトプットは以下のように、スライサーでの切替により、数値も凡例も正しく更新されていることを目指します。

モデリング

実際にフィール ドパラメータでテーブルを作る前に、モデリングについて確認していきます。まずはデータモデルですが、FactSalesをDimテーブルが囲うシンプルなスタースキーマとなっています。

続いて、フィールド パラメータですが、通常であれば1つのテーブルのところ、MeasureFilterというテーブルからリレーションシップが伸びており、fpMeasureとfpMeasurePYという2つのテーブルを絞り込むようになっています(1対多のリレーションシップ)。

これにより、fpMeasureは本年数値、fpMeasurePYは前年数値で表示することになります。スライサーが現在「売上高」になっていますが、他の項目を選択すればその項目の結果を返すことができるようになります。

ベースメジャーの確認(構築)

フィールド パラメータを作りますが、メジャーが8つ必要となります。以下、Tabular EditorからDAXスクリプトだけを抽出したメジャー式となります。

----------------------
-- Measure: [SalesQty]
----------------------
MEASURE FactSales[SalesQty] = SUM( FactSales[数量] )
    //売上数量
    FormatString = "#,0"

-------------------------
-- Measure: [SalesQty.PY]
-------------------------
MEASURE FactSales[SalesQty.PY] = CALCULATE( [SalesQty], SAMEPERIODLASTYEAR( DimCalendar[Date] ) )
    //前年売上数量
    FormatString = "#,0"
    

----------------------
-- Measure: [SalesAmt]
----------------------
MEASURE FactSales[SalesAmt] = [GrossSalesAmt] - [Discount]
    //純売上金額
    FormatString = "#,0"

-------------------------
-- Measure: [SalesAmt.PY]
-------------------------
MEASURE FactSales[SalesAmt.PY] = CALCULATE( [SalesAmt], SAMEPERIODLASTYEAR( DimCalendar[Date] ) )
    //前年売上金額
    FormatString = "#,0"

---------------------
-- Measure: [Profit%]
---------------------
MEASURE FactSales[Profit%] = DIVIDE( [Profit], [SalesAmt] )
    //粗利益率
    FormatString = "0.0%;-0.0%;0.0%"

------------------------
-- Measure: [Profit%.PY]
------------------------
MEASURE FactSales[Profit%.PY] = CALCULATE( [Profit%], SAMEPERIODLASTYEAR( DimCalendar[Date] ) )
    //前年粗利益率
    FormatString = "0.0%;-0.0%;0.0%"

------------------
-- Measure: [Dis%]
------------------
MEASURE FactSales[Dis%] = DIVIDE( [Discount], [GrossSalesAmt] )
    //値引率
    FormatString = "0.0%;-0.0%;0.0%"

---------------------
-- Measure: [Dis%.PY]
---------------------
MEASURE FactSales[Dis%.PY] = CALCULATE( [Dis%], SAMEPERIODLASTYEAR( DimCalendar[Date] ) )
    //前年値引率
    FormatString = "0.0%;-0.0%;0.0%"

PYと付くものは前年数値となります。メジャーが全てあることを確認し、Power BI Desktopより以下を行います。

fpMeasureとfpMeasurePYを作る
  • フィールド パラメータを立ち上げる
    タブ「モデリング」> 「新しいパラメータ」>「フィールド」
  • 以下のように入力していきます

  • fpMeasureテーブルが無事作成されます

  • 同じ手順でfpMeasurePYも作ります

これで本年と前年の2つのフィールド パラメータ が完成しましたので、このままでも可視化ができるようになります(下図)。

しかし、fpMeasureとfpMeasurePYの項目が本年○○と前年○○になっている関係上、これを同じチャート内で使うことができません。試しに、fpMeasurePYの列をfpMeasureのグラフ内にドラッグしてみると、以下のように意味不明な状態になってしまいます。

冒頭にあるビジュアルをもう一度確認すれば分かりますが、スライサーには本年や前年といったキーワードが入っていないので、このやり方では正しくないというわけです。

共通列の追加とMeasureFilterテーブルの構築

両方の結果を同じチャートに入れることが目的ですが、修正法は至って簡単です。まず、fpMeasureとfpMeasurePYにそれぞれ下図の通り、スライサー用の項目名を追加し、追加された列名を(ダブルクリックでMeasureという名前に)変更しておきます。

次にMeasureFilterというテーブルを作ります。作り方はPower Queryの入力機能でも良いですが、DATATABLEという関数を使ってみます。

ここでPower BI Desktopのモデルビューを見ると、以下3つのテーブルになりますが、これらは冒頭で話をした下記の項目となります。

  1. スライサー(メジャーフィルター用)
    = MeasureFilterテーブル
  2. 本年数値(スライサー選択に呼応する本年数値)
    = fpMeasureテーブル
  3. 前年数値(スライサー選択に呼応する前年数値)
    = fpMeasurePYテーブル

あとはリレーションシップを構築するだけですので、以下の①~②の通り設定していきます。

最終的には下図のようになります。

スライサーにMeasureFilterのメジャーという列を持っていくわけですが、最後の仕上げとして「列で並べ替え」を行います。これにより、スライサーの先頭に「売上数量」、一番最後に「値引率」が来るようになります。

余談ですが、並べ替え用の列を英語のSortにすると、並べ替えを行おうとした際の列名はSortではなく、並べ替え(上図②)という名称に勝手に翻訳されるようになります。何年も続いているバグだと思いますが、最初にこれを発見したときはかなり焦りました。

最終アウトプット

これらの修正を終えると最終的に下図のように、同じチャート内で異なる指標で切替ができる本年vs前年のトレンドチャートを生成することができます。

なお、パフォーマンスですが、以前のブログでも記載していますが、SWTICH関数を使ったやり方よりも相当早いと思います。一方で、レポートキャッシュがない状態では、ビジュアルがロードされるまでに約2秒程度掛かっており、モデル概要は下記の通り。

まとめ

  • フィールド パラメータは単発で使ってもパワフルな機能である
  • モデリングでリレーションシップを組むストラクチャに変更すれば、今回の例のようなチャートを作ることができる
  • 今回解説していないが、同じことをCALCULATION GROUPSでも実現は可能。フィールド パラメータとの違いは、フィールド パラメータであればPower BI Desktopで構築が可能な点であり、個人的にはフィールド パラメータのほうがお手軽で凡例名も変わるのでお勧めです