Стратификация простыми словами
Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.
Короткое объяснение
Стратификация — разделение population на однородные группы (страты) перед анализом. Снижает variance и даёт более точные выводы.
Применяется:
- В sampling (stratified sampling)
- В A/B-тестах (stratified randomization)
- В post-hoc анализе (stratified analysis)
Зачем
1. Более точная оценка
Обычная случайная выборка из heterogeneous population даёт variance. Стратификация уменьшает её — внутри страт объекты более похожи.
2. Representative sampling
Гарантирует, что каждый сегмент правильно представлен.
3. Corrected analysis
В A/B — корректирует для несбалансированных страт.
Пример в sampling
У вас 10 000 пользователей:
- 80% mobile, 20% desktop
Случайная выборка 1000 → примерно 800 mobile, 200 desktop. Но из-за случайности может быть 850 / 150.
Stratified sampling:
- Берём 800 mobile случайно
- Берём 200 desktop случайно
Получаем точно пропорциональную выборку.
Пример в A/B
Равная случайная аллокация 50/50.
Проблема: если у вас 10% whales генерируют 50% revenue, случайно 8 whales в control и 2 в test → test проиграет, даже если feature крутая.
Stratified randomization:
- Разделить пользователей на страты (по revenue quintile)
- Внутри каждой страты — случайно 50/50
Теперь whales равномерно в обеих группах → variance меньше → быстрее выявите effect.
В Python
Stratified sampling
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
stratify=y, # страты по y (обычно target)
random_state=42
)Stratified K-Fold (CV)
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True)
for train_idx, test_idx in skf.split(X, y):
...В SQL (stratified random sampling)
-- Postgres
WITH stratified AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY tier ORDER BY RANDOM()) AS rn,
COUNT(*) OVER (PARTITION BY tier) AS strata_size
FROM users
)
SELECT * FROM stratified
WHERE rn <= CEIL(strata_size * 0.1); -- 10% из каждой стратыPost-stratification
Если randomization уже прошла и группы несбалансированы по страте:
# post-stratified estimator
effect = 0
for stratum in strata:
effect += (weight[stratum] * effect_within_stratum[stratum])Добавляет точности даже без предварительной рандомизации.
CUPED и стратификация
CUPED (Controlled-experiment Using Pre-Experiment Data) — техника снижения variance через pre-period covariate. Концептуально похоже на стратификацию.
Y_cuped = Y - θ × (X - X̄)Где X — поведение пользователя до теста. Снижает variance на 20-50%.
Подробнее: CUPED.
Типичные страты в продуктах
- Device type: iOS vs Android vs web
- Новые vs старые: по cohort
- Value tier: free vs paid vs enterprise
- Gео: по странам / регионам
- Поведение: power users vs casual
Принцип: страты должны быть однородны внутри и отличаться снаружи.
Когда не стоит
1. Мало данных
Deep stratification с малой выборкой → каждая страта пустая.
2. Много слабо отличающихся страт
Если разница между стратами маленькая — overhead без пользы.
3. Dynamic population
Страты меняются со временем. Нужен re-stratification регулярно.
Kvazi-стратификация: через blocking
В RCT (randomized controlled trial) — blocking. Группы формируются внутри блоков (стратов).
Концептуально то же самое, просто под другим названием.
На собесе
«Что такое стратификация?» Разделение на однородные группы для более точного анализа.
«Зачем в A/B?» Снижает variance, особенно при наличии «китов».
«Как выбрать страты?» По переменной, которая сильно коррелирует с outcome (revenue, activity).
«CUPED vs stratification?» Похожие идеи. CUPED работает с continuous covariate. Stratification — с дискретными.
Частые ошибки
1. Слишком много страт
Если страт 50, а выборка 1000 — по 20 на страту. Шум побеждает.
2. Страты по неревелантной переменной
Стратифицировать по времени суток, когда outcome от него не зависит, — бесполезно.
3. Post-hoc stratification как оправдание
Если A/B проиграл overall, но «в страте X работает» — это p-hacking.
4. Ignore имбаланса
Если страты разных размеров, нужны weights в финальной оценке.
5. Смешивать с сегментацией
Stratification = метод. Segmentation = анализ для разных сегментов. Разные вещи.
Связанные темы
FAQ
Stratification обязательна?
Нет. Для большинства A/B обычной randomization достаточно. Для heavy-tailed метрик — помогает.
Сколько страт?
2-10 обычно. Чем больше вариация в population, тем больше страт имеет смысл.
CUPED или stratification?
CUPED эффективнее для continuous covariates. Stratification проще для категориальных.
В ML обязательна?
Stratified CV для classification — да (особенно imbalanced). Для регрессии — реже.
Тренируйте статистику — откройте тренажёр с 1500+ вопросами для собесов.