Условная вероятность и теорема Байеса
Новая информация меняет вероятности. Условная вероятность и теорема Байеса учат пересчитывать шансы, когда что-то стало известно.
Условная вероятность P(A|B) — вероятность события A при условии, что событие B уже произошло.
Что такое «при условии»
Вероятность меняется, когда появляется информация. Вероятность, что случайный человек болен, — одна. Вероятность, что он болен, при условии что тест положительный, — совсем другая. Формула: P(A|B) = P(A и B) / P(B) — доля случаев A внутри тех случаев, где случилось B.
from fractions import Fraction
# Колода 36 карт. A = туз, B = красная карта (18 штук).
# Красных тузов 2. P(туз | карта красная)?
p_red = Fraction(18, 36)
p_red_ace = Fraction(2, 36) # красный туз
p_ace_given_red = p_red_ace / p_red
print("P(туз | красная):", p_ace_given_red)
# Сравним с безусловной вероятностью туза
print("P(туз) безусловно:", Fraction(4, 36))
Вывод:
P(туз | красная): 1/9 P(туз) безусловно: 1/9
Здесь они совпали — значит, «туз» и «красная» независимы (знание цвета не меняет шанс туза). Но так бывает не всегда; чаще условие сильно меняет вероятность.
Теорема Байеса
Часто мы знаем P(B|A), а нужна P(A|B) — «перевернуть» условие. Это делает теорема Байеса:
P(A|B) = P(B|A) · P(A) / P(B)
Звучит абстрактно, поэтому сразу разберём самый знаменитый пример, где интуиция жестоко обманывает.
Парадокс редкой болезни
Болезнь есть у 1% людей. Тест на неё хорош: при наличии болезни даёт «+» в 99% случаев, при отсутствии ошибочно даёт «+» лишь в 5% случаев. У вас тест положительный. Какова вероятность, что вы действительно больны? Большинство интуитивно говорит «процентов 95». Посчитаем.
# Разложим на 100000 человек — так нагляднее
total = 100000
sick = int(total * 0.01) # 1% больны
healthy = total - sick
# Положительные тесты
tp = sick * 0.99 # больные с "+" (верно)
fp = healthy * 0.05 # здоровые с "+" (ложная тревога)
all_positive = tp + fp
p_sick_given_positive = tp / all_positive
print("Больных:", sick, "Здоровых:", healthy)
print("Истинных '+':", int(tp), "Ложных '+':", int(fp))
print("Всего '+':", int(all_positive))
print("P(болен | тест '+'):", round(p_sick_given_positive, 3))
Вывод:
Больных: 1000 Здоровых: 99000 Истинных '+': 990 Ложных '+': 4950 Всего '+': 5940 P(болен | тест '+'): 0.167
Всего около 17%! Хотя тест очень точный, болезнь настолько редкая, что ложных тревог среди здоровых (4950) в пять раз больше, чем настоящих случаев (990). Поэтому при положительном тесте вы скорее здоровы. Это не недостаток теста — это математика редких событий, и именно её формализует теорема Байеса.
Та же задача формулой Байеса
# P(болен|+) = P(+|болен)*P(болен) / P(+)
p_sick = 0.01
p_pos_given_sick = 0.99
p_pos_given_healthy = 0.05
p_pos = p_pos_given_sick * p_sick + p_pos_given_healthy * (1 - p_sick)
p_sick_given_pos = p_pos_given_sick * p_sick / p_pos
print("P(тест '+') всего:", round(p_pos, 4))
print("P(болен | '+'):", round(p_sick_given_pos, 3))
Вывод:
P(тест '+') всего: 0.0594 P(болен | '+'): 0.167
Тот же ответ 0.167. Формула Байеса — просто компактная запись того же рассуждения «разложим на людей». Главный практический вывод: базовая частота события (как оно редко) критически важна, и игнорировать её — классическая ошибка.
Итог
- Условная вероятность P(A|B) = P(A и B) / P(B) — вероятность A, когда известно B.
- Теорема Байеса переворачивает условие: P(A|B) = P(B|A)·P(A)/P(B).
- При редком событии даже точный тест даёт много ложных тревог — нужно учитывать базовую частоту.
- Разложение «на 100000 человек» даёт тот же ответ, что и формула, но нагляднее.