Power BI 中的 HR 分析仪表板:Workforce Insights
人员分析是企业中增长最快的商业智能应用,这是有充分理由的。拥有成熟人力资源分析计划的组织的三年平均利润比人力数据能力最低的公司高出 82%(德勤人力资本趋势)。然而,大多数人力资源团队仍然在 Excel 电子表格中跟踪员工人数,并在 Google 表格中手动计算营业额。
Power BI 为人力资源领导者提供了与财务和销售团队多年来相同的分析深度 - 实时员工人数可见性、自动营业额计算、多样性分析以及从招聘到离职的整个员工旅程中的员工生命周期跟踪。
本指南在 Power BI 中构建了完整的 HR 分析平台,涵盖数据模型、每个关键 HR KPI 及其 DAX 公式以及推动实际劳动力决策的仪表板页面。
要点
- 人力资源分析需要针对历史员工人数采用缓慢变化维度 (SCD) 方法
- 流动率计算必须区分自愿离职和非自愿离职
- 多样性仪表板需要仔细的隐私设计——聚合,切勿在不适当的情况下进行个人级别的设计
- 员工生命周期分析跟踪雇用时间、生产力时间和保留曲线
- 缺勤分析(布拉德福德因素、缺勤频率)与工资数据集成
- DAX 员工人数衡量标准是时间点(未求和)——需要特殊的计算模式
- HRIS 系统(Workday、SAP SuccessFactors、BambooHR)均具有 Power BI 连接器
- 行级安全性必须将 HR 数据限制为授权的 HR 业务合作伙伴和经理
HR 分析的数据模型
核心人力资源表
Employee_Snapshot(缓慢变化,每个员工每月一行):
| 专栏 | 描述 |
|---|---|
| 代码0 | 员工身份 |
| 代码0 | 快照的月末日期 |
| 代码0 | 活跃、休假、终止 |
| 代码0 | FK 至部门 |
| 代码0 | 等级/等级 (L1-L8) |
| 代码0 | 现任职务 |
| 代码0 | FK 转员工(经理) |
| 代码0 | FK 至地点 |
| 代码0 | 原始雇用日期 |
| 代码0 | 终止日期(如果有效则为空) |
| 代码0 | 自愿、非自愿、退休等 |
| 代码0 | 每月基本工资 |
| 代码0 | FT 为 1.0,PT 为 0.5 |
| 代码0 | M/F/非二元(小团体匿名) |
| 代码0 | 汇总年龄范围(非原始年龄) |
| 代码0 | 自我报告的族裔群体 |
| 代码0 | 快照日期受雇月份 |
Hiring_Events(每次雇用一行):
- 代码0、代码1、代码2、代码3、代码4、代码5、代码6、代码7、代码8、代码9
缺勤记录(每个缺勤事件一行):
- 代码0、代码1、代码2、代码3、代码4、代码5、代码6、代码7
Performance_Reviews(每个评论一行):
- 代码0、代码1、代码2、代码3、代码4
Training_Completions(每次训练一行):
- 代码0、代码1、代码2、代码3、代码4
员工人数分析
人数时间点计算
员工人数是一个快照指标(某个时间点有多少员工),而不是总和。这需要特殊的 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
| 关键绩效指标 | 公式 | 目标 |
|---|---|---|
| 性别平衡 | 女性占总人数的百分比 | 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 个月的员工人数趋势(折线图)
- 新员工与解雇员工(蝴蝶/比较条形图)
- 员工地理地图
第 2 页:营业额分析
- 年化周转率(指标与行业基准)
- 自愿与非自愿(圆环图)
- 按部门划分的营业额(排序条形图,最高的在前)
- 按任期级别划分的营业额(柱状图)
- 24个月营业额趋势(折线图)
- 退出原因细分(树形图)
第 3 页:人才招聘
- 聘用时间趋势(按月折线图)
- 报价接受率(KPI 卡)
- 按来源渠道划分的招聘情况(条形图)
- 按部门划分的未结申请(表)
- 招聘渠道(从申请到开始)
- 按部门划分的每次雇用成本
第 4 页:多元化与包容性
- 按级别划分的性别平衡(堆积条形图)
- 按部门划分的性别工资差距(条形图)
- 多元化雇佣率趋势(折线图)
- 按性别划分的晋升率(分组栏)
- 经理的团队多样性指数
第 5 页:缺勤与健康
- 按部门划分的缺勤率(热图)
- 布拉德福德因子分布
- 缺勤(饼图)
- 缺勤趋势(12 个月折线图)
- 缺勤与绩效相关散点图
常见问题
如何将 Power BI 连接到 Workday 或 SAP SuccessFactors?
Workday 提供了 Prism Analytics 模块和 REST API,Power BI 可以使用 OAuth 身份验证通过 Web 连接器连接到该模块和 REST API。 SAP SuccessFactors 公开员工数据的 OData API。对于这两个系统,大型企业的推荐架构是:HRIS → Fivetran 或 Talend 管道 → Snowflake/Azure Synapse → Power BI。这将分析层与 HRIS 分离,并避免 API 速率限制问题。
如何保护 Power BI 中的敏感员工数据?
应用多层保护:行级安全性限制每个查看者看到的员工数据(例如,经理只能看到他们的直接报告,HRBP 只能看到他们分配的业务部门)。将 Microsoft 信息保护敏感度标签应用于包含个人数据的数据集。切勿在共享仪表板中显示单个员工级别的薪资数据。对于多样性分析,抑制少于 10 名员工的群体的指标。确保您组织的数据隐私政策明确允许使用人员分析。
员工人数和 FTE 有什么区别?
Headcount 对员工进行计数,无论其工作时间如何(兼职员工计为 1)。 FTE(全职当量)按工作时间加权 — 50% 的兼职员工计为 0.5 FTE。使用 headcount 来表示绝对员工数量(例如,“我们有 500 名员工”)。使用 FTE 进行容量规划和成本建模(例如,“我们有相当于 430 FTE 的容量”)。这两项措施都很重要,并且有不同的目的。
如何正确计算周转率?
流动率=(离职次数/平均员工人数)×100。关键是分母——使用该期间开始和结束员工人数的平均值,而不仅仅是期末员工人数。对于滚动 12 个月的营业额,将过去 12 个月的离职情况相加,然后除以 12 个月的平均员工人数。许多组织错误地使用期末员工人数,这会增加成长型组织的营业额。
Power BI 能否预测单个员工的流失风险?
通过 Azure 机器学习集成,可以。使用历史特征(任期、绩效评级、敬业度得分、上次晋升日期、薪资与市场、经理评级)在 Azure ML 中构建人员流失预测模型,并输出每位当前员工的人员流失概率得分。将此分数连接到 Power BI 并将其显示在经理仪表板中,显示其团队的离职风险 - 允许在员工辞职之前主动进行保留对话。
后续步骤
Power BI 中的人力资源分析为领导者提供了与财务和销售团队多年来相同的数据驱动决策。了解谁离职、原因、从哪些团队离职以及在什么任期内离职,可以让人力资源部门有洞察力,尽早进行干预并留住最重要的人才。
ECOSIRE 的 Power BI 团队构建了完整的 HR 分析平台 - 从 HRIS 数据管道设计到具有适当隐私控制和基于角色的访问的交互式人员分析仪表板。
探索我们的Power BI 仪表板开发服务 以了解我们的人力资源分析方法,或联系我们的团队 以讨论您的劳动力分析要求和数据源。
作者
ECOSIRE Research and Development Team
在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。
相关文章
Building Financial Dashboards with Power BI
Step-by-step guide to building financial dashboards in Power BI covering data connections to accounting systems, DAX measures for KPIs, P&L visualisations, and best practices.
Case Study: Power BI Analytics for Multi-Location Retail
How a 14-location retail chain unified their reporting in Power BI connected to Odoo, replacing 40 spreadsheets with one dashboard and cutting reporting time by 78%.
The Future of Work: AI-Augmented Workforce in 2026-2030
A grounded analysis of how AI is reshaping work from 2026-2030—what jobs change, what skills matter, how organizations adapt, and what workers and leaders should do now.