# rede_bayesiana_clientes.py
from typing import Literal, Dict, Tuple
Historico = Literal["sim", "nao"]
Tempo = Literal["pouco", "muito"]
Promo = Literal["sim", "nao"]
Compra = Literal["sim", "nao"]
# 1) Probabilidades marginais das variáveis "pais"
P_historico: Dict[Historico, float] = {
"sim": 0.4,
"nao": 0.6,
}
P_tempo: Dict[Tempo, float] = {
"muito": 0.3,
"pouco": 0.7,
}
P_promo: Dict[Promo, float] = {
"sim": 0.2,
"nao": 0.8,
}
# 2) Tabela de probabilidade condicional P(compra | historico, tempo, promo)
# Valores fictícios, apenas para exemplo.
# Chave: (historico, tempo, promo)
P_compra_dado_pais: Dict[Tuple[Historico, Tempo, Promo], float] = {
("sim", "muito", "sim"): 0.90,
("sim", "muito", "nao"): 0.75,
("sim", "pouco", "sim"): 0.70,
("sim", "pouco", "nao"): 0.50,
("nao", "muito", "sim"): 0.60,
("nao", "muito", "nao"): 0.40,
("nao", "pouco", "sim"): 0.35,
("nao", "pouco", "nao"): 0.10,
}
def prob_compra(
historico: Historico,
tempo: Tempo,
promo: Promo,
) -> Dict[Compra, float]:
"""
Retorna P(compra = sim | evidência) e P(compra = nao | evidência).
Como já temos a Tabela P(compra | pais), basta usar diretamente.
"""
p_sim = P_compra_dado_pais[(historico, tempo, promo)]
p_nao = 1.0 - p_sim
return {"sim": p_sim, "nao": p_nao}
def prob_conjunta(
historico: Historico,
tempo: Tempo,
promo: Promo,
compra: Compra,
) -> float:
"""
Calcula P(historico, tempo, promo, compra).
Útil para ver a distribuição conjunta do modelo.
"""
p_h = P_historico[historico]
p_t = P_tempo[tempo]
p_p = P_promo[promo]
p_c_sim = P_compra_dado_pais[(historico, tempo, promo)]
p_c = p_c_sim if compra == "sim" else (1.0 - p_c_sim)
return p_h * p_t * p_p * p_c
if __name__ == "__main__":
# Exemplos de consulta:
casos = [
("sim", "muito", "sim"),
("sim", "pouco", "nao"),
("nao", "muito", "sim"),
("nao", "pouco", "nao"),
]
for h, t, p in casos:
cond = prob_compra(h, t, p)
print("=== Cliente ===")
print(f"Histórico de compras: {h}")
print(f"Tempo no site: {t}")
print(f"Clicou em promo?: {p}")
print(f"P(compra = sim | evidência) = {cond['sim']:.2f}")
print(f"P(compra = nao | evidência) = {cond['nao']:.2f}")
print()
# Exemplo de probabilidade conjunta:
exemplo = prob_conjunta("sim", "muito", "sim", "sim")
print("P(historico=sim, tempo=muito, promo=sim, compra=sim) =", round(exemplo, 4))