Как получить значимый A/B-тест из воздуха? 🥸
Товарищи, сегодня разберём одну из неприятных ошибок в A/B-тестировании, на которой можно легко завалиться даже с хорошим знанием матстата.
Представим, что мы тестируем новую рекомендательную систему.
В эксперименте:
• 10 000 пользователей в каждой группе
• Каждый пользователь совершил по 10 сессий
• CR в контроле = 10%
• CR в тесте = 10,3%
Аналитик берёт все 100 000 сессий в каждой группе, запускает z-test для долей и получает p-value ≈ 0,026.
Можно выкатывать?
Не торопимся)))
Проблема в том, что рандомизация происходила на уровне пользователей, а тест мы провели на уровне сессий.
Сессии одного пользователя зависимы. Если человек склонен покупать, он с большей вероятностью совершит покупку и в следующей сессии.
Получается, что наши 100 000 наблюдений не являются независимыми.
Это называется псевдорепликацией (pseudoreplication).
➡️Как оценить масштаб проблемы?
Введём intraclass correlation coefficient (ICC), который показывает корреляцию между наблюдениями внутри одного кластера.
Для кластеров одинакового размера поправка на дисперсию приближённо равна:
DE = 1 + (m − 1) × ICC
Где m — число наблюдений на пользователя.
Допустим, ICC = 0,2.
Тогда:
DE = 1 + 9 × 0,2 = 2,8
То есть дисперсия оценки примерно в 2,8 раза больше, чем предполагалось при независимости сессий.
А эффективный размер выборки:
n_eff ≈ 100 000 / 2,8 ≈ 35 714
Что будет с нашим p-value?
После учёта внутрипользовательской корреляции стандартная ошибка увеличится примерно в √2,8 раза.
И вместо p ≈ 0,026 мы получим уже около p ≈ 0,18.
Поздравляю, статистическая значимость исчезла 🙂
➡️Как правильно?
Если рандомизация идёт по пользователям, нужно учитывать зависимость наблюдений внутри пользователя.
Например:
• Агрегировать метрику до уровня пользователя и применять тест к пользовательским наблюдениям
• Использовать cluster bootstrap с ресемплированием пользователей
• Применять cluster-robust standard errors
Но есть нюанс: средняя конверсия по пользователям и общая конверсия по сессиям не всегда оценивают один и тот же эффект. При разном количестве сессий на пользователя это нужно учитывать отдельно.
Мораль: 200 000 строк в датасете ещё не означают 200 000 независимых наблюдений.
И перед выбором статистического критерия стоит проверить не только распределение метрики, но и единицу рандомизации, зависимости в данных и то, какой именно эффект мы пытаемся оценить.
🫥🫥🫥🫥
Такие задачи могут встретиться на контестах и собеседованиях на продуктового аналитика
Чтобы уверенно их решать, приходите на наши курсы «Аналитика СТАРТ» и «Аналитика ПРО»
До конца дня на них скидка 60% 🔔
Post #208
291