from pgmpy.models import DiscreteBayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
modelo = DiscreteBayesianNetwork([
('HC', 'RC'), ('TS', 'RC'), ('IP', 'RC')
])
cpd_hc = TabularCPD('HC', 2, [[0.60], [0.40]],
state_names={'HC': ['Nao', 'Sim']})
cpd_ts = TabularCPD('TS', 2, [[0.45], [0.55]],
state_names={'TS': ['Curto', 'Longo']})
cpd_ip = TabularCPD('IP', 2, [[0.65], [0.35]],
state_names={'IP': ['Nao', 'Sim']})
cpd_rc = TabularCPD('RC', 2,
[[0.90,0.70,0.40,0.30,0.55,0.35,0.15,0.10],
[0.10,0.30,0.60,0.70,0.45,0.65,0.85,0.90]],
evidence=['HC', 'TS', 'IP'], evidence_card=[2,2,2],
state_names={'RC': ['Nao', 'Sim'], 'HC': ['Nao', 'Sim'],
'TS': ['Curto', 'Longo'], 'IP': ['Nao', 'Sim']})
modelo.add_cpds(cpd_hc, cpd_ts, cpd_ip, cpd_rc)
modelo.check_model()
inf = VariableElimination(modelo)
print("REDE BAYESIANA - ANALISE DE COMPORTAMENTO DE CLIENTES\n")
testes = [
("Historico + Tempo Longo + Promocao",
{'HC': 'Sim', 'TS': 'Longo', 'IP': 'Sim'}),
("Novo + Tempo Curto + Sem Promocao",
{'HC': 'Nao', 'TS': 'Curto', 'IP': 'Nao'}),
("Novo + Tempo Longo + Promocao",
{'HC': 'Nao', 'TS': 'Longo', 'IP': 'Sim'}),
]
for nome, ev in testes:
res = inf.query(variables=['RC'], evidence=ev)
prob = res.values[1] * 100
print(f"{nome}: {prob:.1f}%")
print("\nTABELA DE TODOS OS CENARIOS\n")
print("Historico | Tempo | Promocao | P(Compra)")
print("-" * 44)
for hc in ['Nao', 'Sim']:
for ts in ['Curto', 'Longo']:
for ip in ['Nao', 'Sim']:
res = inf.query(variables=['RC'],
evidence={'HC': hc, 'TS': ts, 'IP': ip})
prob = res.values[1] * 100
print(f"{hc:9} | {ts:6} | {ip:8} | {prob:6.1f}%")
print("\nINFERENCIA REVERSA")
res_rev = inf.query(variables=['IP'], evidence={'RC': 'Sim'})
prob_ip_dado_rc = res_rev.values[1] * 100
print(f"P(Promocao | Compra) = {prob_ip_dado_rc:.1f}%\n")
print("RECOMENDACOES:")
print("1. Clientes com historico + tempo longo + promo: MAIOR prioridade (90%)")
print("2. Clientes novos + tempo curto + sem promo: MENOR prioridade (10%)")
print("3. Investir em estrategias para aumentar tempo no site")
print("4. Segmentar promocoes para clientes novos")