Условие
A/B-тест с малой выборкой: 20 юзеров в группе. Какое распределение использовать для CI и теста?
Решение
Когда normal, когда t
| n | Что использовать |
|---|---|
| ≥ 30 (CLT работает) | Normal (z-test) |
| < 30, σ известно | Normal (z-test) |
| < 30, σ неизвестно (всегда) | t-distribution |
В реальной практике σ почти никогда не известно → почти всегда используем t-distribution. Просто при n > 30 t ≈ Normal.
Отличие t от Normal
t-distribution с df = n-1 степенями свободы:
- Heavier tails (толще хвосты).
- При df → ∞ сходится к Normal.
- При df = 1 — это распределение Cauchy.
Quantiles
| df | 95% quantile | Normal 95% |
|---|---|---|
| 5 | 2.57 | 1.96 |
| 10 | 2.23 | 1.96 |
| 20 | 2.09 | 1.96 |
| 30 | 2.04 | 1.96 |
| 100 | 1.98 | 1.96 |
| ∞ | 1.96 | 1.96 |
t даёт более широкие CI на маленьких выборках — это правильно (мы менее уверены).
CI
CI = mean ± t_{df, 1-α/2} × SE
Для n=20, α=0.05: t = 2.09 (а не 1.96).
Python
from scipy import stats
import numpy as np
mean, se, n = np.mean(data), stats.sem(data), len(data)
ci = stats.t.interval(0.95, df=n-1, loc=mean, scale=se)
# t-test
stat, p = stats.ttest_ind(a, b, equal_var=False) # уже использует t-распределениеЧто делать при n < 30 без нормальности
- Bootstrap percentile CI.
- Non-parametric тесты (Mann-Whitney).
- Permutation test.
t-test устойчив к умеренным отклонениям от нормальности (CLT уже работает на n=30), но при сильной скошенности (LTV с длинным хвостом) — bootstrap безопаснее.
Подводные камни
- Всегда использовать t, кроме случая известного σ. n=30 — не магический порог.
- t-distribution предполагает нормальность данных; при сильной не-нормальности используйте bootstrap.
- Welch's t-test (
equal_var=False) — дефолт. Не предполагать равенство дисперсий. - df = n-1 для одной выборки, n_A + n_B - 2 для пары при equal_var; для Welch — Satterthwaite формула.
- На больших n (>1000) различие t и Normal незаметно — не зацикливайтесь.
Эталонный ответ
t-distribution всегда, когда σ неизвестно (т.е. практически всегда). На n<30 различие с Normal заметно: t-quantile больше → CI шире. При сильной не-нормальности — bootstrap.