📊 STEP 35: DAX関数の基礎
Power BIの心臓部!データ分析の魔法を使いこなそう
📋 このステップで学ぶこと
- DAX(Data Analysis Expressions)とは何か
- 計算列とメジャーの違いと使い分け
- 基本的な集計関数(SUM、AVERAGE、COUNTなど)
- DAX式の書き方と構文ルール
- よく使う関数一覧と実践例
- 実際のビジネスシナリオでの活用方法
ゴール:基本的なDAX関数を使って、売上分析や利益率計算などの指標を作成できるようになる
🎯 1. DAXとは何か
DAXの役割を理解しよう
DAX(Data Analysis Expressions)は、Power BIでデータを計算・集計・分析するための専用言語です。Excelの関数に似ていますが、より強力で、複数のテーブルにまたがるデータ分析に特化しています。
| できること | 説明 | 具体例 |
|---|---|---|
| 集計 | 数値データをまとめて計算 | 合計、平均、最大値、最小値 |
| 計算 | ビジネス指標を算出 | 利益率、成長率、構成比 |
| 時系列分析 | 期間を比較する計算 | 前年比、累計、移動平均 |
| 条件分岐 | 状況に応じた計算 | IF文で「高」「低」を判定 |
| フィルタリング | 特定条件での集計 | 「東京のみ」の売上合計 |
なぜDAXが必要なのか
Power BIでは、単純な数値を表示するだけでなく、ビジネスに役立つ「指標」を作成することが重要です。DAXを使えば、複雑な計算も簡単に実現できます。
| 指標 | 計算内容 | ビジネスでの活用 |
|---|---|---|
| 売上合計 | 全売上の合計 | 売上目標の達成状況確認 |
| 顧客単価 | 売上 ÷ 顧客数 | 顧客の購買力分析 |
| 利益率 | 利益 ÷ 売上 × 100 | 収益性の評価 |
| 前年比 | 今年 ÷ 昨年 × 100 | 成長率の把握 |
| 売上構成比 | 商品売上 ÷ 全体売上 × 100 | 主力商品の特定 |
DAXとExcel関数の違い
ExcelとDAXは似ていますが、いくつかの重要な違いがあります。Excelに慣れている方は、この違いを理解しておくとスムーズに学習できます。
| 項目 | Excel | DAX |
|---|---|---|
| セル参照 | =A1+B1(セル番地で指定) | =テーブル[列名](列名で指定) |
| 集計 | =SUM(A1:A10) | =SUM(売上[金額]) |
| 条件分岐 | =IF(A1>100, “大”, “小”) | =IF([売上]>100, “大”, “小”) |
| 他テーブル参照 | VLOOKUPが必要 | リレーションで自動参照 |
| 計算タイミング | セル単位で即座に計算 | フィルターに応じて動的に計算 |
ポイント:DAXはExcelより「列」単位で考えます。セル番地(A1など)ではなく、列名(売上[金額]など)で指定します。
⚖️ 2. 計算列とメジャーの違い
DAXの2つの使い方
DAXには「計算列」と「メジャー」という2つの使い方があります。この違いを理解することが、DAXを使いこなす第一歩です。
| 特徴 | 説明 |
|---|---|
| 定義 | テーブルに新しい列を追加し、各行ごとに計算した値を格納する |
| 計算タイミング | データが読み込まれたときに1回だけ計算され、結果が保存される |
| メモリ使用 | 計算結果がテーブルに保存されるため、メモリを消費する |
| 使用例 | 利益 = 売上 – 原価、フルネーム = 姓 & 名、年齢層の分類 |
| スライサー使用 | 可能(列として存在するため、フィルターに使える) |
| 手順 | 操作 | 補足 |
|---|---|---|
| 1 | データビューまたはモデルビューを開く | 計算列を追加したいテーブルを表示 |
| 2 | 対象のテーブルを選択 | 左側のフィールド一覧からテーブルをクリック |
| 3 | 「テーブルツール」→「新しい列」をクリック | 数式バーが表示される |
| 4 | DAX式を入力(例:利益 = 売上[売上金額] – 売上[原価]) | 列名 = 式 の形式で入力 |
| 5 | Enterキーで確定 | テーブルに新しい列が追加される |
| 特徴 | 説明 |
|---|---|
| 定義 | ビジュアルで使用されるときに、その都度計算される集計値 |
| 計算タイミング | ビジュアルが表示されるたびに動的に計算される |
| メモリ使用 | 計算式のみ保存されるため、軽量 |
| 使用例 | 合計売上、平均単価、顧客数、利益率 |
| フィルター影響 | スライサーやフィルターの影響を受けて値が変化する |
| 手順 | 操作 | 補足 |
|---|---|---|
| 1 | レポートビュー、データビュー、モデルビューのいずれかを開く | どのビューからでも作成可能 |
| 2 | メジャーを紐づけたいテーブルを選択 | 通常はファクトテーブルを選択 |
| 3 | 「テーブルツール」→「新しいメジャー」をクリック | 数式バーが表示される |
| 4 | DAX式を入力(例:合計売上 = SUM(売上[金額])) | メジャー名 = 式 の形式で入力 |
| 5 | Enterキーで確定 | フィールド一覧に計算機アイコン付きで表示 |
計算列とメジャーの使い分け
どちらを使うべきか迷ったときは、以下の基準で判断しましょう。
| シチュエーション | 推奨 | 理由 |
|---|---|---|
| 行ごとの計算(単価、利益など) | 計算列 | 各行で異なる値が必要なため |
| 集計(合計、平均など) | メジャー | 動的に計算され、メモリ効率が良い |
| スライサー/フィルターで使いたい | 計算列 | 列として存在するためスライサーに配置可能 |
| KPI指標(売上合計、顧客数など) | メジャー | フィルターに応じて値が変化するため |
| 文字列結合(フルネームなど) | 計算列 | 行レベルの操作だから |
| 前年比、累計など時系列計算 | メジャー | タイムインテリジェンス関数はメジャーで使用 |
迷ったらメジャーを使う!
メジャーの方が以下の点で優れています:
- パフォーマンス:計算式だけを保存するためメモリ効率が良い
- 柔軟性:フィルターに応じて動的に値が変わる
- 再利用性:他のメジャーから参照しやすい
計算列は「どうしても行レベルで値を保存したい」「スライサーに使いたい」ときだけ使いましょう。
🔢 3. 基本的な集計関数
SUM関数 – 合計を計算する
最もよく使う関数です。指定した列のすべての値を合計します。
| 項目 | 内容 |
|---|---|
| 構文 | SUM(テーブル名[列名]) |
| 機能 | 指定した列のすべての値を合計する |
| 使用例 | 合計売上 = SUM(売上[金額]) |
| 結果 | すべての売上金額の合計が表示される |
数式バーに以下のように入力します:
合計売上 = SUM(売上[金額])
※モバイルでは横スクロールで全体を確認できます
AVERAGE関数 – 平均を計算する
指定した列の平均値を計算します。1件あたりの金額などを求めるときに使います。
| 項目 | 内容 |
|---|---|
| 構文 | AVERAGE(テーブル名[列名]) |
| 機能 | 指定した列の平均値を計算する |
| 使用例 | 平均売上 = AVERAGE(売上[金額]) |
| 結果 | 1件あたりの平均売上金額が表示される |
COUNT系関数 – 件数をカウントする
件数を数えるための関数は3種類あり、それぞれ用途が異なります。
| 関数 | 機能 | 使用例 |
|---|---|---|
| COUNT | 数値が入っているセルの数をカウント | 注文数 = COUNT(売上[注文ID]) |
| COUNTA | 空白以外のセルの数をカウント | 記入件数 = COUNTA(売上[備考]) |
| DISTINCTCOUNT | 重複を除いたユニークな値の数をカウント | 顧客数 = DISTINCTCOUNT(売上[顧客ID]) |
| 売上テーブルの例 | COUNT結果 | DISTINCTCOUNT結果 |
|---|---|---|
| 顧客ID: C001 | 4件 (全行をカウント) |
2人 (ユニークな顧客数) |
| 顧客ID: C001 | ||
| 顧客ID: C002 | ||
| 顧客ID: C001 |
ポイント:「顧客数」「商品種類数」など、ユニークな数を求めるときは必ずDISTINCTCOUNTを使いましょう!
MIN / MAX関数 – 最小値・最大値を取得する
データの範囲(最小〜最大)を把握するために使います。日付にも使用できます。
| 用途 | MIN(最小値) | MAX(最大値) |
|---|---|---|
| 金額 | 最小売上 = MIN(売上[金額]) | 最大売上 = MAX(売上[金額]) |
| 日付 | 最古日付 = MIN(売上[日付]) | 最新日付 = MAX(売上[日付]) |
| スコア | 最低点 = MIN(成績[点数]) | 最高点 = MAX(成績[点数]) |
DIVIDE関数 – 安全に割り算をする
割り算は通常の「/」演算子でもできますが、DIVIDE関数を使うことを強くおすすめします。ゼロで割ってもエラーにならない安全な割り算ができます。
| 式 | 分母がゼロの場合 | 結果 |
|---|---|---|
| [利益] / [売上] | 売上が0のとき | ❌ エラー発生! |
| DIVIDE([利益], [売上]) | 売上が0のとき | ✅ BLANK(空白)を返す |
| 項目 | 内容 |
|---|---|
| 構文 | DIVIDE(分子, 分母, [エラー時の代替値]) |
| 引数1:分子 | 割られる数(例:利益) |
| 引数2:分母 | 割る数(例:売上) |
| 引数3(省略可) | ゼロ除算時に返す値(省略時はBLANK) |
利益率を計算する例:
利益率 = DIVIDE(SUM(売上[利益]), SUM(売上[売上金額])) * 100
エラー時に0を返す例:
利益率 = DIVIDE(SUM(売上[利益]), SUM(売上[売上金額]), 0) * 100
重要:割り算は必ずDIVIDE関数を使いましょう!
✍️ 4. DAX式の書き方
基本構文を覚えよう
DAX式は「名前 = 式」という形式で記述します。列の参照方法や演算子のルールを押さえておきましょう。
| 要素 | 説明 | 例 |
|---|---|---|
| 名前 | メジャーまたは計算列の名前 | 合計売上 |
| =(イコール) | 名前と式を区切る記号 | = |
| 式 | 関数や演算子を組み合わせた計算式 | SUM(売上[金額]) |
| 書き方 | 意味 | 使用場面 |
|---|---|---|
| [列名] | 同じテーブル内の列を参照 | 計算列で使用 |
| テーブル名[列名] | テーブルを明示して列を参照 | メジャー、他テーブル参照時 |
推奨:常に「テーブル名[列名]」形式で書くと、どのテーブルの列かが明確になります。
演算子を覚えよう
DAXで使える演算子はExcelとほぼ同じです。
| 種類 | 演算子 | 意味 | 例 |
|---|---|---|---|
| 算術演算子 | + | 足し算 | [売上] + [利益] |
| – | 引き算 | [売上] – [原価] | |
| * | 掛け算 | [単価] * [数量] | |
| / | 割り算 | [売上] / [顧客数] | |
| 比較演算子 | = | 等しい | [地域] = “東京” |
| <> | 等しくない | [地域] <> “東京” | |
| > , < | より大きい/小さい | [売上] > 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([売上金額] >= 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サイトの基本指標
オンラインショップでよく使う基本的な指標を作成してみましょう。
以下のメジャーを作成します:
// 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もすぐに慣れます!
📝 実践演習
売上テーブル(注文ID、顧客ID、商品ID、金額、数量)に対して、以下のメジャーを作成してください:
1. 合計売上
2. 注文件数
3. 顧客数(ユニーク)
4. 平均注文金額
// 1. 合計売上 合計売上 = SUM(売上[金額]) // 2. 注文件数 注文数 = COUNT(売上[注文ID]) // 3. 顧客数(ユニーク) 顧客数 = DISTINCTCOUNT(売上[顧客ID]) // 4. 平均注文金額 平均注文金額 = DIVIDE([合計売上], [注文数]) // または 平均注文金額 = AVERAGE(売上[金額])
作成手順:
- モデルビューまたはデータビューで売上テーブルを選択
- 「新しいメジャー」をクリック
- 数式バーに上記のDAX式を入力
- Enterキーで確定
- 4つすべてのメジャーを作成
使い方:
- カードビジュアルに配置してKPI表示
- テーブルビジュアルで一覧表示
売上テーブル(売上金額、原価)に対して、以下を作成してください:
1. 利益メジャー(売上金額 – 原価)
2. 利益率メジャー(利益 / 売上金額 × 100)
3. 利益率判定の計算列(利益率が30%以上なら「高利益」、そうでなければ「低利益」)
// 1. 利益メジャー
利益 = SUM(売上[売上金額]) - SUM(売上[原価])
// 2. 利益率メジャー
利益率(%) = DIVIDE([利益], SUM(売上[売上金額])) * 100
// 3. 利益率判定(計算列)
// まず、行レベルの利益率を計算列で作成
行別利益率 = DIVIDE(売上[売上金額] - 売上[原価], 売上[売上金額])
// 次に、判定列を作成
利益率判定 = IF(売上[行別利益率] >= 0.3, "高利益", "低利益")
// または、1つの計算列にまとめる
利益率判定 = IF(
DIVIDE(売上[売上金額] - 売上[原価], 売上[売上金額]) >= 0.3,
"高利益",
"低利益"
)
ポイント:
- メジャーは集計レベル(全体の利益率)
- 計算列は行レベル(各行の判定)
- DIVIDEを使ってゼロ除算を回避
- 利益率判定列はスライサーで使える
売上テーブルに対して、売上構成比(各商品の売上 / 全体の売上 × 100)を計算するメジャーを作成してください。ヒント:CALCULATE関数とALL関数を使います。
// 売上構成比
売上構成比(%) =
DIVIDE(
SUM(売上[金額]),
CALCULATE(
SUM(売上[金額]),
ALL(商品)
)
) * 100
解説:
| 部分 | 説明 |
|---|---|
| SUM(売上[金額]) | 分子:現在のフィルター(商品)での売上合計 |
| CALCULATE | フィルターコンテキストを変更する関数 |
| ALL(商品) | 商品テーブルのフィルターをすべて解除 |
| 分母 | 全商品の売上合計(フィルターなし) |
使い方:
- 商品別のテーブルに配置
- 円グラフで構成比を可視化
- パレート分析に活用
※CALCULATE関数とALL関数の詳細は次のステップで学習します!
❓ よくある質問
迷ったら以下の質問で判断しましょう:
「この値はビジュアルのフィルターによって変わる?」
→ YES:メジャー(例:合計売上、平均)
→ NO:計算列(例:フルネーム、カテゴリ分類)
「スライサーやフィルターとして使いたい?」
→ YES:計算列
→ NO:メジャー
❌ 悪い例:[利益] / [売上]
✅ 良い例:DIVIDE([利益], [売上])
DIVIDEは分母がゼロの場合、自動的にBLANK(空白)を返すので安全です。エラー時の代替値も指定できます:
DIVIDE([利益], [売上], 0) → ゼロ除算時は0を返す
COUNT:すべての行をカウント(重複含む)
例:注文数 = COUNT(売上[注文ID])
DISTINCTCOUNT:ユニークな値のみカウント(重複除く)
例:顧客数 = DISTINCTCOUNT(売上[顧客ID])
顧客IDが複数回登場しても、DISTINCTCOUNTなら1人として数えます。KPI指標ではDISTINCTCOUNTをよく使います。
デバッグ方法:
- カードビジュアルに単独で配置して全体の値を確認
- テーブルビジュアルで商品別などに分割して確認
- スライサーをすべてクリアして確認
次のステップでフィルターコンテキストを詳しく学びます!
Power BIでは、テーブル間のリレーションシップを設定すれば、自動的に関連データを参照できます。
どうしても必要な場合は:
- RELATED:関連テーブルの値を取得(計算列で使用)
- LOOKUPVALUE:条件に一致する値を検索
ただし、ほとんどのケースでリレーションシップで解決します!
DAX式は改行しても問題ありません。読みやすく整形することで、後からの修正も楽になります。
良い例:
売上構成比 =
DIVIDE(
SUM(売上[金額]),
CALCULATE(
SUM(売上[金額]),
ALL(商品)
)
) * 100
むしろ日本語の方が:
- レポートを見る人にわかりやすい
- 何の指標かすぐに理解できる
- メンテナンスがしやすい
「合計売上」「顧客数」「利益率(%)」など、日本語で明確な名前をつけましょう。
学習メモ
BIツール入門 - Step 35