Ejercicio 2.

# ====================================================
# BAYES — Caso 2: Control de Calidad + Actualización
# Secuencial (múltiples inspecciones)
# ====================================================

# ----------------------------------------------------
# Función bayesiana general
# ----------------------------------------------------

bayes_tabla <- function(prior, likel, estados) {
  
  # Probabilidad conjunta:
  # P(Estado ∩ Evidencia) = P(Estado) * P(Evidencia | Estado)
  conjunta  <- prior * likel
  
  # Probabilidad marginal de la evidencia:
  # P(E) = Σ P(Estado) * P(E | Estado)
  # (Ley de la probabilidad total)
  P_E       <- sum(conjunta)
  
  # Probabilidad posterior:
  # P(Estado | E) = P(Estado ∩ E) / P(E)
  # (Teorema de Bayes)
  posterior <- conjunta / P_E
  
  # Construcción de tabla resumen
  df <- data.frame(
    Estado    = estados,
    Prior     = round(prior,      4),  # Creencia inicial
    Likel     = round(likel,      4),  # Verosimilitud
    Conjunta  = round(conjunta,   4),  # Probabilidad conjunta
    P_E       = round(P_E,        4),  # Evidencia total
    Posterior = round(posterior,  4)   # Creencia actualizada
  )
  
  # Retorna resultados clave para uso posterior
  list(tabla = df, posterior = posterior, P_E = P_E)
}


# ----------------------------------------------------
# Definición del problema
# ----------------------------------------------------

estados  <- c("Proveedor A", "Proveedor B", "Proveedor C")

# Probabilidades a priori:
# Representan la creencia inicial sobre qué proveedor es más probable
prior    <- c(0.60, 0.30, 0.10)

# Probabilidades condicionales (modelo de calidad):
# P(Defecto | Proveedor)
p_defecto <- c(0.01, 0.04, 0.12)

# P(Conforme | Proveedor) = 1 - P(Defecto | Proveedor)
p_conforme <- c(0.99, 0.96, 0.88)


# ----------------------------------------------------
# INSPECCIÓN 1: Se observa una pieza defectuosa
# ----------------------------------------------------

cat("=== INSPECCIÓN 1: DEFECTUOSA ===\n")
## === INSPECCIÓN 1: DEFECTUOSA ===
res1 <- bayes_tabla(prior, p_defecto, estados)

print(res1$tabla[, c("Estado","Prior","Likel","Conjunta","Posterior")])
##        Estado Prior Likel Conjunta Posterior
## 1 Proveedor A   0.6  0.01    0.006       0.2
## 2 Proveedor B   0.3  0.04    0.012       0.4
## 3 Proveedor C   0.1  0.12    0.012       0.4
# Interpretación:
# Se actualizan las probabilidades de cada proveedor dado que
# se observó un defecto.
#
# Proveedores con mayor tasa de defectos tendrán mayor probabilidad posterior.


# ----------------------------------------------------
# ACTUALIZACIÓN SECUENCIAL (Aprendizaje Bayesiano)
# ----------------------------------------------------

# PRINCIPIO CLAVE:
# La posterior obtenida se convierte en el nuevo prior.
#
# Esto permite incorporar evidencia de manera acumulativa,
# típico en procesos industriales y control de calidad.


# ----------------------------------------------------
# INSPECCIÓN 2: Segunda pieza defectuosa
# ----------------------------------------------------

cat("\n=== INSPECCIÓN 2: DEFECTUOSA (prior actualizado) ===\n")
## 
## === INSPECCIÓN 2: DEFECTUOSA (prior actualizado) ===
res2 <- bayes_tabla(res1$posterior, p_defecto, estados)

print(res2$tabla[, c("Estado","Prior","Likel","Posterior")])
##        Estado Prior Likel Posterior
## 1 Proveedor A   0.2  0.01    0.0303
## 2 Proveedor B   0.4  0.04    0.2424
## 3 Proveedor C   0.4  0.12    0.7273
# Interpretación:
# Se refuerza la evidencia contra proveedores con mayor tasa de defectos.
# El modelo "aprende" de la información acumulada.


# ----------------------------------------------------
# INSPECCIÓN 3: Pieza conforme (no defectuosa)
# ----------------------------------------------------

cat("\n=== INSPECCIÓN 3: CONFORME ===\n")
## 
## === INSPECCIÓN 3: CONFORME ===
res3 <- bayes_tabla(res2$posterior, p_conforme, estados)

print(res3$tabla[, c("Estado","Prior","Likel","Posterior")])
##        Estado  Prior Likel Posterior
## 1 Proveedor A 0.0303  0.99    0.0332
## 2 Proveedor B 0.2424  0.96    0.2578
## 3 Proveedor C 0.7273  0.88    0.7090
# Interpretación:
# La evidencia favorable (pieza conforme) ajusta nuevamente las probabilidades.
# Esto puede "compensar" parcialmente la evidencia negativa previa.


# ----------------------------------------------------
# Visualización de la evolución de probabilidades
# ----------------------------------------------------

library(ggplot2); library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
# Se construye una matriz de evolución temporal
evolución <- data.frame(
  Inspección = c("Prior", "Tras Def1", "Tras Def2", "Tras Conf"),
  
  # Probabilidades de cada proveedor en cada etapa
  A = c(prior[1], res1$posterior[1], res2$posterior[1], res3$posterior[1]),
  B = c(prior[2], res1$posterior[2], res2$posterior[2], res3$posterior[2]),
  C = c(prior[3], res1$posterior[3], res2$posterior[3], res3$posterior[3])
)

# Transformación a formato largo (tidy data)
df_long <- pivot_longer(evolución, -Inspección,
                        names_to = "Proveedor", values_to = "Probabilidad")

# Orden lógico de las etapas
df_long$Inspección <- factor(df_long$Inspección,
                             levels = c("Prior","Tras Def1","Tras Def2","Tras Conf"))


# ----------------------------------------------------
# Gráfico de evolución bayesiana
# ----------------------------------------------------

ggplot(df_long, aes(x = Inspección, y = Probabilidad, 
                    color = Proveedor, group = Proveedor)) +
  
  geom_line(linewidth = 1.2) +
  # Muestra la trayectoria de cada proveedor
  
  geom_point(size = 3.5) +
  # Puntos en cada etapa
  
  geom_label(aes(label = paste0(round(Probabilidad * 100, 1), "%")),
             size = 3, show.legend = FALSE) +
  # Etiquetas con porcentajes
  
  scale_color_manual(values = c(A="#3a7fbd", B="#d97706", C="#b0305a")) +
  
  scale_y_continuous(labels = function(x) paste0(round(x*100,0),"%"), limits=c(0,1)) +
  
  labs(title = "Actualización Secuencial Bayesiana — Control de Calidad",
       subtitle = "La posterior de cada inspección es el prior de la siguiente",
       y = "P(Proveedor | Evidencia acumulada)") +
  
  theme_minimal()

# ----------------------------------------------------
# CONCLUSIÓN (Toma de decisiones)
# ----------------------------------------------------

# Este modelo permite:
#
# 1. Identificar el proveedor más probable dado el historial de inspecciones
# 2. Actualizar decisiones en tiempo real (aprendizaje dinámico)
# 3. Minimizar riesgo en selección de proveedores
#
# En términos de decisión:
# → Se elegiría el proveedor con mayor probabilidad posterior
# → O se podría incorporar una función de pérdida (teoría de decisión)