P-values and Significance
The most quoted — and most misread — number in analytics
A p-value is the probability of seeing a result this extreme if there were truly no effect. It is not the probability the variant is better — a distinction A/B teams routinely botch.
What you will learn
- State exactly what a p-value does and doesn't mean
- Run a z-test and interpret the p-value correctly
- Explain why 'not significant' is not 'no effect'
p = P(observed result or more extreme | no true effect). Small p means the data is surprising under the null, which pushes you toward believing a real effect — it never directly gives the probability the effect is real.
What is this?
A p-value is the probability of observing your result (or something more extreme) assuming the null hypothesis is true — i.e. assuming there is genuinely no effect. 'p < 0.05' is a decision threshold, not a measure of effect size or practical importance. Significance is purely a statement about how surprising the data is under 'no effect', which is why 'statistically significant' and 'practically significant' are two different questions.
Why do you need it?
- The 'p = probability my variant is better' misreading is the most common — and most expensive — analytics error.
- Decision thresholds turn ambiguous evidence into published decisions, but the decision needs effect size + context.
- Conflating significance with importance sends teams chasing 0.1% 'wins' and passing 8% real wins as 'no effect'.
- Reading p-values correctly is the difference between a disciplined experimentation culture and a superstitious one.
Mental model
A fingerprint comparison
A p-value
If a detective matching a print assumes two people are the same person (null) and still finds an impossible match rate, the probability of that under the null is tiny — a small p-value. It supports 'not the same person', but the detective still has to decide how important the match is.
How it works
- State H0: no difference in true conversion between groups.
- Compute the standard error from the pooled proportion and the z-statistic = (p̂_t − p̂_c)/SE.
- Map the z-statistic to a two-sided tail probability — that's the p-value.
- Compare to α = 0.05; 'significant' means the result is surprising-to-unlikely under no effect.
- Report the p-value together with the effect size and confidence interval, never alone.
Where a p-value lives in the z-test pipeline.
Examples
Two-proportion z-test by hand
import mathc = 3000; n_c = 30000 # control: 5,000 conversions wait, 3,000 / 30,000 = 10%t = 3250; n_t = 30000 # treatment pc, pt = c/n_c, t/n_tp_pool = (c + t)/(n_c + n_t)se = math.sqrt(p_pool*(1-p_pool)*(1/n_c + 1/n_t))z = (pt - pc)/se# two-sided p-value via the normal cdffrom math import erfcp_value = erfc(abs(z)/math.sqrt(2))print(f"conv: {pc:.3f} vs {pt:.3f} | z={z:.2f} | p={p_value:.4f}")# → conv: 0.100 vs 0.108 | z≈3.55 | p≈0.0004 → significantThe z-score is the signal (delta in conversion) divided by the noise (standard error). p≈0.0004 says: if there were truly no effect, results this extreme would appear 4 times in 10,000 — strong evidence against 'no effect'.
In production
- An experimentation team reports lift with a bracket: '+3.1% (95% CI +1.2 to +5.0, p=0.002)' — effect and evidence, not just a star.
- A product team rejects a 'statistically significant' 0.05% engagement lift because the MDE they cared about was 2%: significant, but commercially irrelevant.
- A company recognizes a promising-null pattern and runs a simple Bayesian re-analysis to quantify evidence for the effect.
Best practices
- Always report effect size and CI next to the p-value.
- Use the pre-registered alpha and don't re-interpret it after seeing data.
- Treat 'p>0.05' as insufficient evidence, not proof of no effect — that requires an equivalence or power analysis.
- Distinguish statistical from practical significance explicitly in the decision summary.
Common mistakes
- 'p=0.03 means a 97% chance the treatment is better.' — wrong; that's the posterior probability and needs a prior.
- 'p=0.06 means there's probably no effect.' — wrong; evidence is inconclusive, direction may still be informative.
- Comparing p-values across experiments to rank which won more.
- Using one-sided tests as a backdoor to 'more significant' results without pre-registration.
Debugging tips
- A suspiciously tiny p-value (p<0.0001) in a low-traffic test usually means wrong variance — check you used pooled proportions, not standard deviations of the data.
- When two tools disagree on p, compare their SE formula and whether they used a continuity correction.
- If significance flips when you change the sample filter, your population definition is unstable — fix the query, not the p.
- p=0.049 vs p=0.051 should not change decisions; if it does, your decision rule is inhumane — widen the reporting bracket.
Interview checkpoint
Hands-on lab
- Compute conversion lift, standard error, z and p-value in Python
- Show what p-values mean under simulated null worlds
- Observe that 'not significant' happens even with real effects when power is low
Run a Z-Test and Swap Misreadings for Correct Ones
30 min · intermediate
Quick quiz
p=0.02 means:
A result that is statistically significant is always practically important.