null
эссе · статистика · A/B · ~12 мин

сад расходящихся троп.

p-value обещает простую защиту: если эффекта нет, значимый результат выпадет реже чем раз на двадцать. Гарантия железная — но ровно для одной заранее назначенной проверки. А стоит дать себе свободу выбора — какую метрику смотреть, когда остановиться, какие выбросы убрать — и пятипроцентная защита тихо рассыпается. Разберём три способа обмануться, не обманывая.

Сначала вспомним, что вообще гарантирует p. Это вероятность увидеть такой результат (или ярче), если эффекта нет. Порог 0.05 значит: при пустой гипотезе мы ошибочно закричим «нашли!» в одном случае из двадцати. Один тест — один шанс ошибиться из двадцати, честно. Беда начинается, когда тестов незаметно становится много.

приём первый · перебрать метрики

Меряешь не одну метрику, а двадцать: клики, время на странице, возвраты, глубина, конверсия в каждом шаге. Эффекта нет ни в одной — но каждая проверка независимо ошибается с вероятностью 5%. Шанс, что хоть одна случайно выстрелит, уже совсем другой.

P(хоть одна значима) = 1 − (1 − 0.05)2064%
из 20 невинных метрик почти наверняка одна даст p<0.05 случайно. берёшь её, пишешь «новая кнопка повысила вовлечённость» — и ты соврал, ничего не подтасовав.

Это классика, увековеченная комиксом xkcd: учёные проверяют, вызывают ли желейки прыщи. Зелёные — p<0.05! Газета выходит с заголовком «зелёные желейки связаны с прыщами», а двадцать других цветов, где ничего не нашли, тихо остаются за кадром.[1]

приём второй · подглядывать и доливать

Запустил A/B и смотришь каждый день: «уже значимо? нет — подожду ещё». А останавливаешь ровно в тот день, когда наконец загорелось зелёное. Кажется невинным — ты же просто дожидался данных. Но это подглядывание (peeking, optional stopping), и оно раздувает ошибку само по себе: p-value по ходу набора блуждает случайно, и рано или поздно само нырнёт под 0.05, даже когда эффекта нет. Ты дожидаешься не правды — ты дожидаешься удобной флуктуации.[2]

порог 0.05 1.0 0 «стоп! значимо» смотришь каждый день — p блуждает, пока не нырнёт под порог →
подглядывание: p по ходу теста блуждает; останови на удачном нырке — и «поймал» эффект из ничего

приём третий · развилки, даже без злого умысла

Самый тонкий приём — и оттого самый опасный. Даже если ты честно поставил один тест и заглянул в данные один раз, обмануться всё равно можно. Потому что по дороге ты принял десяток мелких решений, подсказанных самими данными: какой выброс счесть аномалией, где провести границу групп, объединять ли две недели или взять одну, логарифмировать ли скошенную метрику. Каждое такое решение — развилка.

Эндрю Гельман и Эрик Локен назвали это садом расходящихся троп: даже единственный анализ скрыто содержит проблему множественных сравнений, потому что будь данные другими, ты свернул бы иначе.[3] Ты прошёл по одной тропинке сада, но веток было много — и значимость, найденная на этой тропе, учитывает только её, а не весь сад. Это не подтасовка: так ошибаются и добросовестные исследователи, искренне уверенные, что сделали одну честную проверку.

Анализ чист, только если ты сделал бы его точно так же при любых других данных. Если данные вели тебя за руку — развилок было много, даже когда тест один.

что общего · свобода ломает гарантию

Три приёма — одна болезнь под названием степени свободы исследователя. Пятипроцентная защита p верна ровно для одной заранее зафиксированной проверки. Любая гибкость — выбор метрики, момента остановки, обработки, среза — превращает один тест в скрытую россыпь тестов, и реальная доля ложных тревог взлетает с обещанных 5% куда выше.

Лечится это не формулой, а дисциплиной — причём до того, как ты увидел данные. Предрегистрация: заранее напиши, какую метрику и какой тест смотришь, когда останавливаешься, что считаешь выбросом, — и держись плана. Поправки на множественность (Бонферрони, FDR) ужесточают порог под число проверок. Разделяй разведку и подтверждение: рой данные сколько угодно, но гипотезу, рождённую в рытье, проверяй заново на свежих данных. Суть одна — заранее лишить себя развилок, на которых так легко обмануться.[4]

рядом по теме
Поиграть в это руками можно в песочнице p-hacking: там A/B без эффекта дожимается до значимости теми же ручками. А про то, почему сам порог 0.05 — слабая улика, — в эссе «почему p < 0.05 — плохой порог».

Мораль, которую стоит унести: значимость — не печать истины, а узкое обещание про один-единственный тест. Чем больше свободы ты дал себе после того, как заглянул в данные, тем меньше это обещание стоит. Хочешь, чтобы p что-то значил, — реши всё до того, как посмотришь.

на полях
[1]Множественные сравнения: при k независимых проверках P(хотя бы одна ложно значима) = 1−(1−α)^k; для α=0.05, k=20 → ≈64%. Иллюстрация — xkcd #882 «Significant» (зелёные желейки и прыщи): из 20 цветов один случайно даёт p<0.05, и только он попадает в заголовок.
[2]Подглядывание (optional stopping / peeking): остановка теста по достижении значимости раздувает ошибку I рода — при наборе данных p блуждает и при многократной проверке почти наверняка хоть раз нырнёт под порог. Лечится последовательными методами (alpha spending, групповые последовательные тесты) или фиксацией размера выборки заранее.
[3]«Сад расходящихся троп» (Andrew Gelman & Eric Loken, 2013): множественные сравнения — проблема даже при единственном анализе и единственном взгляде на данные, если выбор метода зависел от данных. Условие чистоты: анализ был бы тем же при любых других данных. Контраст с осознанным p-hacking — здесь нет умысла, эффект тот же.
[4]Лечение: предрегистрация (зафиксировать метрику, тест, правило остановки, критерии выбросов заранее), поправки на множественность (Бонферрони делит α на число тестов; FDR контролирует долю ложных открытий), разделение разведочного и подтверждающего анализа (split-sample).