Dashboard Design — HR Analytics¶
Dashboard Purpose¶
A Power BI dashboard for the CHRO and department heads. Two pages: - Page 1 — Attrition Overview: the state of attrition across the org - Page 2 — Driver Analysis: what's causing it, where to focus
Privacy-first design
This dashboard shows aggregate patterns, not individual employee surveillance. Filters should never narrow below a minimum group size (e.g., 5 employees) to avoid identifying individuals. Frame everything around systemic improvement, not flagging people.
Page 1 — Attrition Overview¶
┌──────────────────────────────────────────────────────────────────┐
│ Attrition Rate Headcount Left (12mo) Est. Cost Avg Tenure │
│ 16.1% 1,470 237 £8.3M 7.0 yrs │
├──────────────────────────────────────────────────────────────────┤
│ │
│ Attrition Rate by Department Attrition Rate by Job Role │
│ [Bar] [Horizontal bar, sorted] │
│ │
├────────────────────────────────┬───────────────────────────────────┤
│ Attrition by Tenure Bucket │ Attrition by Age Group │
│ [Column] │ [Column] │
└────────────────────────────────┴───────────────────────────────────┘
Slicers: [Department] [Job Level] [Gender]
Page 2 — Driver Analysis¶
┌──────────────────────────────────────────────────────────────────┐
│ Overtime Workers: 30.5% attrition vs No Overtime: 10.4% │
├──────────────────────────────────────────────────────────────────┤
│ │
│ Attrition by Overtime (the headline) Attrition by Income Band │
│ [Clustered column] [Column] │
│ │
├────────────────────────────────┬───────────────────────────────────┤
│ Work-Life Balance vs Attrition │ Years Since Promotion vs Attr. │
│ [Column] │ [Line] │
└────────────────────────────────┴───────────────────────────────────┘
Building in Power BI Desktop¶
Step 1 — Load¶
- Get Data → CSV →
hr_clean.csv - Verify
Attrition_flagis a whole number, income fields are decimal
Step 2 — Core DAX Measures¶
Headcount = COUNTROWS(employees)
Attrition Count = SUM(employees[Attrition_flag])
Attrition Rate = DIVIDE([Attrition Count], [Headcount], 0)
Est Attrition Cost =
SUMX(
FILTER(employees, employees[Attrition_flag] = 1),
employees[MonthlyIncome] * 12 * 0.75
)
Avg Tenure = AVERAGE(employees[YearsAtCompany])
-- Overtime attrition (for comparison card)
Overtime Attrition Rate =
CALCULATE([Attrition Rate], employees[OverTime] = "Yes")
Step 3 — KPI Cards¶
Add cards for: Attrition Rate (conditional format red if > 15%), Headcount, Attrition Count, Est. Cost, Avg Tenure.
Step 4 — Department/Role Bars¶
- Visual: Clustered bar
- Axis:
Department(orJobRole) - Values:
Attrition Ratemeasure - Sort descending, add data labels as %
Step 5 — Overtime Comparison (Page 2 headline)¶
- Visual: Clustered column
- Axis:
OverTime - Values:
Attrition Rate - This single chart tells the whole story — make it prominent
Step 6 — Privacy Guard¶
Set up the slicers so that filtering doesn't expose individuals:
- Avoid adding EmployeeNumber or name fields to any visual
- Consider a measure that blanks out groups with < 5 employees:
Building in Excel (Alternative)¶
For an Excel-only version: 1. Create a PivotTable: Rows = Department, Values = Count of Attrition (filtered to "Yes") and Count of all 2. Add a calculated field for attrition rate 3. Insert PivotCharts (clustered column) 4. Add Slicers for Department and Job Role 5. Build the overtime comparison as a separate small PivotTable
Design Principles for HR Dashboards¶
- Lead with the actionable driver (overtime), not the demographic ones (age) which HR can't change
- Avoid blame framing — "Sales attrition is high" not "Sales managers are failing"
- Protect privacy — aggregate only, minimum group sizes
- Pair every problem with a lever — don't just show high attrition, show the factor HR can pull