Solucionado (ver solução)

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!

Solucionado
(ver solução)
6
respostas

[Projeto] Faça como eu fiz: construindo uma Rede Bayesiana

Redes Bayesianas

Principais conceitos de uma Rede Bayesiana:
probabilidades a priori,
tabela condicional (CPT),
inferência simples e
cálculo de probabilidade conjunta

Usando apenas dicionários e funções Python.

baseado em:
Histórico de compras
tempo no site
interação com promoção

objetivo: prever se o cliente irá comprar ou não um produto
tabela condicional P(Compra | Historico, Tempo, Promocao)

Observação importante:

Qual é mais importante probabilidade de compra ou probalidade conjunta?

Para prever vendas:

Probabilidade de Compra é muito mais útil.

Exemplo:
Cliente entrou no site.

Você observa:
Histórico = Sim
Tempo = Muito
Promoção = Sim

Pergunta: Ele vai comprar?
Resposta: 95%

A probabilidade de compra é o que realmente importa para tomar decisões de marketing e vendas.

E a probabilidade conjunta?
ela é a base matemática da Rede Bayesiana.

Ela permite responder perguntas mais sofisticadas:

Qual a chance de encontrar esse perfil de cliente?
Qual variável influencia mais?
Qual a probabilidade de ter clicado na promoção sabendo que comprou?
Qual a probabilidade de já ser cliente sabendo que comprou?

Essas perguntas usam o Teorema de Bayes.

Em Redes Bayesianas, quando estamos fazendo previsão ou classificação, quase sempre o número que mais nos interessa é:

Probabilidade de Conjunta, exemplo, probalidade de compra dado que o cliente tem um histórico de compras, passou muito tempo no site e clicou na promoção:
P(Compra | Histórico, Tempo, Promoção)

ou seja:
Dadas as evidências que observei, qual a chance de compra?
Esse é exatamente o tipo de cálculo que sistemas de recomendação, análise de fraude e diagnóstico médico utilizam no dia a dia.

# Probabilidades iniciais
historico = {
    "Sim": 0.30,
    "Nao": 0.70
}

tempo_site = {
    "Pouco": 0.50,
    "Medio": 0.30,
    "Muito": 0.20
}

promocao = {
    "Sim": 0.40,
    "Nao": 0.60
}

# Tabela Condicional P(Compra | Historico, Tempo, Promocao)
compra = {
    ("Sim", "Muito", "Sim"): 0.95,
    ("Sim", "Medio", "Sim"): 0.85,
    ("Sim", "Pouco", "Sim"): 0.70,

    ("Nao", "Muito", "Sim"): 0.65,
    ("Nao", "Medio", "Sim"): 0.50,
    ("Nao", "Pouco", "Sim"): 0.30,

    ("Sim", "Muito", "Nao"): 0.75,
    ("Sim", "Medio", "Nao"): 0.60,
    ("Sim", "Pouco", "Nao"): 0.40,

    ("Nao", "Muito", "Nao"): 0.30,
    ("Nao", "Medio", "Nao"): 0.15,
    ("Nao", "Pouco", "Nao"): 0.05
}


# Função para calcular a probabilidade de compra com base no histórico, tempo e promoção, 
# chances de compra
def calcular_probabilidade_compra( historico_cliente, tempo_cliente, promocao_cliente ):
        return compra[(historico_cliente, tempo_cliente, promocao_cliente )]

# Função para calcular a probabilidade conjunta P(Historico, Tempo, Promocao, Compra)
# chances de encontrar um cliente com esse perfil
def probabilidade_conjunta( historico_cliente, tempo_cliente, promocao_cliente ):
    probabilidade_historico = historico[historico_cliente]
    probabilidade_tempo     = tempo_site[tempo_cliente]
    probabilidade_promocao  = promocao[promocao_cliente]

    probabilidade_compra = compra[(historico_cliente, tempo_cliente, promocao_cliente)]
            
    return probabilidade_historico * probabilidade_tempo * probabilidade_promocao * probabilidade_compra


# Função para analisar um cliente específico e imprimir a probabilidade de compra
def analisar_cliente(historico_cliente, tempo_cliente, promocao_cliente):
    probabilidade = calcular_probabilidade_compra(historico_cliente, tempo_cliente, promocao_cliente)

    print("\n===== ANALISE DO CLIENTE =====")
    print(f"Historico:  {historico_cliente}")
    print(f"Tempo Site: {tempo_cliente}")
    print(f"Promocao:   {promocao_cliente}")

    print(f"\nProbabilidade de Compra: {probabilidade:.0%}")
    print(f"Probabilidade de Nao Comprar: {(1-probabilidade):.0%}")


#Exemplo 1
# Se eu encontrar um cliente com essas características, qual a chance dele comprar?
# 100 clientes iguais
# ↓
# 5 compram
# 95 não compram
analisar_cliente(
    historico_cliente="Sim",
    tempo_cliente="Muito",
    promocao_cliente="Sim"
)

#Exemplo 2
analisar_cliente(
    historico_cliente="Nao",
    tempo_cliente="Pouco",
    promocao_cliente="Nao"
)


#Exemplo 3
# Aqui a pergunta é diferente: Qual a chance de encontrar no mundo um cliente que satisfaça TODAS essas condições ao mesmo tempo?
# Já comprou antes
# E
# Ficou muito tempo no site
# E
# Clicou na promoção
# E
# Comprou novamente

resultado = probabilidade_conjunta(
    "Sim",
    "Muito",
    "Sim"
)

print(f"Probabilidade conjunta: {resultado*100:.2f}%")
6 respostas
solução!

Olá, Marcelo! Como vai?

Parabéns pela realização das atividades!

Você apresentou uma explicação muito clara sobre Redes Bayesianas, trouxe exemplos práticos com código em Python e destacou de forma precisa a diferença entre probabilidade de compra e probabilidade conjunta. Isso mostra domínio conceitual, aplicação prática e preocupação em conectar teoria com uso real em marketing e vendas.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Validação com dados reais: testar o modelo com históricos de clientes para verificar a precisão das previsões.
  • Ajuste dinâmico: atualizar probabilidades conforme novos dados entram, mantendo o sistema adaptativo.
  • Visualização gráfica: usar bibliotecas como networkx ou pgmpy para representar a rede e facilitar a interpretação.

Ah uma pergunta: O que você considera mais interessante para evoluir esse modelo, incluir mais variáveis de comportamento do cliente ou explorar técnicas de aprendizado de parâmetros automáticos?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

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

Olá Daniel, obrigado pelo feedback

essa resolução esta mais pra uma didática do que aplicação, eu não conheço essas duas bibliotecas que falou, vou pesquisar. O ajuste conforme os dados entram é bem interessante pode ser algo mais realista utilizando dados históricos de alguma base com essas caracteristicas.

Sobre incluir variáveis , penso que um sistema realista realmente vai ter muito mais caracteristicas pra analisar, e quando mais dados alguma técnica de aprendizado automático pode ser um caminho.

Você tem exemplo com essas bibliotecas e caracteristicas?

Bom dia, Marcelo!

Vou deixar aqui dois exemplos completos e independentes para executar no Google Colab usando as bibliotecas que citei. Antes de executar, instale as bibliotecas:

!pip install networkx matplotlib pgmpy -q

Exemplo 1 | Visualizando uma Rede Bayesiana com networkx

  • Este exemplo cria uma rede simples representando a influência de Marketing Digital sobre Leads e Compras.
import networkx as nx
import matplotlib.pyplot as plt

# Criando um grafo direcionado
G = nx.DiGraph()

# Adicionando nós
G.add_nodes_from([
    "Marketing Digital",
    "Leads",
    "Compra"
])

# Adicionando conexões
G.add_edges_from([
    ("Marketing Digital", "Leads"),
    ("Leads", "Compra")
])

# Configuração da figura
plt.figure(figsize=(8, 5))

# Layout automático
pos = nx.spring_layout(G, seed=42)

# Desenhando a rede
nx.draw(
    G,
    pos,
    with_labels=True,
    node_size=4000,
    font_size=10,
    arrows=True
)

plt.title("Rede de Influência em Marketing")
plt.show()

O resultado será um diagrama simples mostrando a relação:

Marketing Digital → Leads → Compra



Exemplo 2 | Rede Bayesiana com Inferência usando pgmpy

  • Neste exemplo, será calculada a probabilidade de uma pessoa realizar uma compra sabendo que ela clicou em um anúncio.
from pgmpy.models import DiscreteBayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination

# Estrutura da rede
modelo = DiscreteBayesianNetwork([
    ("Anuncio", "Clique"),
    ("Clique", "Compra")
])

# Probabilidade de visualizar um anúncio
cpd_anuncio = TabularCPD(
    variable="Anuncio",
    variable_card=2,
    values=[[0.4], [0.6]]
)

# Probabilidade de clicar dado o anúncio
cpd_clique = TabularCPD(
    variable="Clique",
    variable_card=2,
    values=[
        [0.8, 0.3],  # Não clica
        [0.2, 0.7]   # Clica
    ],
    evidence=["Anuncio"],
    evidence_card=[2]
)

# Probabilidade de compra dado o clique
cpd_compra = TabularCPD(
    variable="Compra",
    variable_card=2,
    values=[
        [0.9, 0.2],  # Não compra
        [0.1, 0.8]   # Compra
    ],
    evidence=["Clique"],
    evidence_card=[2]
)

# Adicionando CPDs ao modelo
modelo.add_cpds(
    cpd_anuncio,
    cpd_clique,
    cpd_compra
)

# Verificando consistência
print("Modelo válido:", modelo.check_model())

# Criando mecanismo de inferência
inferencia = VariableElimination(modelo)

# Probabilidade de compra sabendo que houve clique
resultado = inferencia.query(
    variables=["Compra"],
    evidence={"Clique": 1}
)

print("\nProbabilidade de Compra dado que houve Clique:")
print(resultado)

Saída esperada:

Modelo válido: True

Probabilidade de Compra dado que houve Clique:
+-----------+---------------+
| Compra    |   phi(Compra) |
+===========+===============+
| Compra(0) |        0.2000 |
+-----------+---------------+
| Compra(1) |        0.8000 |
+-----------+---------------+

Nesse caso, a rede conclui que a probabilidade de compra é de 80% quando o usuário clicou no anúncio.

Esses dois exemplos mostram tanto a visualização estrutural (networkx) quanto a modelagem probabilística e inferência (pgmpy).

Olá Daniel,

obrigado pelo sensacional conjunto de exemplos de uso das bibliotecas, bem interessante.
A questão maior agora seria, como chegar nas probabilidades para criar as tabelas, por exemplo, da onde que veio a probailidade de clicar no anuncio, de visualizar etc... eu sei aqui é didático, mas e uma forma real como seria essa extração?

Oi, Marcelo!

Nesse caso, as fontes das probabilidades poderiam ser das campanhas de anúncios no Meta Ads (anúncios no Instagram e Facebook), por exemplo.

O profissional de dados iria analisar as campanhas junto ao gestor de tráfego e concluir esses números com base nas estatísticas que eles têm em mão (CPA, CPC, CPM...).

Aliás, está aí uma excelente ideia de negócio hein! 😄

Olá Daniel,

obrigado por responder, de fato acho que tenho algo pra levantar com meu irmão, que é do marketing e tem um negócio ahahahah
um abraço