Задача на точность теста (PPV)
Условие
Тест на заболевание имеет чувствительность 99% и специфичность 95%. Распространённость заболевания в популяции составляет 1%.
Если тест показал положительный результат, какова вероятность, что человек действительно болен?
Рассчитайте положительную прогностическую ценность (PPV).
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Положительная прогностическая ценность (PPV): диагностический тест
Условие задачи
- Чувствительность (Sensitivity) = 99% = 0.99
- Специфичность (Specificity) = 95% = 0.95
- Распространённость (Prevalence) = 1% = 0.01
Тест положительный. Какова вероятность, что человек действительно болен?
Определения
Чувствительность (TPR - True Positive Rate):
P(+ | Болен) = 0.99
Вероятность положительного теста при наличии болезни.
Специфичность (TNR - True Negative Rate):
P(- | Не болен) = 0.95
Или: P(+ | Не болен) = 1 - 0.95 = 0.05
Вероятность отрицательного теста при отсутствии болезни.
Распространённость:
P(Болен) = 0.01
P(Не болен) = 0.99
Положительная прогностическая ценность (PPV)
Формула:
PPV = P(Болен | +) = P(+ | Болен) × P(Болен) / P(+)
Решение по теореме Байеса
Шаг 1: Определяем основные вероятности
P(Болен) = 0.01
P(Не болен) = 0.99
P(+ | Болен) = 0.99
P(+ | Не болен) = 0.05
Шаг 2: Вычисляем полную вероятность положительного результата
P(+) = P(+ | Болен) × P(Болен) + P(+ | Не болен) × P(Не болен)
= 0.99 × 0.01 + 0.05 × 0.99
= 0.0099 + 0.0495
= 0.0594
Шаг 3: Применяем теорему Байеса
PPV = P(Болен | +) = (0.99 × 0.01) / 0.0594
= 0.0099 / 0.0594
≈ 0.1667
≈ 16.67%
Ответ
Если тест положительный, вероятность что человек действительно болен ≈ 16.67% или 1 из 6
Расчёт на Python
# Параметры теста
sensitivity = 0.99 # P(+ | болен)
specificity = 0.95 # P(- | не болен)
prevalence = 0.01 # P(болен)
# Производные вероятности
P_positive_given_sick = sensitivity
P_negative_given_healthy = specificity
P_positive_given_healthy = 1 - specificity
P_sick = prevalence
P_healthy = 1 - prevalence
print(f"P(+ | Болен) = {P_positive_given_sick}")
print(f"P(+ | Не болен) = {P_positive_given_healthy}")
print(f"P(Болен) = {P_sick}")
print(f"P(Не болен) = {P_healthy}\n")
# Полная вероятность положительного результата
P_positive = (P_positive_given_sick * P_sick) + (P_positive_given_healthy * P_healthy)
print(f"P(+) = {P_positive:.4f}\n")
# PPV - вероятность что болен если тест положительный
PPV = (P_positive_given_sick * P_sick) / P_positive
print(f"PPV = P(Болен | +) = {PPV:.4f}")
print(f"Процентов: {PPV * 100:.2f}%")
print(f"Или: 1 из {1/PPV:.1f}")
Вывод:
P(+ | Болен) = 0.99
P(+ | Не болен) = 0.05
P(Болен) = 0.01
P(Не болен) = 0.99
P(+) = 0.0594
PPV = P(Болен | +) = 0.1667
Процентов: 16.67%
Или: 1 из 6.0
Визуализация на конкретных числах
Представим 10,000 человек:
10,000 человек
├─ 100 больных (1%)
│ └─ 99 положительный тест (99%)
│ └─ 1 отрицательный тест (1%)
└─ 9,900 здоровых (99%)
├─ 495 положительный тест (5%)
└─ 9,405 отрицательный тест (95%)
Всего положительных тестов: 99 + 495 = 594
Из них действительно больных: 99
Процент: 99 / 594 = 0.1667 = 16.67%
Другие метрики качества теста
Чувствительность (Sensitivity / Recall):
P(+ | Болен) = 99 / 100 = 0.99 = 99%
Из всех больных тест выявит 99%.
Специфичность (Specificity):
P(- | Не болен) = 9405 / 9900 = 0.95 = 95%
Из всех здоровых тест подтвердит 95% как здоровых.
Отрицательная прогностическая ценность (NPV):
NPV = P(Не болен | -) = (0.95 × 0.99) / (0.95 × 0.99 + 0.01 × 0.01)
= 0.9405 / 0.9406
≈ 0.99989 ≈ 99.99%
Таблица 2×2 (Confusion Matrix)
Тест положительный Тест отрицательный
Действительно болен 99 1
Действительно здоров 495 9405
TPR (Sensitivity) = 99 / 100 = 99%
TNR (Specificity) = 9405 / 9900 = 95%
PPV = 99 / 594 = 16.67%
NPV = 9405 / 9406 = 99.99%
Интуитивное объяснение
- Распространённость низкая (1%): болезнь редкая
- Большинство населения здоровы (99%): даже 5% ложно-положительных от 9900 человек = 495 людей
- 99% чувствительность: тест выявляет только 99 больных
- Результат: ложно-положительных (495) БОЛЬШЕ чем истинно-положительных (99)!
- PPV низкая: даже хороший тест при редкой болезни может иметь низкую точность
Практическое значение
Это показывает парадокс редких событий в медицине:
- Отличный тест (99% чувствительность, 95% специфичность)
- Но при положительном результате вероятность болезни только 16.67%
- Нужны дополнительные тесты для подтверждения
Как улучшить PPV?
-
Увеличить специфичность (уменьшить ложно-положительные)
- Специфичность 99%: PPV = 99 / (99 + 99) = 50%
-
Тестировать группу высокого риска (увеличить распространённость)
- Если распространённость 10%: PPV ≈ 68%
- Если распространённость 50%: PPV ≈ 95%
-
Использовать несколько тестов (комбинировать)
- Два положительных теста подряд: PPV ≈ 85%
Применение в Data Science
- Fraud Detection: класс очень редкий → нужна высокая специфичность
- Disease Detection: нужна высокая чувствительность (не пропустить болезнь)
- Spam Classification: баланс чувствительности и специфичности
- Recommender Systems: PPV = precision (доля релевантных рекомендаций)