← Назад к вопросам

Что такое selection bias и как избежать его при проведении экспериментов?

2.3 Middle🔥 131 комментариев
#A/B тестирование#Статистика и математика

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Selection Bias в экспериментах

Selection Bias (смещение отбора) — это систематическое искажение результатов, возникающее, когда выборка для эксперимента не репрезентативна для всей целевой популяции. Это один из самых опасных источников ошибок в A/B тестировании, так как делает результаты неприменимыми к реальным пользователям.

Типы Selection Bias

1. Sampling Bias (смещение при выборке)

Твой тест включает только определённый сегмент пользователей, хотя должен быть репрезентативен для всех.

Пример: ты тестируешь новый язык интерфейса, но включаешь только англоговорящих пользователей. Результат может быть совсем другим для русскоязычной аудитории.

2. Survivorship Bias (смещение выжившего)

Твой анализ учитывает только пользователей, которые остались (не ушли), игнорируя тех, кто уехал.

Пример: ты измеряешь удовлетворенность в конце месяца, но не учитываешь пользователей, которые ушли в течение месяца. Если они ушли из-за плохого опыта в тесте, ты не увидишь это!

3. Self-Selection Bias (предвзятость самоотбора)

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

Пример: ты предлагаешь добровольное участие в опросе о новой функции. Пользователи, которые участвуют, часто имеют более сильные мнения (либо очень нравится, либо очень не нравится), чем среднестатистический пользователь.

4. Temporal Bias (временное смещение)

Время, когда проводится эксперимент, влияет на результаты.

Пример: тест скидки работает лучше в период праздников, но хуже в обычное время. Если ты запустил тест только перед праздниками, выводы будут неправильны.

Примеры Selection Bias в Product Analytics

Пример 1: Тест новой платежной системы

Ты тестируешь новый способ оплаты, но включаешь только пользователей, которые уже совершили покупку.

-- НЕПРАВИЛЬНО: только пользователи с покупками
SELECT 
  user_id,
  variant,
  COUNT(*) as purchases
FROM payments
WHERE test_id = 'payment_test'
GROUP BY user_id, variant;

-- ПРАВИЛЬНО: все пользователи, участвующие в тесте
SELECT 
  user_id,
  variant,
  COUNT(CASE WHEN payment_status = 'completed' THEN 1 END) as purchases,
  COUNT(*) as attempts
FROM test_users
LEFT JOIN payments ON test_users.user_id = payments.user_id
GROUP BY user_id, variant;

Пример 2: Churn bias

Твой тест повышает retention по метрикам, но в реальности пользователи, которые ушли, не учтены.

# НЕПРАВИЛЬНО: только активные пользователи
active_users = df[df['last_activity'] > '2024-01-01']
retention_rate = active_users[active_users['variant'] == 'test'].converted.mean()

# ПРАВИЛЬНО: все пользователи с флагом для ушедших
all_users = df  # все пользователи в тесте
retention_rate = all_users[all_users['variant'] == 'test']['still_active'].mean()

Как избежать Selection Bias

1. Случайная рандомизация (Randomization)

Основное оружие против selection bias. Случайное распределение пользователей в контроль и тест:

-- Случайное распределение при входе в систему
SELECT 
  user_id,
  CASE 
    WHEN RANDOM() < 0.5 THEN 'control'
    ELSE 'test'
  END as variant
FROM new_sessions
WHERE session_date >= '2024-01-01';

Это делает группы статистически эквивалентными по всем неизмеренным переменным.

2. Определи четкие критерии включения (Inclusion/Exclusion Criteria)

Четко определи, кто включается в тест:

-- Пример: только активные пользователи из определенных стран
SELECT user_id
FROM users
WHERE last_login >= NOW() - INTERVAL '30 days'  -- активны
  AND country IN ('US', 'GB', 'CA')              -- целевой регион
  AND signup_date <= NOW() - INTERVAL '7 days'  -- не новички
  AND NOT has_vip_access                        -- не VIP
ORDER BY RANDOM();

3. Стратификация (Stratified Randomization)

Желательно рандомизируй внутри каждого стратума отдельно:

WITH stratified AS (
  SELECT 
    user_id,
    country,
    ROW_NUMBER() OVER (PARTITION BY country ORDER BY RANDOM()) as rn
  FROM users
  WHERE inclusion_criteria = true
)
SELECT 
  user_id,
  country,
  CASE WHEN rn % 2 = 0 THEN 'control' ELSE 'test' END as variant
FROM stratified;

Это гарантирует одинаковое распределение стран в обоих вариантах.

4. Отслеживание и контроль дропаутов (Dropout Monitoring)

Отслеживай, кто выходит из теста и почему:

-- Анализ отсева
SELECT 
  variant,
  COUNT(DISTINCT user_id) as initial_users,
  COUNT(DISTINCT CASE WHEN last_activity >= NOW() - INTERVAL '7 days' THEN user_id END) as active_after_7d,
  COUNT(DISTINCT CASE WHEN removed_from_test = true THEN user_id END) as removed
FROM test_users
GROUP BY variant;

5. Интент-То-Трит (Intent-To-Treat) анализ

Анализируй всех пользователей, назначенных в тест, независимо от того, закончили ли они его:

# Intent-To-Treat: все, назначенные в тест
intent_to_treat = df[df['test_variant'].notna()]
control_conversion = intent_to_treat[intent_to_treat['variant'] == 'control']['converted'].mean()
test_conversion = intent_to_treat[intent_to_treat['variant'] == 'test']['converted'].mean()

print(f"Control: {control_conversion:.2%}")
print(f"Test: {test_conversion:.2%}")

6. Проверка баланса (Balance Check)

Перед анализом убедись, что группы сбалансированы по известным признакам:

-- Проверка баланса
SELECT 
  variant,
  AVG(age) as avg_age,
  APPROX_PERCENTILE_CONT(ltv, 0.5) as median_ltv,
  COUNT(DISTINCT CASE WHEN premium = true THEN user_id END) as premium_users
FROM test_users
GROUP BY variant;

-- Если значение сильно отличаются между вариантами — есть дисбаланс!

7. Измерение метрик "выживания"

Любой тест должен отслеживать, остаются ли пользователи в системе:

SELECT 
  variant,
  SUM(CASE WHEN still_active = true THEN 1 ELSE 0 END) as retained,
  COUNT(*) as total,
  ROUND(SUM(CASE WHEN still_active = true THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as retention_rate
FROM test_users
WHERE test_end_date <= NOW() - INTERVAL '7 days'  -- завершенные тесты
GROUP BY variant;

Красные флаги Selection Bias

  1. Группы заметно отличаются по демографии (возраст, страна, платформа)
  2. Размеры групп неравномерны (например, 30% в контроле, 70% в тесте)
  3. Baseline метрики (LTV, retention) сильно отличаются до начала теста
  4. Много пользователей выходит из одного варианта
  5. Результаты противоречат ожиданиям и качественным отзывам

Чек-лист для Product Analyst

  • Используется случайная рандомизация
  • Четко определены критерии включения
  • Проверен баланс групп по ключевым признакам
  • Отслежены дропауты и выход из теста
  • Используется Intent-To-Treat анализ
  • Проверено, что тест представителен для целевой аудитории
  • Анализ проведен по подгруппам для выявления Simpson's Paradox

Selection Bias — это не ошибка в расчетах, а фундаментальная проблема дизайна эксперимента. Тщательное планирование — лучшая защита.

Что такое selection bias и как избежать его при проведении экспериментов? | PrepBro