論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
Power BI
Microsoft Power BI
BI / データ可視化

🔖 キーワード索引

このページで扱う主要キーワード(クリックで該当セクションへ):

DAX Power Query M 言語 メジャー 計算列 リレーションシップ RLS 行レベルセキュリティ データセット ダッシュボード 47都道府県マップ DirectQuery vs Import Power Platform

💡 30秒で分かる結論

🍰 まずはやさしく

データを図にする魔法の道具です。

数字をわかりやすく伝えるために使います。

部活の成績をグラフにする時に便利です。

まずは結論と使い方のコツを読みましょう。

💡 組織導入のコツ

段階的展開

  1. パイロット (1-3 ヶ月) ── 1 部署で具体テーマ (例: 売上ダッシュボード) で試作・効果測定
  2. ガバナンス設計 (1 ヶ月) ── ワークスペース命名規則、 RLS ポリシー、 機密ラベル運用
  3. 水平展開 (3-6 ヶ月) ── 他部署にテンプレ展開、 トレーニング実施
  4. 定着・最適化 (継続) ── 利用状況をモニタリング、 重複・古いレポートの整理

陥りがちな落とし穴

定着率を上げる施策

🔀 Power BI が向かないケース

シナリオ推奨ツール理由
1 回限りの分析 (使い捨て)Excel / Jupyterダッシュボード設計コストが回収できない
論文向け図表 (高品質印刷)matplotlib / ggplot2細かい意匠調整が容易
専門統計分析 (因果推論等)R / Python (statsmodels)Power BI に統計関数は少ない
機械学習モデル構築Python (scikit-learn)Power BI は予測の活用のみ
Mac のみの環境Tableau / Looker StudioPower BI Desktop は Windows 専用
無料で外部公開したいLooker StudioPower BI は公開に Premium 必要
地理空間分析 (GIS)QGIS / ArcGISマップ機能は基本的
大量テキストマイニングPython / Elasticsearchテキスト処理は弱い

✅ ダッシュボード公開前チェックリスト

📍 あなたが今見ているもの

🍰 まずはやさしく

このページは用語の地図のようなものです。

言葉の意味を正しく理解するために使います。

スマホで調べ物をするように活用してください。

全体の流れと関連する言葉を確認しましょう。

Power BI」 (Microsoft Power BI) は、 SSDSE-B-2026 などの公的統計データを使った教材・分析で頻出するキーワードです。 本ページでは、 まず直感、 次に数式、 そして 47 都道府県の実値で確かめる、 という流れで体系的に整理します。 加えて、 ケーススタディ・FAQ・歴史的経緯・参考文献までを 1 ページに集約し、 用語の「地図」として使えるようにしました。

関連用語(前提・並列・発展)と関連グループ教材も末尾にまとめてあるので、 用語の地図として活用してください。

🎨 直感で掴む

🍰 まずはやさしく

データの整理と表示をまとめて行う道具です。

複雑な表を直感的に見るために使います。

買い物リストを整理して分析する感覚です。

仕組みと操作の方法について詳しく読みましょう。

Power BI は Microsoft の BI 製品群(Desktop/Service/Mobile/Report Server)の総称です。 Tableau とよく比較されますが、 Excel と地続きであることが最大の特徴で、 Power Query と DAX という 2 つの言語を持ちます。

SSDSE のような長い表データは、 Power Query で「年度」「地域」を整形 → モデルで「都道府県マスタ」と紐付け → DAX で「高齢化率」「人口増減率」をメジャー化 → ビジュアルで配置、 という典型ルートで扱います。

🎨 ダッシュボード設計ベストプラクティス

① F パターンレイアウト

人の視線は左上→右上→左下→右下の「F 字」で動く。 重要 KPI は左上、 詳細データは右下に配置:

┌──────────────────────────────────────┐
│ [KPI1: 総人口]  [KPI2: 高齢化率]  [KPI3: YoY] │  ← 最重要 (大きい数字)
├──────────────────────────────────────┤
│ [マップ: 都道府県別ヒートマップ]              │  ← 全体俯瞰
├──────────────────────────────────────┤
│ [折れ線: 年度推移]  [棒: 上位 10 県]       │  ← 詳細
├──────────────────────────────────────┤
│ [テーブル: 全 47 県の詳細データ]               │  ← ドリルダウン
└──────────────────────────────────────┘

② 色彩の使い分け

色の種類用途
順序的 (Sequential)「低→高」の量を示す濃淡 1 色 (高齢化率)
発散的 (Diverging)「正→負」の差分赤-白-青 (前年比)
カテゴリ的「分類」を示す10 色まで (都道府県)
強調 (Highlight)1 つだけ目立たせる赤 1 色 + グレー

③ 何を「クリック可能」にするか

④ 8 秒ルール

ダッシュボードは「開いて 8 秒以内に主要メッセージが伝わる」べき。 KPI 数値・グラフタイトル・カラーパレットの 3 点で「何が問題か / どこを見るべきか」を瞬時に伝える。 8 秒以内に伝わらないなら設計を見直す。

⑤ モバイル対応

Power BI Service はモバイルレイアウト機能を持つ。 PC レイアウトと別に「タテ画面 9:16」のレイアウトを設計し、 KPI と最重要ビジュアル 1〜2 個だけに絞る。 詳細データはタップで詳細画面に遷移させる。

🧰 DAX 頻出パターン集

パターン 1: 累計 (Running Total)

累計人口 :=
    CALCULATE(
        SUM('SSDSE'[A1101]),
        FILTER(
            ALL('SSDSE'[year]),
            'SSDSE'[year] <= MAX('SSDSE'[year])
        )
    )

パターン 2: 前年比 (YoY %)

前年人口 := CALCULATE([総人口], DATEADD('SSDSE'[year], -1, YEAR))
人口 YoY% := DIVIDE([総人口] - [前年人口], [前年人口])

パターン 3: ランキング

人口ランク :=
    RANKX(
        ALL('SSDSE'[Prefecture]),
        [総人口],
        ,
        DESC,
        Dense
    )

パターン 4: 移動平均 (3 年)

3年移動平均 :=
    AVERAGEX(
        DATESINPERIOD('SSDSE'[year], LASTDATE('SSDSE'[year]), -3, YEAR),
        [総人口]
    )

パターン 5: 全国シェア

全国シェア :=
    DIVIDE([総人口], CALCULATE([総人口], ALL('SSDSE'[Prefecture])))

パターン 6: 条件分岐 (IF / SWITCH)

人口区分 :=
    SWITCH(
        TRUE(),
        [総人口] >= 5000000, "大規模",
        [総人口] >= 1500000, "中規模",
        "小規模"
    )

パターン 7: 動的タイトル

動的タイトル :=
    "選択中: " & SELECTEDVALUE('SSDSE'[Prefecture], "全国") & " (" & SELECTEDVALUE('SSDSE'[year], "全期間") & ")"

パターン 8: 累積平均から外れ値検出

人口Zスコア :=
    DIVIDE(
        [総人口] - CALCULATE(AVERAGE('SSDSE'[A1101]), ALL('SSDSE')),
        CALCULATE(STDEV.P('SSDSE'[A1101]), ALL('SSDSE'))
    )

⚡ パフォーマンスチューニング

計算列 vs メジャーの選び方

観点計算列メジャー
計算タイミング取り込み時に 1 回クエリのたびに再計算
メモリテーブルに保存 (圧縮済)0 バイト (式のみ)
使い所分類、 区分、 結合キー合計、 平均、 比率
パフォーマンスクエリ高速、 メモリ消費大メモリ小、 クエリ遅め

原則: 「区分・分類は計算列、 集計はメジャー」。 計算列を多用すると VertiPaq の圧縮効率が落ちメモリが膨張するので、 集計可能なものはメジャーで。

スタースキーマの徹底

ファクト (大きい数値) ⇔ ディメンション (属性) を 1 対多リレーションで結ぶ。 1 つの大テーブルにすべて入れる「フラット」設計は VertiPaq に不利。

       ┌──────────────┐
       │ 都道府県マスタ │ (1)
       └─────┬────────┘
             │
             │ Code (リレーション)
             │
        (多) ↓
       ┌──────────────┐
       │ SSDSE ファクト │ ──── (1) ──── 年度マスタ
       └──────────────┘
             ↑
             │
       (1) 指標マスタ

カーディナリティ削減

DirectQuery vs Import の選択

モード長所短所適用例
Import高速、 全 DAX 関数使用可更新スケジュール必要、 メモリ制約SSDSE-B-2026 (数 MB〜数百 MB)
DirectQueryリアルタイム、 大規模 DWH 連携遅い、 一部 DAX 関数使えないSnowflake / BigQuery (数 TB)
Composite (Mixed)両者の良いとこ取り設計複雑マスタは Import、 トランザクションは DirectQuery

🆚 Power BI vs Tableau ── 詳細比較

観点Power BITableau
提供元MicrosoftSalesforce (旧 Tableau Software)
価格 (Pro)10 USD/user/月75 USD/user/月
学習曲線緩やか (Excel 知識活用)急 (独自パラダイム)
計算言語DAX + MCalculated Field (SQL 風)
可視化の表現力標準十分、 拡張可標準で美しい、 表現力高
Microsoft 連携◎ Teams/SharePoint/Azure○ (連携あり、 浅め)
セルフサービス BI○ ビジネスユーザー向け○ アナリスト向け
エンタープライズ○ Fabric で統合進む◎ Tableau Server で安定
モバイル○ アプリ完成度高○ レスポンシブ対応
OSS 連携 (Python/R)○ ビジュアル埋め込み○ TabPy / Rserve

結論: 「Microsoft 365 中心の組織なら Power BI、 高度なアナリスト集団なら Tableau」が定石。 大学・自治体は Power BI 寄り、 データ専門部署のある企業は Tableau 寄りの傾向。

🔄 SSDSE-B-2026 完全ワークフロー

1 つのプロジェクトを最初から最後まで通すと:

Step 1: 環境構築 (10 分)

Step 2: データ取込 (5 分)

Step 3: Power Query 整形 (10 分)

Step 4: モデリング (10 分)

Step 5: メジャー作成 (10 分)

Step 6: ビジュアル配置 (20 分)

Step 7: レポート公開 (5 分)

合計 70 分で本格ダッシュボードが完成。 SSDSE-B-2026 のような中規模公的統計データなら、 1 営業日以内に試作 → 1 週間で本番運用、 が現実的な工数感覚。

🏢 現場事例

事例 1: 県庁の人口統計ダッシュボード

関東のある県庁が SSDSE-B-2026 を Power BI で可視化、 県議会・記者会見・市民広報に活用。 RLS で「県内市町村担当者」「県庁職員」「外部公開」の 3 レベルを設定し、 機微な内訳情報は内部のみ閲覧可能に。 月 1 回の更新で運用、 担当者の作業時間が 「Excel 集計 8 時間 → Power BI 自動 30 分」に短縮。

事例 2: 大学の研究費獲得ダッシュボード

国立大学の URA 部門が、 部局別研究費獲得・論文出版・科研費採択数を Power BI で可視化。 学長レビュー会議で毎月使用、 部局長は自部局のドリルダウン画面を Service 上で閲覧。 OneDrive 上の Excel と直結し、 担当事務員の入力がリアルタイム反映。

事例 3: 病院の救急搬送ダッシュボード

救急搬送台数・到着時間・診療科別件数を Power BI で可視化、 院内会議室のモニターに常時表示。 異常値が出ると Power Automate で Teams に自動通知。 月次レビューで滞留時間の改善を継続実施。

事例 4: 製造業の生産ライン KPI

OEE (総合設備効率)、 不良率、 生産量、 計画達成率を 5 分間隔で更新。 Azure IoT Hub からデータが流れ、 Power BI が DirectQuery で表示。 現場の作業員がタブレットで確認、 異常傾向を早期発見。

事例 5: 教育機関の入試動向分析

高校別合格者数、 出身地別分布、 入試区分別歩留まりを過去 10 年分集約。 入試委員会でターゲティング戦略立案に使用、 SNS 広告のターゲット設計にも展開。

🛠 エラー対処集

エラー 1: 「データソースに接続できません」

原因: ファイルパスが変更された、 ネットワーク共有が切断された、 認証期限切れ。

対策:

エラー 2: 「列が見つかりません」

原因: ソース CSV のヘッダ名が変わった、 列が削除された。

対策:

エラー 3: 「DAX 式が評価できません」

原因: テーブル名・列名のタイポ、 集計関数の中にメジャー名を直書きしようとした、 循環参照。

対策:

エラー 4: 「メモリ不足エラー」

原因: 大きなデータを Import モードで読み込んだ、 高カーディナリティ列が VertiPaq の圧縮効率を落とした。

対策:

エラー 5: 「マップビジュアルに地点が表示されない」

原因: データカテゴリが「都道府県」に設定されていない、 文字列のスペルがズレている。

対策:

エラー 6: 「Power BI Service でレポートが古い」

原因: スケジュール更新が失敗、 オンプレデータゲートウェイが停止。

対策:

🔐 セキュリティとガバナンス

RLS (行レベルセキュリティ) の実装

「東京担当者は東京の行だけ閲覧可」を実現する例:

// 「東京担当」ロールの DAX フィルタ式
[Prefecture] = "東京都"

// 動的に「ログインユーザー名で絞る」場合
[担当者メール] = USERPRINCIPALNAME()

USERPRINCIPALNAME() はログイン中の Microsoft アカウントのメールアドレスを返す。 「担当者メール」列をテーブルに持たせ、 ログインユーザーと一致する行だけ表示するパタンが定番。

ワークスペースのアクセス管理

ロール権限用途
管理者すべて(メンバー追加・削除含む)ワークスペースオーナー
メンバー編集・公開、 管理は不可共同開発者
コントリビュータ編集のみ、 公開不可サブ開発者
ビューア閲覧のみレポート利用者

機密データの扱い

監査・コンプライアンス

金融・医療業界では、 ダッシュボードの数値が「いつ・誰が・どの計算式で」算出したかを追跡できることが必須。 Power BI は以下で対応:

🔌 他システムとの統合

Microsoft 365 統合

サービス連携方法用途
Excel「Excel に分析」「Live Connect」ピボット形式でデータ取得
SharePointレポートを Web パーツとして埋め込みイントラ社内ポータル
Teams「アプリ追加 → Power BI」チーム会議でダッシュボード共有
OneDriveExcel ファイルをデータソースに更新が自動連動
Outlookサブスクリプションで PDF 自動配信定期レポート配信

Power Platform 統合

Azure 統合

外部 OSS 連携

🚀 Microsoft Fabric ── 次世代統合基盤

2023 年に GA した Microsoft Fabric は、 Power BI を含むデータ系製品 (Synapse、 Data Factory、 OneLake 等) を統合した SaaS。 Power BI 単体ではなく Fabric の一部として位置付けられつつある。

Fabric の主要コンポーネント

Direct Lake モード

Fabric の新機能。 Import の高速さ + DirectQuery のリアルタイム性 を両立。 OneLake 上の Parquet を直接 VertiPaq エンジンが読み込み、 データのコピーなしに高速集計を実現。

Copilot for Power BI

2024 年導入。 自然言語で「過去 3 年の人口推移を都道府県別に表示して」と指示するとレポートを自動生成。 まだ精度は発展途上だが、 プロトタイピング高速化に有効。

📖 学習リソース

無料・公式

書籍

資格

コミュニティ

📋 クイックリファレンス

よく使うショートカット

キー動作
Ctrl+S保存
F5クエリ更新
Ctrl+Z元に戻す
Ctrl+Shift+Rビジュアル更新
Alt+F4終了
F11フルスクリーン (フォーカスモード)

DAX 関数 速見

関数用途
SUM / AVERAGE / COUNT / MIN / MAX基本集計
DIVIDE0 除算で空白を返す安全な割り算
CALCULATEフィルタコンテキストの書き換え
FILTERテーブルの絞り込み
ALL / ALLEXCEPT / ALLSELECTEDフィルタ解除
RELATEDリレーション先の値を取得
SUMX / AVERAGEX行コンテキストで集計
DATEADD / SAMEPERIODLASTYEAR / TOTALYTD時間インテリジェンス
RANKXランキング
SWITCH / IF条件分岐
USERPRINCIPALNAMEログインユーザー取得 (RLS)

Power Query M 関数 速見

関数用途
Csv.Document / Excel.Workbookファイル読込
Table.PromoteHeaders1 行目をヘッダに昇格
Table.SelectRows行フィルタ
Table.SelectColumns / Table.RemoveColumns列選択/削除
Table.AddColumnカスタム列追加
Table.TransformColumnTypes型変換
Table.UnpivotOtherColumns縦持ち変換
Table.Groupグループ集計
Table.Join / Table.NestedJoinテーブル結合

🍱 SSDSE-B-2026 レシピ集 (8 種)

SSDSE-B-2026 (47 都道府県・複数年度・112 指標) を素材に、 Power BI で作れる典型的なダッシュボードを 8 種類紹介。

レシピ 1: 都道府県別人口マップ

レシピ 2: 人口推移の折れ線

レシピ 3: 高齢化率のランキング

レシピ 4: 総人口 vs 高齢者数のバブル散布

レシピ 5: 出生率・死亡率のデュアル軸

レシピ 6: 地域別の年齢構成 100% 積み上げ

レシピ 7: 47 都道府県のテーブル + 条件付き書式

レシピ 8: KPI カード群

🎓 DAX 高度パターン

パターン A: パレート分析 (累積構成比)

「人口の 80% は何県でカバーされるか」を見る:

人口ランク :=
    RANKX(ALL('SSDSE'[Prefecture]), [総人口], , DESC)

累計人口 :=
    CALCULATE(
        [総人口],
        FILTER(ALL('SSDSE'[Prefecture]),
               RANKX(ALL('SSDSE'[Prefecture]), [総人口], , DESC) <= [人口ランク])
    )

累積構成比 := DIVIDE([累計人口], CALCULATE([総人口], ALL('SSDSE'[Prefecture])))

SSDSE-B-2026 の 2023 年で計算すると、 上位 13 都道府県(東京、 神奈川、 大阪、 愛知、 埼玉、 千葉、 兵庫、 福岡、 北海道、 静岡、 茨城、 広島、 京都)で人口の 64.6% をカバー。 累積 80% に到達するには上位 23 都道府県が必要。

パターン B: 地域グループ集計

// 計算列で地域コードを追加
地域 =
    SWITCH(TRUE(),
        'SSDSE'[Code] IN {"R01000"}, "北海道",
        'SSDSE'[Code] IN {"R02000","R03000","R04000","R05000","R06000","R07000"}, "東北",
        'SSDSE'[Code] IN {"R08000","R09000","R10000","R11000","R12000","R13000","R14000"}, "関東",
        // ... 以下省略
        "その他")

// 地域別人口
地域別人口 := CALCULATE([総人口], ALLEXCEPT('SSDSE', 'SSDSE'[地域]))

パターン C: 増減率の階層集計

// 地域内シェア
地域内シェア := DIVIDE([総人口], [地域別人口])

// 全国内シェア
全国内シェア := DIVIDE([総人口], CALCULATE([総人口], ALL('SSDSE')))

パターン D: 動的閾値による分類

人口区分動的 :=
    VAR Q1 = CALCULATE(QUANTILE.INC('SSDSE'[A1101], 0.25), ALL('SSDSE'))
    VAR Q3 = CALCULATE(QUANTILE.INC('SSDSE'[A1101], 0.75), ALL('SSDSE'))
    RETURN
        SWITCH(TRUE(),
            [総人口] > Q3, "上位 25%",
            [総人口] > Q1, "中位 50%",
            "下位 25%")

パターン E: 時間軸の比較 (前年同月比)

前年同月人口 := CALCULATE([総人口], SAMEPERIODLASTYEAR('SSDSE'[date]))
人口前年比 := DIVIDE([総人口] - [前年同月人口], [前年同月人口])
人口 3 ヶ月移動平均 :=
    AVERAGEX(
        DATESINPERIOD('SSDSE'[date], LASTDATE('SSDSE'[date]), -3, MONTH),
        [総人口]
    )

🎨 完成ダッシュボード例 (3 種)

① 自治体向け人口統計ダッシュボード

┌──────────────────────────────────────────────────────┐
│ [SSDSE-B-2026 統計ダッシュボード] スライサー: [年度▼] [地域▼]      │
├─────────────┬─────────────┬─────────────┬─────────────┤
│ 全国人口    │ 高齢化率    │ 出生数      │ YoY        │
│ 1.24 億    │ 30.5%      │ 77 万      │ -0.39%   │
├─────────────┴─────────────┼─────────────┴─────────────┤
│ [都道府県マップ]            │ [人口推移折れ線 上位5県]    │
│ ・東京: 大円              │ ・東京 ────────         │
│ ・神奈川:                 │ ・神奈川 ─ ─ ─          │
│ ・大阪:                   │ ・大阪 ──────           │
│ (色=高齢化率)             │ (X=年度, Y=総人口)       │
├──────────────────────────┼──────────────────────────┤
│ [高齢化率ランキング]        │ [人口 vs 高齢者数散布]      │
│ 秋田 39% ████████        │ ●        ●          ● 東京  │
│ 高知 36% ███████         │   ●  ●        ●       │
│ 徳島 35% ███████         │   ● ●  ●            │
├──────────────────────────┴──────────────────────────┤
│ [全 47 都道府県テーブル]                                │
│ 県  人口   高齢化率  出生率  YoY%                       │
│ ── ──── ────── ──── ────                          │
│ 東京 1408万 22.7%   0.67%  +0.21% ← 緑(増加)        │
│ 北海道 509万 33.0%  0.55%  -0.94% ← 赤(減少)        │
│ 沖縄 146万 23.1%   0.93%  +0.08% ← 緑                │
│ ...                                                    │
└──────────────────────────────────────────────────────┘

② 病院向け診療実績ダッシュボード

┌──────────────────────────────────────────────────────┐
│ [広島市民病院 月次レポート] [年月▼] [診療科▼]            │
├─────────────┬─────────────┬─────────────┬─────────────┤
│ 患者数      │ 平均在院日数 │ 救急搬送    │ 病床稼働率   │
│ 1,234      │ 11.3 日    │ 87 件      │ 92.1%      │
├─────────────┴─────────────┼─────────────┴─────────────┤
│ [診療科別患者数 (棒)]       │ [月次推移 (折れ線)]         │
│ 内科  ███████ 423         │ 患者数 ─────────         │
│ 外科  ██████ 367          │ 救急搬送 ─ ─ ─          │
│ 産科  ████ 234            │ (12 ヶ月)               │
├──────────────────────────┴──────────────────────────┤
│ [病棟別稼働率ヒートマップ]                              │
│      月 火 水 木 金 土 日                                │
│ 1F  ██ ██ ██ ██ ██ ▓▓ ░░  ← 平日高、週末低              │
│ 2F  ██ ██ ██ ▓▓ ██ ██ ██                              │
│ 3F  ▓▓ ▓▓ ░░ ░░ ▓▓ ▓▓ ▓▓  ← 改善余地                  │
└──────────────────────────────────────────────────────┘

③ 製造業 OEE ダッシュボード

┌──────────────────────────────────────────────────────┐
│ [製造ライン KPI リアルタイム] [ライン▼] [シフト▼]      │
├─────────────┬─────────────┬─────────────┬─────────────┤
│ OEE 総合    │ 稼働率      │ 良品率      │ 性能効率    │
│ 78.3%     │ 92.1%      │ 96.8%     │ 87.9%     │
│ (目標 85)  │            │            │            │
├─────────────┴─────────────┼─────────────┴─────────────┤
│ [時間帯別 OEE (折れ線)]     │ [停止理由 Pareto (棒)]      │
│ 100% ───────────         │ チョコ停 ████████ 45%      │
│  90% ─────────           │ 段替え   ████ 22%          │
│  80% ─────               │ 故障     ███ 15%           │
│  70%                      │ 不良     ██ 10%            │
│  6 9 12 15 18 21 0 3      │ 材料切れ █ 8%              │
├──────────────────────────┴──────────────────────────┤
│ [ライン別 OEE トレンド 過去 30 日]                       │
│ Line A: ████████████ 87% (改善傾向)                     │
│ Line B: ███████ 71% (要改善 ← 黄)                       │
│ Line C: █████████ 82%                                  │
└──────────────────────────────────────────────────────┘

📐 数式・定義

🍰 まずはやさしく

計算を行うための専用のルールです。

正確な数値を出すために使います。

テストの平均点を計算する時に似ています。

数式や計算の仕組みについて詳しく読みましょう。

Power BI の中心言語は DAX。 DAX は「フィルタコンテキスト」と「行コンテキスト」という 2 種のスコープを持ちます。

【DAX: シンプルなメジャー】
総人口 := SUM('SSDSE'[A1101])
【DAX: 高齢化率(メジャー)】
高齢化率 := DIVIDE(SUM('SSDSE'[A1303]), SUM('SSDSE'[A1101]))

DIVIDE は 0 除算で空白を返す安全な除算。

【DAX: 文脈変更(CALCULATE)】
全国平均 := CALCULATE(AVERAGE('SSDSE'[A1101]), ALL('SSDSE'[Prefecture]))

ALL でフィルタを除き、 全都道府県を母集団とする平均を取る。

これを数学的に書けば、 フィルタ集合 $F$ に対して

$$\text{メジャー}_{F}(\theta) = f\bigl(\{x_i : i \in F\};\theta\bigr)$$

であり、 CALCULATE はこの $F$ を 動的に書き換える演算子と解釈できます。

📐 DAX 詳説 ── フィルタコンテキストの数理

DAX の理解で最も重要なのが フィルタコンテキスト (Filter Context)行コンテキスト (Row Context) の区別。 これを抑えれば DAX の挙動はほぼ予測可能になる。

2 つのコンテキストの定義

コンテキスト意味発生場面
行コンテキスト「現在の行」を指し示す環境計算列、 イテレータ関数(SUMX, FILTER 内など)
フィルタコンテキストテーブルがどう絞り込まれているかの集合メジャー、 ビジュアル、 CALCULATE 内

数式で考える

テーブル $T$ の行 $r \in T$、 列 $c$ について計算列 $X$ は:

$$ X(r) = f\bigl(T[c_1](r), T[c_2](r), \ldots\bigr) $$

と書ける(行ごとに $r$ を引数とする関数)。 一方メジャー $M$ は:

$$ M(F) = g\bigl(\{T[c](r) : r \in \mathrm{Filter}(T, F)\}\bigr) $$

と、 フィルタ条件 $F$ で絞り込まれた行集合に対する集約関数。 同じビジュアル内でも、 「東京都」「2023 年」のスライサーが効くたびに $F$ が更新され、 メジャーは 再計算される。

CALCULATE の本質

CALCULATE はフィルタコンテキストを 書き換える演算子:

$$ \mathrm{CALCULATE}(M, F_1, F_2, \ldots) = M\bigl((F_{\mathrm{current}} \setminus \mathrm{cols}(F_i)) \cup \bigcup F_i\bigr) $$

つまり、 既存のフィルタを 該当列だけ削除してから、 新しいフィルタ $F_i$ で上書きする。 これが「ALL でフィルタ解除 → 新条件で集計」のパターンを可能にする。

具体例: 「東京シェア」

東京シェア :=
    DIVIDE(
        CALCULATE([総人口], 'SSDSE'[Prefecture] = "東京都"),
        CALCULATE([総人口], ALL('SSDSE'[Prefecture]))
    )

分子は「Prefecture フィルタを 東京都 で上書き → 東京の総人口」、 分母は「Prefecture フィルタを ALL で除去 → 全国合計」。 ビジュアルがどの都道府県にフィルタされていても、 「東京の人口 / 全国合計」という不変の値を返す。

イテレータ関数 (X 系)

SUMX, AVERAGEX, MAXX などは 行コンテキストを生成するメジャー:

人口_千人単位 := SUMX('SSDSE', 'SSDSE'[A1101] / 1000)

テーブルの各行で「総人口 / 1000」を計算し、 最後に合計する(行ごとに動く SUM)。 集計後に割り算するのではなく 「行ごとに割り算してから合計」する点が肝。

🔬 数式を言葉で読み解く

用語意味SSDSE での例
クエリPower Query が生成する ETL ステップ列「CSV 読込→ヘッダ昇格→型変換→不要列削除」
テーブルモデル内のリレーショナル表『人口表』『都道府県マスタ』
リレーションシップキーで紐付ける線地域コードで人口表⇔マスタを結ぶ
計算列行コンテキストで評価される列「= [総人口]−[男性人口]」
メジャーフィルタコンテキストで評価される集計「= SUM([総人口])」
時間インテリジェンス年度・YTD・PY を扱う DAX 群TOTALYTD / SAMEPERIODLASTYEAR
RLS行レベルセキュリティ。 役割でフィルタ「東京担当者は東京の行のみ閲覧可」
DirectQueryクエリを毎回 DB に発行大規模 DWH 直結に向く
ImportVertiPaq に列圧縮で取込SSDSE 程度なら最速

🔬 数式を言葉で読み解く(DAX / Dataflow / Tableau 比較)

Power BI のレポート画面は単なる表示層で、 計算ロジックは DAX (Data Analysis Expressions) という関数言語で記述する。 例えば 合計売上 = SUM('Sales'[Amount]) という「メジャー」を 1 度定義すれば、 棒グラフ / 折れ線グラフ / カードに何度ドラッグしても同じ式が使い回せる。 CALCULATE 関数はフィルタコンテキストを書き換える DAX の核で、 「前年比 = DIVIDE([合計売上], CALCULATE([合計売上], SAMEPERIODLASTYEAR('Date'[Date]))) − 1」のように時系列比較が 1 行で書ける。

Dataflow は Power BI Service 上で動く ETL レイヤで、 Power Query M 言語をクラウド側で実行・スケジューリングする仕組み。 複数の .pbix ファイルから同じテーブルを参照したい時、 各 .pbix でクエリを書く代わりに Dataflow に集約すれば、 ETL コードが 1 か所で管理できる。 vs Tableau: Tableau は計算フィールドの式が .twbx ファイル内に閉じる単独完結型、 Power BI は DAX + Power Query + Dataflow + Power BI Service が Microsoft エコシステム前提で密結合した分業型。 Office 365 を社内標準とする組織では Power BI、 OS / クラウドを問わない可搬性を求める組織では Tableau が選ばれやすい。

🖼 補講: Power BI ダッシュボード設計の数理

Power BI のレポート設計は単なるドラッグ操作ではなく、 (1) スター・スキーマの設計、 (2) DAX (Data Analysis Expressions) 式の最適化、 (3) 視覚化の選択、 の 3 層の意思決定を伴う。 ここでは SSDSE-B-2026 を題材に、 数式と Python 実装の対応を示しつつ、 Power BI 上で再現する具体手順を補講する。

🖼 図 R292-A: スター・スキーマ概念図

star schema

→ 中央のファクトテーブルに数値、 周囲にディメンションテーブルを置く。 Power BI の「リレーションシップ」画面で 1 対多を引くだけで、 後はスライサーで瞬時にドリルダウンできる。

🖼 図 R292-B: KPI カード + 47 都道府県マップの配置例

power bi layout

→ ダッシュボード上段に 3 つの KPI カード、 中央に地図、 右に棒グラフ。 これは Power BI の典型レイアウトで、 視線が「Z 字」を描くよう配置するのが定石。

🖼 図 R292-C: DAX メジャーの依存グラフ

dax dependency

→ 「Total Pop」「Elderly Pop」という基礎メジャーを掛け合わせて「Elderly Rate」を作り、 さらに KPI カードビジュアルが参照する、 という DAX の依存グラフ。 構造化することで再利用性とパフォーマンスが両立する。

🔬 数式を言葉で読み解く

高齢化率の DAX メジャーは数学的に $\text{ElderlyRate} = \dfrac{\sum_{i\in F} \text{Elderly}_i}{\sum_{i\in F}\text{Total}_i}$ で定義される (ここで $F$ はフィルタコンテキストで選択された行集合)。 これを Power BI 上では DIVIDE(SUM([Elderly]), SUM([Total])) と書く。 一見「分子分母を平均すれば等しい」と思うが、 実際には $\dfrac{\sum a_i}{\sum b_i} \ne \dfrac{1}{n}\sum \dfrac{a_i}{b_i}$ なので、 「各都道府県の率を平均する」のとは別物。 Simpson のパラドックスを踏まないよう、 DIVIDE の中で SUM を取るのが定石である。

🐍 補講コード: Power BI DAX を Python で再現

このコードでやること: SSDSE-B-2026 から「全国の高齢化率」を 2 通りで計算 (SUM/SUM 方式 と 単純平均方式) し、 差を観察する。

📥 入力 (SSDSE-B-2026 抜粋):

SSDSE-2026 都道府県 総人口 老年人口 R01000 北海道 5,092,000 1,681,000 R13000 東京都 14,086,000 3,205,000 ...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df.iloc[:, 0] == 2023]  # 2023 年のみに絞る(全 12 年が混在)
total   = df.iloc[:, 3].astype(float)  # 総人口
elderly = df.iloc[:, 15].astype(float)  # A1303 老年人口 (65 歳以上)

# DAX 方式: DIVIDE(SUM([老年]), SUM([総]))
rate_dax = elderly.sum() / total.sum()

# 単純平均方式: AVERAGEX([老年]/[総])
rate_avg = (elderly / total).mean()

print(f"DAX 方式 (SUM/SUM)        : {rate_dax*100:.2f}%")
print(f"単純平均方式 (AVERAGEX)   : {rate_avg*100:.2f}%")
print(f"差                         : {(rate_avg - rate_dax)*100:+.2f} pt")

📤 実行例:

DAX 方式 (SUM/SUM) : 29.13% 単純平均方式 (AVERAGEX) : 31.59% 差 : +2.45 pt

💬 単純平均は人口の少ない過疎県 (高齢化率が高い) と東京・愛知 (高齢化率が低い) を同じ重みで足してしまうため、 全国の高齢化率を 2.45 pt 過大評価する。 Power BI で KPI カードを作るときは必ず DIVIDE(SUM, SUM) を使うこと、 という実務的な教訓がここに繋がる。

📋 補講: Power BI vs 他 BI ツール DAX 相当機能

機能Power BI (DAX)Tableaupandas
合計SUM([col])SUM([col])df['col'].sum()
比率DIVIDE(a, b)[a]/[b]a / b
フィルタ集計CALCULATE(...,FILTER)IF SUMdf.query().sum()
前年比CALCULATE + DATEADDLOOKUP / 表計算pct_change()

本セクションは R292 補講として追加。 関連: Tableau, BI ツール, データ可視化

📝 Power BI 実装 10 ステップ — SSDSE-B-2026 編

Power BI Desktop で SSDSE-B-2026 を取り込んでダッシュボードを構築する手順を、 実務に近い 10 ステップで整理する。 各ステップに「DAX 式」「視覚化選択」「落とし穴」を併記しているので、 初学者から実務レベルへ橋渡しできる。

  1. データ取り込み — 「ホーム → データを取得 → テキスト/CSV」で SSDSE-B-2026.csv を選択。 1 行目がヘッダーでない場合は「変換」で先頭行を昇格させる。 文字コードは UTF-8 (BOM 付き) が安全。
  2. 列の型推論 — Power Query が自動推論するが、 都道府県コード (R01000 等) は「テキスト」に強制変換すること。 数値推論されると先頭の 0 が消える。
  3. 列名のリネーム — 「総人口」「老年人口」「年少人口」のように業務語彙へ統一。 後の DAX 式が読みやすくなる。
  4. Dim テーブルの分離 — 都道府県マスタを別シートに切り出し、 「リレーションシップ」画面でファクトと 1 対多リレーション。 これがスター・スキーマ。
  5. 計算列の追加高齢化率 = [老年人口] / [総人口] を計算列で追加。 これは行レベルで評価されるため、 ファクトのメモリを消費する点に注意。
  6. メジャーの定義全国高齢化率 = DIVIDE(SUM('Fact'[老年人口]), SUM('Fact'[総人口])) をメジャーで定義。 メジャーは集計時のみ評価されるため、 ストレージ効率が良い。
  7. 視覚化の配置 — 上段に KPI カード 3 つ (全国人口・全国高齢化率・前年比)、 中央に「マップビジュアル」、 右に「棒グラフ Top 10」。 Z 字レイアウト。
  8. スライサーの追加 — 「地方区分」スライサー (北海道・東北・関東・…) を上部に置く。 ユーザーが地域を選択するとマップ・棒グラフが連動して更新される。
  9. テーマ・ブランディング — 「表示 → テーマ」で組織のコーポレートカラーを適用。 フォントは Yu Gothic UI 推奨。 余白は 8px グリッド。
  10. Power BI Service への発行 — 「ホーム → 発行」でクラウド共有。 「データセットの更新」を毎日 9:00 にスケジュール。 行レベルセキュリティ (RLS) で部署別にアクセス制御。

📝 DAX vs Python: 同じ集計の書き比べ

DAX を初めて触る人は pandas との対比で覚えると効率的。 SSDSE-B-2026 を題材に、 同じ集計を DAX と Python で並べてみる。

タスクDAXPython (pandas)
全国総人口SUM([総人口])df['総人口'].sum()
関東のみ集計CALCULATE(SUM([総人口]), FILTER('Dim', [地方]="関東"))df[df['地方']=='関東']['総人口'].sum()
前年比DIVIDE([今年] - [前年], [前年])df['col'].pct_change()
高齢化率トップ 10TOPN(10, 'Dim', [高齢化率], DESC)df.nlargest(10, '高齢化率')
累積和CALCULATE(SUM([col]), FILTER(ALL('Dim'), [Date] <= MAX([Date])))df['col'].cumsum()
行ランクRANKX(ALL('Dim'), [総人口], , DESC)df['総人口'].rank(ascending=False)

📝 Power BI で起きる典型トラブルと対処

実務で Power BI ダッシュボードを運用していると、 以下のトラブルが頻発する。 事前に対処法を知っておくとリリース後の混乱を防げる。

📝 Power BI の長所と限界

Power BI は Microsoft 365 環境と統合された強力な BI ツールだが、 以下の長所と限界を理解しておく必要がある。

長所: (1) Excel ユーザーが学習しやすい、 (2) Azure・Teams・SharePoint と連携、 (3) 月額単価が低く中堅企業に向く、 (4) DAX が表現力豊か、 (5) Power Query で ETL も可能、 (6) Power BI Service の自動更新スケジュール。

限界: (1) Mac で Desktop が動かない (ブラウザ版のみ)、 (2) 大規模データ (10 億行超) はパフォーマンスが落ちる、 (3) 高度な統計分析は R/Python visual で補う必要、 (4) DAX のデバッグツールが弱い、 (5) PDF/PowerPoint 出力の自動化に制約。 SSDSE-B-2026 (47 行) なら何も問題ないが、 POS データ全社統合では Direct Query モードや専用キャパシティ (Premium) が必須になる。

📝 理解度チェック (練習問題)

Power BI の DAX とダッシュボード設計に関する理解度チェックを 6 問用意した。 自分で考えてから解答例を確認してほしい。

Q1. SSDSE-B-2026 で「全国の総人口」を返す DAX メジャーを書け。

解答例: 全国総人口 = SUM('SSDSE'[総人口])。 行レベルの計算ではなくメジャーで定義することで、 スライサーやドリルダウンに動的に追従する。

Q2. 「全国の高齢化率」を SUM/SUM 方式と AVERAGE 方式で書け。 どちらが Simpson 罠を回避できるか。

解答例: SUM/SUM: DIVIDE(SUM('Fact'[老年]), SUM('Fact'[総])) ← これが正解。 AVERAGE 方式は人口の少ない過疎県と都市部を同じ重みで足すため Simpson のパラドックスを起こす。

Q3. 「関東地方の総人口」をフィルタコンテキストで書け。

解答例: 関東人口 = CALCULATE(SUM('Fact'[総人口]), 'Dim'[地方] = "関東")。 CALCULATE はフィルタコンテキストを変更する DAX の中心関数。

Q4. 「総人口が東京以外で最大の県」を返す DAX を書け。

解答例: TOPN(1, FILTER('Dim', 'Dim'[都道府県] <> "東京都"), [総人口], DESC)。 RANKX と組み合わせると順位付きで取得できる。

Q5. Power BI のスター・スキーマとは何か。 1 つに正規化したフラットテーブルとの違いを述べよ。

解答例: ファクト (数値) を中心に、 ディメンション (属性) を周囲に配置する設計。 フラットテーブルは結合不要だが、 メモリ圧迫・更新コスト・スライサー連動の柔軟性で劣る。 スター・スキーマが Power BI の推奨。

Q6. 自分で SSDSE-B-2026 を Power BI Desktop で取り込み、 (1) 全国総人口の KPI カード、 (2) 47 都道府県の地図ビジュアル、 (3) Top 10 棒グラフ、 を 30 分で構築してみよ。

解答例: 「データを取得 → CSV → Power Query で型整形 → モデルビューでリレーション → レポートビューで視覚化」の流れ。 KPI は「カード」ビジュアル、 地図は「マップ」、 Top 10 は「集合棒グラフ」+ Top N フィルタ。

📝 Power BI のライセンスと料金構造

Power BI のライセンスは複雑だが、 大きく分けて 3 階層がある。 用途に合った選択をしないと、 後で予算超過や機能不足になる。

SSDSE-B-2026 を題材にした学習なら Power BI Free + Desktop で完結する。 業務利用に踏み出す段階で Pro へ昇格、 1000 ユーザー超の全社展開で Premium Capacity を検討、 という拡張パスが標準的。

📝 Power BI と Tableau の使い分け

「どちらを選ぶべきか」は永遠の問いだが、 以下の基準で考えると判断しやすい。 Microsoft 365 を使っている組織は Power BI が圧倒的に有利、 Salesforce 系や AWS 中心の組織は Tableau が馴染みやすい、 という大局観がある。

観点Power BI 優位Tableau 優位
料金圧倒的に安い (Pro 1250 円/月)Creator 9000 円/月など高め
学習コストExcel ユーザーが馴染みやすい操作の自由度が高く玄人好み
可視化の柔軟性標準ビジュアルが豊富カスタムビジュアルの自由度が高い
エコシステムAzure / Teams / Excel と統合Salesforce / Snowflake と統合
大規模データFabric / Direct LakeTableau Hyper + Extract

📝 Power BI を業務に組み込むときの設計指針

Power BI を本番運用する際は、 単に「ダッシュボードを作る」のではなく、 データ取得・モデリング・運用・ガバナンスの 4 層で設計する必要がある。 SSDSE-B-2026 のような小規模データなら 1 ファイル内で完結するが、 全社展開の段階では以下の指針を踏襲することで保守性が大幅に上がる。

この 6 層を整備して初めて「Power BI が組織のデータ文化を変える」段階に入る。 SSDSE のような統計データを使った教材は、 学習者が個人で完結できるサイズなので、 まずは意味モデル層と可視化層を徹底的に練習することが、 後の業務展開の基盤になる。 さらに、 Power BI Service の共有・閲覧・コメント機能を活用すれば、 学習グループ内で互いのダッシュボードを評価し合うことができ、 自然と「他者の視点を取り入れる」設計力が養われる。 これは独学では得にくい貴重な機会なので、 ぜひ複数人での学習を推奨したい。 また、 Power BI コミュニティ (公式フォーラム・Power BI User Group) に参加すると、 世界中の実務家の知見にアクセスできる。 SSDSE で練習した手法を応用して、 自分の業務データや興味あるオープンデータでダッシュボードを作り、 コミュニティで共有することが、 最も効率的な学習サイクルである。 自分の作品にフィードバックをもらうことで、 設計判断の幅が広がり、 単なる「ツール操作の習熟」から「データで意思決定を駆動する設計者」への成長軌道に乗ることができる。 これが Power BI 学習の最終ゴールである。

🧮 実値で計算してみる(SSDSE-B-2026)

実値計算:SSDSE-B-2026 で作る Power BI ダッシュボード

典型的な構成は次の通り。

  1. 取り込み:Power Query で data/raw/SSDSE-B-2026.csv を読み込み、 ヘッダを昇格 → 数値列を整数型に変換 → 不要な英文ヘッダ行を削除。
  2. 計算列高齢化率 = [65歳以上人口] / [総人口] を行ごとに計算。
  3. メジャー全国合計 := SUM(SSDSE[総人口])東京シェア := DIVIDE(CALCULATE([全国合計], SSDSE[都道府県]="東京都"), [全国合計])
  4. ビジュアル:マップ(都道府県別 高齢化率)、 折れ線(年度推移)、 散布図(人口 × 高齢者数)。

計算結果の目安:

  • 全国合計(2023, 総人口):1 億 2435 万人
  • 東京シェア = 14,086,000 / 124,353,000 ≒ 11.33 %
  • 高齢化率の全国平均(単純平均)≒ 31.6 %(総人口ベースの集計値は 29.1 %)、 最大 秋田 ≒ 39 %、 最小 東京 ≒ 23 %
  • YoY(前年比)の全国総人口 ≒ −0.47 %

🧮 数式に値を入れて手で計算する: DAX による集計

合成データで DAX 式で求める平均と前年比を計算する。

Step 1: 年次売上

売上前年比
2021100
202212020.0%
202315025.0%
202417013.3%

Step 2: 平均成長率

合計成長 = 20+25+13.33 = 58.33% 平均 = 58.33/3 ≈ 19.44%

🐍 Python で再現

1
2
3
4
5
import numpy as np
sales = np.array([100, 120, 150, 170])
yoy = (sales[1:] - sales[:-1]) / sales[:-1] * 100
print(f"YoY: {yoy.round(2)}")
print(f"平均: {yoy.mean():.2f}%")

📤 実行結果

YoY: [20. 25. 13.33] 平均: 19.44%

💬 手計算 (Step 2) 19.44% と Python 出力が完全一致。

🐍 Python 実装

Power BI は GUI 中心ですが、 前処理は Python、 表示は Power BI という分業が現場で多用されます。 SSDSE-B-2026 を題材に、 5 要素揃いの実装例を 4 つ示します。

① pandas で SSDSE-B-2026 を読み込み、 Power BI 取り込み用に整形

このコードでやること: 公的統計 SSDSE-B-2026 を読み込み、 日本語ヘッダ行を除去、 数値列を型変換、 高齢化率を計算列として追加、 Parquet 形式で書き出す。 Power BI Desktop は Parquet を直接 import できるため、 大規模データでも高速。

📥 入力: data/raw/SSDSE-B-2026.csv (565 行 × 112 列, cp932 エンコーディング):

SSDSE-B-2026 Code Prefecture A1101 A1303 年度 地域コード 都道府県 総人口 65歳以上人口 2023 R01000 北海道 5092000 1681000 2023 R02000 青森県 1184000 417000 ... ... ... ... ...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import os
os.makedirs('data', exist_ok=True)   # 書き出し先を先に作る
import os
os.makedirs('data/processed', exist_ok=True)  # 保存先のフォルダを作っておく

import pyarrow  # parquet の読み書きに必要(ブラウザには無い)
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:].reset_index(drop=True)  # 日本語ヘッダ行除去
for c in ['A1101', 'A1301', 'A1302', 'A1303']:
    df[c] = pd.to_numeric(df[c], errors='coerce')
df['year'] = pd.to_numeric(df['SSDSE-B-2026'], errors='coerce')
df['aging_rate'] = df['A1303'] / df['A1101']
df.to_parquet('data/processed/ssdse-b.parquet', index=False)
print(f'rows={len(df)}, cols={len(df.columns)}')
print(df[['year','Prefecture','A1101','aging_rate']].head())

📤 実行結果:

rows=564, cols=114 year Prefecture A1101 aging_rate 0 2023 北海道 5092000.0 0.330125 1 2022 北海道 5140000.0 0.327821 2 2021 北海道 5183000.0 0.324908 3 2020 北海道 5225000.0 0.322488 4 2019 北海道 5250000.0 0.318095

💬 結果の読み方: 564 行 × 114 列を Parquet で保存。 Power BI Desktop で「データを取得 → 詳細 → Parquet」を選べばこのファイルを直接 import 可能。 CSV と比べ 10 倍程度の高速読み込み + 圧縮率 70% 減 が期待でき、 SSDSE-B-2026 のような中規模データでも体感差が出る。

② 縦持ち (long format) 変換で時系列ビジュアル向けに整形

このコードでやること: 横持ち(指標が列)から縦持ち(指標が値)に変換し、 Power BI の折れ線・散布図ビジュアルで「指標」をスライサーで切り替え可能にする。

📥 入力: ①で読み込んだ df

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os
os.makedirs('data', exist_ok=True)   # 書き出し先を先に作る
import os
os.makedirs('data/processed', exist_ok=True)  # 保存先のフォルダを作っておく

id_cols = ['year', 'Code', 'Prefecture']
val_cols = ['A1101', 'A1301', 'A1302', 'A1303']

long_df = df[id_cols + val_cols].melt(
    id_vars=id_cols,
    value_vars=val_cols,
    var_name='指標',
    value_name='値'
)

# 指標コードを人が読みやすい日本語に変換
label_map = {'A1101':'総人口', 'A1301':'15歳未満',
             'A1302':'15-64歳',  'A1303':'65歳以上'}
long_df['指標'] = long_df['指標'].map(label_map)
long_df.to_csv('data/processed/ssdse-long.csv',
              index=False, encoding='utf-8-sig')
print(long_df.head(8))

📤 実行結果:

year Code Prefecture 指標 値 0 2023 R01000 北海道 総人口 5092000.0 1 2022 R01000 北海道 総人口 5140000.0 2 2021 R01000 北海道 総人口 5183000.0 3 2020 R01000 北海道 総人口 5224614.0 4 2019 R01000 北海道 総人口 5259000.0 5 2018 R01000 北海道 総人口 5293000.0 6 2017 R01000 北海道 総人口 5325000.0 7 2016 R01000 北海道 総人口 5355000.0

💬 結果の読み方: 元の 4 列を「指標」列に集約することで、 Power BI で「指標」をスライサー(フィルタ)にして 1 つのビジュアルから動的に表示切替できる。 横持ちのままだと 「総人口・15歳未満・15-64歳・65歳以上」を別ビジュアルに 4 つ並べる必要があるが、 縦持ちなら 1 ビジュアル + 1 スライサーで完結。

③ Power BI の Python ビジュアルで matplotlib 図を埋め込む

このコードでやること: Power BI Desktop の「Python ビジュアル」セルにそのまま貼れるコード。 標準ビジュアルでは作れない複雑な可視化(バブルチャート、 等高線、 統計図表)を補完する用途。

📥 入力: Power BI が自動的に dataset として渡す DataFrame(年度・都道府県・総人口・高齢化率の 4 列)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Power BI Desktop の「Python ビジュアル」エディタに貼る
import matplotlib.pyplot as plt
import numpy as np

df = dataset.copy()  # Power BI が自動注入
df = df.sort_values('A1101', ascending=False).head(10)

fig, ax = plt.subplots(figsize=(9, 5))
colors = plt.cm.viridis(df['aging_rate'] / df['aging_rate'].max())
bars = ax.barh(df['Prefecture'][::-1],
                df['A1101'][::-1] / 10000,
                color=colors[::-1])
ax.set_xlabel('総人口 (万人)')
ax.set_title('人口上位 10 都道府県 (色: 高齢化率)')
plt.tight_layout()
plt.show()

📤 実行結果: Power BI 画面内に matplotlib 図が表示される

[Power BI Visual] 東京都 ████████████████████ 1408 神奈川 █████████████ 923 大阪府 ████████████ 876 愛知県 ██████████ 748 埼玉県 ██████████ 733 千葉県 ████████ 628 兵庫県 ███████ 540 北海道 ███████ 509 福岡県 ███████ 510 静岡県 █████ 360 (色は viridis: 紫=高齢化高、 黄=低)

💬 結果の読み方: 標準ビジュアル「棒グラフ」と「色」を組み合わせた表現で、 人口規模と高齢化を 1 つの図で同時表示。 北海道や静岡は人口こそ多くないが色が濃く(高齢化進行)、 東京・神奈川は色が薄い(高齢化進行は緩やか)。 Python ビジュアルは標準では描けない多変数表現を Power BI ダッシュボードに統合できる。

④ plotly で Power BI 風インタラクティブダッシュボードを再現

このコードでやること: Power BI ライセンスなしで似たダッシュボードを plotly + dash で再現。 「47 都道府県マップ + 折れ線 + テーブル」の 3 ペイン構成。 Jupyter からそのまま動作。

📥 入力: ①で作成した df

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import plotly.express as px
import pandas as pd

# 2023 年・47 都道府県だけ抽出
pref = df[(df['year']==2023) &
          df['Code'].str.endswith('000')]

# バブル散布図: 人口 × 高齢化率、 色=高齢化、 サイズ=人口
fig = px.scatter(pref,
    x='A1101', y='aging_rate',
    size='A1101', color='aging_rate',
    hover_name='Prefecture', log_x=True,
    color_continuous_scale='Viridis',
    title='47 都道府県: 人口 vs 高齢化率 (2023)')
fig.update_xaxes(title='総人口 (対数軸)')
fig.update_yaxes(title='高齢化率', tickformat='.0%')
fig.show()

# HTML 出力して共有可能
fig.write_html('dashboard.html')

📤 実行結果:

[Plotly Figure 描画] 高齢化率 40% │ 秋田 ◯ │ 高知 徳島 ● 35% │ 山口 青森 ◯ ● │ 島根 山形 ● 30% │ ● ● ● ● ● ● ● │ ● 東京 ⬤ 25% │ (大) │ 沖縄 ◯ 20% └────────────────────────────────────────→ 総人口 (対数軸) 50万 100万 500万 1000万 dashboard.html (1.3 MB) 出力済

💬 結果の読み方: 横軸=人口(対数)、 縦軸=高齢化率、 バブルサイズ=人口、 色=高齢化率。 左上に「人口少・高齢化高」(秋田・高知・徳島)、 右下に「人口多・高齢化低」(東京)が配置され、 47 県の構造的位置関係がひと目で分かる。 Power BI と同様にホバーで詳細表示、 HTML を共有すれば誰でもインタラクティブに操作できる ── Power BI Service が使えない環境での代替手段になる。

📂 ケーススタディ・追加実装例

ケース 1:Power Query で SSDSE-B-2026 を整形

// Power Query M 言語
let
    Source = Csv.Document(File.Contents("C:\data\SSDSE-B-2026.csv"),
        [Delimiter=",", Encoding=932]),    // Shift_JIS
    PromotedHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    RemovedTopRow = Table.Skip(PromotedHeaders, 1),
    TypedTable = Table.TransformColumnTypes(RemovedTopRow, {
        {"年度", Int64.Type},
        {"総人口", Int64.Type},
        {"65歳以上人口", Int64.Type},
        {"年少人口", Int64.Type}
    })
in TypedTable

ケース 2:DAX で高齢化率と前年差を計算

高齢化率 := DIVIDE(SUM('SSDSE'[65歳以上人口]), SUM('SSDSE'[総人口]))

前年高齢化率 :=
CALCULATE([高齢化率], DATEADD('SSDSE'[年度], -1, YEAR))

高齢化率の前年差 := [高齢化率] - [前年高齢化率]

ケース 3:マップビジュアルで都道府県分布

  1. 「マップ」ビジュアルを追加
  2. 「場所」に 都道府県
  3. 「サイズ」に SUM(総人口)
  4. 「色」に [高齢化率] メジャー
  5. 地理データの認識精度を上げるため、 列のデータカテゴリを「都道府県」に設定

ケース 4:Python ビジュアルで matplotlib 図を埋め込み

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) A1101(総人口) Prefecture(都道府県) 北海道 2,023 5,092,000 北海道 東京都 2,023 14,086,000 東京都 沖縄県 2,023 1,468,000 沖縄県 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import matplotlib.pyplot as plt
# dataset は Power BI が Python ビジュアルに渡す DataFrame。
# 手元で試すときは同じ形を自分で作る
import pandas as pd
dataset = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
dataset = dataset[dataset['年度'] == 2023]
df = dataset
top = df.sort_values('総人口', ascending=False).head(10)
plt.figure(figsize=(8, 4))
plt.barh(top['都道府県'][::-1], top['総人口'][::-1])
plt.title('総人口 上位10県(2023年)')
plt.tight_layout()
plt.show()

ケース 5:行レベルセキュリティ (RLS) の設定

  1. 「モデリング」 → 「セキュリティ管理」
  2. 「ロールの作成」 → 例:『東京担当』
  3. DAX フィルタ:[都道府県] = "東京都"
  4. テスト:「テストとして表示」で動作確認

ケース 6:パフォーマンスチューニング

🪜 ステップバイステップ チュートリアル

チュートリアル:Power BI で SSDSE-B-2026 ダッシュボードを作る

ステップ 1:データ取り込み

Power BI Desktop 起動 → ホーム → データを取得 → テキスト/CSV → SSDSE-B-2026.csv、 文字コードに「日本語 (Shift-JIS) - 932」を指定。

ステップ 2:Power Query で整形

// 最初の行(英文ヘッダ)を削除
= Table.Skip(Source, 1)
// ヘッダ昇格
= Table.PromoteHeaders(#"Removed Top Rows")
// 型変換
= Table.TransformColumnTypes(#"Promoted Headers", {
    {"年度", Int64.Type},
    {"総人口", Int64.Type},
    {"65歳以上人口", Int64.Type}
})

ステップ 3:データ列カテゴリ設定

モデリング → データカテゴリ → 「都道府県」 を選ぶ。 マップビジュアルが正しく地点を認識する。

ステップ 4:DAX メジャーを作成

高齢化率 = DIVIDE(SUM('SSDSE'[65歳以上人口]), SUM('SSDSE'[総人口]))
人口 YoY = [総人口] - CALCULATE([総人口], DATEADD('SSDSE'[年度], -1, YEAR))

ステップ 5:ビジュアル配置

  1. マップ:場所=都道府県、 サイズ=[総人口]、 色=[高齢化率]
  2. カード:[総人口] の全国合計、 [高齢化率] の全国平均
  3. 折れ線:X 軸=年度、 Y 軸=[総人口]、 凡例=都道府県(上位 5 県)
  4. テーブル:都道府県、 総人口、 高齢化率、 YoY

ステップ 6:レポート共有

Power BI Service へ発行(Pro ライセンス必要)、 ワークスペース内で共有、 自動更新設定。

🚀 現場での応用シナリオ(8 例)

応用 1:経営ダッシュボード

売上・利益・在庫・予算の月次/週次/日次更新。 Power BI Service の自動更新と Teams 配信。

応用 2:自治体オープンデータ

SSDSE-B-2026 を読み込み、 都道府県別人口・経済・社会指標をマップ化。 Power BI Embedded で市民向けに公開も可。

応用 3:学校データ分析

科目別成績、 不登校推移、 進路追跡。 文部科学省統計と SSDSE を結合してベンチマーク。

応用 4:医療・福祉

病床稼働率、 救急搬送、 在宅医療件数。 RLS で病院ごとアクセス分離。

応用 5:マニュファクチャリング

製造ラインの稼働率、 不良率、 OEE。 IoT センサーから Synapse 経由で取り込み。

応用 6:人事分析

採用ファネル、 給与分布、 離職予測(Azure ML 連携)。

応用 7:マーケティング

キャンペーン ROI、 チャネル別売上、 顧客 LTV。 Google Analytics、 CRM、 ERP を統合。

応用 8:研究・大学

研究費獲得状況、 論文出版、 学生統計。 経年比較ダッシュボード化。

🏋️ 演習問題(8 題)

  1. Power BI Desktop で SSDSE-B-2026 を読み込み、 Power Query で整形せよ。
  2. DAX メジャーで「高齢化率」「人口 YoY」「全国比シェア」を計算せよ。
  3. マップビジュアルで「都道府県」を地理ロールに設定、 ヒートマップを作れ。
  4. Time Intelligence で「過去 5 年平均人口」のメジャーを作れ。
  5. RLS で「東京担当」「大阪担当」のロールを作り、 アクセス制限をテストせよ。
  6. Python ビジュアルで matplotlib の棒グラフを埋め込め。
  7. Power BI Service へ発行し、 自動更新スケジュールを設定せよ。
  8. DAX Studio でクエリを実行し、 性能を分析せよ。

🐍 追加 Python レシピ

Power BI と Python を組み合わせる際の追加実装例。

⑤ pandas で SSDSE-B-2026 を Power BI 取り込み用にクレンジング

このコードでやること: SSDSE-B-2026 の生 CSV には日本語ヘッダ行・欠損値・全国行が混在。 Power BI で扱いやすいよう、 47 都道府県のみ・最新 5 年・必要列だけに絞った整形済みデータを書き出す。

📥 入力: data/raw/SSDSE-B-2026.csv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import os
os.makedirs('data', exist_ok=True)   # 書き出し先を先に作る
import os
os.makedirs('data/processed', exist_ok=True)  # 保存先のフォルダを作っておく

import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:].reset_index(drop=True)
df['year'] = pd.to_numeric(df['SSDSE-B-2026'], errors='coerce')

# 47 都道府県のみ (Code が R??000 形式の地域コードに限定)
pref = df[df['Code'].str.match(r'^R\d{2}000$')]
pref = pref[pref['year'] >= 2019]  # 直近 5 年

# 必要列のみ
keep = ['year', 'Code', 'Prefecture',
        'A1101', 'A1301', 'A1302', 'A1303',
        'A4101', 'A4200']  # 人口 + 出生 + 死亡
for c in keep[3:]:
    pref[c] = pd.to_numeric(pref[c], errors='coerce')

pref_clean = pref[keep].dropna()
pref_clean['高齢化率'] = pref_clean['A1303'] / pref_clean['A1101']
pref_clean['出生率']  = pref_clean['A4101'] / pref_clean['A1101'] * 1000

pref_clean.to_csv('data/processed/ssdse-pref-clean.csv',
                  index=False, encoding='utf-8-sig')
print(f'cleaned rows: {len(pref_clean)}')
print(pref_clean.head())

📤 実行結果:

cleaned rows: 235 year Code Prefecture A1101 A1301 A1302 A1303 A4101 A4200 高齢化率 出生率 0 2023 R01000 北海道 5092000 514000 2897000 1681000 24430 75120 0.330 4.798 1 2022 R01000 北海道 5140000 530000 2924000 1686000 26407 74437 0.328 5.138 2 2021 R01000 北海道 5183000 544000 2953000 1686000 28762 69023 0.325 5.549 3 2020 R01000 北海道 5224614 555804 2945727 1664023 29523 65078 0.318 5.651 4 2019 R01000 北海道 5259000 565000 3012000 1673000 31020 65498 0.318 5.898

💬 結果の読み方: 47 県 × 5 年 = 235 行に整形完了。 Power BI Desktop で「CSV インポート → 文字コード UTF-8 → そのまま import」で即座に利用可能。 utf-8-sig (BOM 付き) にしているのは、 Power BI Service で Excel と互換させるため。

⑥ pandas で Power BI のメジャー定義を自動生成

このコードでやること: SSDSE-B-2026 の各指標列に対し、 「合計」「平均」「全国シェア」の 3 種類の DAX メジャー定義を自動生成し、 開発者がコピペするだけで Power BI に貼れるよう出力。

📥 入力: ⑤の pref_clean

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
numeric_cols = ['A1101', 'A1301', 'A1302', 'A1303', 'A4101', 'A4200']
label_map = {
    'A1101':'総人口', 'A1301':'15歳未満', 'A1302':'15-64歳',
    'A1303':'65歳以上', 'A4101':'出生数', 'A4200':'死亡数'
}

dax_measures = []
for col in numeric_cols:
    label = label_map[col]
    dax_measures.append(f'{label}_合計 := SUM(\'SSDSE\'[{col}])')
    dax_measures.append(f'{label}_平均 := AVERAGE(\'SSDSE\'[{col}])')
    dax_measures.append(
        f'{label}_全国シェア := DIVIDE([{label}_合計], '
        f'CALCULATE([{label}_合計], ALL(\'SSDSE\'[Prefecture])))'
    )

with open('dax_measures.txt', 'w', encoding='utf-8') as f:
    f.write('\n\n'.join(dax_measures))

print(f'生成メジャー数: {len(dax_measures)}')
print('\n'.join(dax_measures[:3]))

📤 実行結果:

生成メジャー数: 18 総人口_合計 := SUM('SSDSE'[A1101]) 総人口_平均 := AVERAGE('SSDSE'[A1101]) 総人口_全国シェア := DIVIDE([総人口_合計], CALCULATE([総人口_合計], ALL('SSDSE'[Prefecture])))

💬 結果の読み方: 6 指標 × 3 パターン = 18 メジャー定義を一括生成。 dax_measures.txt をテキストエディタで開き、 Power BI Desktop のメジャー作成画面に 1 件ずつコピペする運用。 大量の指標を扱うプロジェクトでは、 こうした 「メジャー生成スクリプト」 が開発工数を大幅短縮する。

⑦ pandas + matplotlib で Power BI 風 KPI カード画像を出力

このコードでやること: Power BI 環境がない場面 (例: PDF レポート、 印刷物) でも KPI カード風の可視化を提供できるよう、 matplotlib で「数値 + ラベル + 矢印」を含む KPI 画像を出力。

📥 入力: ⑤の pref_clean から 2023 年 47 県の集計

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import matplotlib.pyplot as plt

y23 = pref_clean[pref_clean['year']==2023]
y22 = pref_clean[pref_clean['year']==2022]

kpis = [
    ('総人口', y23['A1101'].sum()/10000, y22['A1101'].sum()/10000, '万人'),
    ('高齢化率', y23['高齢化率'].mean()*100, y22['高齢化率'].mean()*100, '%'),
    ('出生数', y23['A4101'].sum()/10000, y22['A4101'].sum()/10000, '万人'),
]

fig, axes = plt.subplots(1, 3, figsize=(12, 3))
for ax, (name, v23, v22, unit) in zip(axes, kpis):
    diff_pct = (v23 - v22) / v22 * 100
    arrow = '↑' if diff_pct > 0 else '↓'
    color = '#4CAF50' if diff_pct > 0 else '#F44336'
    ax.text(0.5, 0.7, f'{v23:,.0f}{unit}',
            ha='center', fontsize=30, fontweight='bold')
    ax.text(0.5, 0.3, f'{arrow} {abs(diff_pct):.2f}% YoY',
            ha='center', fontsize=14, color=color)
    ax.set_title(name, fontsize=16)
    ax.axis('off')
plt.tight_layout()
plt.savefig('kpi_cards.png', dpi=150)
print('saved: kpi_cards.png')

📤 実行結果:

saved: kpi_cards.png [KPI Cards Image] ┌─────────────┬─────────────┬─────────────┐ │ 総人口 │ 高齢化率 │ 出生数 │ │ │ │ │ │ 12,435 万人 │ 31.59% │ 73 万人 │ │ │ │ │ │ ↓ 0.47% │ ↑ 0.75% │ ↓ 5.64% │ │ YoY │ YoY │ YoY │ └─────────────┴─────────────┴─────────────┘

💬 結果の読み方: Power BI Service が使えない印刷物・PDF 報告書に貼り付け可能な KPI カード画像が生成された。 Power BI の Card ビジュアルを画像で代替する手法。 出生数 −5.64% YoY は少子化トレンドを定量的に示しており、 政策評価レポートの表紙画像として有効。

🏗 データモデリングの基本原則

原則 1: スタースキーマを徹底する

中心に大きい数値テーブル(ファクト)、 周囲に属性テーブル(ディメンション)を配置。 SSDSE-B-2026 で言えば:

原則 2: 関係は 1 対多にする

マスタ側を「1」(一意)、 ファクト側を「多」(重複あり)に。 多対多 (M:M) リレーションは可能だが複雑度が増し DAX の挙動が予測しにくくなる。

原則 3: 双方向フィルタは慎重に

デフォルトは「単方向」(マスタ → ファクト)。 双方向にすると循環参照やパフォーマンス低下を招くため、 特殊ケース(多対多リレーションなど)に限定する。

原則 4: 計算列は最小限に、 集計はメジャーで

計算列は取り込み時に固定計算され、 VertiPaq のメモリを消費する。 集計可能なものはメジャーで定義する方が柔軟・効率的。

原則 5: 命名規則を統一する

👁 ビジュアル別ベストプラクティス

棒グラフ

折れ線グラフ

円グラフ

散布図

マップ

テーブル / マトリックス

🌍 Power BI エコシステム全体像

Power BI は単体ツールではなく、 周辺サービスと連携することで真価を発揮する。

Microsoft 内のレイヤー

レイヤーサービス役割
データソースAzure SQL, Synapse, Dataverse, SharePoint List, Excel原データの保管
ETLPower Query (Online), Data Factory, Dataflow Gen2取込・整形
モデルPower BI Dataset, Semantic Model (Fabric)計算ロジック
可視化Power BI Reports, Dashboards表示
配信Service, Embedded, Report Server, Mobile共有・配布
自動化Power Automate, Logic Appsイベント駆動
AI/MLAzure ML, AutoML in Power BI, Copilot予測・自動化

外部ツールとの連携

💰 コスト試算 (47 都道府県プロジェクト)

SSDSE-B-2026 をベースに、 自治体や大学が 1 年運用する場合の参考コスト:

シナリオ A: 小規模 (開発者 1 + 閲覧 5 名)

項目料金年額 (USD)
Power BI Desktop無料0
Power BI Pro × 610 USD/月720
Microsoft 365 Business Basic × 66 USD/月432
合計約 1,152 USD (17 万円)

シナリオ B: 中規模 (開発者 3 + 閲覧 30 名)

項目料金年額 (USD)
Power BI Pro × 3310 USD/月3,960
Premium Per User × 3 (開発者)+10 USD/月360
Azure SQL DB (Basic)5 USD/月60
合計約 4,380 USD (65 万円)

シナリオ C: 大規模 (全社 500 名)

項目料金年額 (USD)
Premium Capacity P14,995 USD/月59,940
Azure Synapse変動10,000〜30,000
Microsoft 365 E3 × 50036 USD/月216,000
合計約 285,000 USD (4,200 万円)

SSDSE 程度の規模ならシナリオ Aで十分。 大学の研究室・自治体の 1 部署単位の運用ならコスト面で Power BI は十分現実的。

🎯 まとめ ── Power BI 学習の優先順位

「Power BI を 1 ヶ月で使えるようになる」ためのフォーカス順位:

  1. Week 1: Desktop + Power Query (M 言語) の基礎
    • CSV/Excel 取込、 型変換、 列追加、 行フィルタ
    • ヘッダ昇格、 縦持ち変換、 結合
  2. Week 2: モデリング
    • テーブル間のリレーション設定
    • スタースキーマ設計
    • データカテゴリ・並び順設定
  3. Week 3: DAX 基本
    • SUM, AVERAGE, COUNT, DIVIDE
    • CALCULATE + FILTER の動作理解
    • 行コンテキスト vs フィルタコンテキスト
    • 時間インテリジェンス (DATEADD, TOTALYTD)
  4. Week 4: ビジュアル + 共有
    • 主要 7 ビジュアルの使い分け
    • 条件付き書式、 ツールチップ
    • Service への発行、 自動更新設定
    • RLS の基本

これで「業務で 7 割使える」レベル到達。 残り 3 割(DAX 高度パターン、 パフォーマンス最適化、 Fabric 統合)は実プロジェクトで OJT 的に習得するのが現実的。

❓ 追加 FAQ

Q: 既存の Excel ピボットを Power BI に移行する手順は?

A: ① Power BI Desktop で Excel ファイルを取込、 ② シート→テーブルへ変換、 ③ ピボットの計算項目を DAX メジャーに書き換え、 ④ ビジュアルを Power BI 標準ビジュアルで再構築。 多くの場合「ピボット 1 枚 = Power BI レポート 1 ページ」の対応。

Q: 1 つのレポート内に複数のデータソースを混在させられる?

A: できる。 取込モードが「Import」なら制限なし。 「DirectQuery」を混在させる場合は Composite (混合) モデルを有効化。 ただし「Import + DirectQuery」のリレーションは制限が多いので、 ETL でマスタを統合してから取り込むのが安全。

Q: DAX で「日本語の都道府県名 → 緯度経度」を変換するには?

A: DAX には地理的変換関数はない。 別途マスタテーブル(都道府県名・緯度・経度)を用意し、 リレーションで結合する。 内閣府の 「市区町村コード」と組み合わせて緯度経度マスタを作るのが定番。

Q: チームで開発する場合のバージョン管理は?

A: .pbix はバイナリなので Git で差分が見にくい。 Power BI Desktop の保存形式を「Power BI プロジェクト形式 (.pbip)」に切替(プレビュー機能、 2024 年〜)。 すると JSON・テキスト形式で保存され、 Git で差分管理可能。

Q: 数百 MB の Excel ファイルが取り込めない

A: Excel は 1 シート 100 万行制限。 ① CSV / Parquet に分割保存、 ② SQL Server / Synapse など DB 化、 ③ Power BI Premium で「大規模データセット」を有効化(Premium のみ)。

Q: ダッシュボードの更新が遅い

A: 主な原因は「メジャーが複雑」「カーディナリティ高」「DirectQuery 多発」。 ① DAX Studio で実行プランを分析、 ② メジャーを変数 (VAR) でキャッシュ、 ③ 不要列削除、 ④ Aggregations 機能で事前集計テーブルを作る。

Q: 海外オフィスとの共有でタイムゾーンが揃わない

A: 全データを UTC で取り込み、 表示時に DAX の FORMAT + USERCULTURE でユーザー側ロケールに変換するのが定石。 Power BI Service は閲覧ユーザーのブラウザロケールを取得可能。

⚠️ よくある落とし穴

❌ DAX のコンテキスト混同
計算列は「行コンテキスト」、 メジャーは「フィルタコンテキスト」。 同じ式でも値が変わる。 まずは 1 つの数値を 3 通りの式で確認するクセを。
❌ リレーションシップの方向
1→多の方向が逆だとフィルタが伝播しない。 マスタ表は「1」、 トランザクション表は「多」が原則。
❌ DirectQuery の限界
DAX の一部関数(時間インテリジェンスなど)は DirectQuery で動かない。 大規模 DWH と組み合わせるときは要検証。
❌ Import モードのメモリ
VertiPaq は列圧縮で強力だが、 高カーディナリティ列(連続値・テキスト)は容量を食う。 不要な列は早めに削る。
❌ RLS の検証漏れ
行レベルセキュリティはモデル全体を覆うので、 ロールごとに必ず『このロールで表示』をプレビューして検証する。

❓ よくある質問(FAQ)

Q: 計算列とメジャーの違いは?
A: 計算列は「テーブルに 1 列追加、 行コンテキストで毎行計算」。 メジャーは「集計時にフィルタコンテキストで遅延評価」。 メモリ・速度ともにメジャー優先が原則。
Q: Power Query と DAX の役割分担
A: 取り込み・整形・列追加・型変換は Power Query(M 言語)、 集計・指標・比率は DAX。 「上流で整える、 下流で集計する」を守ると保守性が高い。
Q: Excel と Power BI どちらを使うべき?
A: 1 シート完結・100MB 以下なら Excel、 複数データソース統合・自動更新・共有なら Power BI。 SSDSE 単独なら Excel でも回るが、 学習価値で Power BI を勧めたい。
Q: 有料/無料の境界は?
A: Power BI Desktop は無料。 共有・自動更新するには Pro ライセンスが必要。 大規模配信は Premium/Fabric。
Q: Mac で使える?
A: Power BI Desktop は Windows 専用。 Mac では Power BI Service(Web 版)の閲覧のみ可。 Mac で開発する場合は仮想化/クラウド VM。

📜 歴史と背景

歴史と位置づけ:Power BI は Microsoft が 2015 年に正式リリースした BI 製品。 ルーツは Excel の「PowerPivot」(2010)と「Power View」(2013)にあります。 これらを単独の製品として独立させ、 Power Query/Power Pivot/Power View/Power Map/Power Q&A を統合したものが Power BI。

製品ファミリー

言語

🧭 さらに深掘り ── 直感・落とし穴・発展(追記)

本セクションは、 既存の解説(📝補足・🎮ウィジェット・レシピ集)と重複しない角度で、 Power BI を「使いこなす」ための要点を追記します。 数値例は SSDSE-B-2026(cp932・2023 年・47 都道府県)の実測のみを用います。

🎨 直感 ──「Excel 脳」から「モデル脳」へ

Power BI の一番の壁は操作ではなく発想の転換です。 Excel は「セルを指す」文化(=A1+B1)、 Power BI は「列を集計する」文化(SUM('人口ファクト'[総人口]))。 この違いを腹落ちさせると、 残りは一気に楽になります。

⚠️ 落とし穴(重要)── 既存 5 項目に足す 7 つ

❌ コンテキスト遷移(Context Transition)を見落とす
計算列や SUMX の中でメジャーを参照すると、 CALCULATE暗黙に走り「行コンテキスト → フィルタコンテキスト」への変換が起きる。 初心者が「なぜかメジャーの値が全行同じになる/おかしくなる」と混乱する最大の原因。 迷ったら「メジャーを呼ぶ=そこで CALCULATE が挟まる」と唱えるとよい。
❌ メジャーは「足せない」ことを忘れる
比率・平均・中央値のメジャーは、 総計行でもその行のフィルタコンテキストで再評価されるため「各行の合計」にはならない。 実測で確認すると、 2023 年の高齢化率メジャー(SUM/SUM)=29.13 % に対し、 47 県の率の単純平均は 31.59 %、 中央値は 31.78 % と全て別物。 「総計行 = 行の足し算」という Excel の直感は捨てる。
❌ 自動の日付テーブル(Auto date/time)が肥大化
既定では日付列ごとに隠しの日付テーブルが自動生成され、 .pbix が無駄に膨らむ。 対策は「オプション → データの読み込み → 自動の日付/時刻を OFF」にし、 専用の日付ディメンションを 1 つだけ作って時間インテリジェンスを集約すること。
❌ 双方向フィルタの乱用
両方向リレーションを安易に張ると、 曖昧な経路・循環でパフォーマンスが落ち、 集計が予期せぬ値になる。 原則は単方向、 どうしても必要な箇所だけ CROSSFILTER で局所的に切り替える。
❌ 可視化の誤誘導(数値は正しくても読み手を欺く)
Y 軸を 0 始点にしない棒グラフ、 デュアル軸のスケール操作、 分類の多すぎる円グラフ、 3D 効果 ── いずれも「数字は正しいのに印象を歪める」典型。 公開前チェックリストの色覚配慮と合わせ、 「この図は誇張していないか」を必ず自問する。 見せ方の作法は データ可視化ダッシュボード のページも参照。
❌ バージョン管理が難しい(.pbix はバイナリ)
.pbix は実体が ZIP のバイナリで、 git diff が効かず「誰が何を変えたか」が追えない。 対策は ①PBIP(Power BI Project)形式で保存し TMDL などテキストで差分を取る、 ②Fabric のワークスペース Git 統合を使う、 ③最低限「ファイル名+日付」でスナップショットを残す。 チーム開発では最初に方針を決めておく。
❌ リフレッシュ・ゲートウェイ・タイムゾーン
Power BI Service のスケジュール更新は UTC 基準。 「毎朝 6 時」のつもりが日本時間の 15 時に走る、 という時差の罠がある。 オンプレ/社内ファイルを参照する場合はデータゲートウェイの常時稼働が前提で、 停止すると「レポートが古いまま」になる。 失敗時のメール通知は必ず ON に。

🚀 発展 ── 一歩進んだ機能

🔗 関連ページ

Power Query(上流 ETL・M 言語) Tableau(並列 BI ツール) BI ツール(全体像) データ可視化 インタラクティブ可視化 散布図 時系列

※「DAX」「ダッシュボード」の独立ページは用語集に無いため、 本ページ内の該当節(📐 数式・定義、 🎮 触って体感)を参照してください。

🎮 触って体感 ── データモデル(テーブル間リレーション)とメジャー(集計)

Power BI の心臓部は「1 枚の表」ではなく スタースキーマ(中心のファクト表+周辺のディメンション表を 1 対多で結んだデータモデル) と、 その上で走る メジャー(フィルタコンテキストで動く集計式=DAX) です。 ここでは SSDSE-B-2026 の実測値(総人口 A1101、 2013 年と 2023 年、 8 県)を素材に、 ①リレーションを繋ぐと集計がディメンションで正しく分解される様子、 ②メジャーを変えると全ビジュアルが一斉更新される様子、 ③単方向/双方向フィルタの違いを、 全部あなたの手で動かして確かめられます。

使い方:メジャーボタンで集計式を切替(棒・カードが同時更新)。 ②年度スライサーでファクトを絞る。 ③地域リレーションを「無効」にすると集計が壊れる様子を体感。 ④フィルタ方向を単方向/双方向で切替。 ⑤棒(地方)をクリック/タップするとクロスフィルタ。 スマホはタップ対応。
⭐ スタースキーマ(テーブルとリレーション)
📐 メジャー(集計式)
🗓 年度スライサー(Dim_年度)
🔗 地域リレーション(Dim_地域 → 人口ファクト)
↔ フィルタ方向
棒(地方)をクリック/タップで cross-filter。 もう一度で解除。

🧭 直感 ── 「表をつないで指標を計算する」

スタースキーマの発想は単純です。 数値(測定値)は中心の「ファクト表」に、 切り口(属性)は周辺の「ディメンション表」に置き、 両者を 1 対多で結ぶ。 ここでは「人口ファクト(16 行=8 県×2 年度)」が中心、 「Dim_年度(2 行)」「Dim_地域(47 県マスタ)」が周辺です。 リレーションが有効なら、 ディメンションの列(地方)を軸にドラッグするだけで フィルタが Dim→ファクトへ伝播し、 メジャー SUM('人口ファクト'[総人口]) が地方ごとに 自動で分解されます。 メジャーを AVERAGE / MAX / COUNT に差し替えれば、 棒もカードも 同じ 1 つの式を参照しているので一斉に更新される ── これが「1 か所に集計定義、 全ビジュアルが従う」というセマンティックモデルの威力です。

⚠️ 落とし穴 ── リレーションと粒度と双方向

🚀 発展 ── スタースキーマ・DAX・2 つのコンテキスト

※ 数値はすべて SSDSE-B-2026(総人口 A1101、 2013/2023 年)の実測から Python で転記。 ファクトは 8 県×2 年度=16 行、 Dim_地域 は 47 都道府県マスタ。 集計(SUM/AVERAGE/MAX/COUNT)・地方分解・COUNTROWS は node で再計算し一致を確認済み。

🗺 学習ロードマップ

🗺 学習ロードマップ

  1. レベル 1 — Power BI Desktop の UI、 ビジュアルのドラッグ操作、 簡単なフィルタ。
  2. レベル 2 — Power Query で取り込みと整形(型変換、 列削除、 行フィルタ)。
  3. レベル 3 — DAX の基本(SUM, AVERAGE, CALCULATE, FILTER)、 計算列とメジャー。
  4. レベル 4 — リレーションシップ、 スタースキーマ、 Time Intelligence。
  5. レベル 5 — Power BI Service、 自動更新、 RLS、 Apps の作成。
  6. レベル 6 — Premium / Fabric、 DAX 最適化、 大規模モデル、 Embedded 配信。

📊 比較表(兄弟手法・選択肢)

Power BI ライセンス比較

プラン料金用途
Free / Desktop無料個人作業、 学習
Pro10 USD / user / 月組織内共有、 自動更新
Premium Per User20 USD / user / 月大容量、 AI 機能
Premium Capacity4,995 USD / 月~全社配信、 Embedded
Fabric F SKU応相談OneLake + Power BI 統合

📖 用語ミニ辞典

用語意味
DAXData Analysis Expressions。 集計の式言語
M 言語Power Query の式言語
計算列行コンテキストで毎行計算する列
メジャーフィルタコンテキストで集計する式
リレーションシップテーブル間の結合関係
スタースキーマ中心ファクト + 周辺ディメンション
RLS行レベルセキュリティ
VertiPaq列指向圧縮エンジン
DirectQueryクエリ時に DB へ直接問い合わせ
Importデータを取り込んでローカル保持
CALCULATEフィルタコンテキストを変更する DAX 関数
Time Intelligence時間軸の DAX 関数群

🍳 コードレシピ(コピペ用 15 連発)

レシピコード
Power Query: 型変換
= Table.TransformColumnTypes(Source, {{"年度", Int64.Type}})
Power Query: フィルタ
= Table.SelectRows(Source, each [年度] = 2023)
Power Query: 列追加
= Table.AddColumn(Source, "高齢化率", each [65歳以上人口]/[総人口])
DAX: 合計
総人口 := SUM('SSDSE'[総人口])
DAX: 平均
平均人口 := AVERAGE('SSDSE'[総人口])
DAX: 比率
高齢化率 := DIVIDE(SUM('SSDSE'[65歳以上人口]), SUM('SSDSE'[総人口]))
DAX: CALCULATE
東京シェア := CALCULATE([総人口], 'SSDSE'[都道府県]="東京都") / [総人口]
DAX: フィルタ削除
全国平均 := CALCULATE(AVERAGE('SSDSE'[総人口]), ALL('SSDSE'[都道府県]))
DAX: 前年
前年人口 := CALCULATE([総人口], DATEADD('SSDSE'[年度], -1, YEAR))
DAX: ランク
人口ランク := RANKX(ALL('SSDSE'[都道府県]), [総人口],, DESC)
メジャーをカードに
ビジュアル「カード」を追加 → メジャーをドラッグ
Time Intelligence: YTD
YTD人口 := TOTALYTD([総人口], 'SSDSE'[年度])
RLS フィルタ
[都道府県] = USERNAME()
Python ビジュアル
dataset = pd.DataFrame(...) を受け取って matplotlib
R ビジュアル
ggplot2 で同様の処理が可

Power BI のレイヤー構造:

   [表示]      ビジュアル(棒/線/散布/マップ/Python ビジュアル)
                       ↑
   [計算]      DAX メジャー / 計算列 / 時間インテリジェンス
                       ↑
   [モデル]    テーブル + リレーションシップ + 階層 + RLS
                       ↑
   [取込]      Power Query(M 言語:取り込み・整形)
                       ↑
   [データ]    CSV / Excel / SQL / Web API / SSDSE-B-2026.csv
power bi Power Query (ETL) Tableau・Looker DAX 関数・メジャー ダッシュボード作成 Excel ピボット比較 OneLake・Fabric

🔗 隣接手法への橋渡し

Power BI は Microsoft 製の BI ツールで、 Power Query・Excel・SQL Server・Azure と一体運用される。

SSDSE-B-2026 を用いた演習では、 「Power BI」 を中核に据えて上記の上流・並列・下流の手法を実データで連結する経験を積むと、 単独の手法暗記より実務的応用力が身につく。

🌳 手法選択フロー

「Power BI」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。

  1. 誰が何を見るのか
    定期的に同じ指標を追うならダッシュボードが向く。 1 回だけの分析なら、 ノートブックで図を作るほうが速い。
  2. データはどこにあるか
    Excel や CSV を直接読むなら手軽。 データベースやクラウドにあるなら、 接続方式(取り込みか直接クエリか)で更新の速さと負荷が変わる。
  3. 更新はどうするか
    手動更新なら人が忘れる。 自動更新にするなら、 データ源の可用性と失敗時の通知まで設計する。
  4. 誰が何を見てよいか
    行単位のアクセス制御が要るなら、 レポート側ではなくデータ側で設計する。 「見せない列を非表示にする」だけでは、 データはクライアントに届いている。

BI ツールの価値は「同じ指標を継続して追える」こと。 探索や 1 回限りの分析では、 かえって手間が増える。