Ловушки A/B-тестов
Ловушки A/B - сеньорская часть темы, и интервьюер тут ищет шрамы. Вопрос «тест прокрасился на третий день, что делаешь?» работает как детектор: ответ довольно точно показывает, жил ли ты с реальными экспериментами или читал про них.
Типовые формулировки: «почему нельзя останавливать тест, когда прокрасилось?», «эффект нашёлся только у андроидов - что с этим делать?», «средний чек вырос, а конверсия упала».
// Каждая ловушка на этих карточках - работающий способ получить красивый, значимый и полностью неверный результат. Тем они и опасны: провал выглядит как успех.
Подглядывание: сколько оно стоит в цифрах
Подглядывание - проверять значимость каждый день и остановить тест, когда прокрасилось. Звучит безобидно: ты же просто смотришь на свои данные.
Вот симуляция A/A-теста, где эффекта нет вообще, ни малейшего. Одна проверка в конце даёт 5 процентов ложных прокрасов - ровно столько, сколько обещает уровень значимости. Пять ежедневных проверок дают уже 14 процентов. Десять - 19. Четырнадцать - 23 процента. В двухнедельном тесте с ежедневным подглядыванием почти каждый четвёртый пустой эксперимент покажет «эффект».
Механизм понятен, если представить случайное блуждание: разница между группами колеблется вокруг нуля, и чем чаще ты смотришь, тем больше шансов застать момент, когда её случайно занесло за порог. Останавливая тест на прокрасе, ты выбираешь именно тот момент, когда шум был максимальным.
// Легальных выходов два. Фиксированная длительность без промежуточных решений. Или последовательный дизайн (mSPRT, alpha spending), где право остановиться раньше заложено в математику и оплачено более строгим порогом на каждой проверке.
- уровень значимости (α)
- заранее назначенный риск объявить эффект там, где его нет. 0.05 означает один ложный прокрас на двадцать пустых тестов - но только при одной проверке
Множественность и гипотезы задним числом
Множественность растёт по трём осям сразу: метрики, варианты, срезы. Двадцать метрик при пороге 0.05 дают в среднем одну «значимую» на ровном месте - это прямая арифметика, 20 умножить на 0.05.
Отсюда дисциплина: первичная метрика одна и объявлена заранее. Остальные либо идут с поправкой на множественность (метод Холма, контроль доли ложных открытий - FDR, false discovery rate), либо честно понижаются в статусе до наблюдений, из которых родятся будущие гипотезы.
HARKing (hypothesizing after results are known) - сформулировать гипотезу после того, как увидел данные, и проверить её этими же данными. «Эффект есть у андроид-юзеров 25-34 из Казани» ничего не доказывает, если сегмент найден перебором срезов: при достаточном числе разрезов что-нибудь прокрасится обязательно.
// Это не запрет на срезы. Это правило, что найденная в срезах гипотеза проверяется НОВЫМ тестом. Граница между исследованием и подгонкой проходит ровно здесь: объявил до данных или после.
Группы влияют друг на друга
Сплит по юзерам молча предполагает, что группы независимы: что происходит с одним человеком, не зависит от того, в какую группу попал другой. Есть места, где это прямая ложь.
Маркетплейс с общим складом: тест-группа получила рекомендации получше, раскупила ходовой товар, контрольной он не достался. Контроль ухудшился ИЗ-ЗА теста, разрыв между группами вырос, измеренный эффект оказался больше настоящего. Соцсеть: контент, залайканный в тест-группе, всплывает в лентах контрольной. Такси: водители общие, переманив их в одну группу, ты обездолил другую.
Лечится сменой единицы рандомизации на такую, внутри которой взаимодействие замкнуто: сплит по городам, по кластерам социального графа, либо switchback - включать вариант для всех попеременно, отрезками по времени.
// Из той же серии - ловушка средних. Средний чек вырос, конверсия упала: вполне вероятно, это чистый отбор, ушли мелкие покупатели и остались крупные. Поведение при этом не изменилось ни у кого. Раскладывай метрику на компоненты и смотри распределение, а не одно число.
- switchback
- дизайн, где вариант переключается для всей аудитории по времени: час так, час иначе. Спасает там, где юзеры делят общий ресурс
- holdback
- малая группа, которую после раската оставляют без фичи. Ловит долгие эффекты, которые двухнедельный тест не видит по определению
Как отвечать: «Тест прокрасился на третий день из четырнадцати - останавливаем?»
Нет, это подглядывание. За четырнадцать ежедневных проверок шанс случайно поймать значимость давно не пять процентов, а порядка двадцати - симуляция на пустых данных это показывает прямо. Длительность считалась под нужную мощность и под полные недельные циклы, значит доживаем её. Если бизнесу принципиально уметь останавливаться раньше, это закладывают заранее последовательным дизайном вроде mSPRT, где ранняя остановка валидна и оплачена более строгим порогом. Заодно проверю, не разъехался ли фактический сплит с плановым, и посмотрю динамику эффекта по дням: ранний всплеск часто оказывается эффектом новизны и к концу теста тает.
Назван механизм ошибки с числом, легальная альтернатива и две сопутствующие проверки. Так отвечает человек, который останавливал тесты по правилам, а не по нетерпению продакта.
На чём валят
- −Остановить тест в день прокраса - самая массовая ошибка A/B-практики, и она поднимает долю ложных выводов вчетверо.
- −Проверить двадцать метрик и отчитаться по трём «значимым» без поправки на множественность.
- −Найти сегмент в данных теста и проверить его теми же данными: нужен новый тест, иначе это подгонка с ритуалом.
- −Сплит по юзерам там, где они делят общий склад или общую ленту: контроль страдает от успеха теста, эффект завышен.
- −Отчитаться словом «незначимо» вместо интервала: интервал от минус 0.2 до плюс 1.4 процента и интервал от минус 5 до плюс 7 - это два совершенно разных вывода.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 14, остальные разбираются в тренажёре.
- Новую фичу выкатили в A/B; первые дни метрика ХУЖЕ контроля, потом выравнивается и растёт. Как называется и что делать?A)Winner's curse: эффект был случайным пиком и теперь просто регрессирует к среднему значению метрики группы во времениB)Primacy-эффект (эффект привыкания): старым юзерам сначала непривычно; нужно дать тесту время и смотреть по когортамC)Sample ratio mismatch: раз метрика заметно меняется во времени, значит рандомизация в тесте точно была проведена неверноD)Это в случае баг выката, который надо немедленно откатить, вообще не дожидаясь стабилизации метрики теста во времени
показать ответ и разбор
+B)Primacy-эффект (эффект привыкания): старым юзерам сначала непривычно; нужно дать тесту время и смотреть по когортам// разбор: Primacy-эффект (обратный novelty): привычные пользователи поначалу спотыкаются о новый интерфейс, метрика проседает, но по мере привыкания эффект проявляется в истинную сторону. Как и novelty, он делает ранние замеры нерепрезентативными. Лечится достаточной длительностью теста, анализом по когортам (новые vs старые юзеры) и отслеживанием динамики эффекта, а не мгновенным откатом. Это не winner's curse и не SRM.
- В продукте одновременно крутятся десятки A/B на пересекающихся пользователях. Чем грозит и как решают?A)Ничем: параллельные эксперименты независимы и не влияют на результаты друг другаB)Тесты просто немного замедляют друг друга по времени выполнения, но на сами оценки эффектов пересечение аудитории никак не влияетC)Реальная проблема — рост нагрузки на серверы; её решают добавлением мощностей, на статистику это не влияетD)Взаимодействие экспериментов может исказить эффекты; изолируют слоями (layers) платформы экспериментов и мониторят взаимодействия
показать ответ и разбор
+D)Взаимодействие экспериментов может исказить эффекты; изолируют слоями (layers) платформы экспериментов и мониторят взаимодействия// разбор: Когда пользователь одновременно в нескольких тестах, изменения могут взаимодействовать (один усиливает/гасит эффект другого), искажая оценки. Крупные платформы экспериментов управляют этим слоями (layers/universes): в одном слое пользователь попадает в один эксперимент, ортогональные тесты разносят по слоям, а подозрительные пары проверяют на взаимодействие. Рандомизация внутри слоя сохраняет валидность отдельных тестов. Это не «замедление» и не только про серверы.
- A/B показал невероятный +40% к выручке за один день. Первая реакция опытного аналитика?A)Заподозрить ошибку (Twyman's law): слишком хороший результат чаще всего баг в логировании/сплите/метрике, а не реальный эффектB)Немедленно выкатить победителя на 100% пользователей — такой сильный эффект не получится упускать и медлитьC)Сразу и без каких-либо дополнительных проверок отрапортовать эти +40% руководству как окончательный подтверждённый результат тестаD)Постараться увеличить эффект ещё сильнее, добавив в тестовую группу побольше пользователей ради пущей убедительности итоговых цифр
показать ответ и разбор
+A)Заподозрить ошибку (Twyman's law): слишком хороший результат чаще всего баг в логировании/сплите/метрике, а не реальный эффект// разбор: Закон Тваймана: «любая цифра, которая выглядит интересной или необычной, обычно неверна». Аномально большой эффект (+40% за день) гораздо вероятнее объясняется багом — двойным логированием, SRM, утечкой, неверным подсчётом метрики или выбросом, — чем настоящим сдвигом. Первым делом такой результат перепроверяют (SRM, санити метрик, сегменты, A/A), а не празднуют и катят. Реальные продуктовые эффекты обычно скромны.
- В целом по тесту вариант B выигрывает, но в КАЖДОМ сегменте (mobile, desktop) — проигрывает. Что происходит?A)Это просто случайный статистический шум, который непременно исчезнет сам собой, если увеличить общую выборку эксперимента в несколько разB)Однозначная победа B: агрегированная метрика важнее посегментной, поэтому вариант B и следует выкатывать на всехC)Парадокс Симпсона: перекос в долях сегментов между группами переворачивает агрегат; проверьте состав групп и SRMD)Метрика выбрана неверно, и достаточно всего лишь заменить среднее на медиану, чтобы противоречие сегментов и агрегата исчезло само собой
показать ответ и разбор
+C)Парадокс Симпсона: перекос в долях сегментов между группами переворачивает агрегат; проверьте состав групп и SRM// разбор: Когда агрегат и все сегменты дают противоположный вывод — это парадокс Симпсона: он возникает, если доли сегментов различаются между группами (в группу B случайно попало больше «дешёвого» трафика с высокой конверсией). Агрегат тогда отражает состав, а не эффект. Первым делом проверяют баланс сегментов и SRM; при перекосе доверяют посегментной картине или корректируют. Это не шум и не вопрос выбора медианы.
- В тесте по 300 юзеров на группу: конверсия 5.2% против 5.0%. Победил вариант B?A)Да: +0.2 п.п. — это +4% относительного приростаB)Нет: на таких числах разница неотличима от шумаC)Да, если преимущество держится третий день подрядD)Нет: сначала надо уравнять группы по возрасту и городу
показать ответ и разбор
+B)Нет: на таких числах разница неотличима от шума// разбор: 300 юзеров при конверсии 5% дают около 15 конверсий на группу. Одна-две конверсии туда-сюда — и преимущество исчезает: доверительный интервал разницы накрывает ноль с огромным запасом. Прежде чем сравнивать проценты, считают, какой эффект выборка вообще способна различить (MDE) и сколько наблюдений нужно под нужный MDE.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.