Парадокс Симпсона — это ситуация, когда метрика растёт в каждом отдельном сегменте, но падает (или меняет направление) в общем агрегате. Причина почти всегда одна: сместились веса сегментов, то есть изменился mix. Если на собесе вам показывают «конверсия выросла у новых пользователей и у старых, но общая упала» — это не ошибка в данных, а классический парадокс Симпсона. Ниже разбираем, как он возникает, как воспроизвести его на SQL и Python, и как не попасться на этот подвох в продуктовых кейсах и A/B-тестах.
Что такое парадокс Симпсона простыми словами?
Парадокс Симпсона — это эффект, при котором тренд, видимый внутри каждой группы данных, исчезает или разворачивается, когда группы объединяют. Назван по статье Эдварда Симпсона 1951 года, хотя сам эффект описывали и раньше (Юл, Пирсон).
Ключевая мысль: общий агрегат — это не среднее по сегментам, а взвешенное среднее. Веса — это доли сегментов в общем объёме. Когда веса меняются, агрегат может пойти против сегментных трендов.
Простой числовой пример. Сравним конверсию в покупку на сайте в два месяца, разбив трафик на десктоп и мобильный.
| Сегмент | Месяц 1 | Месяц 2 |
|---|---|---|
| Десктоп | 100 / 1000 = 10% | 110 / 1000 = 11% |
| Мобильный | 60 / 3000 = 2% | 50 / 2000 = 2.5% |
| Итого | 160 / 4000 = 4% | 160 / 3000 = 5.3% |
Здесь оба сегмента выросли, и итог тоже вырос — пока всё честно. А теперь сломаем веса.
Как конверсия растёт в каждом сегменте, но падает в целом?
Возьмём другой расклад. Конверсия выросла и на десктопе, и на мобильном, но общая упала.
| Сегмент | Период A | Период B |
|---|---|---|
| Десктоп | 90 / 1000 = 9% | 95 / 1000 = 9.5% |
| Мобильный | 30 / 1000 = 3% | 120 / 3500 = 3.43% |
| Итого | 120 / 2000 = 6% | 215 / 4500 = 4.78% |
Десктоп: 9% → 9.5% (рост). Мобильный: 3% → 3.43% (рост). А общая конверсия: 6% → 4.78% (падение).
Что произошло? В периоде B резко вырос мобильный трафик (1000 → 3500). Мобильный конвертит в 3 раза хуже десктопа. Доля «плохого» сегмента подскочила с 50% до 78% всего трафика. Хорошая новость про рост внутри сегментов утонула под весом mix-shift.
Это и есть mix-shift: метрика верхнего уровня изменилась не потому, что сегменты стали хуже, а потому, что изменилась структура аудитории. Хотите потренировать такие разборы на живых данных — соберите запрос в SQL-тренажёре.
Чем парадокс Симпсона отличается от mix-shift?
Это связанные, но не идентичные понятия.
- Mix-shift — это сам факт смещения долей сегментов. Он есть всегда, когда меняется структура (больше мобильных, больше новичков, больше дешёвого тарифа). Mix-shift нейтрален: он может усиливать, гасить или разворачивать тренд.
- Парадокс Симпсона — это частный, самый коварный случай mix-shift, когда направление агрегата противоположно направлению во всех сегментах.
Можно сказать так: парадокс Симпсона — это «mix-shift настолько сильный, что перевернул знак». На практике аналитику важнее ловить любой mix-shift, потому что даже без разворота знака он искажает выводы.
Где парадокс Симпсона ломает A/B-тесты?
В A/B-тестах парадокс возникает, когда доли сегментов между контролем и тестом не совпадают. Чаще всего это симптом проблемы рандомизации.
Типовые причины:
- SRM (Sample Ratio Mismatch) — фактическое распределение пользователей по группам отличается от запланированного 50/50. Часть пользователей отвалилась на этапе попадания в эксперимент неслучайно (например, баг в SDK на старых Android роняет их до сплита).
- Несбалансированные ковариаты — в тест случайно попало больше платящих или больше мобильных. Глобальная метрика покажет ложный эффект.
- Разная длина наблюдения по сегментам — в одной группе больше «свежих» когорт с другим поведением.
Защита от парадокса в A/B:
- Всегда проверяйте SRM хи-квадратом перед чтением результата. Если p-value SRM < 0.001 — результату нельзя доверять, сначала ищите утечку.
- Считайте эффект внутри ключевых сегментов (платформа, новый/старый, гео), а не только агрегат.
- Используйте стратификацию или CUPED для снижения дисперсии и контроля состава.
Разобрать SRM и поведение метрик в эксперименте можно на AI мок-интервью, где интервьюер задаёт follow-up вопросы как на реальном собесе.
Как воспроизвести парадокс Симпсона на SQL?
Соберём данные так, чтобы увидеть и сегментную картину, и агрегат в одном запросе. Допустим, есть таблица событий с периодом, сегментом, числом пользователей и числом конверсий.
WITH segment_stats AS (
SELECT
period,
segment,
SUM(users) AS users,
SUM(conversions) AS conversions,
ROUND(100.0 * SUM(conversions) / SUM(users), 2) AS cr_segment
FROM funnel_events
GROUP BY period, segment
),
total_stats AS (
SELECT
period,
SUM(users) AS users,
SUM(conversions) AS conversions,
ROUND(100.0 * SUM(conversions) / SUM(users), 2) AS cr_total
FROM funnel_events
GROUP BY period
)
SELECT
s.period,
s.segment,
s.cr_segment,
t.cr_total,
ROUND(100.0 * s.users / t.users, 1) AS segment_weight_pct
FROM segment_stats s
JOIN total_stats t USING (period)
ORDER BY s.period, s.segment;
Колонка segment_weight_pct — это вес сегмента в периоде. Именно по ней видно mix-shift: если у «плохо конвертящего» сегмента вес вырос между периодами, ждите парадокса. Сравнивая cr_segment (растёт по сегментам) и cr_total (упал), вы наглядно ловите подвох.
Если хотите проверить запрос на реальной схеме — похожие задачи на воронки и сегментацию есть в кейсах и тестовых заданиях.
Как разложить изменение метрики на «эффект ставки» и «эффект веса»?
Это главный инструмент против парадокса — декомпозиция изменения (mix-rate decomposition). Общая конверсия равна сумме по сегментам: CR_total = сумма (вес_сегмента × CR_сегмента).
Изменение CR_total между периодами раскладывается на два слагаемых:
- Rate effect (эффект ставки) — насколько изменилась конверсия внутри сегментов при фиксированных старых весах.
- Mix effect (эффект веса) — насколько изменился агрегат только из-за сдвига весов при фиксированных старых ставках.
Формула для одного сегмента (вклад в изменение):
- Вклад rate = вес_старый × (CR_новый − CR_старый)
- Вклад mix = (вес_новый − вес_старый) × CR_старый
Просуммируйте по всем сегментам — получите общее изменение (плюс малый остаточный член взаимодействия). Если сумма rate-эффектов положительная, а итог отрицательный, значит mix-эффект «съел» весь рост. Это и есть формальное доказательство парадокса Симпсона в цифрах.
Как сделать декомпозицию mix-shift на Python?
Соберём данные в pandas и посчитаем оба эффекта явно.
import pandas as pd
# period A и B: пользователи и конверсии по сегментам
data = pd.DataFrame({
"segment": ["desktop", "mobile", "desktop", "mobile"],
"period": ["A", "A", "B", "B"],
"users": [1000, 1000, 1000, 3500],
"conv": [90, 30, 95, 120],
})
# конверсия и вес внутри каждого периода
data["cr"] = data["conv"] / data["users"]
data["weight"] = data.groupby("period")["users"].transform(lambda x: x / x.sum())
a = data[data.period == "A"].set_index("segment")
b = data[data.period == "B"].set_index("segment")
# декомпозиция вклада каждого сегмента в изменение общей CR
rate_effect = (a["weight"] * (b["cr"] - a["cr"])).sum()
mix_effect = ((b["weight"] - a["weight"]) * a["cr"]).sum()
cr_total_a = (a["weight"] * a["cr"]).sum()
cr_total_b = (b["weight"] * b["cr"]).sum()
print(f"CR total A: {cr_total_a:.4f}") # 0.0600
print(f"CR total B: {cr_total_b:.4f}") # 0.0478
print(f"Изменение : {cr_total_b - cr_total_a:.4f}") # -0.0122
print(f"Rate effect: {rate_effect:.4f}") # +0.0040 (рост в сегментах)
print(f"Mix effect : {mix_effect:.4f}") # -0.0166 (вес утопил)
Вывод читается однозначно: rate-эффект положительный (+0.40 п.п. от роста внутри сегментов), но mix-эффект отрицательный (−1.66 п.п. от смещения трафика на мобильный). Итог −1.22 п.п. Сегменты улучшились, агрегат ухудшился — парадокс подтверждён численно. Отработать такие разборы в pandas можно в Python-тренажёре.
Какие продуктовые кейсы маскируют парадокс Симпсона?
Самые частые ловушки в продуктовой аналитике, где агрегат врёт:
| Кейс | Что сдвигает mix | Симптом |
|---|---|---|
| Запуск маркетинга в новом гео | Приток дешёвого/холодного трафика | ARPU и конверсия падают, хотя в старых гео растут |
| Новая воронка для новичков | Доля новых пользователей растёт | Retention D7 падает (новички удерживаются хуже когорты) |
| Скидочная акция | Рост заказов с низким чеком | AOV падает при росте числа заказов |
| Расширение на B2C из B2B | Меняется структура клиентской базы | NRR/маржа падают при росте выручки |
| Сезонность мобильного трафика | Лето = больше мобильных | Конверсия проседает без изменения продукта |
Общее правило: любая метрика-отношение (конверсия, ARPU, retention, AOV, маржа) уязвима к mix-shift. Если метрика-отношение изменилась — первым делом проверьте, не изменился ли состав знаменателя. Похожие продуктовые разборы метрик есть в разделе метрики.
Как защититься от парадокса Симпсона на практике?
Чек-лист аналитика перед тем, как делать вывод по агрегату:
- Разбейте метрику по ключевым сегментам. Платформа, новый/старый, гео, тариф, канал привлечения. Если внутри сегментов тренд другой — у вас mix-shift.
- Посмотрите на веса сегментов в динамике. Постройте долю каждого сегмента по периодам. Резкий скачок доли — красный флаг.
- Сделайте декомпозицию rate vs mix. Это переводит «кажется, тут парадокс» в точные цифры вклада.
- Зафиксируйте веса (стандартизация). Пересчитайте агрегат при весах базового периода — увидите «чистый» эффект продукта без влияния структуры.
- В A/B всегда проверяйте SRM. Дисбаланс групп — главная причина парадокса в экспериментах.
- Не доверяйте одной цифре. Метрика верхнего уровня без сегментного среза — это всегда риск ложного вывода.
Эти шесть шагов закрывают 90% случаев, где «метрика упала, а на самом деле нет».
Как часто это спрашивают на собеседовании аналитика?
Парадокс Симпсона — один из топовых подвохов на собесах на позиции продуктового и аналитика данных. Типичные формулировки вопроса:
- «Конверсия выросла в каждом сегменте, но общая упала. Как такое возможно?»
- «A/B-тест показал лифт по выручке, но менеджер не верит. Что проверишь?»
- «Retention новых пользователей вырос, а общий retention падает. Объясни.»
Хороший ответ всегда содержит три части: (1) назвать механизм — mix-shift / парадокс Симпсона; (2) объяснить, что агрегат это взвешенное среднее и веса сместились; (3) предложить декомпозицию и сегментный срез как способ проверки. Если добавите упоминание SRM для A/B-контекста — это уровень middle+.
Реальные вопросы такого типа с разбором собраны в разделе вопросы с собесов.
Краткие выводы
- Парадокс Симпсона = mix-shift, перевернувший знак агрегата. Метрика растёт в сегментах, но падает в целом из-за смещения весов.
- Любая метрика-отношение уязвима: конверсия, ARPU, retention, AOV, маржа.
- В A/B главная причина — дисбаланс групп (SRM). Проверяйте хи-квадратом до чтения результата.
- Инструмент против парадокса — декомпозиция изменения на rate-эффект и mix-эффект. Считается в три строки на SQL или pandas.
- На собесе ответ строится по схеме: назвать механизм → объяснить через взвешенное среднее → предложить сегментный срез и декомпозицию.
Потренируйтесь бесплатно: соберите запрос с весами сегментов в SQL-тренажёре, посчитайте декомпозицию в Python-тренажёре и прогоните вопрос про конверсию на AI мок-интервью. Если хотите системно закрыть базу SQL под аналитику — начните с курса SQL с нуля.