sqlстатистикапродуктовая-аналитикаab-тестыметрикисобеседование

Парадокс Симпсона: когда агрегат врёт (примеры)

2026-06-09 9 мин

Парадокс Симпсона — это ситуация, когда метрика растёт в каждом отдельном сегменте, но падает (или меняет направление) в общем агрегате. Причина почти всегда одна: сместились веса сегментов, то есть изменился 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, потому что даже без разворота знака он искажает выводы.

Где парадокс Симпсона ломает A/B-тесты?

В A/B-тестах парадокс возникает, когда доли сегментов между контролем и тестом не совпадают. Чаще всего это симптом проблемы рандомизации.

Типовые причины:

Защита от парадокса в A/B:

Разобрать 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-эффектов положительная, а итог отрицательный, значит 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. Если метрика-отношение изменилась — первым делом проверьте, не изменился ли состав знаменателя. Похожие продуктовые разборы метрик есть в разделе метрики.

Как защититься от парадокса Симпсона на практике?

Чек-лист аналитика перед тем, как делать вывод по агрегату:

Эти шесть шагов закрывают 90% случаев, где «метрика упала, а на самом деле нет».

Как часто это спрашивают на собеседовании аналитика?

Парадокс Симпсона — один из топовых подвохов на собесах на позиции продуктового и аналитика данных. Типичные формулировки вопроса:

Хороший ответ всегда содержит три части: (1) назвать механизм — mix-shift / парадокс Симпсона; (2) объяснить, что агрегат это взвешенное среднее и веса сместились; (3) предложить декомпозицию и сегментный срез как способ проверки. Если добавите упоминание SRM для A/B-контекста — это уровень middle+.

Реальные вопросы такого типа с разбором собраны в разделе вопросы с собесов.

Краткие выводы

Потренируйтесь бесплатно: соберите запрос с весами сегментов в SQL-тренажёре, посчитайте декомпозицию в Python-тренажёре и прогоните вопрос про конверсию на AI мок-интервью. Если хотите системно закрыть базу SQL под аналитику — начните с курса SQL с нуля.

Лови подвохи на кейсах
Продуктовые кейсы с разбором mix-shift и Симпсона + AI-оценка твоего решения.
Открыть кейсы →