Módulo 5 · Probabilidade e estatística

Probabilidade condicional e Bayes

Aula 5.2 · cerca de 20 minutos

P(A | B) = P(A ∩ B) / P(B)

Teorema de Bayes:  P(H | E) = P(E | H) · P(H) / P(E)

Bayes inverte a condicional: a partir da chance da evidência dada a hipótese, obtemos a chance da hipótese dada a evidência. P(H) é a priori, P(H | E) é a posteriori.

Exemplo: alerta de fraude

0,1% das transações são fraude. O detector acerta 99% das fraudes e dá falso positivo em 2% das transações legítimas. Se o alerta disparou, qual é a chance de ser fraude?

P(alerta) = 0,99·0,001 + 0,02·0,999 ≈ 0,02097
P(fraude | alerta) = 0,99·0,001 / 0,02097 ≈ 4,7%

Mais de 95% dos alertas são falsos. Com eventos raros, a taxa de falso positivo domina. Isso vale para monitoramento, detecção de spam e exames médicos.

# Filtro de spam Naive Bayes, mínimo
from collections import Counter
import math

def treina(docs):   # docs: lista de (palavras, é_spam)
    cont = {True: Counter(), False: Counter()}
    n = Counter()
    for palavras, spam in docs:
        cont[spam].update(palavras)
        n[spam] += 1
    return cont, n

def log_prob(palavras, cls, cont, n, vocab):
    total = sum(cont[cls].values())
    lp = math.log(n[cls] / sum(n.values()))
    for w in palavras:   # suavização de Laplace
        lp += math.log((cont[cls][w] + 1) / (total + vocab))
    return lp
Dica: Trabalhe com logaritmos de probabilidades. Multiplicar centenas de números pequenos dá underflow para 0.0; somar logs, não.

Exercício 1

Um teste de CI instável falha 30% das vezes quando há bug e 5% das vezes sem bug. 10% dos commits têm bug. O teste falhou: qual é a chance de haver bug?