STEP 35:DAX関数の基礎

📊 STEP 35: DAX関数の基礎

Power BIの心臓部!データ分析の魔法を使いこなそう

📋 このステップで学ぶこと

  • DAX(Data Analysis Expressions)とは何か
  • 計算列とメジャーの違いと使い分け
  • 基本的な集計関数(SUM、AVERAGE、COUNTなど)
  • DAX式の書き方と構文ルール
  • よく使う関数一覧と実践例
  • 実際のビジネスシナリオでの活用方法

ゴール:基本的なDAX関数を使って、売上分析や利益率計算などの指標を作成できるようになる

🎯 1. DAXとは何か

DAXの役割を理解しよう

DAX(Data Analysis Expressions)は、Power BIでデータを計算・集計・分析するための専用言語です。Excelの関数に似ていますが、より強力で、複数のテーブルにまたがるデータ分析に特化しています。

✅ DAX = Power BIの計算エンジン
できること 説明 具体例
集計 数値データをまとめて計算 合計、平均、最大値、最小値
計算 ビジネス指標を算出 利益率、成長率、構成比
時系列分析 期間を比較する計算 前年比、累計、移動平均
条件分岐 状況に応じた計算 IF文で「高」「低」を判定
フィルタリング 特定条件での集計 「東京のみ」の売上合計

なぜDAXが必要なのか

Power BIでは、単純な数値を表示するだけでなく、ビジネスに役立つ「指標」を作成することが重要です。DAXを使えば、複雑な計算も簡単に実現できます。

💡 DAXで作れるビジネス指標の例
指標 計算内容 ビジネスでの活用
売上合計 全売上の合計 売上目標の達成状況確認
顧客単価 売上 ÷ 顧客数 顧客の購買力分析
利益率 利益 ÷ 売上 × 100 収益性の評価
前年比 今年 ÷ 昨年 × 100 成長率の把握
売上構成比 商品売上 ÷ 全体売上 × 100 主力商品の特定

DAXとExcel関数の違い

ExcelとDAXは似ていますが、いくつかの重要な違いがあります。Excelに慣れている方は、この違いを理解しておくとスムーズに学習できます。

📊 ExcelとDAXの比較
項目 Excel DAX
セル参照 =A1+B1(セル番地で指定) =テーブル[列名](列名で指定)
集計 =SUM(A1:A10) =SUM(売上[金額])
条件分岐 =IF(A1>100, “大”, “小”) =IF([売上]>100, “大”, “小”)
他テーブル参照 VLOOKUPが必要 リレーションで自動参照
計算タイミング セル単位で即座に計算 フィルターに応じて動的に計算

ポイント:DAXはExcelより「列」単位で考えます。セル番地(A1など)ではなく、列名(売上[金額]など)で指定します。

⚖️ 2. 計算列とメジャーの違い

DAXの2つの使い方

DAXには「計算列」「メジャー」という2つの使い方があります。この違いを理解することが、DAXを使いこなす第一歩です。

✅ 計算列(Calculated Column)とは
特徴 説明
定義 テーブルに新しい列を追加し、各行ごとに計算した値を格納する
計算タイミング データが読み込まれたときに1回だけ計算され、結果が保存される
メモリ使用 計算結果がテーブルに保存されるため、メモリを消費する
使用例 利益 = 売上 – 原価、フルネーム = 姓 & 名、年齢層の分類
スライサー使用 可能(列として存在するため、フィルターに使える)
📊 計算列の作成手順
手順 操作 補足
1 データビューまたはモデルビューを開く 計算列を追加したいテーブルを表示
2 対象のテーブルを選択 左側のフィールド一覧からテーブルをクリック
3 「テーブルツール」→「新しい列」をクリック 数式バーが表示される
4 DAX式を入力(例:利益 = 売上[売上金額] – 売上[原価]) 列名 = 式 の形式で入力
5 Enterキーで確定 テーブルに新しい列が追加される
📊 メジャー(Measure)とは
特徴 説明
定義 ビジュアルで使用されるときに、その都度計算される集計値
計算タイミング ビジュアルが表示されるたびに動的に計算される
メモリ使用 計算式のみ保存されるため、軽量
使用例 合計売上、平均単価、顧客数、利益率
フィルター影響 スライサーやフィルターの影響を受けて値が変化する
📊 メジャーの作成手順
手順 操作 補足
1 レポートビュー、データビュー、モデルビューのいずれかを開く どのビューからでも作成可能
2 メジャーを紐づけたいテーブルを選択 通常はファクトテーブルを選択
3 「テーブルツール」→「新しいメジャー」をクリック 数式バーが表示される
4 DAX式を入力(例:合計売上 = SUM(売上[金額])) メジャー名 = 式 の形式で入力
5 Enterキーで確定 フィールド一覧に計算機アイコン付きで表示

計算列とメジャーの使い分け

どちらを使うべきか迷ったときは、以下の基準で判断しましょう。

💡 使い分けの判断基準
シチュエーション 推奨 理由
行ごとの計算(単価、利益など) 計算列 各行で異なる値が必要なため
集計(合計、平均など) メジャー 動的に計算され、メモリ効率が良い
スライサー/フィルターで使いたい 計算列 列として存在するためスライサーに配置可能
KPI指標(売上合計、顧客数など) メジャー フィルターに応じて値が変化するため
文字列結合(フルネームなど) 計算列 行レベルの操作だから
前年比、累計など時系列計算 メジャー タイムインテリジェンス関数はメジャーで使用
✅ 迷ったときの基本ルール

迷ったらメジャーを使う!

メジャーの方が以下の点で優れています:

  • パフォーマンス:計算式だけを保存するためメモリ効率が良い
  • 柔軟性:フィルターに応じて動的に値が変わる
  • 再利用性:他のメジャーから参照しやすい

計算列は「どうしても行レベルで値を保存したい」「スライサーに使いたい」ときだけ使いましょう。

🔢 3. 基本的な集計関数

SUM関数 – 合計を計算する

最もよく使う関数です。指定した列のすべての値を合計します。

📊 SUM関数の基本
項目 内容
構文 SUM(テーブル名[列名])
機能 指定した列のすべての値を合計する
使用例 合計売上 = SUM(売上[金額])
結果 すべての売上金額の合計が表示される
💻 SUM関数の入力例

数式バーに以下のように入力します:

合計売上 = SUM(売上[金額])

※モバイルでは横スクロールで全体を確認できます

AVERAGE関数 – 平均を計算する

指定した列の平均値を計算します。1件あたりの金額などを求めるときに使います。

📊 AVERAGE関数の基本
項目 内容
構文 AVERAGE(テーブル名[列名])
機能 指定した列の平均値を計算する
使用例 平均売上 = AVERAGE(売上[金額])
結果 1件あたりの平均売上金額が表示される

COUNT系関数 – 件数をカウントする

件数を数えるための関数は3種類あり、それぞれ用途が異なります。

📊 COUNT系関数の使い分け
関数 機能 使用例
COUNT 数値が入っているセルの数をカウント 注文数 = COUNT(売上[注文ID])
COUNTA 空白以外のセルの数をカウント 記入件数 = COUNTA(売上[備考])
DISTINCTCOUNT 重複を除いたユニークな値の数をカウント 顧客数 = DISTINCTCOUNT(売上[顧客ID])
💡 DISTINCTCOUNTが重要な理由
売上テーブルの例 COUNT結果 DISTINCTCOUNT結果
顧客ID: C001 4件
(全行をカウント)
2人
(ユニークな顧客数)
顧客ID: C001
顧客ID: C002
顧客ID: C001

ポイント:「顧客数」「商品種類数」など、ユニークな数を求めるときは必ずDISTINCTCOUNTを使いましょう!

MIN / MAX関数 – 最小値・最大値を取得する

データの範囲(最小〜最大)を把握するために使います。日付にも使用できます。

📊 MIN / MAX関数の使用例
用途 MIN(最小値) MAX(最大値)
金額 最小売上 = MIN(売上[金額]) 最大売上 = MAX(売上[金額])
日付 最古日付 = MIN(売上[日付]) 最新日付 = MAX(売上[日付])
スコア 最低点 = MIN(成績[点数]) 最高点 = MAX(成績[点数])

DIVIDE関数 – 安全に割り算をする

割り算は通常の「/」演算子でもできますが、DIVIDE関数を使うことを強くおすすめします。ゼロで割ってもエラーにならない安全な割り算ができます。

⚠️ 通常の割り算の問題点
分母がゼロの場合 結果
[利益] / [売上] 売上が0のとき ❌ エラー発生!
DIVIDE([利益], [売上]) 売上が0のとき ✅ BLANK(空白)を返す
✅ DIVIDE関数の構文
項目 内容
構文 DIVIDE(分子, 分母, [エラー時の代替値])
引数1:分子 割られる数(例:利益)
引数2:分母 割る数(例:売上)
引数3(省略可) ゼロ除算時に返す値(省略時はBLANK)
💻 DIVIDE関数の入力例

利益率を計算する例:

利益率 = DIVIDE(SUM(売上[利益]), SUM(売上[売上金額])) * 100

エラー時に0を返す例:

利益率 = DIVIDE(SUM(売上[利益]), SUM(売上[売上金額]), 0) * 100

重要:割り算は必ずDIVIDE関数を使いましょう!

✍️ 4. DAX式の書き方

基本構文を覚えよう

DAX式は「名前 = 式」という形式で記述します。列の参照方法や演算子のルールを押さえておきましょう。

📊 DAX式の基本構造
要素 説明
名前 メジャーまたは計算列の名前 合計売上
=(イコール) 名前と式を区切る記号 =
関数や演算子を組み合わせた計算式 SUM(売上[金額])
📊 列の参照方法
書き方 意味 使用場面
[列名] 同じテーブル内の列を参照 計算列で使用
テーブル名[列名] テーブルを明示して列を参照 メジャー、他テーブル参照時

推奨:常に「テーブル名[列名]」形式で書くと、どのテーブルの列かが明確になります。

演算子を覚えよう

DAXで使える演算子はExcelとほぼ同じです。

💡 DAXで使える演算子一覧
種類 演算子 意味
算術演算子 + 足し算 [売上] + [利益]
引き算 [売上] – [原価]
* 掛け算 [単価] * [数量]
/ 割り算 [売上] / [顧客数]
比較演算子 = 等しい [地域] = “東京”
<> 等しくない [地域] <> “東京”
> , < より大きい/小さい [売上] > 1000
>= , <= 以上/以下 [売上] >= 1000
論理演算子 && かつ(AND) [売上] > 1000 && [地域] = “東京”
|| または(OR) [地域] = “東京” || [地域] = “大阪”
文字列 & 文字列連結 [姓] & ” ” & [名]

命名規則のベストプラクティス

わかりやすい名前をつけることで、後からレポートを見たときに何の指標かすぐにわかります。

✅ 良い命名のルール
ルール 良い例 悪い例
日本語OK 合計売上、平均売上、顧客数 TotalSales(英語だけ)
単位を含める 売上(百万円)、利益率(%) 売上(単位不明)
一貫性を保つ 合計〇〇、平均〇〇 売上合計、平均の売上
略語は避ける 売上金額 売金、URG
具体的に書く 月間売上合計 売上

📚 5. よく使うDAX関数一覧

集計関数

データを集計するための基本関数です。メジャーで頻繁に使用します。

📊 集計関数一覧
関数 説明 使用例
SUM 合計 合計売上 = SUM(売上[金額])
AVERAGE 平均 平均売上 = AVERAGE(売上[金額])
MIN 最小値 最小売上 = MIN(売上[金額])
MAX 最大値 最大売上 = MAX(売上[金額])
COUNT 数値のカウント 注文数 = COUNT(売上[注文ID])
COUNTA 空白以外のカウント 記入件数 = COUNTA(売上[備考])
DISTINCTCOUNT ユニーク値のカウント 顧客数 = DISTINCTCOUNT(売上[顧客ID])

論理関数

条件によって処理を分岐させる関数です。

📊 論理関数一覧
関数 説明 使用例
IF 条件分岐 評価 = IF([売上] > 1000, “高”, “低”)
AND 複数条件がすべて真 AND([売上] > 1000, [地域] = “東京”)
OR いずれかの条件が真 OR([地域] = “東京”, [地域] = “大阪”)
NOT 条件の否定 NOT([地域] = “東京”)
SWITCH 複数の条件分岐 月名 = SWITCH([月], 1, “1月”, 2, “2月”, “その他”)
💻 IF関数の詳細

構文:

IF(条件, 真の場合の値, 偽の場合の値)

使用例:売上ランク判定

売上ランク = IF([売上金額] >= 100000, "A", IF([売上金額] >= 50000, "B", "C"))

※IF関数はネスト(入れ子)できますが、3つ以上の条件にはSWITCH関数がおすすめです

数学関数

数値を加工するための関数です。

📊 数学関数一覧
関数 説明 使用例
DIVIDE 安全な割り算 利益率 = DIVIDE([利益], [売上])
ROUND 四捨五入 金額(四捨五入) = ROUND([金額], 0)
ROUNDUP 切り上げ 金額(切り上げ) = ROUNDUP([金額], 0)
ROUNDDOWN 切り捨て 金額(切り捨て) = ROUNDDOWN([金額], 0)
ABS 絶対値 差分 = ABS([今年] – [昨年])

テキスト関数

文字列を操作するための関数です。計算列でよく使います。

💡 テキスト関数一覧
関数 説明 使用例
CONCATENATE 文字列結合 フルネーム = CONCATENATE([姓], [名])
LEFT 左から抽出 先頭3文字 = LEFT([商品コード], 3)
RIGHT 右から抽出 末尾3文字 = RIGHT([商品コード], 3)
MID 途中から抽出 中間2文字 = MID([商品コード], 4, 2)
LEN 文字数を数える 文字数 = LEN([商品名])
UPPER / LOWER 大文字/小文字変換 大文字 = UPPER([商品名])

ヒント:文字列結合は「&」演算子でも可能です。例:[姓] & ” ” & [名]

💼 6. 実践的な計算例

例1:ECサイトの基本指標

オンラインショップでよく使う基本的な指標を作成してみましょう。

💻 ECサイトの基本メジャー

以下のメジャーを作成します:

// 1. 合計売上
合計売上 = SUM(売上[金額])

// 2. 注文件数
注文数 = COUNT(売上[注文ID])

// 3. ユニークな顧客数
顧客数 = DISTINCTCOUNT(売上[顧客ID])

// 4. 平均注文金額
平均注文金額 = DIVIDE([合計売上], [注文数])

// 5. 顧客あたり売上(顧客単価)
顧客単価 = DIVIDE([合計売上], [顧客数])

// 6. 販売商品種類数
商品種類数 = DISTINCTCOUNT(売上[商品ID])
✅ 結果イメージ
指標
合計売上 1,500,000円
注文数 150件
顧客数 80人
平均注文金額 10,000円
顧客単価 18,750円
商品種類数 25種類

例2:利益分析

売上から利益を計算し、利益率を求めます。

💻 利益関連のメジャー
// 1. 利益(売上 - 原価)
利益 = SUM(売上[売上金額]) - SUM(売上[原価])

// 2. 利益率(%表示用)
利益率(%) = DIVIDE([利益], SUM(売上[売上金額])) * 100

// 3. 粗利益
粗利益 = SUM(売上[売上金額]) - SUM(売上[仕入原価])

// 4. 粗利益率
粗利益率(%) = DIVIDE([粗利益], SUM(売上[売上金額])) * 100

例3:顧客セグメンテーション(計算列)

顧客を購入回数によってランク分けする計算列を作成します。

💻 顧客ランク分類(計算列)
// 顧客ランク判定(計算列として作成)
顧客ランク = 
SWITCH(
    TRUE(),
    売上[購入回数] >= 10, "プラチナ",
    売上[購入回数] >= 5, "ゴールド",
    売上[購入回数] >= 2, "シルバー",
    "ブロンズ"
)

ポイント:SWITCH(TRUE(), …)は複数のIF文を簡潔に書くテクニックです。条件は上から順に評価されます。

💡 計算列を使う理由

顧客ランクはスライサーとして使いたいため、計算列で作成します。

計算列として作成すると:

  • スライサーに配置できる
  • フィルターとして使用できる
  • グラフの軸に使用できる

📝 STEP 35 のまとめ

✅ このステップで学んだこと
  • DAX:Power BIの計算・分析専用言語
  • 計算列:行ごとに計算され、テーブルに保存される
  • メジャー:動的に計算され、集計に最適
  • 基本関数:SUM、AVERAGE、COUNT、DISTINCTCOUNT、DIVIDE
  • 重要ルール:迷ったらメジャー、割り算はDIVIDE
💡 最重要ポイント

DAXの基本は「メジャーを使う」「DIVIDEで割り算」「わかりやすい命名」の3つです!

最初は難しく感じるかもしれませんが、SUM、AVERAGE、COUNTなどの基本関数から始めて、徐々に複雑な式を作れるようになります。

Excelの関数が使えれば、DAXもすぐに慣れます!

📝 実践演習

演習 1 基礎

売上テーブル(注文ID、顧客ID、商品ID、金額、数量)に対して、以下のメジャーを作成してください:
1. 合計売上
2. 注文件数
3. 顧客数(ユニーク)
4. 平均注文金額

【メジャーの作成】
// 1. 合計売上
合計売上 = SUM(売上[金額])

// 2. 注文件数
注文数 = COUNT(売上[注文ID])

// 3. 顧客数(ユニーク)
顧客数 = DISTINCTCOUNT(売上[顧客ID])

// 4. 平均注文金額
平均注文金額 = DIVIDE([合計売上], [注文数])
// または
平均注文金額 = AVERAGE(売上[金額])

作成手順:

  1. モデルビューまたはデータビューで売上テーブルを選択
  2. 「新しいメジャー」をクリック
  3. 数式バーに上記のDAX式を入力
  4. Enterキーで確定
  5. 4つすべてのメジャーを作成

使い方:

  • カードビジュアルに配置してKPI表示
  • テーブルビジュアルで一覧表示
演習 2 応用

売上テーブル(売上金額、原価)に対して、以下を作成してください:
1. 利益メジャー(売上金額 – 原価)
2. 利益率メジャー(利益 / 売上金額 × 100)
3. 利益率判定の計算列(利益率が30%以上なら「高利益」、そうでなければ「低利益」)

【メジャーと計算列の作成】
// 1. 利益メジャー
利益 = SUM(売上[売上金額]) - SUM(売上[原価])

// 2. 利益率メジャー
利益率(%) = DIVIDE([利益], SUM(売上[売上金額])) * 100

// 3. 利益率判定(計算列)
// まず、行レベルの利益率を計算列で作成
行別利益率 = DIVIDE(売上[売上金額] - 売上[原価], 売上[売上金額])

// 次に、判定列を作成
利益率判定 = IF(売上[行別利益率] >= 0.3, "高利益", "低利益")

// または、1つの計算列にまとめる
利益率判定 = IF(
    DIVIDE(売上[売上金額] - 売上[原価], 売上[売上金額]) >= 0.3,
    "高利益",
    "低利益"
)

ポイント:

  • メジャーは集計レベル(全体の利益率)
  • 計算列は行レベル(各行の判定)
  • DIVIDEを使ってゼロ除算を回避
  • 利益率判定列はスライサーで使える
演習 3 発展

売上テーブルに対して、売上構成比(各商品の売上 / 全体の売上 × 100)を計算するメジャーを作成してください。ヒント:CALCULATE関数とALL関数を使います。

【売上構成比メジャー】
// 売上構成比
売上構成比(%) = 
DIVIDE(
    SUM(売上[金額]),
    CALCULATE(
        SUM(売上[金額]),
        ALL(商品)
    )
) * 100

解説:

部分 説明
SUM(売上[金額]) 分子:現在のフィルター(商品)での売上合計
CALCULATE フィルターコンテキストを変更する関数
ALL(商品) 商品テーブルのフィルターをすべて解除
分母 全商品の売上合計(フィルターなし)

使い方:

  • 商品別のテーブルに配置
  • 円グラフで構成比を可視化
  • パレート分析に活用

※CALCULATE関数とALL関数の詳細は次のステップで学習します!

❓ よくある質問

Q1: 計算列とメジャー、どちらを使えばいいかわかりません
集計なら「メジャー」、行ごとの値なら「計算列」です。

迷ったら以下の質問で判断しましょう:

「この値はビジュアルのフィルターによって変わる?」
→ YES:メジャー(例:合計売上、平均)
→ NO:計算列(例:フルネーム、カテゴリ分類)

「スライサーやフィルターとして使いたい?」
→ YES:計算列
→ NO:メジャー
Q2: 割り算でエラーが出ます
DIVIDE関数を使いましょう!通常の割り算(/)はゼロ除算でエラーになります。

❌ 悪い例:[利益] / [売上]
✅ 良い例:DIVIDE([利益], [売上])

DIVIDEは分母がゼロの場合、自動的にBLANK(空白)を返すので安全です。エラー時の代替値も指定できます:
DIVIDE([利益], [売上], 0) → ゼロ除算時は0を返す
Q3: COUNTとDISTINCTCOUNTの違いは?
重複を数えるかどうかです。

COUNT:すべての行をカウント(重複含む)
例:注文数 = COUNT(売上[注文ID])

DISTINCTCOUNT:ユニークな値のみカウント(重複除く)
例:顧客数 = DISTINCTCOUNT(売上[顧客ID])

顧客IDが複数回登場しても、DISTINCTCOUNTなら1人として数えます。KPI指標ではDISTINCTCOUNTをよく使います。
Q4: メジャーが思った値にならない
フィルターコンテキストを確認しましょう。メジャーは、ビジュアルのフィルター、スライサー、行・列の設定によって値が変わります。

デバッグ方法:
  1. カードビジュアルに単独で配置して全体の値を確認
  2. テーブルビジュアルで商品別などに分割して確認
  3. スライサーをすべてクリアして確認

次のステップでフィルターコンテキストを詳しく学びます!

Q5: ExcelのVLOOKUPに相当するDAX関数は?
リレーションシップを使えば不要です!

Power BIでは、テーブル間のリレーションシップを設定すれば、自動的に関連データを参照できます。

どうしても必要な場合は:
  • RELATED:関連テーブルの値を取得(計算列で使用)
  • LOOKUPVALUE:条件に一致する値を検索

ただし、ほとんどのケースでリレーションシップで解決します!

Q6: DAXの式が長くなって読みにくい
改行とインデントを使いましょう!

DAX式は改行しても問題ありません。読みやすく整形することで、後からの修正も楽になります。

良い例:
売上構成比 = 
DIVIDE(
    SUM(売上[金額]),
    CALCULATE(
        SUM(売上[金額]),
        ALL(商品)
    )
) * 100
Q7: 日本語でメジャー名をつけても大丈夫?
まったく問題ありません!

むしろ日本語の方が:
  • レポートを見る人にわかりやすい
  • 何の指標かすぐに理解できる
  • メンテナンスがしやすい

「合計売上」「顧客数」「利益率(%)」など、日本語で明確な名前をつけましょう。

📝

学習メモ

BIツール入門 - Step 35

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE