Стратификация простыми словами
EXPLAIN вы видите узел Seq Scan on orders. Что это обычно означает?Содержание:
Короткое объяснение
Стратификация — разделение генеральной совокупности на однородные группы (страты) перед анализом. Снижает дисперсию и даёт более точные выводы.
Применяется:
- В выборках (stratified sampling)
- В A/B-тестах (stratified randomization)
- В пост-анализе (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:
- Разделить пользователей на страты (по квинтилям выручки)
- Внутри каждой страты — случайно 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])Добавляет точности даже без предварительной рандомизации.
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 для классификации — да (особенно при дисбалансе классов). Для регрессии — реже.