Парадокс Симпсона
Как одно и то же лекарство может быть лучше в каждой группе, но хуже в целом.
Парадокс Симпсона — ситуация, когда зависимость, наблюдаемая внутри каждой подгруппы, исчезает или меняется на противоположную при объединении подгрупп.
Это не оптическая иллюзия и не ошибка в данных — это реальное и опасное явление статистики. Лекарство $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$ достаётся в основном тяжёлым пациентам с низким базовым шансом. Парадокс воспроизведён из чистого механизма.
Как работает под капотом
В симуляции исход определяется двумя факторами: тяжестью (сильный эффект) и лечением (слабый бонус). Поскольку назначение лечения коррелирует с тяжестью, агрегированная статистика смешивает «эффект лечения» с «эффектом тяжести» — и второй перевешивает. Правильный вывод даёт только разбивка по группам, где тяжесть зафиксирована. Это и есть суть парадокса: усреднять можно лишь при равных условиях, иначе скрытая переменная исказит картину.
Частые ошибки
Первая ошибка — доверять агрегированной таблице, не проверив, нет ли скрытой переменной, по-разному распределённой между группами. Вторая — наоборот, всегда дробить данные на подгруппы: иногда правильно как раз агрегированное число, если подгруппа не влияет на исход напрямую. Решает не статистика, а понимание причинных связей. Третья — считать парадокс ошибкой вычислений: цифры верны, обманчива их интерпретация.
Итог
- Тренд внутри групп может перевернуться при их объединении.
- Причина — скрытая переменная, неравномерно распределённая по группам.
- Правильный вывод требует понимания причинных связей, а не только цифр.
- Числа в парадоксе верны — обманчива лишь их наивная интерпретация.