Условная вероятность и теорема Байеса

Новая информация меняет вероятности. Условная вероятность и теорема Байеса учат пересчитывать шансы, когда что-то стало известно.

Условная вероятность 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 человек» даёт тот же ответ, что и формула, но нагляднее.
Проверьте себя
1. Что обозначает запись P(A|B)?
AВероятность A или B
BВероятность A при условии, что B уже произошло
CВероятность A и B одновременно
DВероятность, что A не произойдёт
2. Почему при положительном тесте на редкую болезнь вероятность болезни оказалась всего ~17%?
AТест неисправен
BБолезнь очень редкая, поэтому ложных срабатываний у здоровых больше, чем настоящих случаев
CПроизошла ошибка в расчётах
DP(болен) была равна 17%
3. Что критически важно учитывать в задачах с теоремой Байеса?
AТолько точность теста
BБазовую частоту события (насколько оно редкое или частое)
CРазмер шрифта в условии
DПорядок событий
Поддержать проект