Стратификация простыми словами

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Короткое объяснение

Стратификация — разделение population на однородные группы (страты) перед анализом. Снижает variance и даёт более точные выводы.

Применяется:

  1. В sampling (stratified sampling)
  2. В A/B-тестах (stratified randomization)
  3. В 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:

  1. Разделить пользователей на страты (по revenue quintile)
  2. Внутри каждой страты — случайно 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+ вопросами для собесов.