Power BI の HR 分析ダッシュボード: Workforce Insights
ピープル アナリティクスは、企業内で最も急速に成長しているビジネス インテリジェンスのアプリケーションですが、それには十分な理由があります。成熟した人事分析プログラムを備えた組織は、最小限の人材データ機能を備えた企業よりも 3 年間の平均利益が 82% 高くなります (Deloitte Human Capital Trends)。しかし、ほとんどの人事チームは依然として Excel スプレッドシートで従業員数を追跡し、Google Sheets で離職率を手動で計算しています。
Power BI は、財務チームや営業チームが長年にわたって提供してきたのと同じ分析の深さを人事リーダーに提供します。つまり、リアルタイムの人員可視化、自動離職計算、ダイバーシティ分析、採用から退職までの全従業員のプロセスにわたる従業員ライフサイクル追跡などです。
このガイドでは、Power BI で完全な HR 分析プラットフォームを構築し、データ モデル、DAX 式を備えたすべての重要な HR KPI、および実際の従業員の意思決定を促進するダッシュボード ページをカバーします。
重要なポイント
- 人事分析には、過去の従業員数に対する緩やかに変化するディメンション (SCD) アプローチが必要です
- 離職率の計算では自発的離職と非自発的離職を区別する必要がある
- ダイバーシティ ダッシュボードには慎重なプライバシー設計が必要です。不適切な場合は決して個人レベルではなく、集約してください。
- 従業員のライフサイクル分析により、採用までの時間、生産性が向上するまでの時間、および定着曲線を追跡します
- 欠勤分析 (ブラッドフォード係数、欠勤頻度) を給与データと統合
- 従業員数の DAX 測定は特定の時点で行われます (合計されません) - 特別な計算パターンが必要です
- HRIS システム (Workday、SAP SuccessFactors、BambooHR) はすべて Power BI コネクタを備えています
- 行レベルのセキュリティでは、人事データを承認された人事ビジネス パートナーおよびマネージャーに限定する必要があります
HR 分析のデータ モデル
コア人事テーブル
Employee_Snapshot (ゆっくりと変化、毎月従業員ごとに 1 行):
| コラム | 説明 |
|---|---|
| コード0 | 従業員識別子 |
| コード0 | スナップショットの月末日 |
| コード0 | アクティブ、休暇中、退職 |
| コード0 | 部門へのFK |
| コード0 | グレード/バンド (L1-L8) |
| コード0 | 現在の役職 |
| コード0 | 従業員 (マネージャー) への FK |
| コード0 | FKから場所へ |
| コード0 | 元の雇用日 |
| コード0 | 終了日 (アクティブな場合は null) |
| コード0 | 自発的、非自発的、退職など |
| コード0 | 基本給月額 |
| コード0 | FT の場合は 1.0、PT の場合は 0.5 |
| コード0 | M/F/ノンバイナリー (少人数の場合は匿名) |
| コード0 | 集計された年齢層 (生の年齢ではない) |
| コード0 | 自己申告による民族グループ |
| コード0 | スナップショット日の雇用月数 |
Hiring_Events (雇用ごとに 1 行):
HireID、EmployeeID、ApplicationDate、OfferDate、AcceptDate、StartDate、DepartmentID、SourceChannel、HiringManagerID、JobRequisitionID
Absence_Records (欠勤イベントごとに 1 行):
AbsenceID、EmployeeID、StartDate、EndDate、DaysAbsent、AbsenceType、Reason、ApprovalStatus
Performance_Reviews (レビューごとに 1 行):
ReviewID、EmployeeID、ReviewDate、PerformanceRating、ManagerID
Training_Completions (トレーニングごとに 1 行):
TrainingID、EmployeeID、CompletionDate、ProgramName、HoursCompleted
人員分析
従業員数の時点での計算
従業員数はスナップショットの尺度 (ある時点で存在する従業員の数) であり、合計ではありません。これには特別な DAX 処理が必要です。
// Headcount at any selected date
Headcount =
CALCULATE(
COUNTROWS(Employee_Snapshot),
Employee_Snapshot[Status] = "Active",
// Use the latest available snapshot for the selected period
Employee_Snapshot[SnapshotDate] = MAX(Employee_Snapshot[SnapshotDate])
)
// FTE-adjusted Headcount
FTE Headcount =
CALCULATE(
SUMX(
FILTER(Employee_Snapshot, Employee_Snapshot[Status] = "Active"),
Employee_Snapshot[FullTimeEquivalent]
),
Employee_Snapshot[SnapshotDate] = MAX(Employee_Snapshot[SnapshotDate])
)
// Headcount by Department (for matrix/bar chart)
Dept Headcount =
CALCULATE(
[Headcount],
ALLEXCEPT(Employee_Snapshot, Employee_Snapshot[DepartmentID])
)
// Headcount growth (vs prior month)
Headcount MoM Change =
[Headcount] -
CALCULATE(
[Headcount],
DATEADD(Date[Date], -1, MONTH)
)
// Headcount trend (for sparkline or line chart)
Headcount Trend =
CALCULATE(
[Headcount],
REMOVEFILTERS(Date[Month])
)
離職率分析
離職率は、最も追跡されている人事指標であり、最も一般的に誤計算されている指標です。正しい計算式では、分母として平均人数が使用されます (開始人数または終了人数ではありません)。
売上高 KPI
// Total Terminations in Period
Terminations =
CALCULATE(
COUNTROWS(Employee_Snapshot),
Employee_Snapshot[Status] = "Terminated",
Employee_Snapshot[TerminationDate] >= MIN(Date[Date]),
Employee_Snapshot[TerminationDate] <= MAX(Date[Date])
)
// Voluntary Terminations (resigned)
Voluntary Terminations =
CALCULATE(
[Terminations],
Employee_Snapshot[TerminationReason] = "Voluntary"
)
// Involuntary Terminations (laid off, fired)
Involuntary Terminations =
CALCULATE(
[Terminations],
Employee_Snapshot[TerminationReason] = "Involuntary"
)
// Average Headcount (for turnover denominator)
Avg Headcount =
AVERAGEX(
VALUES(Date[Month]),
[Headcount]
)
// Annualized Turnover Rate
Turnover Rate =
DIVIDE(
[Terminations],
[Avg Headcount],
0
) * 12 -- Annualize if showing monthly data
// Voluntary Turnover Rate
Voluntary Turnover Rate =
DIVIDE([Voluntary Terminations], [Avg Headcount], 0) * 12
// Regrettable Turnover (voluntary + high performers)
Regrettable Turnover =
CALCULATE(
[Voluntary Terminations],
RELATED(Performance_Reviews[PerformanceRating]) >= 4 -- High performers
)
// Retention Rate
Retention Rate = 1 - [Turnover Rate]
// New Hire Survival Rate (% of new hires still employed after 90 days)
90 Day Survival Rate =
DIVIDE(
CALCULATE(
COUNTROWS(Hiring_Events),
DATEDIFF(Hiring_Events[StartDate], TODAY(), DAY) >= 90,
RELATED(Employee_Snapshot[Status]) = "Active"
),
CALCULATE(
COUNTROWS(Hiring_Events),
DATEDIFF(Hiring_Events[StartDate], TODAY(), DAY) >= 90
),
0
)
多様性、公平性、包括性の指標
プライバシーを意識した DEI 分析
DEI 分析はプライバシー ガードレールを使用して実装する必要があります。機密属性ごとに個人レベルのデータを決して表示せず、構成可能な最小値 (通常は 5 ~ 10 人の従業員) より小さいグループのデータを抑制します。
// Gender ratio (with suppression for small groups)
Gender Ratio Female =
VAR FemaleCount = CALCULATE([Headcount], Employee_Snapshot[Gender] = "Female")
VAR TotalCount = [Headcount]
RETURN
IF(TotalCount >= 10, DIVIDE(FemaleCount, TotalCount, 0), BLANK())
// Pay equity ratio (female to male)
Gender Pay Ratio =
VAR FemalePay = CALCULATE(
AVERAGE(Employee_Snapshot[BaseSalary]),
Employee_Snapshot[Gender] = "Female"
)
VAR MalePay = CALCULATE(
AVERAGE(Employee_Snapshot[BaseSalary]),
Employee_Snapshot[Gender] = "Male"
)
RETURN DIVIDE(FemalePay, MalePay, 0)
// Leadership diversity (% of senior roles filled by underrepresented groups)
Leadership Diversity % =
DIVIDE(
CALCULATE(
[Headcount],
Employee_Snapshot[JobLevel] IN {"L6","L7","L8"},
Employee_Snapshot[Gender] = "Female"
),
CALCULATE(
[Headcount],
Employee_Snapshot[JobLevel] IN {"L6","L7","L8"}
),
0
)
DEI ダッシュボードの KPI
| KPI | 式 | ターゲット |
|---|---|---|
| ジェンダーバランス | 総従業員数に占める女性の割合 | 50% ± 5% |
| 男女間の賃金格差 | 女性の平均給与 / 男性の平均給与 | > 97% |
| リーダーシップの多様性 | 上級職における過小評価されているグループ | > 30% |
| 多様な採用率 | 多様な雇用者数 / 総雇用者数 | > 40% |
| プロモーションエクイティ | 性別・民族別昇進率 | グループ間で±2% |
従業員のライフサイクル分析
雇用までの時間
// Average days from job posting to offer acceptance
Avg Time to Hire =
AVERAGEX(
Hiring_Events,
DATEDIFF(
Hiring_Events[ApplicationDate],
Hiring_Events[AcceptDate],
DAY
)
)
// Offer Acceptance Rate
Offer Acceptance Rate =
DIVIDE(
CALCULATE(COUNTROWS(Hiring_Events), Hiring_Events[AcceptDate] <> BLANK()),
CALCULATE(COUNTROWS(Hiring_Events), Hiring_Events[OfferDate] <> BLANK()),
0
)
// Source Channel Effectiveness (hired employees by source)
Source Hire Rate =
DIVIDE(
COUNTROWS(Hiring_Events),
CALCULATE(
COUNTROWS(Hiring_Events),
REMOVEFILTERS(Hiring_Events[SourceChannel])
),
0
)
在職期間の分布
// Tenure bucket (for histogram)
Tenure Bucket =
SWITCH(TRUE(),
Employee_Snapshot[TenureMonths] < 3, "0-3 months",
Employee_Snapshot[TenureMonths] < 12, "3-12 months",
Employee_Snapshot[TenureMonths] < 24, "1-2 years",
Employee_Snapshot[TenureMonths] < 60, "2-5 years",
Employee_Snapshot[TenureMonths] < 120, "5-10 years",
"10+ years"
)
// Average Tenure at Separation
Avg Tenure at Separation =
AVERAGEX(
FILTER(Employee_Snapshot, Employee_Snapshot[Status] = "Terminated"),
Employee_Snapshot[TenureMonths]
)
欠勤分析
欠勤 KPI
// Absence Rate (% of working days lost)
Absence Rate =
DIVIDE(
SUM(Absence_Records[DaysAbsent]),
[Headcount] * NETWORKDAYS(MIN(Date[Date]), MAX(Date[Date])),
0
)
// Bradford Factor (frequency-weighted absence score)
// B = S² × D (S = absence episodes, D = total days)
Bradford Factor =
VAR Spells = COUNTROWS(Absence_Records)
VAR Days = SUM(Absence_Records[DaysAbsent])
RETURN Spells * Spells * Days
// Average Absence Days per Employee
Avg Absence Days =
DIVIDE(SUM(Absence_Records[DaysAbsent]), [Headcount], 0)
// Absence by Type (breakdown)
Medical Absence Days =
CALCULATE(
SUM(Absence_Records[DaysAbsent]),
Absence_Records[AbsenceType] = "Medical"
)
5 ページの HR ダッシュボード アーキテクチャ
ページ 1: 従業員の概要
- 従業員数 KPI カード (現在と前年度)
- FTE 従業員数 (実績対目標)
- 部門別の従業員数 (棒グラフ)
- 12 か月間の従業員数の傾向 (折れ線グラフ)
- 新規採用者 vs 退職者 (蝶形/比較棒グラフ)
- 地理的な人数マップ
ページ 2: 売上高分析
- 年間離職率 (ゲージと業界のベンチマーク)
- 自発的 vs 非自発的 (ドーナツ チャート)
- 部門別の売上高 (並べ替えられた棒グラフ、高い順)
- 在職期間別の売上高 (ヒストグラム)
- 24 か月間の売上高傾向 (折れ線グラフ)
- 終了理由の内訳(ツリーマップ)
ページ 3: 人材の獲得
- 採用までの時間の傾向 (月ごとの折れ線グラフ)
- オファー承諾率 (KPI カード)
- ソースチャネル別の採用数(棒グラフ)
- 部門別の未処理求人 (表)
- 採用ファネル(応募から採用まで)
- 部門別の採用単価
ページ 4: ダイバーシティとインクルージョン
- レベル別の男女バランス(積み上げ棒グラフ)
- 部門別の男女間の賃金格差(棒グラフ)
- ダイバーシティ採用率の推移(折れ線グラフ)
- 男女別の昇進率(グループ化されたバー)
- マネージャー別のチーム多様性指数
ページ 5: 欠勤と健康
・部門別欠勤率(ヒートマップ)
- ブラッドフォード因子分布 ・理由欠勤(円グラフ)
- 欠勤傾向(12か月折れ線グラフ)
- 欠勤とパフォーマンスの相関散布図
よくある質問
Power BI を Workday または SAP SuccessFactors に接続するにはどうすればよいですか?
Workday は、Power BI が OAuth 認証を使用して Web コネクタ経由で接続できる Prism Analytics モジュールと REST API を提供します。 SAP SuccessFactors は、従業員データ用の OData API を公開します。どちらのシステムでも、大企業に推奨されるアーキテクチャは、HRIS → Fivetran または Talend パイプライン → Snowflake/Azure Synapse → Power BI です。これにより、分析レイヤーが HRIS から切り離され、API レート制限の問題が回避されます。
Power BI で従業員の機密データを保護するにはどうすればよいですか?
複数の保護層を適用する: 行レベルのセキュリティにより、各閲覧者が参照できる従業員のデータが制限されます (たとえば、マネージャーには直属の部下のみが参照され、HRBP には割り当てられたビジネス ユニットが参照されます)。個人データを含むデータセットに Microsoft Information Protection 機密ラベルを適用します。共有ダッシュボードには給与データを個々の従業員レベルで決して表示しないでください。ダイバーシティ分析の場合、従業員が 10 人未満のグループの指標を抑制します。組織のデータ プライバシー ポリシーで People Analytics の使用が明示的に許可されていることを確認してください。
従業員数と FTE の違いは何ですか?
従業員数は、労働時間に関係なく従業員をカウントします (パートタイム従業員は 1 としてカウントされます)。 FTE (フルタイム換算) は労働時間によって重み付けされます。50% のパートタイム従業員は 0.5 FTE としてカウントされます。従業員の絶対数には headcount を使用します (例: 「当社には従業員が 500 人います」)。キャパシティ プランニングとコスト モデリングには FTE を使用します (例: 「当社には 430 FTE 相当のキャパシティがあります」)。どちらの対策も重要であり、異なる目的を果たします。
離職率を正しく計算するにはどうすればよいですか?
離職率 = (離職数 / 平均従業員数) × 100。重要なのは分母です。期末従業員数だけでなく、期間の開始従業員数と終了従業員数の平均を使用します。 12 か月のローリング離職率の場合は、過去 12 か月の離職期間を合計し、12 か月の平均従業員数で割ります。多くの組織は最終従業員数を誤って使用しており、成長する組織の離職率を押し上げています。
Power BI は、個々の従業員の離職リスクの予測を表示できますか?
Azure Machine Learning の統合では、はい。履歴機能 (在職期間、パフォーマンス評価、エンゲージメント スコア、最終昇進日、給与対市場、マネージャー評価) を使用して Azure ML で離職予測モデルを構築し、現在の従業員ごとに離職確率スコアを出力します。このスコアを Power BI に接続し、チームの離職リスクを示すマネージャー ダッシュボードに表示することで、従業員が退職する前に積極的に人材維持に関する会話を行うことができます。
次のステップ
Power BI の HR 分析により、財務チームや営業チームが長年行ってきたのと同じデータ主導の意思決定が人事リーダーに提供されます。誰がなぜ退職するのか、どのチームからどのくらいの期間で退職するのかを理解することで、人事部は早期に介入して最も重要な人材を保持するための洞察が得られます。
ECOSIRE の Power BI チームは、HRIS データ パイプライン設計から、適切なプライバシー制御とロールベースのアクセスを備えたインタラクティブな People Analytics ダッシュボードに至るまで、完全な HR 分析プラットフォームを構築します。
当社の HR 分析アプローチを理解するには、Power BI ダッシュボード開発サービス をご覧ください。また、従業員分析の要件とデータ ソースについては、チームにお問い合わせください してください。
執筆者
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
関連記事
Power BI for Odoo: 運用環境に対応した 12 の DAX パターン
Power BI の Odoo データ用の 12 の実績のある DAX パターン: タイム インテリジェンス、顧客コホート、在庫の経年劣化、複数企業の損益計算書、複合キー結合。
1,000 万行を超えるテーブルの Power BI 増分更新
1,000 万行以上のテーブル用の Power BI 増分更新プレイブック: パーティション設計、RangeStart/RangeEnd、更新ポリシー、クエリの折りたたみ、DirectQuery ハイブリッド。
Power BI Premium、Pro、Embedded: ライセンス決定マトリックス
デコードされた Power BI ライセンス: Pro、PPU、Premium F-SKU、Embedded A-SKU、ファブリック容量。ユーザーあたりのコスト、含まれる機能、実際の決定ルール。