19 / 22 · От вероятности к статистике
Проверка гипотез и A/B-тесты
Как решить, реален ли эффект: нулевая и альтернативная гипотезы, статистики критериев, p-значения и ошибки двух родов, A/B-тест от статистики z до размера выборки, нужного для мощности 80%, чем p-значение не является (и почему треть значимых результатов может оказаться ложной), подглядывание и множественные сравнения, а также перестановочные тесты, которым не нужны предположения о распределении.
На этой странице 12
В эксперименте с 20 000 пользователей в каждой группе доля кликов с новой кнопкой выросла с 2.0% до 2.3%. Кнопка лучше или разница — это шум? Проверка гипотезы (hypothesis test) превращает этот вопрос в вычисление: предположить, что эффекта нет, вычислить, насколько неожиданными были бы данные при этом предположении, и действовать, если они достаточно неожиданны. В этой заметке мы строим тест, разбираем A/B-тест как его самое частое применение и мощность, которая определяет, насколько большим должен быть эксперимент, а также то, как тесты неверно читают и неверно применяют: p-значение принимают за вероятность того, что гипотеза верна, подглядывают (peeking) в идущие эксперименты и проверяют много гипотез сразу.
Обозначения. — нулевая гипотеза (null hypothesis; эффекта нет), — альтернативная гипотеза. — статистика критерия (test statistic), — уровень значимости (significance level), обычно . — функция распределения стандартного нормального распределения.
Логика теста#
У теста четыре части:
- Нулевая гипотеза : монета честная, кнопка ничего не меняет.
- Статистика критерия , распределение которой при известно: число орлов, стандартизованная разность.
- p-значение (p-value): вероятность при получить статистику не менее экстремальную, чем наблюдённая.
- Решение: отвергнуть , если .
Монета дала 60 орлов в 100 бросках. При гипотезе о честной монете число орлов имеет распределение , а результат, который отстоит от 50 в ту или другую сторону не меньше наблюдённого, имеет вероятность : это не меньше , поэтому тест гипотезу не отвергает. Но и вывода, что монета честная, он не делает; вывод в том, что этих 100 бросков недостаточно, чтобы решить.
Возможны ошибки двух родов. Ошибка первого рода (type I error) — отвергнуть верную ; её вероятность по построению не больше . Ошибка второго рода (type II error) — сохранить неверную ; единица минус её вероятность — это мощность (power), вероятность обнаружить эффект, который действительно есть. Уровень выбирают; мощность зависит от величины эффекта и от объёма данных.
A/B-тест#
Пользователей случайно делят на две группы: группа A видит старую кнопку, группа B — новую, и сравнивают доли кликов и . По центральной предельной теореме их разность приближённо нормальна со стандартной ошибкой , и статистика критерия
имеет приближённо распределение , если кнопка ничего не меняет. p-значение равно :
Нулевое распределение, p-значение и мощность
Именно рандомизация делает сравнение причинным: любое различие между группами, кроме кнопки, возникает случайно, и тест это учитывает. Без рандомизации пользователи, которые видят новую кнопку, могли бы отличаться и в других отношениях, и никакой тест не смог бы разделить эффекты.
Мощность и размер выборки. Если истинные доли равны 2.0% и 2.3%, эксперимент с 20 000 пользователей в группе обнаруживает разницу с вероятностью всего ; почти половина таких экспериментов пропустила бы реальный эффект. Число пользователей в группе, нужное для мощности на уровне , равно
и для мощности 80% это 36 691 пользователь в группе. Малым эффектам на малых долях нужны большие эксперименты: требуемое растёт обратно пропорционально квадрату эффекта, поэтому уменьшение обнаруживаемого эффекта вдвое увеличивает эксперимент вчетверо.
Чем p-значение не является#
- Не . Пусть из идей, которые проверяет команда, на самом деле работают 10%, мощность тестов — 80%, а . Из 1000 идей работают 100, и 80 из них обнаруживаются; 900 не работают, и 45 из них оказываются значимыми случайно. Около трети значимых результатов, , ложные, хотя у каждого из них . Это расчёт с базовой частотой из вводной заметки, только с тестами вместо пациентов.
- Не величина эффекта. При достаточном объёме данных значимой оказывается и пренебрежимо малая разница; при слишком малом не оказывается значимой и большая. Эффект нужно приводить с доверительным интервалом, а не только с p-значением.
- Большое p-значение — не свидетельство отсутствия эффекта. означает, что данные совместимы с отсутствием эффекта — и обычно также с заметным эффектом.
- Не мера воспроизводимости. Результат с при том же размере выборки и при истинном эффекте, равном наблюдённому, воспроизводится лишь примерно в половине случаев, потому что наблюдённый эффект лишь чуть превышает порог.
Подглядывание#
Проверять идущий эксперимент каждый день и останавливать его, как только , кажется безобидным, но это не так. Каждая проверка — ещё один шанс для шума пересечь порог:
Подглядывание в A/A-тесте
В A/A-тестах, где обе группы одинаковы, 20 просмотров данных дают «значимый» результат в 25% экспериментов вместо 5%. Исправить это можно тремя способами: заранее зафиксировать размер выборки; использовать последовательные тесты (sequential tests), пороги которых учитывают повторные просмотры (расходование уровня значимости — alpha spending, всегда корректные p-значения — always-valid p-values).
Множественные сравнения#
Эксперимент, который сообщает 20 метрик и проверяет каждую на уровне , находит хотя бы один ложный эффект с вероятностью , если ни одна метрика на самом деле не изменилась и метрики независимы, — это вычислила заметка об аксиомах. Поправка Бонферрони (Bonferroni correction) проверяет каждую из гипотез на уровне и через оценку объединения контролирует вероятность хотя бы одного ложного отвержения. Когда гипотез много и некоторое число ложных открытий допустимо, процедура Бенджамини–Хохберга (Benjamini–Hochberg) контролирует ожидаемую долю ложных открытий среди отвергнутых гипотез (false discovery rate, FDR) вместо вероятности хотя бы одного ложного отвержения — групповой вероятности ошибки (family-wise error rate), которую контролирует поправка Бонферрони, — и сохраняет гораздо большую мощность. Её гарантия предполагает корректные p-значения, независимые или положительно зависимые в определённом смысле; для метрик с произвольной зависимостью нужна более консервативная поправка Бенджамини–Иекутиели (Benjamini and Yekutieli, 2001) или метод повторных выборок, сохраняющий зависимость. Та же проблема возникает незаметно для всех, когда анализ перебирает несколько сегментов, метрик или временных окон и сообщает о том, что сработало.
Перестановочные тесты#
z-тест опирается на центральную предельную теорему. Перестановочный тест (permutation test) опирается только на саму рандомизацию: если воздействие ничего не меняет, метки групп произвольны и любое их перераспределение равновероятно. Вычислим статистику для каждого способа разбить данные на группы исходных размеров; p-значение — доля разбиений, в которых статистика не менее экстремальна, чем наблюдённая. Когда разбиений слишком много, чтобы перебрать все, берут случайных и используют , где — число случайных разбиений, не менее экстремальных, чем наблюдённое: учёт самого наблюдённого разбиения сохраняет корректность теста и никогда не даёт . Для двух групп по шесть измерений с разностью средних в 20 из 924 разбиений разность по абсолютной величине не меньше: против у t-теста, который предполагает нормальность данных. Если нулевая гипотеза — полное отсутствие эффекта, перестановочные тесты точны при любом распределении и для любой статистики, поэтому они — естественный тест для медиан, разностей AUC и любых метрик без формулы.
Что изменилось#
| До | С тестами | |
|---|---|---|
| «Реальна ли разница?» | субъективное суждение | p-значение: насколько неожиданны данные при отсутствии эффекта |
| Ошибки | первого рода — не больше ; второго рода — задаётся мощностью | |
| Размер эксперимента | сколько позволяет трафик | для нужной мощности; |
| Чтение результатов | — значит, правда | треть значимых результатов может быть ложной, когда работают немногие идеи |
| Процесс | смотреть когда угодно, сообщать о том, что сработало | фиксированный горизонт или последовательные тесты; поправки на множественные сравнения |
Ограничения#
- Статистическая значимость — не практическая значимость. Реальный эффект может быть слишком мал, чтобы иметь значение, а большой эффект может оказаться необнаружимым на имеющихся данных.
- Тесты предполагают независимые единицы и стабильные условия. Пользователи, взаимодействующие друг с другом, эффекты новизны (novelty effects) или трафик, меняющийся во время эксперимента, нарушают предположения, на которых держится p-значение.
- Порог 0.05 — условность. Он контролирует одну вероятность ошибки на тест; решения связаны с издержками, которые фиксированный порог игнорирует.
Что нужно запомнить#
- p-значение = ; на уровне гипотезу отвергают, когда .
- Ошибка первого рода — не больше ; мощность — вероятность обнаружить реальный эффект; планируют под мощность, .
- A/B-тест для долей: ; 2.0% против 2.3% по 20 000 пользователей в группе дают , , мощность 0.54.
- p-значение — не : при 10% работающих идей, мощности 80% и ложны 36% значимых результатов.
- Подглядывание и множество метрик увеличивают долю ложных срабатываний: 25% при 20 просмотрах, 64% при 20 метриках; помогают фиксированный горизонт, последовательные тесты, поправка Бонферрони или процедура Бенджамини–Хохберга.
- Перестановочные тесты: перемешать метки; при рандомизации тест точен для любой статистики.
Код#
Монета, A/B-тест с его мощностью и размером выборки, доля ложных открытий, подглядывание и перестановочный тест:
import numpy as np, math, itertools
from scipy import stats
# 60 heads in 100 flips: exact two-sided p-value
print(round(float(stats.binomtest(60, 100, 0.5).pvalue), 4)) # 0.0569
# the A/B test: 2.0% vs 2.3% with 20,000 users per group; power now, and users per group for 80% power
p1, p2, n = 0.02, 0.023, 20_000
se = math.sqrt(p1 * (1 - p1) / n + p2 * (1 - p2) / n)
z = (p2 - p1) / se
print(round(z, 2), round(float(2 * stats.norm.sf(z)), 3)) # 2.07 0.039
za, zb = stats.norm.ppf(0.975), stats.norm.ppf(0.8)
print(round(float(stats.norm.sf(za - z)), 2), math.ceil((za + zb) ** 2 * (p1 * (1 - p1) + p2 * (1 - p2)) / (p2 - p1) ** 2)) # 0.54 36691
# false discoveries when 10% of tested ideas work, power 0.8, alpha 0.05
print(round(0.9 * 0.05 / (0.9 * 0.05 + 0.1 * 0.8), 2)) # 0.36
# peeking: 20,000 A/A tests checked after every 1,000 users per group, 20 checks
rng = np.random.default_rng(0)
a = rng.binomial(1000, 0.02, (20_000, 20)).cumsum(axis=1)
b = rng.binomial(1000, 0.02, (20_000, 20)).cumsum(axis=1)
m = 1000 * np.arange(1, 21)
pool = (a + b) / (2 * m)
zz = (b - a) / m / np.sqrt(2 * pool * (1 - pool) / m)
print(round(float((np.abs(zz) > 1.96).any(axis=1).mean()), 3), round(float((np.abs(zz[:, -1]) > 1.96).mean()), 3)) # 0.248 0.048
# a permutation test for two groups of six: all 924 splits
g1 = np.array([12.1, 14.3, 11.8, 15.2, 13.0, 12.7])
g2 = np.array([14.9, 16.2, 13.8, 15.5, 17.1, 14.4])
both, obs = np.concatenate([g1, g2]), g2.mean() - g1.mean()
diffs = []
for chosen in itertools.combinations(range(12), 6):
mask = np.zeros(12, bool)
mask[list(chosen)] = True
diffs.append(both[mask].mean() - both[~mask].mean())
print(round(float(obs), 2), len(diffs), round(float((np.abs(diffs) >= abs(obs) - 1e-9).mean()), 4), round(float(stats.ttest_ind(g2, g1).pvalue), 4))
# 2.13 924 0.0216 0.0152
Дальше#
На этом статистическая часть курса заканчивается; последний раздел посвящён случайным процессам. До сих пор все наблюдения были независимы. Последовательность слов, случайное блуждание по веб-страницам и состояния сэмплера обладают памятью: следующее состояние зависит от текущего. Следующая заметка вводит цепи Маркова — простейшую модель такой памяти — и их стационарные распределения, а n-граммную языковую модель и PageRank рассматривает как два примера таких цепей.
Литература#
- J. Neyman, E. S. Pearson. On the Problem of the Most Efficient Tests of Statistical Hypotheses. Philosophical Transactions of the Royal Society A, 231, 1933.
- R. L. Wasserstein, N. A. Lazar. The ASA Statement on p-Values: Context, Process, and Purpose. The American Statistician, 70(2), 2016.
- R. Kohavi, D. Tang, Y. Xu. Trustworthy Online Controlled Experiments: A Practical Guide to A/B Testing. Cambridge University Press, 2020.
- Y. Benjamini, Y. Hochberg. Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing. Journal of the Royal Statistical Society B, 57(1), 1995.
- Y. Benjamini, D. Yekutieli. The Control of the False Discovery Rate in Multiple Testing under Dependency. The Annals of Statistics, 29(4), 2001.
- R. Johari, P. Koomen, L. Pekelis, D. Walsh. Peeking at A/B Tests: Why It Matters, and What to Do About It. KDD, 2017.
- L. Wasserman. All of Statistics. Springer, 2004. Глава 10 (проверка гипотез и p-значения).