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

Снижение дисперсии: CUPED

Зачем это спрашивают

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

Типовые формулировки: «как ускорить тест, не увеличивая трафик?», «что делает CUPED?», «CUPED применили, а эффект не вырос - метод не сработал?».

// Последний вопрос и есть главная проверка понимания. Правильный ответ: так и должно быть. Метод сужает интервал вокруг той же оценки, а не двигает саму оценку.

Почему дисперсия - это деньги

Размер выборки растёт прямо пропорционально дисперсии метрики. Срезал дисперсию оценки вдвое - и дальше на выбор: вдвое меньше пользователей, вдвое короче тест или вдвое более узкий доверительный интервал на прежних данных. Ничего из этого не требует нового трафика.

Что именно снижается - принципиальный момент, и на нём проверяют понимание. Снижается шум оценки, а не сам эффект. Точечная оценка остаётся примерно там же и остаётся несмещённой; сужается интервал вокруг неё.

// Поэтому фраза «применили CUPED, а эффект не вырос» описывает нормально работающий метод, а не провал. Значимость приходит раньше не потому, что сигнал стал больше, а потому что шум стал меньше.

дисперсия оценки
насколько сильно измеренный эффект скакал бы от повторения к повторению эксперимента. Ширина доверительного интервала - её видимое проявление

CUPED: вычесть предсказуемое

Ковариата - величина, измеренная ДО эксперимента и коррелирующая с метрикой. Самая сильная ковариата почти всегда одна и та же: та же метрика за предыдущий период. Кто покупал на пять тысяч в месяц до теста, скорее всего будет покупать много и во время теста, и эта часть его поведения к твоей фиче отношения не имеет - она чистый шум для эксперимента.

Идея CUPED (controlled experiment using pre-experiment data): вычесть из метрики ту часть, которую можно предсказать по ковариате. Остаётся остаток - то, что ковариатой не объясняется, - и у него дисперсия заметно меньше. Разница между группами при этом не смещается, потому что ковариата снята до рандомизации и в обеих группах распределена одинаково.

Сила метода жёстко привязана к корреляции: дисперсия падает примерно как 1−ρ². При корреляции 0.7 остаётся 51 процент исходной дисперсии - проверяется симуляцией и совпадает с формулой до второго знака. При корреляции 0.3 останется 91 процент, и городить огород незачем.

// Условие, которое нельзя нарушать: ковариата снята до назначения в группу и от него не зависит. Признак, на который повлияла сама фича, вычтет вместе с шумом кусок настоящего эффекта и сместит оценку - причём в сторону нуля, то есть ты сам себе занизишь результат.

ковариата
вспомогательная переменная, которая объясняет часть разброса метрики, но не зависит от эксперимента

Стратификация и триггер

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

Триггерный анализ: если фичу видят всего 5 процентов юзеров (скажем, она срабатывает только в корзине с промокодом), то остальные 95 вносят в обе группы одинаковые числа и разбавляют сигнал в двадцать раз. Считать эффект надо на затронутых.

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

// Чего делать нельзя ни при каких обстоятельствах: ослаблять уровень значимости или мощность ради скорости. Это тоже «ускоряет тест» - ровно в той же мере, в какой делает его вывод бесполезным.

страта
однородная группа внутри аудитории: iOS-юзеры Москвы, новички, тяжёлые пользователи. Внутри страты люди похожи, между стратами - нет

Как отвечать: «Как ускорить A/B-тест, не увеличивая трафик?»

Снижаю дисперсию оценки, тогда нужная мощность набирается на меньшей выборке. Первый инструмент - CUPED: беру ту же метрику за предпериод как ковариату и вычитаю предсказуемую по ней часть. Оценка остаётся несмещённой, а интервал сужается тем сильнее, чем выше корреляция: при 0.7 дисперсия падает примерно вдвое, при 0.3 смысла почти нет. Дополняю стратификацией по платформе и гео, а если фичу видит меньшинство юзеров - триггерным анализом на затронутых, определяя триггер одинаково в обеих группах. Чего я при этом не трогаю, так это уровень значимости и мощность: их ослабление тоже ускоряет прокрас, но платит за это надёжностью вывода, а снижение дисперсии даёт скорость честно.

Перечислены реальные рычаги, сила CUPED привязана к корреляции числом, и явно проведена граница между честным ускорением и жульническим. Это понимание, а не список терминов.

На чём валят

  • Взять в ковариаты CUPED признак, снятый после старта теста: оценка смещается, причём к нулю.
  • Ждать роста эффекта от снижения дисперсии - метод режет шум, а не двигает среднее.
  • Сравнивать затронутых в тесте с полным контролем: группы стали несопоставимы, эффект завышен.
  • Применять CUPED к свежим юзерам без истории - предпериодной ковариаты у них нет, срезать нечего.
  • Стратифицировать по признаку, на который повлиял сам тест: это уже не коррекция, а внесение смещения.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 14, остальные разбираются в тренажёре.

  1. #variance_reduction1 / 5
    От чего зависит, насколько сильно CUPED срежет дисперсию?
    A)От корреляции ковариаты предпериода с метрикой эксперимента
    B)От того, насколько велик сам эффект фичи
    C)От числа вариантов, участвующих в тесте
    D)От того, какой именно уровень значимости α был выбран заранее
    показать ответ и разбор
    +A)От корреляции ковариаты предпериода с метрикой эксперимента

    // разбор: Выигрыш CUPED растёт с корреляцией ковариаты и метрики: дисперсия падает примерно как 1−ρ². Сильно коррелирующая ковариата (та же метрика за предпериод) даёт заметный срез, слабая — почти ничего. Величина эффекта, число вариантов и α на силу снижения дисперсии не влияют.

  2. #variance_reduction2 / 5
    Какую ковариату для CUPED выбирают чаще всего и почему?
    A)Случайный шумовой признак — для непредвзятости
    B)Ту же метрику за предпериод: она сильнее всего коррелирует с исходом
    C)Признак, который сам меняется под действием фичи
    D)Идентификатор той экспериментальной группы, в которую попал пользователь
    показать ответ и разбор
    +B)Ту же метрику за предпериод: она сильнее всего коррелирует с исходом

    // разбор: Лучшая ковариата — та же метрика за доэкспериментный период: прошлое поведение юзера обычно сильнее всего предсказывает его поведение в тесте, а значит даёт максимальную корреляцию и наибольший срез дисперсии. Ковариата обязана быть из предпериода и не зависеть от назначения в группу — признак, меняющийся под фичей, внёс бы смещение.

  3. #variance_reduction3 / 5
    Как стратификация снижает дисперсию оценки эффекта?
    A)Удаляя из выборки пользователей нетипичных страт
    B)Пропорционально увеличивая долю тестовой группы в наиболее крупных стратах
    C)Рандомизируя внутри однородных страт и убирая межстратовую вариативность
    D)Заменяя реальные метрики их средними по стратам
    показать ответ и разбор
    +C)Рандомизируя внутри однородных страт и убирая межстратовую вариативность

    // разбор: Стратификация делит аудиторию на однородные страты (гео, платформа, тип юзера), рандомизирует внутри каждой и оценивает эффект взвешенно по стратам. Так из дисперсии оценки уходит межстратовая составляющая — различия между странами или платформами больше не добавляют шума в сравнение групп. Пользователей при этом не выбрасывают и метрики не подменяют.

  4. #variance_reduction4 / 5
    Фича меняет поведение лишь у 8% пользователей, дошедших до неё. Как повысить чувствительность теста?
    A)Оценивать эффект только по самым активным пользователям в обеих группах сразу
    B)Убрать из контроля всех, кто похож на затронутых
    C)Раздать фичу всем сразу, отменив контроль
    D)Триггерный анализ: считать эффект только на реально затронутых пользователях
    показать ответ и разбор
    +D)Триггерный анализ: считать эффект только на реально затронутых пользователях

    // разбор: Если фичу видят немногие, 92% нетронутых юзеров вносят в обе группы одинаковые нули и разбавляют эффект, топя чувствительность. Триггерный анализ считает эффект на подмножестве, реально дошедшем до фичи, — сравнивая затронутых в тесте с теми, кто дошёл бы до неё в контроле. Важно сохранить сопоставимость: триггер определяют одинаково в обеих группах.

  5. #variance_reduction5 / 5
    Что делает пост-стратификация, если по стратам заранее не рандомизировали?
    A)На этапе анализа корректирует случайный дисбаланс групп по ковариате
    B)Отменяет результаты теста как невалидные
    C)Заново перераспределяет пользователей между тестовой и контрольной группами
    D)Увеличивает уровень значимости для надёжности
    показать ответ и разбор
    +A)На этапе анализа корректирует случайный дисбаланс групп по ковариате

    // разбор: Пост-стратификация применяет ту же идею на этапе анализа: разбивает выборку на страты уже после эксперимента и пересчитывает эффект взвешенно, компенсируя случайный перекос групп по ковариате (например, тестовая случайно набрала больше мобильных). Перемешивать пользователей задним числом нельзя — используются те же назначения, меняется только схема агрегации.

дальше

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

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