from pgmpy.models import DiscreteBayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
# ---------------------------------------------------------
# 1) Definindo a estrutura da Rede Bayesiana
# ---------------------------------------------------------
modelo = DiscreteBayesianNetwork([
("HistoricoCompras", "Compra"),
("TempoNoSite", "Compra"),
("InteracaoPromocao", "Compra"),
])
# ---------------------------------------------------------
# 2) Definindo as Tabelas de Probabilidade Condicional (CPDs)
# ---------------------------------------------------------
# HistoricoCompras: 0 = Nao comprou antes, 1 = Ja comprou antes
cpd_historico = TabularCPD(
variable="HistoricoCompras",
variable_card=2,
values=[[0.6], [0.4]], # P(Nao)=0.6 , P(Sim)=0.4
state_names={"HistoricoCompras": ["Nao", "Sim"]},
)
# TempoNoSite: 0 = Pouco tempo, 1 = Muito tempo
cpd_tempo = TabularCPD(
variable="TempoNoSite",
variable_card=2,
values=[[0.5], [0.5]], # P(Pouco)=0.5 , P(Muito)=0.5
state_names={"TempoNoSite": ["Pouco", "Muito"]},
)
# InteracaoPromocao: 0 = Nao clicou, 1 = Clicou
cpd_promocao = TabularCPD(
variable="InteracaoPromocao",
variable_card=2,
values=[[0.7], [0.3]], # P(NaoClicou)=0.7 , P(Clicou)=0.3
state_names={"InteracaoPromocao": ["NaoClicou", "Clicou"]},
)
# Compra depende das 3 variaveis acima (2 x 2 x 2 = 8 combinacoes)
cpd_compra = TabularCPD(
variable="Compra",
variable_card=2,
values=[
# P(Compra=Nao | combinacoes)
[0.95, 0.85, 0.80, 0.60, 0.75, 0.55, 0.50, 0.20],
# P(Compra=Sim | combinacoes)
[0.05, 0.15, 0.20, 0.40, 0.25, 0.45, 0.50, 0.80],
],
evidence=["HistoricoCompras", "TempoNoSite", "InteracaoPromocao"],
evidence_card=[2, 2, 2],
state_names={
"Compra": ["Nao", "Sim"],
"HistoricoCompras": ["Nao", "Sim"],
"TempoNoSite": ["Pouco", "Muito"],
"InteracaoPromocao": ["NaoClicou", "Clicou"],
},
)
modelo.add_cpds(cpd_historico, cpd_tempo, cpd_promocao, cpd_compra)
# Verifica se o modelo esta consistente
assert modelo.check_model(), "Modelo inconsistente!"
# ---------------------------------------------------------
# 3) Realizando inferencias
# ---------------------------------------------------------
inferencia = VariableElimination(modelo)
print("=== Probabilidade geral (marginal) de Compra ===")
print(inferencia.query(variables=["Compra"]))
print("\n=== Cliente com histórico, muito tempo no site e que clicou na promoção ===")
print(inferencia.query(
variables=["Compra"],
evidence={"HistoricoCompras": "Sim", "TempoNoSite": "Muito", "InteracaoPromocao": "Clicou"},
))
print("\n=== Cliente sem histórico, pouco tempo no site e que não clicou na promoção ===")
print(inferencia.query(
variables=["Compra"],
evidence={"HistoricoCompras": "Nao", "TempoNoSite": "Pouco", "InteracaoPromocao": "NaoClicou"},
))
print("\n=== Apenas sabendo que o cliente clicou na promoção ===")
print(inferencia.query(
variables=["Compra"],
evidence={"InteracaoPromocao": "Clicou"},
))