Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta
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"},
))
1 resposta

Oi, Bruna. Tudo bem com você?

Sua implementação da Rede Bayesiana atende ao objetivo da atividade e contempla os principais conceitos envolvidos na modelagem probabilística. Você definiu corretamente a estrutura da rede, estabelecendo as dependências entre HistoricoCompras, TempoNoSite, InteracaoPromocao e Compra. As tabelas de probabilidade condicional também foram configuradas de forma consistente, incluindo os state_names, o que torna o modelo mais legível e facilita a realização das inferências. Além disso, a utilização do check_model() é uma boa prática, pois garante que todas as probabilidades e relações estejam válidas antes da execução das consultas.

Outro ponto interessante foi realizar consultas com diferentes evidências, permitindo comparar cenários distintos, como um cliente que já comprou anteriormente e interagiu com promoções em contraste com outro que não possui histórico e teve pouca interação com o site. Como evolução, você pode experimentar alterar alguns valores das CPDs para observar como pequenas mudanças nas probabilidades influenciam os resultados das inferências e a probabilidade final de compra, simulando diferentes perfis de clientes.

Na sua opinião, qual das variáveis utilizadas teria maior impacto na probabilidade de compra caso fosse ajustada, e como você justificaria essa escolha?

Parabéns pela implementação e por compartilhar sua solução. Continue praticando e utilizando o fórum sempre que surgir uma nova dúvida. Estamos à disposição para ajudar.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!