Стратификация в A/B-тестах

Что такое стратификация

Стратификация в контексте A/B-тестов — это разбиение выборки на однородные подгруппы (страты) по заранее известным признакам перед или после распределения пользователей по экспериментальным группам. Цель — снизить дисперсию оценки эффекта и получить результат быстрее при том же объёме трафика.

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

Почему стратификация снижает дисперсию

Дисперсию метрики можно разложить на два компонента — between-strata (различия между стратами) и within-strata (шум внутри страт):

Var(Y) = Var_between + Var_within

Обычный A/B-тест оценивает эффект по всей выборке и «платит» за оба компонента. Стратификация устраняет between-strata компонент: вы оцениваете эффект внутри каждой страты, а потом берёте взвешенное среднее. Различия между стратами больше не добавляют шума в итоговую оценку.

Формально, оценка эффекта при стратификации:

ATE_strat = sum over s: w_s * (mean_treatment_s - mean_control_s)

где w_s — доля страты s в общей выборке. Дисперсия этой оценки:

Var(ATE_strat) = sum over s: w_s^2 * Var(effect_s) / n_s

Эта величина всегда меньше или равна дисперсии обычной оценки без стратификации. Равенство наступает только если страты не различаются по среднему значению метрики — тогда стратификация бесполезна, но и не вредит.

На практике снижение дисперсии составляет 5–30% в зависимости от того, насколько хорошо страты разделяют пользователей по уровню метрики.

Как выбирать страты

Хорошая страта — это признак, который сильно связан с метрикой эксперимента, но не зависит от воздействия (treatment). Если метрика — revenue per user, стоит стратифицировать по факторам, которые объясняют разницу в revenue между пользователями.

Платформа (iOS / Android / Web). Пользователи разных платформ часто различаются по платёжеспособности и поведению. iOS-аудитория в среднем имеет более высокий средний чек. Этот признак легко получить, он стабилен и хорошо дробит выборку на 2–3 группы.

География (страна, город). Пользователи из Москвы и из региона — разные сегменты по покупательской способности. Если продукт работает на несколько стран, страна — очевидная страта.

Уровень активности. Разделение на heavy / medium / light users по количеству сессий или заказов за последние N дней до эксперимента. Это один из самых сильных предикторов будущей метрики — активный пользователь останется активным, неактивный вряд ли резко изменит поведение.

Сегмент подписки. Бесплатные vs платные пользователи. Если эксперимент влияет на монетизацию, эта страта объяснит большую часть разброса в revenue.

Правила выбора:

  • Берите 3–7 страт. Слишком много страт — маленькие подгруппы с нестабильными оценками. Слишком мало — слабое снижение дисперсии.
  • Признак должен быть известен до начала эксперимента и не меняться в процессе.
  • Не стратифицируйте по признакам, которые слабо связаны с метрикой — это добавит сложности без выигрыша.
  • Если используете уровень активности — определяйте его строго по pre-period данным, не по данным во время эксперимента.

Pre-stratification vs post-stratification

Два подхода, которые часто путают.

Pre-stratification (стратифицированная рандомизация). Пользователей сначала распределяют по стратам, а затем внутри каждой страты случайно назначают в тест и контроль. Это гарантирует одинаковые пропорции страт в обеих группах. Например, если 30% пользователей с iOS, то и в тесте, и в контроле будет ровно 30% iOS-пользователей. Метод устраняет дисбаланс между группами ещё на этапе рандомизации.

Post-stratification. Рандомизация проходит как обычно (без учёта страт), а стратификацию применяют на этапе анализа — вычисляют эффект внутри каждой страты и берут взвешенное среднее. Это проще в реализации, потому что не требует изменений в системе рандомизации.

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

На практике крупные платформы экспериментов (Яндекс, Booking, Netflix) используют pre-stratification на уровне рандомизатора, а пост-стратификацию применяют для дополнительного анализа по срезам, не заложенным в рандомизацию.

Сравнение стратификации с CUPED

Стратификацию часто сравнивают с CUPED — оба метода снижают дисперсию. Принципиальные отличия:

Стратификация CUPED
Суть Разбиение на группы, взвешенная оценка Регрессионная коррекция на ковариату
Снижение дисперсии 5–30% 20–80%
Тип признака Категориальный (платформа, страна, сегмент) Непрерывный (revenue до эксперимента)
Сложность Низкая Средняя
Нужен pre-period Не обязательно (можно стратифицировать по платформе) Да, нужны числовые pre-period данные
Новые пользователи Работает (если страта известна) Не работает (нет ковариаты)

CUPED обычно сильнее, потому что использует непрерывную ковариату и извлекает больше информации. Но стратификация работает даже там, где CUPED неприменим — например, для новых пользователей, у которых нет pre-period данных, но известна платформа и страна.

Методы не конкурируют, а дополняют друг друга. Оптимальный подход — стратифицированная рандомизация + CUPED внутри каждой страты. Так вы устраняете и категориальные различия (between-strata), и непрерывный шум (within-strata).

SQL-пример: post-stratification

Допустим, вы провели эксперимент с обычной рандомизацией и хотите применить post-stratification по платформе.

WITH user_experiment AS (
    SELECT
        user_id,
        experiment_group,       -- 'control' / 'treatment'
        platform                -- 'ios' / 'android' / 'web'
    FROM experiment_assignments
    WHERE experiment_id = 'checkout_redesign_v2'
),

user_metric AS (
    SELECT
        user_id,
        COALESCE(SUM(revenue), 0) AS y
    FROM orders
    WHERE order_date BETWEEN '2026-03-01' AND '2026-03-14'
    GROUP BY user_id
),

combined AS (
    SELECT
        ue.user_id,
        ue.experiment_group,
        ue.platform,
        COALESCE(um.y, 0) AS y
    FROM user_experiment ue
    LEFT JOIN user_metric um USING (user_id)
),

-- Доля каждой страты в общей выборке
strata_weights AS (
    SELECT
        platform,
        COUNT(*)::NUMERIC / SUM(COUNT(*)) OVER () AS w
    FROM combined
    GROUP BY platform
),

-- Средние и SE по группам внутри каждой страты
strata_stats AS (
    SELECT
        c.platform,
        c.experiment_group,
        AVG(c.y) AS mean_y,
        STDDEV(c.y) / SQRT(COUNT(*)) AS se_y,
        COUNT(*) AS n
    FROM combined c
    GROUP BY c.platform, c.experiment_group
),

-- Эффект внутри каждой страты
strata_effects AS (
    SELECT
        t.platform,
        sw.w,
        t.mean_y - c.mean_y AS effect,
        SQRT(t.se_y ^ 2 + c.se_y ^ 2) AS se_effect
    FROM strata_stats t
    JOIN strata_stats c
        ON t.platform = c.platform
        AND t.experiment_group = 'treatment'
        AND c.experiment_group = 'control'
    JOIN strata_weights sw ON sw.platform = t.platform
)

-- Взвешенная оценка общего эффекта
SELECT
    SUM(w * effect) AS ate_stratified,
    SQRT(SUM(w ^ 2 * se_effect ^ 2)) AS se_stratified
FROM strata_effects;

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

Вопросы с собеседований

"Объясните, что такое стратификация в A/B-тестах и зачем она нужна."

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

"Чем отличается pre-stratification от post-stratification?"

При pre-stratification рандомизация происходит внутри страт — это гарантирует одинаковое распределение страт между группами. При post-stratification рандомизация обычная, а стратификация применяется только на этапе анализа. Pre-stratification надёжнее при малых выборках, post-stratification проще внедрить.

"По каким признакам вы бы стратифицировали в e-commerce эксперименте с метрикой revenue?"

Платформа (iOS / Android), уровень активности за pre-period (heavy / medium / light), наличие подписки (платный / бесплатный). Каждый из этих признаков сильно коррелирует с revenue и делит выборку на группы с разным средним уровнем метрики.

"Можно ли стратифицировать по слишком большому числу признаков? Какие риски?"

Да, и это проблема. Если страт слишком много (например, пересечение 5 платформ, 20 стран и 4 сегментов активности = 400 страт), в каждой страте окажется мало пользователей. Оценки внутри мелких страт будут нестабильными, и итоговый выигрыш от стратификации может оказаться нулевым или даже отрицательным. Оптимально — 3–7 страт, каждая с достаточным количеством наблюдений.

"Стратификация или CUPED — что лучше?"

Зависит от ситуации. CUPED обычно даёт более сильное снижение дисперсии, потому что использует непрерывную ковариату и извлекает больше информации о поведении пользователя. Но стратификация работает там, где CUPED неприменим — для новых пользователей без pre-period данных, для категориальных признаков. Лучший вариант — комбинировать оба метода: стратифицировать рандомизацию, а затем применить CUPED внутри каждой страты.

"Как стратификация влияет на оценку гетерогенного эффекта?"

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

Итого

Стратификация — простой и надёжный метод снижения дисперсии в A/B-тестах. Он не требует сложной математики, легко реализуется в SQL и даёт стабильный выигрыш в 5–30% дисперсии. Ключевое — правильно выбрать страты: они должны быть связаны с метрикой, известны до эксперимента и создавать достаточно крупные подгруппы.

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


Потренируйтесь решать задачи по A/B-тестам в Карьернике — тренажёре для подготовки к собеседованиям аналитиков.

FAQ

Что такое стратификация в A/B-тестах?

Стратификация — разбиение пользователей на однородные подгруппы (страты) по заранее известным признакам. Оценивая эффект внутри каждой страты и беря взвешенное среднее, мы исключаем шум от различий между группами и получаем более точную оценку при том же объёме трафика.

По каким признакам стратифицировать выборку в A/B-тесте?

Лучшие страты — признаки, сильно связанные с метрикой эксперимента: платформа (iOS/Android/Web), уровень активности за pre-period, сегмент подписки, география. Оптимально 3-7 страт, каждая с достаточным количеством наблюдений.

Чем стратификация отличается от CUPED?

Стратификация работает с категориальными признаками и снижает дисперсию на 5-30%. CUPED использует непрерывную ковариату и снижает дисперсию на 20-80%. CUPED обычно мощнее, но стратификация работает для новых пользователей без pre-period данных. Лучший результат даёт комбинация обоих методов.

Чем pre-stratification отличается от post-stratification?

При pre-stratification рандомизация происходит внутри страт — это гарантирует одинаковое распределение сегментов между группами. При post-stratification рандомизация обычная, а стратификация применяется на этапе анализа. Pre-stratification надёжнее при малых выборках, post-stratification проще внедрить.