3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Copilot を使用してセマンティック モデルにメジャーを作成する方法

Last updated at Posted at 2025-12-08

はじめに

セマンティック モデルでは、数値型の列をそのままメジャーとして使用できる「暗黙的なメジャー」という機能があるため、メジャーを作らなくとも利用できるのですが、メジャーを使いこなせるようになると、グッとレベルアップします。

このメジャーを作るのに使用するのが DAX ですが、独自言語なのでなかなかハードルが高いと思う方も少なくないと思います。
Power BI(Microsoft Fabric)の DAX クエリ ビューには、Copilot を使って DAX クエリの生成・説明を行える機能があり、セマンティック モデルのテーブル名や列名、リレーションシップなどを考慮して、前年比や累計などのメジャー(measure)を短時間で量産することができます。特に、売上高 = SUM(Sales[sales]) のようなベース メジャーを作成する時間を大幅に削減できます。ベース メジャーは前年比や累計を計算する対象となり、多くのメジャーから参照されることになります。
さらに、作られたメジャーに説明を付けたり、定義に使用されている DAX 関数について調べたりするのにも Copilot を活用できます。
本記事では、主にDAX クエリ ビューCopilot を使用してメジャーを作成する方法をまとめました。

DAX クエリ ビューとは?

まず、DAX クエリは「モデルに対して実行する命令文(データ取得や計算のためのスクリプト)」で、DAX 関数は「そのクエリやメジャーの中で使う計算ロジックの部品(SUM、CALCULATE など)」です。
基本的に、Power BI レポートのビジュアル1つにつき、1つの DAX クエリが実行されます。(スライサーもビジュアルの1つなので、DAX クエリが実行されます。)

DAX クエリ ビューは、セマンティック モデルに対して DAX クエリを作成・実行するビューです。基本構文は EVALUATE(必須)と、必要に応じて DEFINE(任意)で、結果はテーブルとして返されます。

  • 例:EVALUATE SUMMARIZECOLUMNS(...) で集計結果を返す、DEFINE MEASURE でクエリ内限定メジャーを定義してから EVALUATE { [Measure Name] } で値を返す、など。
  • DEFINE MEASURE で作成した クエリ限定メジャーは、[変更を含むモデルの更新 (#)] からモデルに取り込むことができます。

Copilot は DAX クエリ ビューで次の3つを支援します。

  • 自然言語から DAX クエリの生成
  • DAX クエリから自然言語の説明
  • DAX 関数や概念の説明


DAX Copilot を使うための前提条件

  • Fabric の容量は、Fabric リージョンの可用性 に記載されているリージョンにある必要があります。 そうでない場合は、Copilotを使用できません。
  • Microsoft Fabric の Copilot は、試用版 SKU ではサポートされていません。 有料 SKU のみがサポートされています。
  • Fabric 管理者が、[ユーザーは、Azure OpenAI に対応する Copilot やその他の機能を使用できます] のテナント設定を有効にする必要があります。
  • テナントまたは容量が米国またはフランス以外の場合、 Copilot は既定で無効になっています。日本や東南アジアなどのリージョンで Copilot を使用するには、Fabric 管理者が、[Azure OpenAI に送信されたデータは、容量の地理的リージョン、コンプライアンス境界、または国内クラウド インスタンスの外部で処理できます] の設定を有効化する必要があります。

image.png

詳細はドキュメントを確認してください。


Copilot にメジャーを提案してもらう

ドキュメントのタイトルからして翻訳がひどいのですが、Power BI の DAX クエリ ビューと Copilot 機能について、こちらで説明されています。
英語版のドキュメントを、ブラウザーの翻訳機能で読む方が良いかもしれません。

1) DAX クエリ ビューを開いて Copilot を起動

  • Power BI Desktop:左ペインの DAX クエリ ビュー アイコンから開きます。
    image.png

  • Power BI Service/Fabric ポータル:ワークスペースやセマンティックモデル詳細ページで DAX クエリの記述 を選択するか、セマンティック モデルを開いて DAX クエリ ビュー を選択します (下図)。
    image.png

DAX クエリ ビューの Copilot アイコンをクリックするか、Ctrl + I を押して Copilot を開始します。

まず、今開いているセマンティック モデルについて確認するため、プロンプトに「このセマンティック モデルについて説明して」と入力し、実行します。
image.png

[さらに表示] をクリックすることで回答全文を閲覧できます。(画面下部の [結果] ペインを最小化しておくと見やすいです。)
image.png

image.png

2) 「できるだけ多くのメジャー」を要求(まず英語)

前に実行したプロンプトが残っているので、一旦削除しできるだけたくさんのメジャーを作成してと入力します。

[メジャーの提案] というボタンをクリックするだけでも構いません。この場合、できるだけたくさん要求する場合より数は少なくなりますが、一般的によく使われるであろうメジャーが定義されます。
image.png

執筆時点で Based on my data suggest new measures in a DAX query for further analysis and try out with one or more suitable columns というプロンプトになります。
(訳:私のデータに基づいて、さらなる分析のためにDAXクエリで新しい指標を提案し、1つ以上の適切な列で試してみてください)

Power BI サービス/Fabric ポータルでは、DAX クエリ ビューに最初から表示されている文字列 (紫の枠内) をそのままにして Copilot の応答を実行すると、EVALUATEDEFINE の前に存在してしまい、「このクエリにはエラーが含まれています。」と表示されます。
Copilot が生成したクエリ以外を削除するか、クエリを削除してから Copilot に指示してください。
image.png

3) メジャーの名前を日本語にして、モデルに反映

Copilot に次のプロンプトを入力して実行します
すべてのメジャーの名前を日本語にして
クエリが修正され、メジャーの名前が日本語になりました。
image.png

日本語に修正されたクエリ
// DAX query generated by Fabric Copilot with "すべてのメジャーの名前を日本語にして"
// 多くの便利なメジャーを定義し、月別に一覧化して返します。
// 参照: 'Calendar' は 'Sales'[Date] と関連しているため、Time Intelligence が利用可能です。
DEFINE
  // 基本集計
  MEASURE 'Sales'[売上合計] = SUM('Sales'[Sales])
  MEASURE 'Sales'[売上原価合計] = SUM('Sales'[COGS])
  MEASURE 'Sales'[総売上高] = SUM('Sales'[Gross Sales])
  MEASURE 'Sales'[販売数量合計] = SUM('Sales'[Units Sold])
  MEASURE 'Sales'[受注件数] = COUNTROWS('Sales')

  // 収益性
  MEASURE 'Sales'[粗利益] = [売上合計] - [売上原価合計]
  MEASURE 'Sales'[粗利率 %] = DIVIDE([粗利益], [売上合計])
  MEASURE 'Sales'[値引額] = [総売上高] - [売上合計]
  MEASURE 'Sales'[値引率 %] = DIVIDE([値引額], [総売上高])

  // 単価関連
  MEASURE 'Sales'[平均単価] = DIVIDE([売上合計], [販売数量合計])
  MEASURE 'Sales'[平均原価単価] = DIVIDE([売上原価合計], [販売数量合計])
  MEASURE 'Sales'[平均値引単価] = DIVIDE([値引額], [販売数量合計])

  // ユニーク数
  MEASURE 'Sales'[ユニーク製品数] = DISTINCTCOUNT('Sales'[Product])
  MEASURE 'Sales'[ユニーク国数] = DISTINCTCOUNT('Sales'[Country])
  MEASURE 'Sales'[ユニークセグメント数] = DISTINCTCOUNT('Sales'[Segment])

  // 時系列 (YTD / QTD / MTD)
  MEASURE 'Sales'[売上YTD] = TOTALYTD([売上合計], 'Calendar'[Date])
  MEASURE 'Sales'[原価YTD] = TOTALYTD([売上原価合計], 'Calendar'[Date])
  MEASURE 'Sales'[粗利益YTD] = TOTALYTD([粗利益], 'Calendar'[Date])

  MEASURE 'Sales'[売上QTD] = TOTALQTD([売上合計], 'Calendar'[Date])
  MEASURE 'Sales'[売上MTD] = TOTALMTD([売上合計], 'Calendar'[Date])

  // 前年比較 (YoY)
  MEASURE 'Sales'[前年売上] = CALCULATE([売上合計], SAMEPERIODLASTYEAR('Calendar'[Date]))
  MEASURE 'Sales'[前年差] = [売上合計] - [前年売上]
  MEASURE 'Sales'[前年比 %] = DIVIDE([前年差], [前年売上])

  // ローリング (移動集計) - 期間は厳密に -3/-6/-12 ヶ月
  MEASURE 'Sales'[売上移動合計3ヶ月] =
    CALCULATE([売上合計], DATESINPERIOD('Calendar'[Date], MAX('Calendar'[Date]), -3, MONTH))
  MEASURE 'Sales'[売上移動合計6ヶ月] =
    CALCULATE([売上合計], DATESINPERIOD('Calendar'[Date], MAX('Calendar'[Date]), -6, MONTH))
  MEASURE 'Sales'[売上移動合計12ヶ月] =
    CALCULATE([売上合計], DATESINPERIOD('Calendar'[Date], MAX('Calendar'[Date]), -12, MONTH))

  // 平均・中央値などの参考指標
  MEASURE 'Sales'[月次平均売上] =
    AVERAGEX(
      VALUES('Calendar'[YearMonth]),
      CALCULATE([売上合計])
    )
  MEASURE 'Sales'[月次売上中央値] =
    MEDIANX(
      VALUES('Calendar'[YearMonth]),
      CALCULATE([売上合計])
    )

  // シェア指標(全体比: 現在のフィルター内の合計に対する比率)
  MEASURE 'Sales'[売上(全体コンテキスト)] = CALCULATE([売上合計], ALL('Country'), ALL('Product'), ALL('Segment'))
  MEASURE 'Sales'[売上構成比 %] = DIVIDE([売上合計], [売上(全体コンテキスト)])

// 月次で多くのメジャーを一覧表示
EVALUATE
  SUMMARIZECOLUMNS(
    'Calendar'[Year],
    'Calendar'[Month],
    // [Month] の並び替えに使用するソート列 [MonthNO] を含める
    'Calendar'[MonthNO],
    "売上合計", [売上合計],
    "売上原価合計", [売上原価合計],
    "総売上高", [総売上高],
    "販売数量合計", [販売数量合計],
    "受注件数", [受注件数],
    "粗利益", [粗利益],
    "粗利率 %", [粗利率 %],
    "値引額", [値引額],
    "値引率 %", [値引率 %],
    "平均単価", [平均単価],
    "平均原価単価", [平均原価単価],
    "平均値引単価", [平均値引単価],
    "ユニーク製品数", [ユニーク製品数],
    "ユニーク国数", [ユニーク国数],
    "ユニークセグメント数", [ユニークセグメント数],
    "売上YTD", [売上YTD],
    "原価YTD", [原価YTD],
    "粗利益YTD", [粗利益YTD],
    "売上QTD", [売上QTD],
    "売上MTD", [売上MTD],
    "前年売上", [前年売上],
    "前年差", [前年差],
    "前年比 %", [前年比 %],
    "売上移動合計3ヶ月", [売上移動合計3ヶ月],
    "売上移動合計6ヶ月", [売上移動合計6ヶ月],
    "売上移動合計12ヶ月", [売上移動合計12ヶ月],
    "月次平均売上", [月次平均売上],
    "月次売上中央値", [月次売上中央値],
    "売上構成比 %", [売上構成比 %]
  )
  ORDER BY
    'Calendar'[Year] ASC,
    'Calendar'[MonthNO] ASC

なお、2)の手順で [クエリを保持する] をクリックしていると、下図のように変更前の部分が赤色に、変更後の部分が緑色にハイライトされます。
image.png

Copilot は英語のほうが網羅的に提案しやすく、「できるだけたくさんのメジャーを日本語で作って」と頼むよりメジャー数が増える傾向があります。まず 英語でメジャーを量産→後から 名前だけ日本語化するのが効率的です(※この挙動は実運用での観察に基づく Tips で、公式仕様ではありません)。

[クエリを保持する][実行] で Copilot が返した DAX クエリの実行結果を確認します。

image.png

不要なメジャーがあれば、その行を削除してから [変更を含むモデルの更新 (#)] を使ってモデルに取り込みます (# はメジャーの数)。

image.png

image.png

変更を含むモデルの更新後に、メジャーの定義が間違っているとか不要だとかが明らかになれば、そのメジャーを右クリックして削除します。

DAX クエリ ビューの Copilot は「クエリ生成・説明」が中心で、モデル内のオブジェクト名の一括リネームは守備範囲外です。
直接オブジェクト名を変更することはできないため、メジャーを定義するクエリを修正してからモデルに反映しています。

4) Copilot でメジャーの説明を作成する

  1. [モデル ビュー] の [データ] ペインで既存のモデル メジャーを選択して、メジャーのプロパティを表示します。
  2. [説明] ボックスの下にある [Copilot を使用して作成する] ボタンを選択します。
    image.png
  3. Copilot からの指標の説明を確認し、問題なければ [保持する] を選びます。
    image.png
    あいにく、現時点では説明は英語で生成されるので、日本語の説明にするには、結果をコピーして翻訳してから手作業で入力することになります。

メジャーを定義している DAX 式について理解したい場合も、DAX クエリ ビューの Copilot にお願いできます。
たとえば、メジャー「売上移動合計3ヶ月」について説明して と入力します。
image.png

さらに、DATESINPERIOD についても聞いてみます。
image.png

出た!「現在のコンテキスト」。意味わかんないですよね。聞きましょう。
image.png

こんな風に、作ってもらったメジャーについて質問することで、DAX の勉強がはかどるかと思います。

検証用クエリ(DAX クエリ)

[クエリ] タブを追加して、下記のコードを実行すると、モデル内のすべてのメジャーの名前とその定義などを一覧できます。State 列で Valid となっていないメジャーがないようにします。

EVALUATE
SELECTCOLUMNS(
  INFO.VIEW.MEASURES(),
  "Home table", [Table],
  "Measure",    [Name],
  "State",      [State],
  "DAX",        [Expression]
)

image.png

まとめ

  • 英語でメジャーを大量生成 → 日本語名へ安全にリネームという二段構えが、個人的なお勧めです。
  • DAX クエリ ビューの Copilot は、メジャーのたたき台作りドキュメント生成(説明文)に強く、最後はモデル整備(命名規則・表示フォルダー・説明)で仕上げると、組織全体で再利用しやすいモデルになると思います。
  • Ignite ではセマンティック モデルからオントロジーを作成する機能が発表され、パブリック プレビューになっています。ぜひセマンティック モデルを Copilot で効率的に作成し、データ エージェントや AI エージェントにおける活用につなげてみてください。
3
0
0

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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?