Your engagement survey came back and Engineering scored 3.8 while Sales scored 3.4. Is that a real gap that requires intervention, or is it noise from a small sample? Your survey vendor shows you averages and heatmaps but doesn't answer that question. This analysis applies proper statistical testing to your survey data (chi-square for response patterns, ANOVA for group comparisons, Tukey HSD for pairwise differences) and tells you which gaps are real, which are noise, and where to focus your limited intervention budget.
Worked Example (Simulated): Do Engagement Scores Differ Across Three Departments?
Question: Do simulated engagement scores differ across three departments?
Inputs: Simulated data, seed 2026. The script makes one score from 1 to 5 for each of 40 simulated responses in each of three departments. The score chances are set in the script. They build in a mean score of 3.70 for Engineering, 2.95 for Sales and 3.05 for Support, and shares of scores 1 to 2 of 15%, 35% and 30%. So Engineering is built about 0.75 points higher, and Sales and Support are built almost level.
Method: The Kruskal-Wallis rank test compares the score ranks across groups. Epsilon-squared gives a rank-based estimate of effect size.
import numpy as np
from scipy.stats import kruskal
seed = 2026
rng = np.random.default_rng(seed)
levels = np.arange(1, 6)
profiles = {
"Engineering": [0.05, 0.10, 0.20, 0.40, 0.25],
"Sales": [0.15, 0.20, 0.30, 0.25, 0.10],
"Support": [0.10, 0.20, 0.35, 0.25, 0.10],
}
n_per_group = 40
scores = {
name: rng.choice(levels, size=n_per_group, p=probabilities)
for name, probabilities in profiles.items()
}
statistic, p_value = kruskal(*scores.values())
n_total = sum(len(values) for values in scores.values())
k = len(scores)
epsilon_squared = max(0.0, (statistic - k + 1) / (n_total - k))
print(f"Simulated data, seed {seed}")
print(f"Input: {k} departments, {n_per_group} simulated responses each; "
"score scale 1 to 5")
print("Method: Kruskal-Wallis rank test; epsilon-squared effect size")
for name, values in scores.items():
print(f"{name}: mean={values.mean():.2f}, median={np.median(values):.1f}, "
f"score 1-2 share={(values <= 2).mean():.0%}")
p_text = "below 0.001" if p_value < 0.001 else format(p_value, ".3f")
print(f"Kruskal-Wallis H={statistic:.3f}, p={p_text}, "
f"epsilon-squared={epsilon_squared:.3f}")
built_in_means = {name: float(levels @ np.array(probs))
for name, probs in profiles.items()}
print("Built-in mean score: "
+ ", ".join(f"{name} {value:.2f}" for name, value in built_in_means.items()))
Printed output:
Simulated data, seed 2026
Input: 3 departments, 40 simulated responses each; score scale 1 to 5
Method: Kruskal-Wallis rank test; epsilon-squared effect size
Engineering: mean=3.90, median=4.0, score 1-2 share=2%
Sales: mean=3.00, median=3.0, score 1-2 share=30%
Support: mean=2.95, median=3.0, score 1-2 share=30%
Kruskal-Wallis H=19.932, p=below 0.001, epsilon-squared=0.153
Built-in mean score: Engineering 3.70, Sales 2.95, Support 3.05
Result: The test gives evidence of a difference among the three simulated groups (H=19.932, p below 0.001), which is expected because Engineering was built higher. Epsilon-squared is 0.153. The drawn means were 3.90 for Engineering, 3.00 for Sales and 2.95 for Support. This draw ran high for Engineering: its drawn share of low scores (2%, 1 of 40 responses) is far under the 15% built in, where about 6 responses were expected, so treat that share as a chance draw and not a finding. These results describe only the made-up data. The test does not show why scores differ or whether an action would help.
Limit: The script sets the score chances, so this example cannot show how a real workforce would respond. It is not evidence about any real team.
Sources
- Kruskal, W. H., and Wallis, W. A. (1952). Use of Ranks in One-Criterion Variance Analysis. Journal of the American Statistical Association. doi 10.1080/01621459.1952.10483441. Who published the rank test and when.
The Problem with Averages
Yet most organizations analyze their survey results the same way: export the data, compute department averages in Excel, build a heatmap in PowerPoint, and present it to leadership as fact. The problem is that averages hide the signal. A department with an average score of 3.5 might have 60% of employees at 4-5 and 40% at 1-2: a polarized team with a very different problem than a department where everyone scores 3-4.
The bigger problem is treating every difference as meaningful. When your survey vendor shows Engineering at 3.8 and Sales at 3.4, that 0.4-point gap looks significant on a color-coded heatmap. But with 40 respondents in each group and Likert-scale data, that gap may not survive a statistical test. Without testing, HR teams allocate intervention budgets to phantom problems while real issues, masked by acceptable averages, go unaddressed.
Knowing which gaps are real and which are noise is what statistical testing provides.
What This Analysis Does
The worked example above uses simulated survey scores to show one test, its output, and one limit. It is not a result from a real survey. The three kinds of test below are the ones this page covers.
ANOVA (Analysis of Variance): compares the mean score across three or more groups (departments, tenure bands, job levels) and tells you whether at least one group is significantly different from the rest. The F-statistic and p-value tell you whether the between-group differences are larger than you'd expect from random variation. A small p-value is evidence against the null model of equal group means. It does not prove a gap is real or useful. Read it with the effect size, uncertainty, study design, sample size, and test assumptions.
Tukey HSD (Honestly Significant Difference): once ANOVA confirms that groups differ, Tukey tells you which specific pairs differ. Maybe it's Engineering vs. Support that drives the significant result, while Sales vs. Marketing is noise. Tukey tests every pair with proper correction for multiple comparisons, so you don't get false positives from testing many pairs.
Chi-square tests: examines whether the pattern of responses differs between groups. ANOVA compares means; chi-square compares distributions. It catches cases where two departments have the same average but completely different response patterns: one uniformly moderate, the other bimodally split between highly engaged and deeply disengaged.
Together, these three tests answer the question that separates data-informed HR from presentation-driven HR: are the differences in our engagement data real, or just noise?
When to Use This Analysis
- After your annual or quarterly engagement survey: export the raw responses (not the vendor's aggregated summary) and run a proper statistical analysis. Use the results alongside your vendor's dashboard, not instead of it.
- Comparing departments: "Is Engineering's engagement significantly different from Sales?" Upload the data with a department column and the analysis tests every pair.
- Comparing tenure cohorts: are new hires (0-1 year) more engaged than veterans (5+ years)? Or is the pattern the opposite? The analysis shows you where the inflection point is.
- Comparing demographic groups: by job level, location, gender, or any other grouping in your data. The statistical tests ensure you're identifying real differences, not reporting noise.
- Before designing interventions: statistical significance tells you where to intervene. Effect size tells you how big the gap is. Together, they help you allocate your limited budget to the problems that are both real and large enough to matter.
Small groups may give uncertain estimates, so use the sample size guidance below for each comparison.
What Data Do You Need?
A CSV export from your survey platform (Culture Amp, Qualtrics, SurveyMonkey, Google Forms, 15Five, Lattice, or any tool with a "Download raw responses" option).
Required columns
- At least one grouping variable: department, location, tenure band, job level, or any categorical column that defines the groups you want to compare
- At least one numeric score: satisfaction score, engagement score, or Likert-scale responses (1-5 or 1-7). The analysis handles both numeric values and text labels like "Strongly Agree"
Optional columns that enrich the analysis
- Additional grouping variables: up to 5 categorical columns. Each one enables cross-tabulation and chi-square independence testing. With department AND tenure band, you can see whether the engagement gap is really about department or about tenure.
- Multiple score dimensions, if your survey covers manager effectiveness, career growth, compensation fairness, and work-life balance as separate scores, map them all. The analysis compares each dimension across groups and shows correlation between dimensions.
Sample size guidance
- Minimum: 100 respondents for basic analysis
- Better: 200+ for department-level comparisons with adequate statistical power
- Per group: at least 20 respondents in each group you want to compare. Groups smaller than 5 are flagged but not tested.
- Response rate: 70%+ is ideal. Below 50%, the results may not represent the full population.
How to Read the Report
Score distributions: density curves for each survey dimension. Look at the shape, not just the center. A bimodal distribution (two humps) in one department means polarized opinions. A mean can hide a split response pattern. Inspect the full score spread and report the share in each relevant score range. This is often the most important finding in the entire report.
Categorical distributions: shows how many respondents fall into each group. Severely imbalanced groups (one department with 200 respondents and another with 12) reduce the statistical power of group comparisons. The report flags this.
Cross-tabulation heatmaps: shows the relationship between categorical variables. A significant chi-square result (p < 0.05) means the variables are associated, for example, tenure band and job level are not independent in your organization. This matters because a "department effect" might actually be a "tenure effect" if one department has systematically different tenure distributions.
ANOVA results: the F-statistic and p-value for each score dimension across each grouping variable. A small p-value is evidence against the null model of equal group means. It does not prove a gap is real or useful. Read it with the effect size, uncertainty, study design, sample size, and test assumptions. Look at the effect size (eta-squared) too, since a difference can be statistically detectable but small.
Post-hoc comparisons (Tukey HSD): the pairs that actually differ. If ANOVA says "departments differ on satisfaction," Tukey tells you which specific pair, such as Support vs. Engineering, drives the result, while another pair, such as Sales vs. Marketing, may not differ. This is where you find the actionable findings. Focus on pairs where the confidence interval for the difference does not cross zero.
Score correlations, when you map multiple survey dimensions, the correlation matrix shows which dimensions move together. A strong correlation between "manager effectiveness" and "career growth" suggests they measure the same underlying factor. Low correlation suggests they're independent, improving one won't automatically improve the other.
What to Do With the Results
Immediate
- Give more attention to gaps with evidence and a useful size: a result above a chosen p-value threshold does not show that groups are alike. Report the estimate and its uncertainty, and consider sample size and power.
- Report the pattern: Hypothetical example only: a pairwise result should report the estimated gap and its uncertainty. This sentence gives no data or test output, so it should not be read as a finding about employees.
- Check for confounders, if department and tenure are associated (chi-square significant), the "department effect" might actually be a tenure effect. Controlling for this requires ANCOVA, which you can run separately.
Strategic
- Track over time: run the same analysis after each survey cycle. The effect sizes should shrink if interventions are working.
- Use effect sizes for budgeting: a 0.8-point gap in a department of 50 people is a bigger organizational risk than a 0.3-point gap in a department of 10. Multiply effect size by headcount to prioritize.
- Segment further with clustering: use workforce segmentation to discover employee groups that cut across departments. The engagement gap might not be about departments at all. It might be about a "burned-out contributor" segment that exists in every department.
When to Use Something Else
- Comparing exactly two groups: If you're comparing male vs. female engagement or remote vs. in-office, use a t-test instead. It gives a simpler, directional result for two-group comparisons.
- Ordinal data concerns: Likert scales (1-5) are technically ordinal, not continuous. If this matters for your audience, use a Kruskal-Wallis test, the non-parametric alternative that compares distributions without assuming normality.
- Controlling for confounders: If you want to compare departments while holding tenure or job level constant, use ANCOVA (Analysis of Covariance).
- Predicting who will leave: Survey engagement data combined with HRIS data can feed an attrition prediction model that gives individual risk scores.
- Discovering hidden employee segments: Use workforce segmentation to find natural groups that cross department boundaries.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai