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

Проверь себя · 1/3разбор после ответа
В выводе EXPLAIN вы видите узел Seq Scan on orders. Что это обычно означает?

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

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

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

  1. В выборках (stratified sampling)
  2. В A/B-тестах (stratified randomization)
  3. В пост-анализе (stratified analysis)

Зачем

1. Более точная оценка

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

2. Репрезентативность

Гарантирует, что каждый сегмент правильно представлен.

3. Коррекция анализа

В A/B — корректирует несбалансированность страт.

Пример в выборках

У вас 10 000 пользователей:

  • 80% mobile, 20% desktop

Случайная выборка 1000 → примерно 800 mobile, 200 desktop. Но из-за случайности может получиться 850 / 150.

Stratified sampling:

  • Берём 800 mobile случайно
  • Берём 200 desktop случайно

Получаем точно пропорциональную выборку.

Пример в A/B

Равная случайная разбивка 50/50.

Проблема: если 10% китов генерируют 50% выручки, случайно 8 китов могут оказаться в контроле и 2 в тесте → тест проиграет, даже если фича крутая.

Stratified randomization:

  1. Разделить пользователей на страты (по квинтилям выручки)
  2. Внутри каждой страты — случайно 50/50

Теперь киты равномерно в обеих группах → дисперсия меньше → быстрее увидите эффект.

В 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

Если рандомизация уже прошла и группы несбалансированы по стратам:

# пост-стратифицированная оценка
effect = 0
for stratum in strata:
    effect += (weight[stratum] * effect_within_stratum[stratum])

Добавляет точности даже без предварительной рандомизации.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

CUPED и стратификация

CUPED (Controlled-experiment Using Pre-Experiment Data) — техника снижения дисперсии через предэкспериментальный ковариат. Концептуально похоже на стратификацию.

Y_cuped = Y - θ × (X - X̄)

Где X — поведение пользователя до теста. Снижает дисперсию на 20–50%.

Подробнее: CUPED.

Типичные страты в продуктах

  • Тип устройства: iOS vs Android vs web
  • Новые vs старые: по когорте
  • Уровень ценности: free vs paid vs enterprise
  • География: по странам и регионам
  • Поведение: power users vs casual

Принцип: страты должны быть однородны внутри и различаться между собой.

Когда не стоит

1. Мало данных

Глубокая стратификация с малой выборкой → каждая страта почти пустая.

2. Много слабо различающихся страт

Если разница между стратами маленькая — только накладные расходы без пользы.

3. Динамичная совокупность

Страты меняются со временем. Нужна регулярная ре-стратификация.

Родственник — blocking

В RCT (рандомизированном контролируемом испытании) используется blocking. Группы формируются внутри блоков (страт).

Концептуально то же самое, просто под другим названием.

На собесе

«Что такое стратификация?» Разделение на однородные группы для более точного анализа.

«Зачем в A/B?» Снижает дисперсию, особенно при наличии «китов».

«Как выбрать страты?» По переменной, которая сильно коррелирует с исходом (выручка, активность).

«CUPED vs стратификация?» Похожие идеи. CUPED работает с непрерывным ковариатом. Стратификация — с дискретным.

Частые ошибки

1. Слишком много страт

Если страт 50, а выборка 1000 — по 20 на страту. Шум побеждает.

2. Страты по нерелевантной переменной

Стратифицировать по времени суток, когда исход от него не зависит, — бесполезно.

3. Пост-стратификация как оправдание

Если A/B в общем проиграл, но «в страте X работает» — это p-hacking.

4. Игнорировать дисбаланс

Если страты разных размеров, нужны веса в финальной оценке.

5. Смешивать со сегментацией

Стратификация — метод дизайна. Сегментация — анализ по сегментам. Разные вещи.

Связанные темы

FAQ

Стратификация обязательна?

Нет. Для большинства A/B обычной рандомизации достаточно. Для метрик с тяжёлыми хвостами — помогает.

Сколько страт?

Обычно 2–10. Чем больше разброс в совокупности, тем больше страт имеет смысл.

CUPED или стратификация?

CUPED эффективнее для непрерывных ковариатов. Стратификация проще для категориальных.

В ML обязательна?

Stratified CV для классификации — да (особенно при дисбалансе классов). Для регрессии — реже.