25 — Make Decisions

Effect Size & Practical Significance#

SignificanceStatistical 1 min read
◆ The PatternStatistically significant ≠ meaningful — Cohen's d and the difference between p-values and impact

With enough data, any tiny difference becomes statistically significant. Effect size measures how big the difference is, independent of sample size. Cohen's d expresses the difference in standard deviation units.

d = (μ1 − μ2) / spooled
Cohen's d: 0.2 = small, 0.5 = medium, 0.8 = large. Tells you the magnitude of the effect.
// Interactive — two distributions, see effect size and overlap
Mean difference0.50
Cohen's d—
Overlap %—
Always report both: "The improvement was statistically significant (p = 0.02) with a medium effect size (d = 0.55)." p-value alone is meaningless.
Pattern bridge: A significant result can still be too small to matter. A model in an A/B rollout can win by a margin that does not pay for itself, and a trading edge can be real yet vanish in risk-adjusted terms.
Worked example

Two groups of 100,000 whose means differ by 0.75 points on a standard deviation of 15. The p-value is 1.6×10⁻³⁴ — overwhelming evidence that a difference exists. Cohen’s d is 0.055, a tenth of what is usually called small. With enough data, significance only tells you the effect is not exactly zero.

Where it misleads
  • Cohen’s benchmarks (0.2, 0.5, 0.8) were meant as a last resort; what counts as meaningful depends on the field and the cost of the change.
  • Standardised effect sizes depend on the spread of the sample; the same effect looks bigger in a homogeneous group.
  • Effects reported from small significant studies are inflated on average (see Hypothesis Testing).
In code
from scipy.stats import ttest_ind
rng = np.random.default_rng(17)
a = rng.normal(100, 15, 100_000)
b = rng.normal(100.75, 15, 100_000)                  # a 0.75-point difference on an SD of 15
p = ttest_ind(a, b).pvalue
d = (b.mean() - a.mean()) / np.sqrt((a.var(ddof=1) + b.var(ddof=1)) / 2)
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd (and SciPy where imported). Each snippet simulates or makes up its own data, as the comments say.

The same idea with a library
# Python — effect size
import numpy as np

def cohens_d(group1, group2):
    n1, n2 = len(group1), len(group2)
    var1, var2 = group1.var(), group2.var()
    pooled_std = np.sqrt(((n1-1)*var1 + (n2-1)*var2) / (n1+n2-2))
    return (group1.mean() - group2.mean()) / pooled_std

d = cohens_d(model_a_scores, model_b_scores)
print(f"Cohen's d = {d:.3f}")
Sources
  • Statistical Power Analysis for the Behavioral Sciences (2nd ed.), J. Cohen, Lawrence Erlbaum, 1988
  • G. M. Sullivan & R. Feinn, “Using Effect Size — or Why the P Value Is Not Enough”, Journal of Graduate Medical Education 4(3), 2012
  • R. L. Wasserstein & N. A. Lazar, “The ASA Statement on p-Values: Context, Process, and Purpose”, The American Statistician 70(2), 2016

Last reviewed October 2026 · How this site checks its content · Report a mistake

Check yourself

1. Study A reports p = 0.001 with 100,000 people; study B reports p = 0.04 with 50. Which found the larger effect?

Show answer

B. A huge sample makes even a trivial difference significant. Compare effect sizes (and their confidence intervals), not p-values.

2. Two groups differ by Cohen’s d = 0.2. Which description fits?

Show answer

B. Cohen called 0.2 “small”, but whether it matters depends on the setting: a small shift applied to millions of people, or to money, can be important.

3. A huge trial finds a drug lowers blood pressure by 1 mmHg on average, p < 0.001. The best summary is:

Show answer

C. Statistical significance answers “is it distinguishable from zero?”; practical significance asks “is it big enough to care about?”.

Linked from 3
← Previous
Bayesian A/B Testing
Open in the full reader, with the topic sidebar