LoginSignup
12
3

[Power BI] 暗黙のメジャーとはなにか、そしてなぜ非推奨なのか

Last updated at Posted at 2023-12-10

はじめに

本記事は「Microsoft Power BI Advent Calendar 2023」、11日目の記事です。
https://qiita.com/advent-calendar/2023/powerbi

いいね! 👍 よろしくお願いします!

暗黙のメジャー(Implicit measures)とは

Power BIではDAXを使用してメジャーを定義します。レポート作成者がPower BI Desktopに記述したメジャーは明示されたメジャーと表現されます。

では暗黙のメジャーとはなんなのか。

暗黙のメジャーとは、テーブルの数値列、 Σ マークのついた項目をビジュアルにドラッグ&ドロップすると作成されるものになります。既定では合計値が集計されますが、平均や、最大値、最小値などをUIで選択することができます。

image.png

ビジュアルに数値列をドラッグアンドドロップすると

2023-12-10_18-47-09.gif

ビジュアルに設定してある項目の集計を変更すると、合計以外にも選択可。

  • 合計
  • 平均
  • 最小値
  • 最大値
  • カウント(一意の値のみ)
  • カウント
  • 標準偏差
  • 差異 (分散)
  • 中央値
  • 集計しない

image.png

内部でメジャーが生成される

一見すると、自然な動作ですが、内部ではメジャーが生成されています。
パフォーマンスアナライザーを開き、ビジュアルを更新。DAXクエリをコピーします。

image.png

DAXクエリについては、以下記事にまとめています。

[DAX Studio] DAX クエリの書き方①
https://qiita.com/akihiro_suto/items/7c56847987f2cf8a441e

[DAX Studio] DAX クエリの書き方②
https://qiita.com/akihiro_suto/items/05cf9a620ee069c85517

[DAX Studio] DAX クエリの書き方③
https://qiita.com/akihiro_suto/items/2d33908ba159befeb304

[DAX Studio] DAX クエリの書き方④
https://qiita.com/akihiro_suto/items/78c739f7cfd91bdf3b43

生成されたDAX.dax
DEFINE
	VAR __DS0Core = 
		SUMMARIZECOLUMNS(
			ROLLUPADDISSUBTOTAL('cso DimProduct'[BrandName], "IsGrandTotalRowTotal"),
			"SumSalesAmount", CALCULATE(SUM('cso FactOnlineSales'[SalesAmount])) //暗黙のメジャー
		)

	VAR __DS0PrimaryWindowed = 
		TOPN(502, __DS0Core, [IsGrandTotalRowTotal], 0, 'cso DimProduct'[BrandName], 1)

EVALUATE
	__DS0PrimaryWindowed

ORDER BY
	[IsGrandTotalRowTotal] DESC, 'cso DimProduct'[BrandName]

自動で生成されたメジャーは以下の部分。DAXでメジャーが書かれているのが確認できる。

"SumSalesAmount", CALCULATE(SUM('cso FactOnlineSales'[SalesAmount])  //暗黙のメジャー

計算方法を変えてみる

既定の合計だけでなく、平均など、他の列を追加してみる。

image.png

生成されたDAXクエリを確認

DAX.dax
// DAX Query
DEFINE
	VAR __DS0Core = 
		SUMMARIZECOLUMNS(
			ROLLUPADDISSUBTOTAL('cso DimProduct'[BrandName], "IsGrandTotalRowTotal"), //合計
			"AverageSalesAmount", CALCULATE(AVERAGE('cso FactOnlineSales'[SalesAmount])), //平均
			"MaxSalesAmount", CALCULATE(MAX('cso FactOnlineSales'[SalesAmount])), //最大値
			"StandardDeviationSalesAmount", CALCULATE(STDEV.P('cso FactOnlineSales'[SalesAmount])), //標準偏差
			"VarianceSalesAmount", CALCULATE(VAR.P('cso FactOnlineSales'[SalesAmount])) //分散
		)

	VAR __DS0PrimaryWindowed = 
		TOPN(502, __DS0Core, [IsGrandTotalRowTotal], 0, 'cso DimProduct'[BrandName], 1)

EVALUATE
	__DS0PrimaryWindowed

ORDER BY
	[IsGrandTotalRowTotal] DESC, 'cso DimProduct'[BrandName]

結局メジャーはつくられている

ということで、ドラッグアンドドロップをして合計値などを出す作業をしても、バックグラウンドでは結局メジャーが生成されていることがわかった。

パフォーマンスの測定

メジャーを手動で作成。暗黙のメジャーの「合計」で自動生成されたDAXと同じもの。
それぞれパフォーマンスを測定してみる。

明示されたメジャー.dax
販売合計 = SUM('cso FactOnlineSales'[SalesAmount])

暗黙のメジャー

image.png

明示されたメジャー

image.png

結果はほぼ変わらず

暗黙のメジャーでも、明示したメジャーでも、パフォーマンスは変わらないことがわかる。
繰り返し実行時のキャッシュも問題なく動作している。

image.png

ではなぜ非推奨なのか

パフォーマンスも問題がないならば、なぜ非推奨なのか。

①Excelで使用できない

暗黙のメジャーはExcelで利用することができない。以下の記事でも書いたが、作成したセマンティックモデルは、Power BIだけではなく、Excelでも消費されることを想定しておくべきだと考えたほうが良い。

メジャーはExcelで利用できる

Excelでセマンティックモデルを開き、ピボットテーブルの画面ではメジャーが上に出てくる。
メジャーは問題なくピボットテーブルで使用ができ、期待した計算結果が表示される。

image.png

暗黙のメジャーはExcelで利用できない(参考動画あり)

Power BIで暗黙のメジャーを作成するイメージで、ピボットテーブルに値を入れてみても、「行」や「列」に指定はできるが、「値」にいれることはできない。

2023-12-10_21-37-50.gif

②表現できないビジネスロジックがある

暗黙のメジャーで用意されている計算の種類では、表現できる計算が少なすぎます。ビジネスに沿った、正しい数字を出すためにはやはりメジャーを自分で記述する必要があります。

暗黙のメジャーで表現できる単純な計算は暗黙のメジャーで、それ以外は記述する…という運用をすると、モデルのメンテナンスが困難になる可能性が高いため、やはりすべてメジャーは記述するというルールで最初から運用をすべきです。

③再利用できない

メジャーは一度定義したら、別のロジックでも繰り返し使うことができます。タイムインテリジェント関数を使用するには、そのベースメジャーが必要です。逆に言うとベースメジャーを定義しない限り、タイムインテリジェント関数を利用することはできません。

まとめ

暗黙のメジャーは非推奨です。が、絶対に使ってはいけないということではありません。さくっとビジュアライズだけ作りたいときなど、利用すればより便利になるシーンもあります。

暗黙的、明示的、それぞれのメジャーの利点や運用上のメリットデメリットを理解して、効果的に利用してあげるのがいいと思います。

12
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3