Skip to course content
Free Python statistics course

Statistical Data Analytics with Python

Unit 05.02: Alpha delivers exactly the rate you set

Alpha is not a discovery threshold. It is the false-positive rate you agree to accept, and it delivers exactly that rate.

Five per cent of true nulls will be rejected

Setting alpha at 0.05 means that in a world where the null is true, you reject it 5% of the time. Not approximately — that is the definition, and the procedure keeps the promise.

The consequence people underestimate is multiplicity. Each test carries its own 5% chance, so the probability that *at least one* of several tests produces a false positive climbs quickly. At twenty tests it is closer to a coin flip than to 5%.

This is why the number of tests run must be reported, and why exploratory findings need either an adjustment or a replication before being treated as results.

This block simulates ten thousand studies in which the null is always true.

import numpy as np
from scipy import stats

rng = np.random.default_rng(203)

# 10,000 studies in a world where the null is TRUE every single time.
p_values = np.array([stats.ttest_1samp(rng.normal(0, 1, 25), popmean=0).pvalue
                     for _ in range(10_000)])

for alpha in (0.10, 0.05, 0.01):
    print(f"alpha = {alpha:.2f}  ->  {np.mean(p_values < alpha) * 100:5.2f}%"
          " of true nulls rejected")

print("\nEvery one of those is a false positive. The rate is not an accident")
print("of this data -- it is exactly what alpha promises.\n")

print("Twenty independent tests, all nulls true, alpha 0.05:")
any_sig = np.array([
    (np.array([stats.ttest_1samp(rng.normal(0, 1, 25), popmean=0).pvalue
               for _ in range(20)]) < 0.05).any()
    for _ in range(3000)
])
print(f"  P(at least one 'significant') = {any_sig.mean():.3f}")
print(f"  1 - 0.95**20 predicts        = {1 - 0.95 ** 20:.3f}")

The rejection rates come out at 10.20%, 4.95% and 0.99% for alpha of 0.10, 0.05 and 0.01 — exactly what was promised, and every one is a false positive. Then twenty independent tests at alpha 0.05: the chance that at least one is 'significant' is 0.645, against the theoretical 1 − 0.95²⁰ of 0.642. Two thirds of such families produce a false positive.

The mistake this prevents

The mistake is running many comparisons and reporting the significant ones. With twenty tests the expected number of false positives is one, so finding one is not a finding.

Takeaway

Fix alpha before analysing, report how many tests you ran, and adjust or replicate when there are many. Treat a single significant result among twenty as a hypothesis, not a conclusion.