財務DX / Power BI Dashboard作成シリーズ
はじめに
前回のVol.4では、Calendarテーブルを作成し、4つのFactテーブルをCalendarテーブルとラインマスターテーブルに接続することで、スタースキーマを完成させました。これで、すべてのテーブルがひとつのデータモデルとしてつながり、期間やラインを軸に、複数のFactテーブルを横断して分析できる土台が整いました。
今回からは、いよいよDAXを使ってDashboardに表示するKPIを計算していきます。
今回はまず、DAXの基本となる「メジャー」の考え方と、SUM・AVERAGE・DIVIDEという3つの基本関数の使い方を学び、次の4つの基本メジャーを作成します。
- Operating Margin Measure
- Defect Rate Measure
- Inventory Turnover Measure
- Utilization Rate Measure
前年比の表示や目標達成の判定などには、もう少し複雑なDAXが必要になります。これらについては、Vol.6「グラフと表を作る」の中で、実際にカードやゲージなどのビジュアルを配置しながら扱います。
スクリーンショットについて
本シリーズでは、日本語版・英語版の記事で共通のスクリーンショットを使用するため、掲載しているPower BI Desktopのスクリーンショットは英語表示で統一しています。本文ではメニュー名や操作内容を日本語でも併記しているため、日本語版Power BI Desktopをご利用の場合でも、そのまま読み進められます。
Step 1:メジャーとは何か
Vol.3のFAQで少し触れましたが、Power BIでは、データを集計・計算する方法として「計算列(Calculated Column)」と「メジャー(Measure)」があります。
1. 計算列(Calculated Column)
計算列は、テーブルの行ごとに計算され、その結果が各行の値として保存される列です。
Power BIで計算に使う列を作成する方法には、Power Queryで「Custom Column」を作成する方法と、データモデル側でDAXを使って「Calculated Column」を作成する方法があります。
Power QueryのCustom Columnは、データをPower BIに取り込む前の変換処理として作成されます。一方、DAXのCalculated Columnは、データをモデルに読み込んだ後に作成します。
このように、どちらも「計算列」ですが、作成する場所やタイミングが異なります。
Vol.3で作成したOperating MarginやDefect Rateは、Power Queryの「Add Custom Column」機能を使って作成した計算列です。
2. メジャー(Measure)
メジャーは、計算結果そのものを各行に固定して持つのではなく、レポート上のフィルター条件に応じて、その都度計算される数値です。
たとえば、月別・ライン別にデータを表示したり、スライサーで特定の期間やラインを選択したりすると、その条件に応じてメジャーの計算結果も変化します。
計算列とメジャーとの違い
計算列が「各行に保存される固定値」であるのに対し、メジャーは「現在選択されている条件に応じて計算される動的な値」です。
この違いは文章で読むよりも、実際にメジャーを作って使ってみた方が理解しやすいため、Step 2以降で体感していきましょう。
Step 2:3つのメジャーを作成する
ここでは、Operating Margin Measure、Defect Rate Measure、Inventory Turnover Measureの3つのメジャーを作成します。この3つは、元となる金額や数量を集計してからDIVIDEするという共通した考え方で計算できます。
1.Operating Marginメジャーを作成する
まず、Data PaneでFact_monthly_kpiテーブルを選択します。次に「Modeling(モデリング)」タブから「New Measure(新しいメジャー)」をクリックします。

「数式バー」に次のDAXを入力し、「Enter」します。
Operating Margin Measure =
DIVIDE(
SUM(Fact_monthly_kpi[Net Sales])
- SUM(Fact_monthly_kpi[COGS])
- SUM(Fact_monthly_kpi[SG&A]),
SUM(Fact_monthly_kpi[Net Sales])
)

画面右側のData Pane(データペイン)を見ると、Operating MarginとOperating Margin Measureが並んでいることが分かります。
Operating Marginは、Vol.3でPower Queryの「Add Custom Column(カスタム列の追加)」機能を使って作成した計算列です。一方、計算機マークが付いているOperating Margin Measureは、今回DAXで作成したメジャーです。
Operating Margin Measureのデータ型を「Percentage(パーセンテージ)」に変更します。

計算列のOperating Marginをそのまま使用しない
Vol.3で作成した計算列のOperating Marginは、1行(1ヶ月・1ライン)ごとの比率です。この列を単純に平均すると、各行を同じ割合で扱うことになります。
たとえば、Net Salesが1,000万円でOperating Marginが20%のラインと、Net Salesが100万円でOperating Marginが10%のラインがあった場合、単純平均では15%になります。しかし、Net Salesの規模を考慮すると、全体のOperating Marginは約19.1%になります。
そのため、Operating Marginのように、分子と分母から計算する比率は、個々の比率を単純平均するのではなく、元となる金額や数量を先に合計してから計算します。
今回のメジャーでは、Net Sales・COGS・SG&AをそれぞれSUMしてからOperating Margin Measureを計算しています。
DIVIDE関数について
DAXでは「/」を使って割り算することもできますが、分母が0になるとエラーが発生します。
DIVIDE関数を使うと、分母が0または空白の場合、デフォルトで空白(BLANK)を返します。
そのため、DAXで比率を計算するときは、DIVIDE関数を使うのが一般的です。
2. Defect Rateメジャーを作成する
次に、Defect Rateメジャーを作成します。
Defect Rate Measure =
DIVIDE(
SUM(Fact_defect_rate[Defect Quantity]),
SUM(Fact_defect_rate[Production Quantity])
)

Operating Marginと同様に、Defect QuantityとProduction Quantityをそれぞれ合計してから割り算しています。また、Operating Marginと同じ手順で、データ型をPercentageに変更しておきます。
Vol.3で作成したDefect Rate列をそのまま平均するのではなく、元となる数量をSUMしてからDIVIDEすることがポイントです。
3. Inventory Turnoverメジャーを作成する
最後に、Inventory Turnoverメジャーを作成します。
Inventory Turnover Measure =
DIVIDE(
SUM(Fact_inventory_turnover[COGS]) * 12,
(SUM(Fact_inventory_turnover[Beginning Inventory])
+ SUM(Fact_inventory_turnover[Ending Inventory])) / 2
)

Inventory Turnover Measureは、年間のCOGSを平均Inventoryで割って計算します。月次データを年換算するためにCOGSを12倍し、Beginning InventoryとEnding Inventoryの平均を分母にしています。
ここでも、Vol.3で作成したInventory Turnover列を単純に平均するのではなく、元となる金額を集計してから計算することがポイントです。Inventory Turnover Measureのデータ型を「Decimal Number(小数)」に変更しておきましょう。
Step 3:Utilization Rateメジャーを作成する
続いて、Utilization Rateです。
Utilization Rate Measure =
AVERAGE(Fact_equipment_utilization[Utilization Rate])

Utilization RateがOperating MarginやDefect Rateと違うのは、Fact_equipment_utilizationテーブルの各行がすでに「その月・そのラインの稼働率」として計算済みのデータになっている点です。
しかも、各行の分母にあたる稼働可能時間がライン間・月間でほぼ揃っているため、単純平均と加重平均の差がほとんど出ません。そのため、ここではSUMしてからDIVIDEする手間をかけず、AVERAGE関数で計算しています。
Utilization Rateのデータ型も同様にPercentageに設定します。
Step 4:ビジュアルで動作を確認する
4つのメジャーが作成できたら、実際にビジュアルに配置して確認してみましょう。
- まず、「Data Pane(データペイン)」から「Operating Margin Measure」メジャーを「Report View(レポートビュー)」にドラッグします。
- 同様に、「Defect Rate Measure」「Inventory Turnover Measure」「Utilization Rate Measure」も「Report View(レポートビュー)」にドラッグします。
- 「Data Pane(データペイン)」から、Vol.4で作成したCalendarテーブルの
Year列を「Report View(レポートビュー)」にドラッグし、「Visual Pane(ビジュアルペイン)」の「Slicer(スライサー)」ボタンをクリックします。 - 年のボタンが表示されたら、別の年をクリックして、4つのビジュアルが変化することを確認します。

年を変更するたびに、4つのビジュアルに表示される値が変化するはずです。
これが、Step 1で説明した「メジャーはフィルター条件に応じて動的に再計算される」という性質です。CalendarテーブルのYearでフィルターすると、その条件がFactテーブルにも反映され、各メジャーがその年のデータを対象に再計算されます。
Step 5:ファイルを保存する
設定が完了したら、Ctrl + Sでファイルを保存します。
Vol.4で作成した「KPIDashboard.pbix」に、4つの基本メジャーが追加された状態になります。
よくあるご質問
1. Power BIのメジャー(Measure)と計算列(Calculated Column)の違いは何ですか?
計算列は、テーブルの各行に対して計算された値が保存されるのに対し、メジャーは、レポート上のフィルター条件に応じて動的に計算される値です。
たとえば、スライサーで期間やラインを変更すると、メジャーの計算結果も自動的に変化します。
そのため、Dashboardで集計値やKPIを表示する場合は、メジャーを使うのが基本です。
2. Power BIで比率や割合を正しく集計するにはどうすればよいですか?
営業利益率や不良率などの比率は、比率そのものを単純に平均するのではなく、分子と分母をそれぞれ集計してから比率を計算することが基本です。
たとえば営業利益率であれば、Net Sales・COGS・SG&AをそれぞれSUMしてからDIVIDEで計算します。
これにより、売上規模の異なるラインや期間を集計する場合でも、適切な全体比率を計算できます。
3. Power BIでSUMとAVERAGEはどのように使い分けますか?
データの性質に応じて使い分けます。
・SUM:売上高、COGS、数量など、合計する意味のある金額・数量
・AVERAGE:各行の値を単純に平均することが適切なデータ
・DIVIDE:分子と分母を使って比率を計算する場合
ただし、AVERAGEが常に正しいわけではありません。各行の分母となる金額や数量が異なる比率については、元データを集計してから比率を計算する必要があります。
4. DAXのDIVIDE関数と「/」演算子の違いは何ですか?
どちらも割り算に使用できますが、DIVIDE関数は分母が0または空白の場合の処理を安全に行える点が特徴です。
DIVIDE(分子, 分母)
分母が0または空白の場合、デフォルトでは空白(BLANK)を返します。
そのため、DAXで比率や割合を計算する場合は、単純な「/」演算子よりもDIVIDE関数を使用することが推奨されます。
5. DAXメジャーはどのテーブルに作成すればよいですか?
メジャーはどのテーブルに作成しても、計算式とデータモデルが同じであれば計算結果は変わりません。
ただし、メジャーが増えてくると管理しやすさが重要になるため、関連するFactテーブルに作成する方法や、メジャー専用のテーブルを作成してまとめて管理する方法があります。
本シリーズでは、分かりやすさを優先して、Operating MarginはFact_monthly_kpi、Defect RateはFact_defect_rateのように、関連するFactテーブルにメジャーを作成しています。
まとめ
今回は、DAXを使って4つの基本KPIメジャーを作成しました。
| KPI | 使用した主な関数 | 計算の考え方 |
|---|---|---|
| Operating Margin | SUM + DIVIDE | 金額を集計してから利益率を計算 |
| Defect Rate | SUM + DIVIDE | 数量を集計してから不良率を計算 |
| Inventory Turnover | SUM + DIVIDE | 金額を集計してから回転率を計算 |
| Utilization Rate | AVERAGE | 各行の比率を平均 |
今回のポイントは、単にDAXの構文を覚えることではありません。
「どのようなデータに対して、SUM・AVERAGE・DIVIDEのどれを使うべきか」
を理解することが重要です。
また、ビジュアルとスライサーを使って、メジャーがフィルター条件に応じて動的に再計算されることも確認しました。
これで、DashboardにKPIを表示するための基本的なDAXメジャーが準備できました。
次回予告
次回のVol.6では、今回作成した4つの基本メジューをベースに、前年同期比(YoY)と目標達成状況を判定するDAX Measureを作成します。これらは、Vol.7でカードビジュアルに配置する際の土台になります。

