← Назад к вопросам

Задача на точность теста (PPV)

2.3 Middle🔥 141 комментариев
#Метрики и оценка моделей#Статистика и A/B тестирование

Условие

Тест на заболевание имеет чувствительность 99% и специфичность 95%. Распространённость заболевания в популяции составляет 1%.

Если тест показал положительный результат, какова вероятность, что человек действительно болен?

Рассчитайте положительную прогностическую ценность (PPV).

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Положительная прогностическая ценность (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. Распространённость низкая (1%): болезнь редкая
  2. Большинство населения здоровы (99%): даже 5% ложно-положительных от 9900 человек = 495 людей
  3. 99% чувствительность: тест выявляет только 99 больных
  4. Результат: ложно-положительных (495) БОЛЬШЕ чем истинно-положительных (99)!
  5. PPV низкая: даже хороший тест при редкой болезни может иметь низкую точность

Практическое значение

Это показывает парадокс редких событий в медицине:

  • Отличный тест (99% чувствительность, 95% специфичность)
  • Но при положительном результате вероятность болезни только 16.67%
  • Нужны дополнительные тесты для подтверждения

Как улучшить PPV?

  1. Увеличить специфичность (уменьшить ложно-положительные)

    • Специфичность 99%: PPV = 99 / (99 + 99) = 50%
  2. Тестировать группу высокого риска (увеличить распространённость)

    • Если распространённость 10%: PPV ≈ 68%
    • Если распространённость 50%: PPV ≈ 95%
  3. Использовать несколько тестов (комбинировать)

    • Два положительных теста подряд: PPV ≈ 85%

Применение в Data Science

  • Fraud Detection: класс очень редкий → нужна высокая специфичность
  • Disease Detection: нужна высокая чувствительность (не пропустить болезнь)
  • Spam Classification: баланс чувствительности и специфичности
  • Recommender Systems: PPV = precision (доля релевантных рекомендаций)