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.
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!