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

probabilidades = {
"HistoricoCompras": {
"Sim": 0.7,
"Nao": 0.3
},
"TempoNoSite": {
"Muito": 0.6,
"Pouco": 0.4
},
"Promocao": {
"Clicou": 0.5,
"NaoClicou": 0.5
},
"Compra": {
# Condicionais: (Historico, Tempo, Promoção)
("Sim", "Muito", "Clicou"): {"Sim": 0.9, "Nao": 0.1},
("Sim", "Pouco", "Clicou"): {"Sim": 0.7, "Nao": 0.3},
("Sim", "Muito", "NaoClicou"): {"Sim": 0.6, "Nao": 0.4},
("Sim", "Pouco", "NaoClicou"): {"Sim": 0.4, "Nao": 0.6},
("Nao", "Muito", "Clicou"): {"Sim": 0.5, "Nao": 0.5},
("Nao", "Pouco", "Clicou"): {"Sim": 0.3, "Nao": 0.7},
("Nao", "Muito", "NaoClicou"): {"Sim": 0.2, "Nao": 0.8},
("Nao", "Pouco", "NaoClicou"): {"Sim": 0.1, "Nao": 0.9}
}
}

def calcular_probabilidade_compra(evidencias):
historico = evidencias["HistoricoCompras"]
tempo = evidencias["TempoNoSite"]
promocao = evidencias["Promocao"]

probs = probabilidades["Compra"][(historico, tempo, promocao)]
return probs


evidencias = {
"HistoricoCompras": "Sim",
"TempoNoSite": "Pouco",
"Promocao": "Clicou"

}

resultado = calcular_probabilidade_compra(evidencias)
print("Probabilidade de compra:", resultado)

1 resposta

Olá, Penha. Como vai?

O seu projeto prático ficou muito bem estruturado! É muito interessante ver os conceitos teóricos de probabilidade condicional em Redes Bayesianas sendo traduzidos em uma implementação direta e legível em Python utilizando dicionários.

A forma como você construiu a Tabela de Probabilidade Condicional (CPT) para o nó filho Compra, mapeando as tuplas de condições dos nós pais (HistoricoCompras, TempoNoSite e Promocao), é exatamente a lógica de representação matricial de dependências que fundamenta esse modelo de IA clássica.

  • O texto "Copiar código" no dicionário: Note que, ao final do seu dicionário de evidencias, o texto automático do botão de cópia do fórum acabou sendo colado junto:
    evidencias = {
    "HistoricoCompras": "Sim",
    "TempoNoSite": "Pouco",
    "Promocao": "Clicou"
    Copiar código # Isso gerará um erro de sintaxe no interpretador do Python!
    }
    
  • Indentação: O corpo da sua função calcular_probabilidade_compra perdeu o recuo de 4 espaços obrigatório no Python (um comportamento muito comum no editor do fórum se o código não estiver envelopado em blocos de Markdown).

Expandindo o Conceito: Calculando a Probabilidade Conjunta

Atualmente, a sua função retorna a probabilidade condicional de compra, que é representada pela notação matemática: P(Compra | Histórico, Tempo, Promoção).

No entanto, o maior poder de uma Rede Bayesiana está em sua capacidade de decompor a Probabilidade Conjunta de todo o cenário acontecer simultaneamente. Como os nós pais (HistoricoCompras, TempoNoSite e Promocao) não possuem dependências entre si na sua estrutura, a probabilidade de todas essas condições ocorrerem juntas e resultarem em uma compra bem-sucedida é obtida multiplicando as probabilidades individuais dos pais pela condicional do filho:

P(Histórico, Tempo, Promoção, Compra) = P(Histórico) * P(Tempo) * P(Promoção) * P(Compra | Histórico, Tempo, Promoção)

probabilidades = {
    "HistoricoCompras": {
        "Sim": 0.7,
        "Nao": 0.3
    },
    "TempoNoSite": {
        "Muito": 0.6,
        "Pouco": 0.4
    },
    "Promocao": {
        "Clicou": 0.5,
        "NaoClicou": 0.5
    },
    "Compra": {
        # Condicionais: (Historico, Tempo, Promoção)
        ("Sim", "Muito", "Clicou"): {"Sim": 0.9, "Nao": 0.1},
        ("Sim", "Pouco", "Clicou"): {"Sim": 0.7, "Nao": 0.3},
        ("Sim", "Muito", "NaoClicou"): {"Sim": 0.6, "Nao": 0.4},
        ("Sim", "Pouco", "NaoClicou"): {"Sim": 0.4, "Nao": 0.6},
        ("Nao", "Muito", "Clicou"): {"Sim": 0.5, "Nao": 0.5},
        ("Nao", "Pouco", "Clicou"): {"Sim": 0.3, "Nao": 0.7},
        ("Nao", "Muito", "NaoClicou"): {"Sim": 0.2, "Nao": 0.8},
        ("Nao", "Pouco", "NaoClicou"): {"Sim": 0.1, "Nao": 0.9}
    }
}

# 1. Função original corrigida
def calcular_probabilidade_compra_condicional(evidencias):
    historico = evidencias["HistoricoCompras"]
    tempo = evidencias["TempoNoSite"]
    promocao = evidencias["Promocao"]

    probs = probabilidades["Compra"][(historico, tempo, promocao)]
    return probs

# 2. Nova função para calcular a Probabilidade Conjunta
def calcular_probabilidade_conjunta(evidencias, status_compra):
    historico = evidencias["HistoricoCompras"]
    tempo = evidencias["TempoNoSite"]
    promocao = evidencias["Promocao"]

    # Busca a probabilidade a priori de cada nó pai
    p_historico = probabilidades["HistoricoCompras"][historico]
    p_tempo = probabilidades["TempoNoSite"][tempo]
    p_promocao = probabilidades["Promocao"][promocao]

    # Busca a probabilidade condicional do nó filho
    p_compra_condicional = probabilidades["Compra"][(historico, tempo, promocao)][status_compra]

    # Multiplica as probabilidades de acordo com a fatoração da rede
    probabilidade_conjunta = p_historico * p_tempo * p_promocao * p_compra_condicional
    return probabilidade_conjunta


# Definindo as evidências sem erros de sintaxe
evidencias = {
    "HistoricoCompras": "Sim",
    "TempoNoSite": "Pouco",
    "Promocao": "Clicou"
}

# Teste 1: Probabilidade Condicional de compra
resultado_condicional = calcular_probabilidade_compra_condicional(evidencias)
print("1. Probabilidade condicional de compra (Sim/Não):", resultado_condicional)

# Teste 2: Probabilidade Conjunta de todo o cenário acontecer (com Compra = Sim)
resultado_conjunto = calcular_probabilidade_conjunta(evidencias, "Sim")
print(f"2. Probabilidade conjunta de ocorrer todo o cenário com compra bem-sucedida:")
print(f"   Resultado: {resultado_conjunto:.4f} (ou {resultado_conjunto * 100:.2f}%)")

Na execução do cenário que você propôs, a probabilidade de uma pessoa ter histórico de compras, passar pouco tempo no site, clicar na promoção e, no fim, realizar a compra é de 9,8% (0,7 * 0,4 * 0,5 * 0,7 = 0,098).

Espero que possa ter lhe ajudado!