Что такое Simpson"s Paradox и как он может повлиять на результаты A/B теста?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Simpson's Paradox в A/B тестировании
Simpson's Paradox — это парадокс в статистике, когда тренд, очевидный в отдельных группах данных, исчезает или даже разворачивается в противоположную сторону при объединении этих групп. Это коварное явление, которое может привести к ошибочным выводам в A/B тестировании.
Классический пример
Представь, что ты тестируешь новый алгоритм рекомендаций. Результаты по группам пользователей:
По странам отдельно:
| Страна | Контроль Конверсия | Тест Конверсия | Вариант выигрывает |
|---|---|---|---|
| США | 10/100 = 10% | 30/300 = 10% | Ничья |
| Европа | 50/500 = 10% | 40/400 = 10% | Ничья |
| Азия | 20/200 = 10% | 15/150 = 10% | Ничья |
Общие результаты (объединено):
| Вариант | Конверсии | Пользователи | Коэффициент |
|---|---|---|---|
| Контроль | 80 | 800 | 10% |
| Тест | 85 | 850 | 10% |
Всё выглядит равным, но что если распределение пользователей разное?
Реальный пример с дисбалансом:
| Страна | Контроль (users, converts) | Тест (users, converts) |
|---|---|---|
| США | 100 users, 5 converts | 500 users, 20 converts |
| Европа | 400 users, 80 converts | 100 users, 10 converts |
Итого:
- Контроль: (5 + 80) / (100 + 400) = 85 / 500 = 17%
- Тест: (20 + 10) / (500 + 100) = 30 / 600 = 5%
Тест проиграл! Но почему? Потому что в тесте больше пользователей из США (низкая конверсия), а в контроле больше из Европы (высокая конверсия).
Почему это происходит
Simpson's Paradox возникает из-за дисбаланса в распределении подгрупп:
- Размеры подгрупп сильно отличаются
- Разные базовые коэффициенты конверсии в подгруппах
- Дисбаланс распределения между вариантами
Как Simpson's Paradox влияет на A/B тесты
Пример из реальной жизни: платежная способность
Твой новый паттерн повышает конверсию во всех странах, но в бедных странах конверсия в целом низче. Если в тесте случайно больше пользователей из бедных стран, общая конверсия упадет.
SQL пример для выявления:
-- Проверь распределение по страна между вариантами
SELECT
country,
variant,
COUNT(*) as user_count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY variant), 2) as pct_in_variant
FROM test_users
WHERE test_id = 'abc123'
GROUP BY country, variant
ORDER BY variant, user_count DESC;
Как защитить A/B тест от Simpson's Paradox
1. Стратификация (Stratified Randomization)
Рандомизируй пользователей внутри каждой подгруппы отдельно:
-- Убедись, что распределение по стратам одинаковое
WITH stratified_assignment AS (
SELECT
user_id,
country,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY country ORDER BY RAND()) % 2 = 0
THEN 'control'
ELSE 'treatment'
END as variant
FROM users
)
SELECT
country,
variant,
COUNT(*) as count
FROM stratified_assignment
GROUP BY country, variant;
2. Анализ по подгруппам (Segmented Analysis)
Всегда анализируй результаты отдельно по подгруппам:
SELECT
country,
variant,
COUNT(*) as users,
SUM(CASE WHEN converted THEN 1 ELSE 0 END) as conversions,
ROUND(
SUM(CASE WHEN converted THEN 1 ELSE 0 END) * 100.0 / COUNT(*),
2
) as conversion_rate
FROM test_events
WHERE test_id = 'abc123'
GROUP BY country, variant
ORDER BY country, variant;
3. ANCOVA (Analysis of Covariance)
Включи страну как ковариату в анализ, чтобы контролировать её влияние.
4. Проверка баланса перед запуском
Убедись, что распределение пользователей по подгруппам одинаково в обоих вариантах:
import pandas as pd
from scipy.stats import chi2_contingency
# Таблица сопряженности для проверки баланса
contingency_table = pd.crosstab(
test_df['country'],
test_df['variant']
)
chi2, p_value, dof, expected = chi2_contingency(contingency_table)
print(f"p-value для баланса: {p_value}")
if p_value > 0.05:
print("Баланс хороший, нет значимых различий в распределении")
else:
print("ВНИМАНИЕ: Дисбаланс! Нужна стратификация")
Пример из практики
Ты тестируешь новый UI для чекаута. Результаты:
Без сегментирования:
- Контроль: 15% конверсия
- Тест: 14% конверсия
- Вывод: Тест хуже (НЕПРАВИЛЬНО)
Со сегментированием по устройствам:
| Устройство | Контроль | Тест | Результат |
|---|---|---|---|
| Desktop | 20% | 25% | Тест выигрывает! |
| Mobile | 8% | 7% | Контроль лучше |
Причина: В тесте больше мобильных пользователей, которые в целом конвертируют хуже. Но для мобильных новый UI ХУЖЕ, а для десктопа ЛУЧШЕ.
Это классический Simpson's Paradox!
Чек-лист для аналитика
-
Перед запуском теста:
- Используй стратификацию по важным переменным
- Проверь баланс распределения
-
При анализе результатов:
- Всегда смотри результаты по подгруппам
- Проверь, нет ли дисбаланса в распределении
- Убедись, что выводы консистентны во всех подгруппах
-
Если нашел парадокс:
- Документируй дисбаланс
- Не игнорируй эффект — это реален!
- Подумай, почему произошел дисбаланс
- Используй ANCOVA для контроля переменной
Simpson's Paradox — это не ошибка статистики, а напоминание о важности тщательного анализа данных.