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

#Rede Bayesiana para Análise de Comportamento de Clientes

  1. Instalar bibliotecas
import sys
!{sys.executable} -m pip install pgmpy
  1. Importar bibliotecas
from pgmpy.models import BayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
from pgmpy.models import DiscreteBayesianNetwork
  1. Definir a estrutura da Rede Bayesiana
model = DiscreteBayesianNetwork([
    ('HistoricoCompras', 'RealizarCompra'),
    ('TempoNoSite', 'RealizarCompra'),
    ('InteracaoPromocoes', 'RealizarCompra')
])
  1. Definir as Tabelas de Probabilidade Condicional (CPDs)
# CPD para HistoricoCompras (variável pai)
cpd_historico = TabularCPD(variable='HistoricoCompras', variable_card=2,
                           values=[[0.7], [0.3]], # P(Sim)=0.7, P(Nao)=0.3
                           state_names={'HistoricoCompras': ['Sim', 'Nao']})

# CPD para TempoNoSite (variável pai)
cpd_tempo = TabularCPD(variable='TempoNoSite', variable_card=2,
                       values=[[0.4], [0.6]], # P(Pouco)=0.4, P(Muito)=0.6
                       state_names={'TempoNoSite': ['Pouco', 'Muito']})

# CPD para InteracaoPromocoes (variável pai)
cpd_promocoes = TabularCPD(variable='InteracaoPromocoes', variable_card=2,
                            values=[[0.2], [0.8]], # P(Sim)=0.2, P(Nao)=0.8
                            state_names={'InteracaoPromocoes': ['Sim', 'Nao']})
cpd_compra = TabularCPD(variable='RealizarCompra', variable_card=2,
                        values=[
                            # P(RealizarCompra='Sim' | H, T, I)
                            [0.9, 0.7, 0.8, 0.5, 0.6, 0.3, 0.4, 0.1],
                            # P(RealizarCompra='Nao' | H, T, I)
                            [0.1, 0.3, 0.2, 0.5, 0.4, 0.7, 0.6, 0.9]
                        ],
                        evidence=['HistoricoCompras', 'TempoNoSite', 'InteracaoPromocoes'],
                        evidence_card=[2, 2, 2],
                        state_names={'RealizarCompra': ['Sim', 'Nao'],
                                     'HistoricoCompras': ['Sim', 'Nao'],
                                     'TempoNoSite': ['Pouco', 'Muito'],
                                     'InteracaoPromocoes': ['Sim', 'Nao']})

# Adicionar as CPDs ao modelo
model.add_cpds(cpd_historico, cpd_tempo, cpd_promocoes, cpd_compra)

# Verificar se o modelo é consistente
print("Modelo consistente:", model.check_model())
  1. Realizar Inferência
infer = VariableElimination(model)

# Exemplo 1: Cliente com histórico de compras, muito tempo no site, interagiu com promoções
prob_compra_ex1 = infer.query(variables=['RealizarCompra'],
                              evidence={'HistoricoCompras': 'Sim',
                                        'TempoNoSite': 'Muito',
                                        'InteracaoPromocoes': 'Sim'})
print("\nProbabilidade de compra (Histórico=Sim, Tempo=Muito, Promoções=Sim):")
print(prob_compra_ex1)

# Exemplo 2: Cliente sem histórico, pouco tempo no site, não interagiu com promoções
prob_compra_ex2 = infer.query(variables=['RealizarCompra'],
                              evidence={'HistoricoCompras': 'Nao',
                                        'TempoNoSite': 'Pouco',
                                        'InteracaoPromocoes': 'Nao'})
print("\nProbabilidade de compra (Histórico=Nao, Tempo=Pouco, Promoções=Nao):")
print(prob_compra_ex2)

# Exemplo 3: Cliente sem histórico, muito tempo no site, interagiu com promoções
prob_compra_ex3 = infer.query(variables=['RealizarCompra'],
                              evidence={'HistoricoCompras': 'Nao',
                                        'TempoNoSite': 'Muito',
                                        'InteracaoPromocoes': 'Sim'})
print("\nProbabilidade de compra (Histórico=Nao, Tempo=Muito, Promoções=Sim):")
print(prob_compra_ex3)
1 resposta

Oii Paulo, tudo bem?

Obrigada por compartilhar seu projeto aqui no fórum! Implementar uma Rede Bayesiana para análise de comportamento de clientes é um tema bem rico, e você estruturou tudo de forma bem organizada: definiu os nós, as CPDs com probabilidades coerentes e ainda rodou três cenários de inferência com perfis bem distintos de clientes.

Um detalhe que vale destacar: os cenários que você escolheu para os exemplos cobrem os extremos bem intencionalmente, do cliente com todos os fatores favoráveis (Exemplo 1) ao completamente desfavorável (Exemplo 2), passando por um caso intermediário (Exemplo 3). Isso torna o modelo muito mais fácil de validar intuitivamente.

Uma consideração para quem quiser evoluir o projeto: as probabilidades das CPDs foram definidas manualmente. Uma extensão natural seria aprendê-las a partir de dados reais usando model.fit() do próprio pgmpy, o que tornaria o modelo muito mais aderente a um cenário real de e-commerce.

Conte com a Alura para evoluir seus estudos. Em caso de dúvidas, fico à disposição.

Bons estudos!

Sucesso

Imagem da comunidade