Парадокс Симпсона

Как одно и то же лекарство может быть лучше в каждой группе, но хуже в целом.

Парадокс Симпсона — ситуация, когда зависимость, наблюдаемая внутри каждой подгруппы, исчезает или меняется на противоположную при объединении подгрупп.

Это не оптическая иллюзия и не ошибка в данных — это реальное и опасное явление статистики. Лекарство $A$ помогает лучше лекарства $B$ и мужчинам, и женщинам по отдельности, но в общей таблице $B$ выглядит эффективнее. Понимание этого парадокса защищает от ложных выводов в медицине, экономике и аналитике. Парадокс не выдуман для учебников — он раз за разом всплывает в реальных данных. Знаменитый случай произошёл в Калифорнийском университете в Беркли: статистика приёма показывала, что мужчин зачисляют чаще женщин, и это выглядело как дискриминация. Но разбивка по факультетам обнаружила обратное: на большинстве факультетов женщин принимали даже чуть охотнее. Дело было в том, что женщины чаще подавали документы на самые конкурсные факультеты с низким процентом приёма у всех. Агрегированная цифра вводила в заблуждение, а правда открывалась только при учёте скрытой переменной — выбора факультета. Этот пример показывает, насколько практически важно уметь распознавать парадокс Симпсона прежде, чем делать громкие выводы из таблиц.

Числовой пример

Сравним два лечения. В каждой группе доля успеха у лечения $A$ выше:

ГруппаЛечение AЛечение B
Лёгкие случаи81/87 ≈ 93%234/270 ≈ 87%
Тяжёлые случаи192/263 ≈ 73%55/80 ≈ 69%
Всего273/350 = 78%289/350 ≈ 83%

В лёгких случаях $A$ лучше ($93\%$ против $87\%$), в тяжёлых тоже ($73\%$ против $69\%$) — но в сумме $A$ хуже ($78\%$ против $83\%$). Загадка в том, что лечение $A$ чаще применяли к тяжёлым случаям, где успех в принципе ниже. Скрытая переменная — тяжесть болезни — искажает общий итог. Воспроизведём цифры программой.

groups = {
    "лёгкие":  {"A": (81, 87),  "B": (234, 270)},
    "тяжёлые": {"A": (192, 263), "B": (55, 80)},
}
for g, d in groups.items():
    aw, an = d["A"]; bw, bn = d["B"]
    print(f"{g:>8}: A={aw/an:.3f}  B={bw/bn:.3f}")

total = {"A": [0, 0], "B": [0, 0]}
for d in groups.values():
    for t in ("A", "B"):
        total[t][0] += d[t][0]; total[t][1] += d[t][1]
print("   всего: A=%.3f  B=%.3f" % (
    total["A"][0]/total["A"][1], total["B"][0]/total["B"][1]))

Вывод:

  лёгкие: A=0.931  B=0.867
 тяжёлые: A=0.730  B=0.688
   всего: A=0.780  B=0.826

Числа подтверждают парадокс: $A$ выигрывает в каждой строке, но проигрывает в итоговой.

Симуляция механизма

Покажем, что парадокс возникает естественно, если назначение лечения зависит от тяжести. Смоделируем пациентов: тяжёлым чаще дают $A$, лёгким — $B$, а вероятность выздороветь зависит в первую очередь от тяжести.

import random
random.seed(25)

wins = {"A": [0, 0], "B": [0, 0]}  # [успехи, всего]
for _ in range(400000):
    severe = random.random() < 0.45
    # тяжёлым чаще назначают A, лёгким — B
    treat = "A" if (random.random() < (0.8 if severe else 0.25)) else "B"
    base = 0.70 if severe else 0.90      # шанс зависит от тяжести
    bonus = 0.04 if treat == "A" else 0  # A немного лучше в каждой группе
    cured = random.random() < base + bonus
    wins[treat][1] += 1
    wins[treat][0] += 1 if cured else 0

for t in ("A", "B"):
    print(f"{t}: общий успех = {wins[t][0]/wins[t][1]:.3f}")

Вывод:

A: общий успех = 0.760
B: общий успех = 0.866

Хотя в коде лечение $A$ всегда добавляет бонус $+0{,}04$ к шансу выздоровления, общий показатель $A$ ниже — потому что $A$ достаётся в основном тяжёлым пациентам с низким базовым шансом. Парадокс воспроизведён из чистого механизма.

Как работает под капотом

В симуляции исход определяется двумя факторами: тяжестью (сильный эффект) и лечением (слабый бонус). Поскольку назначение лечения коррелирует с тяжестью, агрегированная статистика смешивает «эффект лечения» с «эффектом тяжести» — и второй перевешивает. Правильный вывод даёт только разбивка по группам, где тяжесть зафиксирована. Это и есть суть парадокса: усреднять можно лишь при равных условиях, иначе скрытая переменная исказит картину.

Частые ошибки

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

Итог

  • Тренд внутри групп может перевернуться при их объединении.
  • Причина — скрытая переменная, неравномерно распределённая по группам.
  • Правильный вывод требует понимания причинных связей, а не только цифр.
  • Числа в парадоксе верны — обманчива лишь их наивная интерпретация.
Проверьте себя
1. В чём суть парадокса Симпсона?
AОшибка в подсчётах
BТренд в подгруппах меняется на противоположный при объединении
CВероятности не суммируются в 1
DДанные сфальсифицированы
2. Что обычно вызывает парадокс Симпсона?
AСлишком малая выборка
BСкрытая переменная, неравномерно распределённая между группами
CОкругление
DСлучайный шум
3. Как правильно делать вывод при подозрении на парадокс Симпсона?
AВсегда смотреть только агрегат
BОпираться на понимание причинных связей, а не только на цифры
CИгнорировать подгруппы
DУдалить тяжёлые случаи