Стратификация в 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 проще внедрить.