1
resposta

[rede_bayesiana_clientes] - rede_bayesiana_clientes

# rede_bayesiana_clientes.py

from typing import Literal, Dict, Tuple

Historico = Literal["sim", "nao"]
Tempo = Literal["pouco", "muito"]
Promo = Literal["sim", "nao"]
Compra = Literal["sim", "nao"]

# 1) Probabilidades marginais das variáveis "pais"
P_historico: Dict[Historico, float] = {
    "sim": 0.4,
    "nao": 0.6,
}

P_tempo: Dict[Tempo, float] = {
    "muito": 0.3,
    "pouco": 0.7,
}

P_promo: Dict[Promo, float] = {
    "sim": 0.2,
    "nao": 0.8,
}

# 2) Tabela de probabilidade condicional P(compra | historico, tempo, promo)
# Valores fictícios, apenas para exemplo.
# Chave: (historico, tempo, promo)
P_compra_dado_pais: Dict[Tuple[Historico, Tempo, Promo], float] = {
    ("sim", "muito", "sim"): 0.90,
    ("sim", "muito", "nao"): 0.75,
    ("sim", "pouco", "sim"): 0.70,
    ("sim", "pouco", "nao"): 0.50,
    ("nao", "muito", "sim"): 0.60,
    ("nao", "muito", "nao"): 0.40,
    ("nao", "pouco", "sim"): 0.35,
    ("nao", "pouco", "nao"): 0.10,
}


def prob_compra(
    historico: Historico,
    tempo: Tempo,
    promo: Promo,
) -> Dict[Compra, float]:
    """
    Retorna P(compra = sim | evidência) e P(compra = nao | evidência).
    Como já temos a Tabela P(compra | pais), basta usar diretamente.
    """
    p_sim = P_compra_dado_pais[(historico, tempo, promo)]
    p_nao = 1.0 - p_sim
    return {"sim": p_sim, "nao": p_nao}


def prob_conjunta(
    historico: Historico,
    tempo: Tempo,
    promo: Promo,
    compra: Compra,
) -> float:
    """
    Calcula P(historico, tempo, promo, compra).
    Útil para ver a distribuição conjunta do modelo.
    """
    p_h = P_historico[historico]
    p_t = P_tempo[tempo]
    p_p = P_promo[promo]
    p_c_sim = P_compra_dado_pais[(historico, tempo, promo)]
    p_c = p_c_sim if compra == "sim" else (1.0 - p_c_sim)
    return p_h * p_t * p_p * p_c


if __name__ == "__main__":
    # Exemplos de consulta:

    casos = [
        ("sim", "muito", "sim"),
        ("sim", "pouco", "nao"),
        ("nao", "muito", "sim"),
        ("nao", "pouco", "nao"),
    ]

    for h, t, p in casos:
        cond = prob_compra(h, t, p)
        print("=== Cliente ===")
        print(f"Histórico de compras: {h}")
        print(f"Tempo no site:       {t}")
        print(f"Clicou em promo?:    {p}")
        print(f"P(compra = sim | evidência) = {cond['sim']:.2f}")
        print(f"P(compra = nao | evidência) = {cond['nao']:.2f}")
        print()

    # Exemplo de probabilidade conjunta:
    exemplo = prob_conjunta("sim", "muito", "sim", "sim")
    print("P(historico=sim, tempo=muito, promo=sim, compra=sim) =", round(exemplo, 4))
1 resposta

Olá, Marcelo! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de variáveis literais para estruturar os estados possíveis, utilizou muito bem a tabela de probabilidades condicionais para modelar o comportamento dos clientes e ainda compreendeu a importância do cálculo da probabilidade conjunta para analisar a distribuição completa do modelo.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

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!