このページで扱う主要キーワード(クリックで該当セクションへ):
🍰 まずはやさしく
データを図にする魔法の道具です。
数字をわかりやすく伝えるために使います。
部活の成績をグラフにする時に便利です。
まずは結論と使い方のコツを読みましょう。
| シナリオ | 推奨ツール | 理由 |
|---|---|---|
| 1 回限りの分析 (使い捨て) | Excel / Jupyter | ダッシュボード設計コストが回収できない |
| 論文向け図表 (高品質印刷) | matplotlib / ggplot2 | 細かい意匠調整が容易 |
| 専門統計分析 (因果推論等) | R / Python (statsmodels) | Power BI に統計関数は少ない |
| 機械学習モデル構築 | Python (scikit-learn) | Power BI は予測の活用のみ |
| Mac のみの環境 | Tableau / Looker Studio | Power BI Desktop は Windows 専用 |
| 無料で外部公開したい | Looker Studio | Power 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 字」で動く。 重要 KPI は左上、 詳細データは右下に配置:
┌──────────────────────────────────────┐ │ [KPI1: 総人口] [KPI2: 高齢化率] [KPI3: YoY] │ ← 最重要 (大きい数字) ├──────────────────────────────────────┤ │ [マップ: 都道府県別ヒートマップ] │ ← 全体俯瞰 ├──────────────────────────────────────┤ │ [折れ線: 年度推移] [棒: 上位 10 県] │ ← 詳細 ├──────────────────────────────────────┤ │ [テーブル: 全 47 県の詳細データ] │ ← ドリルダウン └──────────────────────────────────────┘
| 色の種類 | 用途 | 例 |
|---|---|---|
| 順序的 (Sequential) | 「低→高」の量を示す | 濃淡 1 色 (高齢化率) |
| 発散的 (Diverging) | 「正→負」の差分 | 赤-白-青 (前年比) |
| カテゴリ的 | 「分類」を示す | 10 色まで (都道府県) |
| 強調 (Highlight) | 1 つだけ目立たせる | 赤 1 色 + グレー |
ダッシュボードは「開いて 8 秒以内に主要メッセージが伝わる」べき。 KPI 数値・グラフタイトル・カラーパレットの 3 点で「何が問題か / どこを見るべきか」を瞬時に伝える。 8 秒以内に伝わらないなら設計を見直す。
Power BI Service はモバイルレイアウト機能を持つ。 PC レイアウトと別に「タテ画面 9:16」のレイアウトを設計し、 KPI と最重要ビジュアル 1〜2 個だけに絞る。 詳細データはタップで詳細画面に遷移させる。
累計人口 :=
CALCULATE(
SUM('SSDSE'[A1101]),
FILTER(
ALL('SSDSE'[year]),
'SSDSE'[year] <= MAX('SSDSE'[year])
)
)
前年人口 := CALCULATE([総人口], DATEADD('SSDSE'[year], -1, YEAR))
人口 YoY% := DIVIDE([総人口] - [前年人口], [前年人口])
人口ランク :=
RANKX(
ALL('SSDSE'[Prefecture]),
[総人口],
,
DESC,
Dense
)
3年移動平均 :=
AVERAGEX(
DATESINPERIOD('SSDSE'[year], LASTDATE('SSDSE'[year]), -3, YEAR),
[総人口]
)
全国シェア :=
DIVIDE([総人口], CALCULATE([総人口], ALL('SSDSE'[Prefecture])))
人口区分 :=
SWITCH(
TRUE(),
[総人口] >= 5000000, "大規模",
[総人口] >= 1500000, "中規模",
"小規模"
)
動的タイトル :=
"選択中: " & SELECTEDVALUE('SSDSE'[Prefecture], "全国") & " (" & SELECTEDVALUE('SSDSE'[year], "全期間") & ")"
人口Zスコア :=
DIVIDE(
[総人口] - CALCULATE(AVERAGE('SSDSE'[A1101]), ALL('SSDSE')),
CALCULATE(STDEV.P('SSDSE'[A1101]), ALL('SSDSE'))
)
| 観点 | 計算列 | メジャー |
|---|---|---|
| 計算タイミング | 取り込み時に 1 回 | クエリのたびに再計算 |
| メモリ | テーブルに保存 (圧縮済) | 0 バイト (式のみ) |
| 使い所 | 分類、 区分、 結合キー | 合計、 平均、 比率 |
| パフォーマンス | クエリ高速、 メモリ消費大 | メモリ小、 クエリ遅め |
原則: 「区分・分類は計算列、 集計はメジャー」。 計算列を多用すると VertiPaq の圧縮効率が落ちメモリが膨張するので、 集計可能なものはメジャーで。
ファクト (大きい数値) ⇔ ディメンション (属性) を 1 対多リレーションで結ぶ。 1 つの大テーブルにすべて入れる「フラット」設計は VertiPaq に不利。
┌──────────────┐
│ 都道府県マスタ │ (1)
└─────┬────────┘
│
│ Code (リレーション)
│
(多) ↓
┌──────────────┐
│ SSDSE ファクト │ ──── (1) ──── 年度マスタ
└──────────────┘
↑
│
(1) 指標マスタ
| モード | 長所 | 短所 | 適用例 |
|---|---|---|---|
| Import | 高速、 全 DAX 関数使用可 | 更新スケジュール必要、 メモリ制約 | SSDSE-B-2026 (数 MB〜数百 MB) |
| DirectQuery | リアルタイム、 大規模 DWH 連携 | 遅い、 一部 DAX 関数使えない | Snowflake / BigQuery (数 TB) |
| Composite (Mixed) | 両者の良いとこ取り | 設計複雑 | マスタは Import、 トランザクションは DirectQuery |
| 観点 | Power BI | Tableau |
|---|---|---|
| 提供元 | Microsoft | Salesforce (旧 Tableau Software) |
| 価格 (Pro) | 10 USD/user/月 | 75 USD/user/月 |
| 学習曲線 | 緩やか (Excel 知識活用) | 急 (独自パラダイム) |
| 計算言語 | DAX + M | Calculated Field (SQL 風) |
| 可視化の表現力 | 標準十分、 拡張可 | 標準で美しい、 表現力高 |
| Microsoft 連携 | ◎ Teams/SharePoint/Azure | ○ (連携あり、 浅め) |
| セルフサービス BI | ○ ビジネスユーザー向け | ○ アナリスト向け |
| エンタープライズ | ○ Fabric で統合進む | ◎ Tableau Server で安定 |
| モバイル | ○ アプリ完成度高 | ○ レスポンシブ対応 |
| OSS 連携 (Python/R) | ○ ビジュアル埋め込み | ○ TabPy / Rserve |
結論: 「Microsoft 365 中心の組織なら Power BI、 高度なアナリスト集団なら Tableau」が定石。 大学・自治体は Power BI 寄り、 データ専門部署のある企業は Tableau 寄りの傾向。
1 つのプロジェクトを最初から最後まで通すと:
C:\data\ に配置高齢化率 = [65歳以上人口] / [総人口]合計 70 分で本格ダッシュボードが完成。 SSDSE-B-2026 のような中規模公的統計データなら、 1 営業日以内に試作 → 1 週間で本番運用、 が現実的な工数感覚。
関東のある県庁が SSDSE-B-2026 を Power BI で可視化、 県議会・記者会見・市民広報に活用。 RLS で「県内市町村担当者」「県庁職員」「外部公開」の 3 レベルを設定し、 機微な内訳情報は内部のみ閲覧可能に。 月 1 回の更新で運用、 担当者の作業時間が 「Excel 集計 8 時間 → Power BI 自動 30 分」に短縮。
国立大学の URA 部門が、 部局別研究費獲得・論文出版・科研費採択数を Power BI で可視化。 学長レビュー会議で毎月使用、 部局長は自部局のドリルダウン画面を Service 上で閲覧。 OneDrive 上の Excel と直結し、 担当事務員の入力がリアルタイム反映。
救急搬送台数・到着時間・診療科別件数を Power BI で可視化、 院内会議室のモニターに常時表示。 異常値が出ると Power Automate で Teams に自動通知。 月次レビューで滞留時間の改善を継続実施。
OEE (総合設備効率)、 不良率、 生産量、 計画達成率を 5 分間隔で更新。 Azure IoT Hub からデータが流れ、 Power BI が DirectQuery で表示。 現場の作業員がタブレットで確認、 異常傾向を早期発見。
高校別合格者数、 出身地別分布、 入試区分別歩留まりを過去 10 年分集約。 入試委員会でターゲティング戦略立案に使用、 SNS 広告のターゲット設計にも展開。
原因: ファイルパスが変更された、 ネットワーク共有が切断された、 認証期限切れ。
対策:
原因: ソース CSV のヘッダ名が変わった、 列が削除された。
対策:
原因: テーブル名・列名のタイポ、 集計関数の中にメジャー名を直書きしようとした、 循環参照。
対策:
'シングルクォート' で囲む[角括弧] で参照、 列は テーブル[列] 形式原因: 大きなデータを Import モードで読み込んだ、 高カーディナリティ列が VertiPaq の圧縮効率を落とした。
対策:
原因: データカテゴリが「都道府県」に設定されていない、 文字列のスペルがズレている。
対策:
原因: スケジュール更新が失敗、 オンプレデータゲートウェイが停止。
対策:
「東京担当者は東京の行だけ閲覧可」を実現する例:
// 「東京担当」ロールの DAX フィルタ式 [Prefecture] = "東京都" // 動的に「ログインユーザー名で絞る」場合 [担当者メール] = USERPRINCIPALNAME()
USERPRINCIPALNAME() はログイン中の Microsoft アカウントのメールアドレスを返す。 「担当者メール」列をテーブルに持たせ、 ログインユーザーと一致する行だけ表示するパタンが定番。
| ロール | 権限 | 用途 |
|---|---|---|
| 管理者 | すべて(メンバー追加・削除含む) | ワークスペースオーナー |
| メンバー | 編集・公開、 管理は不可 | 共同開発者 |
| コントリビュータ | 編集のみ、 公開不可 | サブ開発者 |
| ビューア | 閲覧のみ | レポート利用者 |
金融・医療業界では、 ダッシュボードの数値が「いつ・誰が・どの計算式で」算出したかを追跡できることが必須。 Power BI は以下で対応:
| サービス | 連携方法 | 用途 |
|---|---|---|
| Excel | 「Excel に分析」「Live Connect」 | ピボット形式でデータ取得 |
| SharePoint | レポートを Web パーツとして埋め込み | イントラ社内ポータル |
| Teams | 「アプリ追加 → Power BI」 | チーム会議でダッシュボード共有 |
| OneDrive | Excel ファイルをデータソースに | 更新が自動連動 |
| Outlook | サブスクリプションで PDF 自動配信 | 定期レポート配信 |
2023 年に GA した Microsoft Fabric は、 Power BI を含むデータ系製品 (Synapse、 Data Factory、 OneLake 等) を統合した SaaS。 Power BI 単体ではなく Fabric の一部として位置付けられつつある。
Fabric の新機能。 Import の高速さ + DirectQuery のリアルタイム性 を両立。 OneLake 上の Parquet を直接 VertiPaq エンジンが読み込み、 データのコピーなしに高速集計を実現。
2024 年導入。 自然言語で「過去 3 年の人口推移を都道府県別に表示して」と指示するとレポートを自動生成。 まだ精度は発展途上だが、 プロトタイピング高速化に有効。
| キー | 動作 |
|---|---|
| Ctrl+S | 保存 |
| F5 | クエリ更新 |
| Ctrl+Z | 元に戻す |
| Ctrl+Shift+R | ビジュアル更新 |
| Alt+F4 | 終了 |
| F11 | フルスクリーン (フォーカスモード) |
| 関数 | 用途 |
|---|---|
| SUM / AVERAGE / COUNT / MIN / MAX | 基本集計 |
| DIVIDE | 0 除算で空白を返す安全な割り算 |
| CALCULATE | フィルタコンテキストの書き換え |
| FILTER | テーブルの絞り込み |
| ALL / ALLEXCEPT / ALLSELECTED | フィルタ解除 |
| RELATED | リレーション先の値を取得 |
| SUMX / AVERAGEX | 行コンテキストで集計 |
| DATEADD / SAMEPERIODLASTYEAR / TOTALYTD | 時間インテリジェンス |
| RANKX | ランキング |
| SWITCH / IF | 条件分岐 |
| USERPRINCIPALNAME | ログインユーザー取得 (RLS) |
| 関数 | 用途 |
|---|---|
| Csv.Document / Excel.Workbook | ファイル読込 |
| Table.PromoteHeaders | 1 行目をヘッダに昇格 |
| Table.SelectRows | 行フィルタ |
| Table.SelectColumns / Table.RemoveColumns | 列選択/削除 |
| Table.AddColumn | カスタム列追加 |
| Table.TransformColumnTypes | 型変換 |
| Table.UnpivotOtherColumns | 縦持ち変換 |
| Table.Group | グループ集計 |
| Table.Join / Table.NestedJoin | テーブル結合 |
SSDSE-B-2026 (47 都道府県・複数年度・112 指標) を素材に、 Power BI で作れる典型的なダッシュボードを 8 種類紹介。
Prefecture(データカテゴリ: 都道府県)SUM(A1101)[高齢化率]yearyear, Y: SUM(A1101)Prefecture (上位 10 県でフィルタ)Prefecture[高齢化率]SUM(A1101) (総人口、 対数軸)SUM(A1303) (65 歳以上人口、 対数軸)[高齢化率]year[出生率][死亡率]PrefectureSUM(A1301) (15歳未満), SUM(A1302) (15-64歳), SUM(A1303) (65以上)Prefecture, SUM(A1101), [高齢化率], [人口 YoY%][総人口] (全国合計、 1.24 億人)[平均高齢化率] (30.5%)[人口 YoY%] (−0.39%、 赤字)[出生数] (全国、 約 77 万)「人口の 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 都道府県が必要。
// 計算列で地域コードを追加
地域 =
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'[地域]))
// 地域内シェア
地域内シェア := DIVIDE([総人口], [地域別人口])
// 全国内シェア
全国内シェア := DIVIDE([総人口], CALCULATE([総人口], ALL('SSDSE')))
人口区分動的 :=
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%")
前年同月人口 := CALCULATE([総人口], SAMEPERIODLASTYEAR('SSDSE'[date]))
人口前年比 := DIVIDE([総人口] - [前年同月人口], [前年同月人口])
人口 3 ヶ月移動平均 :=
AVERAGEX(
DATESINPERIOD('SSDSE'[date], LASTDATE('SSDSE'[date]), -3, MONTH),
[総人口]
)
┌──────────────────────────────────────────────────────┐ │ [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 ▓▓ ▓▓ ░░ ░░ ▓▓ ▓▓ ▓▓ ← 改善余地 │ └──────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────┐ │ [製造ライン 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 種のスコープを持ちます。
総人口 := SUM('SSDSE'[A1101])
高齢化率 := DIVIDE(SUM('SSDSE'[A1303]), SUM('SSDSE'[A1101]))
DIVIDE は 0 除算で空白を返す安全な除算。
全国平均 := CALCULATE(AVERAGE('SSDSE'[A1101]), ALL('SSDSE'[Prefecture]))
ALL でフィルタを除き、 全都道府県を母集団とする平均を取る。
これを数学的に書けば、 フィルタ集合 $F$ に対して
$$\text{メジャー}_{F}(\theta) = f\bigl(\{x_i : i \in F\};\theta\bigr)$$であり、 CALCULATE はこの $F$ を 動的に書き換える演算子と解釈できます。
DAX の理解で最も重要なのが フィルタコンテキスト (Filter Context) と 行コンテキスト (Row Context) の区別。 これを抑えれば DAX の挙動はほぼ予測可能になる。
| コンテキスト | 意味 | 発生場面 |
|---|---|---|
| 行コンテキスト | 「現在の行」を指し示す環境 | 計算列、 イテレータ関数(SUMX, FILTER 内など) |
| フィルタコンテキスト | テーブルがどう絞り込まれているかの集合 | メジャー、 ビジュアル、 CALCULATE 内 |
テーブル $T$ の行 $r \in T$、 列 $c$ について計算列 $X$ は:
と書ける(行ごとに $r$ を引数とする関数)。 一方メジャー $M$ は:
と、 フィルタ条件 $F$ で絞り込まれた行集合に対する集約関数。 同じビジュアル内でも、 「東京都」「2023 年」のスライサーが効くたびに $F$ が更新され、 メジャーは 再計算される。
CALCULATE はフィルタコンテキストを 書き換える演算子:
つまり、 既存のフィルタを 該当列だけ削除してから、 新しいフィルタ $F_i$ で上書きする。 これが「ALL でフィルタ解除 → 新条件で集計」のパターンを可能にする。
東京シェア :=
DIVIDE(
CALCULATE([総人口], 'SSDSE'[Prefecture] = "東京都"),
CALCULATE([総人口], ALL('SSDSE'[Prefecture]))
)
分子は「Prefecture フィルタを 東京都 で上書き → 東京の総人口」、 分母は「Prefecture フィルタを ALL で除去 → 全国合計」。 ビジュアルがどの都道府県にフィルタされていても、 「東京の人口 / 全国合計」という不変の値を返す。
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 直結に向く |
| Import | VertiPaq に列圧縮で取込 | SSDSE 程度なら最速 |
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 のレポート設計は単なるドラッグ操作ではなく、 (1) スター・スキーマの設計、 (2) DAX (Data Analysis Expressions) 式の最適化、 (3) 視覚化の選択、 の 3 層の意思決定を伴う。 ここでは SSDSE-B-2026 を題材に、 数式と Python 実装の対応を示しつつ、 Power BI 上で再現する具体手順を補講する。
→ 中央のファクトテーブルに数値、 周囲にディメンションテーブルを置く。 Power BI の「リレーションシップ」画面で 1 対多を引くだけで、 後はスライサーで瞬時にドリルダウンできる。
→ ダッシュボード上段に 3 つの KPI カード、 中央に地図、 右に棒グラフ。 これは Power BI の典型レイアウトで、 視線が「Z 字」を描くよう配置するのが定石。
→ 「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 を取るのが定石である。
このコードでやること: SSDSE-B-2026 から「全国の高齢化率」を 2 通りで計算 (SUM/SUM 方式 と 単純平均方式) し、 差を観察する。
📥 入力 (SSDSE-B-2026 抜粋):
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") |
📤 実行例:
💬 単純平均は人口の少ない過疎県 (高齢化率が高い) と東京・愛知 (高齢化率が低い) を同じ重みで足してしまうため、 全国の高齢化率を 2.45 pt 過大評価する。 Power BI で KPI カードを作るときは必ず DIVIDE(SUM, SUM) を使うこと、 という実務的な教訓がここに繋がる。
| 機能 | Power BI (DAX) | Tableau | pandas |
|---|---|---|---|
| 合計 | SUM([col]) | SUM([col]) | df['col'].sum() |
| 比率 | DIVIDE(a, b) | [a]/[b] | a / b |
| フィルタ集計 | CALCULATE(...,FILTER) | IF SUM | df.query().sum() |
| 前年比 | CALCULATE + DATEADD | LOOKUP / 表計算 | pct_change() |
本セクションは R292 補講として追加。 関連: Tableau, BI ツール, データ可視化。
Power BI Desktop で SSDSE-B-2026 を取り込んでダッシュボードを構築する手順を、 実務に近い 10 ステップで整理する。 各ステップに「DAX 式」「視覚化選択」「落とし穴」を併記しているので、 初学者から実務レベルへ橋渡しできる。
高齢化率 = [老年人口] / [総人口] を計算列で追加。 これは行レベルで評価されるため、 ファクトのメモリを消費する点に注意。全国高齢化率 = DIVIDE(SUM('Fact'[老年人口]), SUM('Fact'[総人口])) をメジャーで定義。 メジャーは集計時のみ評価されるため、 ストレージ効率が良い。DAX を初めて触る人は pandas との対比で覚えると効率的。 SSDSE-B-2026 を題材に、 同じ集計を DAX と Python で並べてみる。
| タスク | DAX | Python (pandas) |
|---|---|---|
| 全国総人口 | SUM([総人口]) | df['総人口'].sum() |
| 関東のみ集計 | CALCULATE(SUM([総人口]), FILTER('Dim', [地方]="関東")) | df[df['地方']=='関東']['総人口'].sum() |
| 前年比 | DIVIDE([今年] - [前年], [前年]) | df['col'].pct_change() |
| 高齢化率トップ 10 | TOPN(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 ダッシュボードを運用していると、 以下のトラブルが頻発する。 事前に対処法を知っておくとリリース後の混乱を防げる。
IF(ISBLANK(...), 0, ...) でゼロ埋め。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 のライセンスは複雑だが、 大きく分けて 3 階層がある。 用途に合った選択をしないと、 後で予算超過や機能不足になる。
SSDSE-B-2026 を題材にした学習なら Power BI Free + Desktop で完結する。 業務利用に踏み出す段階で Pro へ昇格、 1000 ユーザー超の全社展開で Premium Capacity を検討、 という拡張パスが標準的。
「どちらを選ぶべきか」は永遠の問いだが、 以下の基準で考えると判断しやすい。 Microsoft 365 を使っている組織は Power BI が圧倒的に有利、 Salesforce 系や AWS 中心の組織は Tableau が馴染みやすい、 という大局観がある。
| 観点 | Power BI 優位 | Tableau 優位 |
|---|---|---|
| 料金 | 圧倒的に安い (Pro 1250 円/月) | Creator 9000 円/月など高め |
| 学習コスト | Excel ユーザーが馴染みやすい | 操作の自由度が高く玄人好み |
| 可視化の柔軟性 | 標準ビジュアルが豊富 | カスタムビジュアルの自由度が高い |
| エコシステム | Azure / Teams / Excel と統合 | Salesforce / Snowflake と統合 |
| 大規模データ | Fabric / Direct Lake | Tableau Hyper + Extract |
Power BI を本番運用する際は、 単に「ダッシュボードを作る」のではなく、 データ取得・モデリング・運用・ガバナンスの 4 層で設計する必要がある。 SSDSE-B-2026 のような小規模データなら 1 ファイル内で完結するが、 全社展開の段階では以下の指針を踏襲することで保守性が大幅に上がる。
Sales_Sum, Sales_YoY) を統一。この 6 層を整備して初めて「Power BI が組織のデータ文化を変える」段階に入る。 SSDSE のような統計データを使った教材は、 学習者が個人で完結できるサイズなので、 まずは意味モデル層と可視化層を徹底的に練習することが、 後の業務展開の基盤になる。 さらに、 Power BI Service の共有・閲覧・コメント機能を活用すれば、 学習グループ内で互いのダッシュボードを評価し合うことができ、 自然と「他者の視点を取り入れる」設計力が養われる。 これは独学では得にくい貴重な機会なので、 ぜひ複数人での学習を推奨したい。 また、 Power BI コミュニティ (公式フォーラム・Power BI User Group) に参加すると、 世界中の実務家の知見にアクセスできる。 SSDSE で練習した手法を応用して、 自分の業務データや興味あるオープンデータでダッシュボードを作り、 コミュニティで共有することが、 最も効率的な学習サイクルである。 自分の作品にフィードバックをもらうことで、 設計判断の幅が広がり、 単なる「ツール操作の習熟」から「データで意思決定を駆動する設計者」への成長軌道に乗ることができる。 これが Power BI 学習の最終ゴールである。
典型的な構成は次の通り。
data/raw/SSDSE-B-2026.csv を読み込み、 ヘッダを昇格 → 数値列を整数型に変換 → 不要な英文ヘッダ行を削除。高齢化率 = [65歳以上人口] / [総人口] を行ごとに計算。全国合計 := SUM(SSDSE[総人口])、 東京シェア := DIVIDE(CALCULATE([全国合計], SSDSE[都道府県]="東京都"), [全国合計])計算結果の目安:
合成データで DAX 式で求める平均と前年比を計算する。
| 年 | 売上 | 前年比 |
|---|---|---|
| 2021 | 100 | — |
| 2022 | 120 | 20.0% |
| 2023 | 150 | 25.0% |
| 2024 | 170 | 13.3% |
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}%") |
💬 手計算 (Step 2) 19.44% と Python 出力が完全一致。
Power BI は GUI 中心ですが、 前処理は Python、 表示は Power BI という分業が現場で多用されます。 SSDSE-B-2026 を題材に、 5 要素揃いの実装例を 4 つ示します。
このコードでやること: 公的統計 SSDSE-B-2026 を読み込み、 日本語ヘッダ行を除去、 数値列を型変換、 高齢化率を計算列として追加、 Parquet 形式で書き出す。 Power BI Desktop は Parquet を直接 import できるため、 大規模データでも高速。
📥 入力: data/raw/SSDSE-B-2026.csv (565 行 × 112 列, cp932 エンコーディング):
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()) |
📤 実行結果:
💬 結果の読み方: 564 行 × 114 列を Parquet で保存。 Power BI Desktop で「データを取得 → 詳細 → Parquet」を選べばこのファイルを直接 import 可能。 CSV と比べ 10 倍程度の高速読み込み + 圧縮率 70% 減 が期待でき、 SSDSE-B-2026 のような中規模データでも体感差が出る。
このコードでやること: 横持ち(指標が列)から縦持ち(指標が値)に変換し、 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)) |
📤 実行結果:
💬 結果の読み方: 元の 4 列を「指標」列に集約することで、 Power BI で「指標」をスライサー(フィルタ)にして 1 つのビジュアルから動的に表示切替できる。 横持ちのままだと 「総人口・15歳未満・15-64歳・65歳以上」を別ビジュアルに 4 つ並べる必要があるが、 縦持ちなら 1 ビジュアル + 1 スライサーで完結。
このコードでやること: 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 図が表示される
💬 結果の読み方: 標準ビジュアル「棒グラフ」と「色」を組み合わせた表現で、 人口規模と高齢化を 1 つの図で同時表示。 北海道や静岡は人口こそ多くないが色が濃く(高齢化進行)、 東京・神奈川は色が薄い(高齢化進行は緩やか)。 Python ビジュアルは標準では描けない多変数表現を 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') |
📤 実行結果:
💬 結果の読み方: 横軸=人口(対数)、 縦軸=高齢化率、 バブルサイズ=人口、 色=高齢化率。 左上に「人口少・高齢化高」(秋田・高知・徳島)、 右下に「人口多・高齢化低」(東京)が配置され、 47 県の構造的位置関係がひと目で分かる。 Power BI と同様にホバーで詳細表示、 HTML を共有すれば誰でもインタラクティブに操作できる ── Power BI Service が使えない環境での代替手段になる。
// 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
高齢化率 := DIVIDE(SUM('SSDSE'[65歳以上人口]), SUM('SSDSE'[総人口]))
前年高齢化率 :=
CALCULATE([高齢化率], DATEADD('SSDSE'[年度], -1, YEAR))
高齢化率の前年差 := [高齢化率] - [前年高齢化率]
都道府県 列SUM(総人口)[高齢化率] メジャー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() |
[都道府県] = "東京都"ステップ 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:ビジュアル配置
ステップ 6:レポート共有
Power BI Service へ発行(Pro ライセンス必要)、 ワークスペース内で共有、 自動更新設定。
売上・利益・在庫・予算の月次/週次/日次更新。 Power BI Service の自動更新と Teams 配信。
SSDSE-B-2026 を読み込み、 都道府県別人口・経済・社会指標をマップ化。 Power BI Embedded で市民向けに公開も可。
科目別成績、 不登校推移、 進路追跡。 文部科学省統計と SSDSE を結合してベンチマーク。
病床稼働率、 救急搬送、 在宅医療件数。 RLS で病院ごとアクセス分離。
製造ラインの稼働率、 不良率、 OEE。 IoT センサーから Synapse 経由で取り込み。
採用ファネル、 給与分布、 離職予測(Azure ML 連携)。
キャンペーン ROI、 チャネル別売上、 顧客 LTV。 Google Analytics、 CRM、 ERP を統合。
研究費獲得状況、 論文出版、 学生統計。 経年比較ダッシュボード化。
Power BI と Python を組み合わせる際の追加実装例。
このコードでやること: 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()) |
📤 実行結果:
💬 結果の読み方: 47 県 × 5 年 = 235 行に整形完了。 Power BI Desktop で「CSV インポート → 文字コード UTF-8 → そのまま import」で即座に利用可能。 utf-8-sig (BOM 付き) にしているのは、 Power BI Service で Excel と互換させるため。
このコードでやること: 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])) |
📤 実行結果:
💬 結果の読み方: 6 指標 × 3 パターン = 18 メジャー定義を一括生成。 dax_measures.txt をテキストエディタで開き、 Power BI Desktop のメジャー作成画面に 1 件ずつコピペする運用。 大量の指標を扱うプロジェクトでは、 こうした 「メジャー生成スクリプト」 が開発工数を大幅短縮する。
このコードでやること: 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') |
📤 実行結果:
💬 結果の読み方: Power BI Service が使えない印刷物・PDF 報告書に貼り付け可能な KPI カード画像が生成された。 Power BI の Card ビジュアルを画像で代替する手法。 出生数 −5.64% YoY は少子化トレンドを定量的に示しており、 政策評価レポートの表紙画像として有効。
中心に大きい数値テーブル(ファクト)、 周囲に属性テーブル(ディメンション)を配置。 SSDSE-B-2026 で言えば:
マスタ側を「1」(一意)、 ファクト側を「多」(重複あり)に。 多対多 (M:M) リレーションは可能だが複雑度が増し DAX の挙動が予測しにくくなる。
デフォルトは「単方向」(マスタ → ファクト)。 双方向にすると循環参照やパフォーマンス低下を招くため、 特殊ケース(多対多リレーションなど)に限定する。
計算列は取り込み時に固定計算され、 VertiPaq のメモリを消費する。 集計可能なものはメジャーで定義する方が柔軟・効率的。
fact_*dim_*[名詞_動詞] 形式 (例: [総人口_合計])*_key, *_idPower BI は単体ツールではなく、 周辺サービスと連携することで真価を発揮する。
| レイヤー | サービス | 役割 |
|---|---|---|
| データソース | Azure SQL, Synapse, Dataverse, SharePoint List, Excel | 原データの保管 |
| ETL | Power 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/ML | Azure ML, AutoML in Power BI, Copilot | 予測・自動化 |
SSDSE-B-2026 をベースに、 自治体や大学が 1 年運用する場合の参考コスト:
| 項目 | 料金 | 年額 (USD) |
|---|---|---|
| Power BI Desktop | 無料 | 0 |
| Power BI Pro × 6 | 10 USD/月 | 720 |
| Microsoft 365 Business Basic × 6 | 6 USD/月 | 432 |
| 合計 | 約 1,152 USD (17 万円) |
| 項目 | 料金 | 年額 (USD) |
|---|---|---|
| Power BI Pro × 33 | 10 USD/月 | 3,960 |
| Premium Per User × 3 (開発者) | +10 USD/月 | 360 |
| Azure SQL DB (Basic) | 5 USD/月 | 60 |
| 合計 | 約 4,380 USD (65 万円) |
| 項目 | 料金 | 年額 (USD) |
|---|---|---|
| Premium Capacity P1 | 4,995 USD/月 | 59,940 |
| Azure Synapse | 変動 | 10,000〜30,000 |
| Microsoft 365 E3 × 500 | 36 USD/月 | 216,000 |
| 合計 | 約 285,000 USD (4,200 万円) |
SSDSE 程度の規模ならシナリオ Aで十分。 大学の研究室・自治体の 1 部署単位の運用ならコスト面で Power BI は十分現実的。
「Power BI を 1 ヶ月で使えるようになる」ためのフォーカス順位:
これで「業務で 7 割使える」レベル到達。 残り 3 割(DAX 高度パターン、 パフォーマンス最適化、 Fabric 統合)は実プロジェクトで OJT 的に習得するのが現実的。
A: ① Power BI Desktop で Excel ファイルを取込、 ② シート→テーブルへ変換、 ③ ピボットの計算項目を DAX メジャーに書き換え、 ④ ビジュアルを Power BI 標準ビジュアルで再構築。 多くの場合「ピボット 1 枚 = Power BI レポート 1 ページ」の対応。
A: できる。 取込モードが「Import」なら制限なし。 「DirectQuery」を混在させる場合は Composite (混合) モデルを有効化。 ただし「Import + DirectQuery」のリレーションは制限が多いので、 ETL でマスタを統合してから取り込むのが安全。
A: DAX には地理的変換関数はない。 別途マスタテーブル(都道府県名・緯度・経度)を用意し、 リレーションで結合する。 内閣府の 「市区町村コード」と組み合わせて緯度経度マスタを作るのが定番。
A: .pbix はバイナリなので Git で差分が見にくい。 Power BI Desktop の保存形式を「Power BI プロジェクト形式 (.pbip)」に切替(プレビュー機能、 2024 年〜)。 すると JSON・テキスト形式で保存され、 Git で差分管理可能。
A: Excel は 1 シート 100 万行制限。 ① CSV / Parquet に分割保存、 ② SQL Server / Synapse など DB 化、 ③ Power BI Premium で「大規模データセット」を有効化(Premium のみ)。
A: 主な原因は「メジャーが複雑」「カーディナリティ高」「DirectQuery 多発」。 ① DAX Studio で実行プランを分析、 ② メジャーを変数 (VAR) でキャッシュ、 ③ 不要列削除、 ④ Aggregations 機能で事前集計テーブルを作る。
A: 全データを UTC で取り込み、 表示時に DAX の FORMAT + USERCULTURE でユーザー側ロケールに変換するのが定石。 Power BI Service は閲覧ユーザーのブラウザロケールを取得可能。
歴史と位置づけ: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 都道府県)の実測のみを用います。
Power BI の一番の壁は操作ではなく発想の転換です。 Excel は「セルを指す」文化(=A1+B1)、 Power BI は「列を集計する」文化(SUM('人口ファクト'[総人口]))。 この違いを腹落ちさせると、 残りは一気に楽になります。
SUMX の中でメジャーを参照すると、 CALCULATE が暗黙に走り「行コンテキスト → フィルタコンテキスト」への変換が起きる。 初心者が「なぜかメジャーの値が全行同じになる/おかしくなる」と混乱する最大の原因。 迷ったら「メジャーを呼ぶ=そこで CALCULATE が挟まる」と唱えるとよい。SUM/SUM)=29.13 % に対し、 47 県の率の単純平均は 31.59 %、 中央値は 31.78 % と全て別物。 「総計行 = 行の足し算」という Excel の直感は捨てる。.pbix が無駄に膨らむ。 対策は「オプション → データの読み込み → 自動の日付/時刻を OFF」にし、 専用の日付ディメンションを 1 つだけ作って時間インテリジェンスを集約すること。CROSSFILTER で局所的に切り替える。.pbix は実体が ZIP のバイナリで、 git diff が効かず「誰が何を変えたか」が追えない。 対策は ①PBIP(Power BI Project)形式で保存し TMDL などテキストで差分を取る、 ②Fabric のワークスペース Git 統合を使う、 ③最低限「ファイル名+日付」でスナップショットを残す。 チーム開発では最初に方針を決めておく。VAR で中間結果を変数化すると、 同じ計算の重複評価を避けられ、 式も読みやすくなる。 複雑なメジャーはまず VAR で分解するのが定石。Power Query(上流 ETL・M 言語) Tableau(並列 BI ツール) BI ツール(全体像) データ可視化 インタラクティブ可視化 散布図 時系列
※「DAX」「ダッシュボード」の独立ページは用語集に無いため、 本ページ内の該当節(📐 数式・定義、 🎮 触って体感)を参照してください。
Power BI の心臓部は「1 枚の表」ではなく スタースキーマ(中心のファクト表+周辺のディメンション表を 1 対多で結んだデータモデル) と、 その上で走る メジャー(フィルタコンテキストで動く集計式=DAX) です。 ここでは SSDSE-B-2026 の実測値(総人口 A1101、 2013 年と 2023 年、 8 県)を素材に、 ①リレーションを繋ぐと集計がディメンションで正しく分解される様子、 ②メジャーを変えると全ビジュアルが一斉更新される様子、 ③単方向/双方向フィルタの違いを、 全部あなたの手で動かして確かめられます。
スタースキーマの発想は単純です。 数値(測定値)は中心の「ファクト表」に、 切り口(属性)は周辺の「ディメンション表」に置き、 両者を 1 対多で結ぶ。 ここでは「人口ファクト(16 行=8 県×2 年度)」が中心、 「Dim_年度(2 行)」「Dim_地域(47 県マスタ)」が周辺です。 リレーションが有効なら、 ディメンションの列(地方)を軸にドラッグするだけで フィルタが Dim→ファクトへ伝播し、 メジャー SUM('人口ファクト'[総人口]) が地方ごとに 自動で分解されます。 メジャーを AVERAGE / MAX / COUNT に差し替えれば、 棒もカードも 同じ 1 つの式を参照しているので一斉に更新される ── これが「1 か所に集計定義、 全ビジュアルが従う」というセマンティックモデルの威力です。
COUNTROWS('Dim_地域')」カードを見てください。 単方向ではディメンション・マスタは常に 47(ファクト側の絞り込みは Dim に逆流しない)。 ところが 双方向にすると、 ファクトの絞り込みが Dim_地域 へ逆流し、 マスタが 8(さらに地方をクリックすると 2)に 勝手に縮む。 「顧客マスタ件数」のような Dim を数えるメジャーが、 気づかぬうちに別の値になる ── これが双方向の代表的な罠です。 なお ファクト行数(fact 側の集計)は方向に関係なく変わらない点も見比べてください。CALCULATE はこのフィルタコンテキストを書き換える関数です。※ 数値はすべて SSDSE-B-2026(総人口 A1101、 2013/2023 年)の実測から Python で転記。 ファクトは 8 県×2 年度=16 行、 Dim_地域 は 47 都道府県マスタ。 集計(SUM/AVERAGE/MAX/COUNT)・地方分解・COUNTROWS は node で再計算し一致を確認済み。
| プラン | 料金 | 用途 |
|---|---|---|
| Free / Desktop | 無料 | 個人作業、 学習 |
| Pro | 10 USD / user / 月 | 組織内共有、 自動更新 |
| Premium Per User | 20 USD / user / 月 | 大容量、 AI 機能 |
| Premium Capacity | 4,995 USD / 月~ | 全社配信、 Embedded |
| Fabric F SKU | 応相談 | OneLake + Power BI 統合 |
| 用語 | 意味 |
|---|---|
| DAX | Data Analysis Expressions。 集計の式言語 |
| M 言語 | Power Query の式言語 |
| 計算列 | 行コンテキストで毎行計算する列 |
| メジャー | フィルタコンテキストで集計する式 |
| リレーションシップ | テーブル間の結合関係 |
| スタースキーマ | 中心ファクト + 周辺ディメンション |
| RLS | 行レベルセキュリティ |
| VertiPaq | 列指向圧縮エンジン |
| DirectQuery | クエリ時に DB へ直接問い合わせ |
| Import | データを取り込んでローカル保持 |
| CALCULATE | フィルタコンテキストを変更する DAX 関数 |
| Time Intelligence | 時間軸の DAX 関数群 |
| レシピ | コード |
|---|---|
| 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 は Microsoft 製の BI ツールで、 Power Query・Excel・SQL Server・Azure と一体運用される。
SSDSE-B-2026 を用いた演習では、 「Power BI」 を中核に据えて上記の上流・並列・下流の手法を実データで連結する経験を積むと、 単独の手法暗記より実務的応用力が身につく。
「Power BI」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。
BI ツールの価値は「同じ指標を継続して追える」こと。 探索や 1 回限りの分析では、 かえって手間が増える。