"""Ejemplo 4 - La regla de Bayes a mano: el problema del test medico."""

# Datos del enunciado:
P_ENFERMO = 0.001          # prevalencia: 1 de cada 1000 personas
SENSIBILIDAD = 0.99        # P(test positivo | enfermo)
ESPECIFICIDAD = 0.99       # P(test negativo | sano)


def bayes(p_h, p_e_dado_h, p_e_dado_no_h):
    """P(H|E) = P(E|H) * P(H) / P(E)"""
    p_no_h = 1 - p_h
    p_e = p_e_dado_h * p_h + p_e_dado_no_h * p_no_h      # probabilidad total
    return (p_e_dado_h * p_h) / p_e


falso_positivo = 1 - ESPECIFICIDAD

posterior = bayes(P_ENFERMO, SENSIBILIDAD, falso_positivo)

print("P(enfermo) antes del test      :", f"{P_ENFERMO:.4f}", f"({P_ENFERMO*100:.2f} %)")
print("P(positivo | enfermo)          :", SENSIBILIDAD)
print("P(positivo | sano)             :", f"{falso_positivo:.2f}")
print("-" * 52)
print("P(enfermo | test positivo)     :", f"{posterior:.4f}", f"({posterior*100:.2f} %)")

# Comprobacion contando personas, para ver por que da eso.
N = 100_000
enfermos = int(N * P_ENFERMO)
sanos = N - enfermos
verdaderos_pos = round(enfermos * SENSIBILIDAD)
falsos_pos = round(sanos * falso_positivo)

print("\nComprobacion sobre", f"{N:,}".replace(",", "."), "personas:")
print(f"  enfermos           : {enfermos}")
print(f"  positivos correctos: {verdaderos_pos}")
print(f"  positivos falsos   : {falsos_pos}")
print(f"  total de positivos : {verdaderos_pos + falsos_pos}")
print(f"  proporcion realmente enferma: "
      f"{verdaderos_pos}/{verdaderos_pos + falsos_pos} = "
      f"{verdaderos_pos/(verdaderos_pos + falsos_pos)*100:.2f} %")

# Un segundo test positivo, independiente del primero:
segundo = bayes(posterior, SENSIBILIDAD, falso_positivo)
print(f"\nSi un segundo test tambien da positivo: {segundo*100:.2f} %")
