сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · A/B-тесты

Ловушки 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, остальные разбираются в тренажёре.

  1. #ab_pitfalls1 / 5
    Новую фичу выкатили в A/B; первые дни метрика ХУЖЕ контроля, потом выравнивается и растёт. Как называется и что делать?
    A)Winner's curse: эффект был случайным пиком и теперь просто регрессирует к среднему значению метрики группы во времени
    B)Primacy-эффект (эффект привыкания): старым юзерам сначала непривычно; нужно дать тесту время и смотреть по когортам
    C)Sample ratio mismatch: раз метрика заметно меняется во времени, значит рандомизация в тесте точно была проведена неверно
    D)Это в случае баг выката, который надо немедленно откатить, вообще не дожидаясь стабилизации метрики теста во времени
    показать ответ и разбор
    +B)Primacy-эффект (эффект привыкания): старым юзерам сначала непривычно; нужно дать тесту время и смотреть по когортам

    // разбор: Primacy-эффект (обратный novelty): привычные пользователи поначалу спотыкаются о новый интерфейс, метрика проседает, но по мере привыкания эффект проявляется в истинную сторону. Как и novelty, он делает ранние замеры нерепрезентативными. Лечится достаточной длительностью теста, анализом по когортам (новые vs старые юзеры) и отслеживанием динамики эффекта, а не мгновенным откатом. Это не winner's curse и не SRM.

  2. #ab_pitfalls2 / 5
    В продукте одновременно крутятся десятки A/B на пересекающихся пользователях. Чем грозит и как решают?
    A)Ничем: параллельные эксперименты независимы и не влияют на результаты друг друга
    B)Тесты просто немного замедляют друг друга по времени выполнения, но на сами оценки эффектов пересечение аудитории никак не влияет
    C)Реальная проблема — рост нагрузки на серверы; её решают добавлением мощностей, на статистику это не влияет
    D)Взаимодействие экспериментов может исказить эффекты; изолируют слоями (layers) платформы экспериментов и мониторят взаимодействия
    показать ответ и разбор
    +D)Взаимодействие экспериментов может исказить эффекты; изолируют слоями (layers) платформы экспериментов и мониторят взаимодействия

    // разбор: Когда пользователь одновременно в нескольких тестах, изменения могут взаимодействовать (один усиливает/гасит эффект другого), искажая оценки. Крупные платформы экспериментов управляют этим слоями (layers/universes): в одном слое пользователь попадает в один эксперимент, ортогональные тесты разносят по слоям, а подозрительные пары проверяют на взаимодействие. Рандомизация внутри слоя сохраняет валидность отдельных тестов. Это не «замедление» и не только про серверы.

  3. #ab_pitfalls3 / 5
    A/B показал невероятный +40% к выручке за один день. Первая реакция опытного аналитика?
    A)Заподозрить ошибку (Twyman's law): слишком хороший результат чаще всего баг в логировании/сплите/метрике, а не реальный эффект
    B)Немедленно выкатить победителя на 100% пользователей — такой сильный эффект не получится упускать и медлить
    C)Сразу и без каких-либо дополнительных проверок отрапортовать эти +40% руководству как окончательный подтверждённый результат теста
    D)Постараться увеличить эффект ещё сильнее, добавив в тестовую группу побольше пользователей ради пущей убедительности итоговых цифр
    показать ответ и разбор
    +A)Заподозрить ошибку (Twyman's law): слишком хороший результат чаще всего баг в логировании/сплите/метрике, а не реальный эффект

    // разбор: Закон Тваймана: «любая цифра, которая выглядит интересной или необычной, обычно неверна». Аномально большой эффект (+40% за день) гораздо вероятнее объясняется багом — двойным логированием, SRM, утечкой, неверным подсчётом метрики или выбросом, — чем настоящим сдвигом. Первым делом такой результат перепроверяют (SRM, санити метрик, сегменты, A/A), а не празднуют и катят. Реальные продуктовые эффекты обычно скромны.

  4. #ab_pitfalls4 / 5
    В целом по тесту вариант B выигрывает, но в КАЖДОМ сегменте (mobile, desktop) — проигрывает. Что происходит?
    A)Это просто случайный статистический шум, который непременно исчезнет сам собой, если увеличить общую выборку эксперимента в несколько раз
    B)Однозначная победа B: агрегированная метрика важнее посегментной, поэтому вариант B и следует выкатывать на всех
    C)Парадокс Симпсона: перекос в долях сегментов между группами переворачивает агрегат; проверьте состав групп и SRM
    D)Метрика выбрана неверно, и достаточно всего лишь заменить среднее на медиану, чтобы противоречие сегментов и агрегата исчезло само собой
    показать ответ и разбор
    +C)Парадокс Симпсона: перекос в долях сегментов между группами переворачивает агрегат; проверьте состав групп и SRM

    // разбор: Когда агрегат и все сегменты дают противоположный вывод — это парадокс Симпсона: он возникает, если доли сегментов различаются между группами (в группу B случайно попало больше «дешёвого» трафика с высокой конверсией). Агрегат тогда отражает состав, а не эффект. Первым делом проверяют баланс сегментов и SRM; при перекосе доверяют посегментной картине или корректируют. Это не шум и не вопрос выбора медианы.

  5. #ab_pitfalls5 / 5
    В тесте по 300 юзеров на группу: конверсия 5.2% против 5.0%. Победил вариант B?
    A)Да: +0.2 п.п. — это +4% относительного прироста
    B)Нет: на таких числах разница неотличима от шума
    C)Да, если преимущество держится третий день подряд
    D)Нет: сначала надо уравнять группы по возрасту и городу
    показать ответ и разбор
    +B)Нет: на таких числах разница неотличима от шума

    // разбор: 300 юзеров при конверсии 5% дают около 15 конверсий на группу. Одна-две конверсии туда-сюда — и преимущество исчезает: доверительный интервал разницы накрывает ноль с огромным запасом. Прежде чем сравнивать проценты, считают, какой эффект выборка вообще способна различить (MDE) и сколько наблюдений нужно под нужный MDE.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.