CASO REAL 3 — ÁRBOL BAYESIANO INTEGRADO TechParts — Árbol Completo con Consultora (Bayes + Árbol) El caso más completo: la empresa primero decide si contratar la consultora, luego observa el dictamen y aplica Bayes, luego elige la planta. Es un árbol de 2 etapas de decisión con información imperfecta.

Árbol Bayesiano — TechParts S.A.

Parámetros del Problema

library(ggplot2); library(tidyr); library(dplyr)
## Warning: package 'ggplot2' was built under R version 4.5.2
## Warning: package 'dplyr' was built under R version 4.5.2
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# ---- Datos ----
pagos <- matrix(c(
  -200000, 100000, 500000,
  -50000, 200000, 300000,
  100000, 150000, 180000
), nrow=3, byrow=TRUE)
rownames(pagos) <- c("Grande","Mediana","Pequeña")
prior   <- c(0.20, 0.45, 0.35)
likel_F <- c(0.10, 0.40, 0.90)
likel_D <- 1 - likel_F

Cálculo Bayesiano y Evaluación

# ---- Bayes ----
actualizar <- function(prior, likel) {
  conj <- prior*likel
  list(post=conj/sum(conj), P_E=sum(conj))
}
bF <- actualizar(prior, likel_F)
bD <- actualizar(prior, likel_D)

# ---- VME por escenario ----
vme_all <- function(p) {
  v <- pagos %*% p
  list(vme=as.vector(v), mejor=rownames(pagos)[which.max(v)],
       max_vme=max(v))
}

r_prior <- vme_all(prior)
r_F     <- vme_all(bF$post)
r_D     <- vme_all(bD$post)

vme_con_info <- bF$P_E*r_F$max_vme + bD$P_E*r_D$max_vme
veii         <- vme_con_info - r_prior$max_vme

cat("===== ÁRBOL BAYESIANO — TECHPARTS =====\n")
## ===== ÁRBOL BAYESIANO — TECHPARTS =====
cat(sprintf("Sin consultora → %s: $%s\n",
            r_prior$mejor, format(round(r_prior$max_vme), big.mark=",")))
## Sin consultora → Mediana: $185,000
cat(sprintf("Si Favorable   → %s: $%s\n",
            r_F$mejor, format(round(r_F$max_vme), big.mark=",")))
## Si Favorable   → Grande: $333,010
cat(sprintf("Si Desfavor.   → %s: $%s\n",
            r_D$mejor, format(round(r_D$max_vme), big.mark=",")))
## Si Desfavor.   → Pequeña: $133,608
cat(sprintf("VME con info imperfecta: $%s\n",
            format(round(vme_con_info), big.mark=",")))
## VME con info imperfecta: $236,300
cat(sprintf("VEII = $%s (máx a pagar por la consultora)\n",
            format(round(veii), big.mark=",")))
## VEII = $51,300 (máx a pagar por la consultora)

Visualización Comparativa

# ---- Gráfico: VME por alternativa en cada escenario ----
df_vme <- data.frame(
  Alternativa  = rownames(pagos),
  Sin_info     = r_prior$vme,
  Favorable    = r_F$vme,
  Desfavorable = r_D$vme
)
df_long <- pivot_longer(df_vme, -Alternativa,
                        names_to="Escenario", values_to="VME")
df_long$Escenario <- factor(df_long$Escenario,
                            levels=c("Sin_info","Favorable","Desfavorable"),
                            labels=c("Sin info","Favorable","Desfavorable"))

ggplot(df_long, aes(x=Alternativa, y=VME/1000, fill=Escenario)) +
  geom_col(position="dodge", width=0.65) +
  geom_hline(yintercept=0, color="gray50") +
  geom_text(aes(label=paste0("$",round(VME/1000),"k"),
                y=VME/1000+ifelse(VME>0,7,-15)),
            position=position_dodge(0.65), size=2.8, fontface="bold") +
  scale_fill_manual(values=c("Sin info"="#3a7fbd",
                             Favorable="#0f7a52",
                             Desfavorable="#b0305a")) +
  labs(title="VME por Alternativa según Escenario de Información — TechParts",
       subtitle="La información bayesiana cambia cuál alternativa es óptima",
       x="Alternativa", y="VME (miles $)", fill="Escenario") +
  theme_minimal() + theme(legend.position="top")

Análisis de Valor de la Información

# Tabla resumen
resumen <- data.frame(
  Escenario = c("Sin información", "Favorable", "Desfavorable", "Con información"),
  Alternativa_Optima = c(r_prior$mejor, r_F$mejor, r_D$mejor, "Condicional"),
  VME = c(
    round(r_prior$max_vme), round(r_F$max_vme), 
    round(r_D$max_vme), round(vme_con_info)
  )
)
resumen$VEII <- c(0, "-", "-", round(veii))
knitr::kable(resumen, col.names = c("Escenario", "Óptima", "VME ($)", "VEII ($)"),
             digits = 0, format.args = list(big.mark = ","))
Escenario Óptima VME (\()|VEII (\))
Sin información Mediana 185,000 0
Favorable Grande 333,010 -
Desfavorable Pequeña 133,608 -
Con información Condicional 236,300 51300
resumen
##         Escenario Alternativa_Optima    VME  VEII
## 1 Sin información            Mediana 185000     0
## 2       Favorable             Grande 333010     -
## 3    Desfavorable            Pequeña 133608     -
## 4 Con información        Condicional 236300 51300

Conclusión

La decisión estratégica es la de CONTRATAR LA CONSULTORA ya que VEII > costo típico de consultoría de mercado.

VISUALIZACIÓN DEL ÁRBOL DE DECISIÓN

# 1. Definir coordenadas de los nodos (X, Y) y etiquetas
tree_data <- data.frame(
  x = c(0, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3),
  y = c(0, 1, -1, 2, 0, 2.5, 2, 1.5, 0.5, 0, -0.5),
  label = c("Inicio", "Sin Consultora", "Con Consultora", 
            "Favorable", "Desfavorable",
            "Grande", "Mediana", "Pequeña", 
            "Grande", "Mediana", "Pequeña"),
  vme = c("", 
          paste0("$", round(r_prior$max_vme/1000), "k"), 
          paste0("$", round(vme_con_info/1000), "k"),
          paste0("P=", round(bF$P_E, 2)), 
          paste0("P=", round(bD$P_E, 2)),
          "", "", "", "", "", ""),
  tipo = c("Raíz", "Decisión", "Azar", "Azar", "Azar", 
           "Final", "Final", "Final", "Final", "Final", "Final")
)

# 2. Definir las conexiones (ramas)
edges <- data.frame(
  x =    c(0, 0, 1, 1, 2, 2, 2, 2, 2, 2),
  y =    c(0, 0, 1, -1, 2, 2, 2, 0, 0, 0),
  xend = c(1, 1, 2, 2, 3, 3, 3, 3, 3, 3),
  yend = c(1, -1, 2, 0, 2.5, 2, 1.5, 0.5, 0, -0.5)
)

# 3. Dibujar el árbol
ggplot() +
  # Ramas
  geom_segment(data=edges, aes(x=x, y=y, xend=xend, yend=yend), 
               color="gray70", linewidth=1) +
  # Nodos
  geom_point(data=tree_data, aes(x=x, y=y, color=tipo), size=8) +
  # Etiquetas de Nodos
  geom_text(data=tree_data, aes(x=x, y=y, label=label), 
            vjust=-1.5, size=3.5, fontface="bold") +
  # Valores VME o Probabilidades
  geom_text(data=tree_data, aes(x=x, y=y, label=vme), 
            vjust=2.5, size=3, color="darkblue") +
  # Personalización estética
  scale_color_manual(values=c("Raíz"="#333333", "Decisión"="#3a7fbd", 
                              "Azar"="#d97706", "Final"="#0f7a52")) +
  xlim(-0.2, 3.5) + ylim(-1.5, 3) +
  labs(title="Estructura del Árbol de Decisión Bayesiano",
       subtitle="TechParts S.A. — De la consulta a la elección de capacidad",
       caption=paste("VEII calculado:", format(round(veii), big.mark=","))) +
  theme_void() +
  theme(legend.position="none", plot.margin=margin(20,20,20,20))

INTERPRETACION Este árbol de decisión representa una estrategia de inversión donde, antes de comprometer capital en la construcción de una planta, evaluamos si contratar una consultoría externa para reducir la incertidumbre del mercado. Al comparar los resultados, el modelo demuestra que la información proporcionada por el estudio (enfoque Bayesiano) permite ajustar el tamaño de la planta —grande, mediana o pequeña— según el reporte obtenido, lo cual maximiza el valor esperado y minimiza riesgos financieros al evitar decisiones costosas en escenarios desfavorables. En última instancia, la diferencia entre ambos caminos indica el beneficio económico de la información, permitiéndote determinar cuánto es lo máximo que deberías pagar por dicho estudio antes de decidir si es preferible actuar basándote únicamente en tus probabilidades iniciales.