Условие
A/B-тест: считаем metric = revenue_per_user. Var(revenue) = 100, среднее по 1000 юзеров. Какова дисперсия среднего?
Решение
Дисперсия среднего
Var(mean of n iid) = Var(X) / n
SE = sqrt(Var(X) / n)
Для n=1000, Var=100:
Var(mean) = 100 / 1000 = 0.1
SE = sqrt(0.1) ≈ 0.316
Свойства
Var(aX) = a² × Var(X)
Var(X + Y) = Var(X) + Var(Y) + 2·Cov(X, Y)
Var(X - Y) = Var(X) + Var(Y) - 2·Cov(X, Y)
Если X и Y независимы — Var(X ± Y) = Var(X) + Var(Y).
A/B-тест
Разница средних:
SE(diff) = sqrt(Var(A)/n_A + Var(B)/n_B)
Если Var одинакова и n равны:
SE(diff) = sqrt(2σ²/n)
В 1.41× больше, чем SE одной группы.
Ratio metric — Delta method
CTR = clicks / views. Если считать на user-level, view-level или session-level — Var разная.
Delta method:
Var(X/Y) ≈ (X/Y)² × [Var(X)/X² - 2·Cov(X,Y)/(X·Y) + Var(Y)/Y²]
Это важно для CR, CTR, ARPU — обычные t-test игнорируют ковариацию числителя и знаменателя.
Когда складывать дисперсии нельзя
- Зависимые наблюдения (paired data, repeated measures, кластеризованные).
- Sequential testing с many looks — увеличение Type I error.
- Stratified sampling — нужен поправленный SE.
Bootstrap
Когда формула сложная — bootstrap резэмплинг:
import numpy as np
n_boot = 10000
boot_means = [np.random.choice(data, len(data), replace=True).mean() for _ in range(n_boot)]
boot_se = np.std(boot_means)Подводные камни
- Variance суммируется только для независимых X, Y. Для зависимых — обязательно cov term.
- Std deviation не аддитивна: σ(X+Y) ≠ σ(X) + σ(Y) даже при независимости.
- На малых n (< 30) формула Var(mean) = σ²/n плохая аппроксимация — нужен t-distribution.
- Кластеризация: если юзеры внутри города коррелируют, effective n меньше, SE больше.
- Ratio metric — delta method или bootstrap, не t-test «в лоб».
Эталонный ответ
Var(mean of n iid) = σ²/n. Var аддитивна только для независимых; иначе с +2·Cov. Для ratio metrics — delta method или bootstrap, не наивный t-test.