本記事では、Microsoft Fabricのウェアハウスに格納された売上・在庫・顧客データを活用し、Power BIで分析環境を構築する実践的なステップをご紹介します。
具体的には、データモデル(リレーションシップ)構築から始め、Power BI Serviceで「売上パフォーマンス」「在庫最適化」の2つの主要な分析レポートページを作成します。
さらに、作成したレポートから重要なKPIを抽出し、日次マネジメントダッシュボードを構築し、ビジネスの異常値をいち早く検知するためのアラート設定を行い、実際に通知が届くことまで確認を行います。
今回は、データモデル編としてデータモデルの構築とメジャーの追加方法について紹介します。
事前準備
今回のPower BI分析環境構築で使用するウェアハウス上に格納されているデータセットは、以下のディメンションテーブルとファクトテーブルで構成されています。
なお、各テーブルは自作したダミーデータを利用します。
| テーブル名 | タイプ | 主要カラム | 役割 |
| 商品ディメンション | ディメンション | 商品ID,商品名,カテゴリ,ブランド,標準売価 | 商品の属性情報を提供 |
| 顧客ディメンション | ディメンション | 顧客ID,顧客名,性別,年齢層,会員ランク,初回購入日 | 顧客の属性情報を提供 |
| 店舗ディメンション | ディメンション | 店舗ID,店舗名,支店名,店舗タイプ,開店日 | 店舗の属性情報を提供 |
| 日付ディメンション | ディメンション | 日付キー,日付,年,月,四半期,曜日,休日フラグ | 時間軸での分析(トレンド、季節性など)を可能にするカレンダー情報を提供 |
| 販売ファクト | ファクト | 販売ID,店舗ID(大阪支店のデータのみを格納),商品ID,顧客ID,販売日時,販売数量,合計金額,支払い方法 | 各販売トランザクションの測定値(売上金額、数量など)を記録 |
| 在庫ファクト | ファクト | 在庫ID,店舗ID,商品ID,在庫日時,在庫数量,入庫数量,出荷数量 | 各時点での在庫状況の測定値(在庫数量、入出庫など)を記録 |
データモデルの構築
データモデルを構築する理由
Power BIで正確かつ柔軟な分析を行うためには、データモデルの構築が不可欠です。
複数のテーブルに分かれたデータを一貫して扱うには、それぞれのテーブル間の関係性(リレーションシップ)を定義し、意味のある構造にまとめる必要があります。
今回構築するデータモデル(リレーションシップ)
今回の分析では、以下のリレーションシップを構築します。これにより、販売データと在庫データを、店舗、商品、顧客、日付といった様々な切り口で柔軟に分析できるようになります。
| ファクトテーブル | ディメンションテーブル | 結合キー | リレーションシップ |
| 販売ファクト | 日付ディメンション | 販売日時 → 日付 | 多対一(* : 1) |
| 販売ファクト | 店舗ディメンション | 店舗ID | 多対一(* : 1) |
| 販売ファクト | 商品ディメンション | 商品ID | 多対一(* : 1) |
| 販売ファクト | 顧客ディメンション | 顧客ID | 多対一(* : 1) |
| 在庫ファクト | 日付ディメンション | 在庫日時 → 日付 | 多対一(* : 1) |
| 在庫ファクト | 店舗ディメンション | 店舗ID | 多対一(* : 1) |
| 在庫ファクト | 商品ディメンション | 商品ID | 多対一(* : 1) |
データモデルの構築(リレーションシップの作成)
実際に、リレーションシップを作成する手順を以下に示します。
データセットが格納されているウェアハウスを表示し、「モデル レイアウト」をクリックします。

対象の列をドラッグして、マッピングを行います。

結合キーとリレーションシップが正しいことを確認し、リレーションシップを作成します。

同様の手順で、全てのリレーションシップを作成します。
作成後、リレーションシップの整合性を確認するために、リレーションシップの確認を行います。
販売ファクトテーブルの「…」 > 「リレーションシップの管理」を順にクリックします。

リレーションシップの管理では、設定した全てのリレーションシップを一覧で確認できます。

メジャーの追加
メジャーの役割
Power BIで柔軟な計算を行うために、DAX式を適応してメジャーを作成します。
DAXには200を超える関数・演算子・およびコンストラクトから成るライブラリが含まれているため、柔軟性の高い計算を行うことができます。
本記事で使用する主要なメジャー一覧
「売上パフォーマンス」「在庫最適化」のレポートにおいて利用するメジャーを以下に示します。
| メジャー名 | 説明 | 使用レポート | DAX式 |
| 前日売上高 | 前日の売上高 | 売上パフォーマンス | 前日売上高 = CALCULATE( SUM('販売ファクト'[合計金額]), '販売ファクト'[販売日時] = TODAY() - 1 ) |
| 前々日比売上成長率 | 前日と前々日の売上比較 | 売上パフォーマンス | 前々日比売上成長率 = VAR PreviousDaySales = CALCULATE(SUM('販売ファクト'[合計金額]),'販売ファクト'[販売日時] = TODAY() - 1) VAR DayBeforePreviousDaySales = CALCULATE(SUM('販売ファクト'[合計金額]),'販売ファクト'[販売日時] = TODAY() - 2) RETURN DIVIDE(PreviousDaySales - DayBeforePreviousDaySales, DayBeforePreviousDaySales) |
| 月間売上目標 | 月ごとの売上目標値 | 売上パフォーマンス | 月間売上目標 = 45000000 |
| 今月の累計売上高 | 今月の売上の合計 | 売上パフォーマンス | 今月の累計売上高 = CALCULATE( SUM('販売ファクト'[合計金額]), FILTER( ALL('日付ディメンション'),YEAR('日付ディメンション'[日付]) = YEAR(TODAY()) && MONTH('日付ディメンション'[日付]) = MONTH(TODAY())) ) |
| 今月の売上達成率 | 今月の累計売上高/月間売上目標 | 売上パフォーマンス | 今月の売上達成率 = DIVIDE( '販売ファクト'[今月の累計売上高], '販売ファクト'[月間売上目標] ) |
| 年間売上目標 | 年間の売上目標 | 売上パフォーマンス | 年間売上目標 = 540000000 |
| 今年の累計売上高 | 今年の売上の合計 | 売上パフォーマンス | 今年の累計売上高 = CALCULATE( SUM('販売ファクト'[合計金額]), FILTER( ALL('日付ディメンション'), YEAR('日付ディメンション'[日付]) = YEAR(TODAY()) ) ) |
| 今年の売上達成率 | 今年の累計売上高/年間売上目標 | 売上パフォーマンス | 今年の売上達成率 = DIVIDE( '販売ファクト'[今年の累計売上高], '販売ファクト'[年間売上目標] ) |
| 前日総在庫評価額 | 前日の在庫評価額(数量×標準売価) | 在庫最適化 | 前日総在庫評価額 = CALCULATE( SUMX( '在庫ファクト', '在庫ファクト'[在庫数量] * RELATED('商品ディメンション'[標準売価]) ), FILTER( '在庫ファクト', '在庫ファクト'[在庫日時] = TODAY()-1 ) ) |
| 欠品リスク商品数_前日 | 前日の在庫数量が閾値未満の商品数 | 在庫最適化 | 欠品リスク商品数_前日 = COALESCE( CALCULATE( COUNTROWS('在庫ファクト'), '在庫ファクト'[在庫数量] < 20, '在庫ファクト'[在庫日時] = TODAY() - 1 ), 0 ) |
| 過剰在庫商品数_前日 | 前日の在庫数量が閾値を超える商品数 | 在庫最適化 | 過剰在庫商品数_前日 = COALESCE( CALCULATE( COUNTROWS('在庫ファクト'), '在庫ファクト'[在庫数量] > 100, '在庫ファクト'[在庫日時] = TODAY() - 1 ), 0 ) |
メジャーの作成手順
実際に、メジャーを新規作成する手順を以下に示します。
メジャーを作成するためには、ファクトテーブルの「…」 > 「新しいメジャー」を順にクリックします。

以下の赤枠部分(数式バー)にDAX式を入力し、メジャーを追加します。

上記の手順で、それぞれのメジャー名とDAX式を適用することで、必要なメジャーを全て追加できます。

終わりに
今回は、データモデル編としてデータモデルの構築とメジャーの追加方法について紹介しました。
リレーションシップの設定やメジャーの作成を通じて、データの構造を整理し、分析に必要な指標を定義することで、レポートの基盤を整えました。
次回のレポート編では、「売上パフォーマンス」「在庫最適化」の2つの主要な分析レポートページの作成に取り組みます。