# ====================================================
# BAYES + VEII — TechParts S.A. (Análisis Completo)
# ====================================================
library(ggplot2); library(dplyr); library(tidyr)
## 
## 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
# Tabla de pagos
pagos <- matrix(c(
  -200000, 100000, 500000,
   -50000, 200000, 300000,
   100000, 150000, 180000,
    50000,  50000,  50000
), nrow=4, byrow=TRUE)
rownames(pagos) <- c("Grande","Mediana","Pequeña","NoConstr")
colnames(pagos) <- c("Baja","Media","Alta")

Se arma una tabla donde pones qué decisión tomas (construir grande, mediano, pequeño o no hacer nada) y qué puede pasar en el mercado (bajo, medio o alto). Los números son la plata que ganas o pierdes en cada caso. Básicamente es para ver qué te conviene más según cómo venga la situación, sin saber exactamente qué va a pasar.

# Probabilidades previas y verosimilitudes
prior     <- c(0.20, 0.45, 0.35)
likel_F   <- c(0.10, 0.40, 0.90)  # P(Fav | S)
likel_D   <- 1 - likel_F            # P(Desf | S)

Aquí estás diciendo qué tan probable es cada escenario al inicio y qué tan probable es que el estudio salga bueno en cada uno. Y el otro (likel_D) es nomás lo contrario, cuando sale malo. En corto: estás armando todo para ver cómo cambian las probabilidades según si el estudio sale bien o mal.

# Función Bayesiana
actualizar <- function(prior, likel) {
  conj <- prior * likel
  list(post = conj/sum(conj), P_E = sum(conj))
}

Esta función agarra lo que pensaba al inicio (prior) y la info nueva (likel), los mezcla (multiplica), y con eso saca las nuevas probabilidades (post). También calcula P_E, que es como el total para poder normalizar. En corto: actualiza tus probabilidades cuando aparece nueva evidencia, o sea puro Bayes automático.

# Actualización
bayes_F <- actualizar(prior, likel_F)
bayes_D <- actualizar(prior, likel_D)

cat("Posterior si FAVORABLE:    ", round(bayes_F$post, 3), "\n")
## Posterior si FAVORABLE:     0.039 0.35 0.612
cat("Posterior si DESFAVORABLE: ", round(bayes_D$post, 3), "\n")
## Posterior si DESFAVORABLE:  0.371 0.557 0.072

Aquí se usa la función para ver qué pasa con las probabilidades si el estudio sale bueno o malo. Calculas dos casos: uno cuando es favorable (bayes_F) y otro cuando es desfavorable (bayes_D). Luego imprimes los resultados ya actualizados. En corto: ves cómo cambia la jugada según el resultado del estudio.

# Función de mejor VME
mejor_vme <- function(prob) {
  vme <- pagos %*% prob
  idx <- which.max(vme)
  list(alternativa = rownames(pagos)[idx], valor = vme[idx], todos = vme)
}

Esta función agarra las probabilidades y las mete con la tabla de pagos para calcular cuánta plata esperas ganar en cada opción. Luego mira cuál da más billete y te dice cuál es la mejor decisión. En corto: te ayuda a elegir la opción más conveniente según lo que se espera ganar.

# VME sin información
opt_sin_info  <- mejor_vme(prior)
# VME con info imperfecta
opt_fav       <- mejor_vme(bayes_F$post)
opt_desf      <- mejor_vme(bayes_D$post)

vme_con_info <- bayes_F$P_E * opt_fav$valor +
               bayes_D$P_E * opt_desf$valor

# VECP y VEIP
vecp <- sum(apply(pagos, 2, max) * prior)
veip <- vecp - opt_sin_info$valor
veii <- vme_con_info - opt_sin_info$valor

cat("\n===== RESUMEN DECISIONAL =====\n")
## 
## ===== RESUMEN DECISIONAL =====
cat(sprintf("Sin info → %s: $%s\n",
            opt_sin_info$alternativa, format(round(opt_sin_info$valor), big.mark=",")))
## Sin info → Mediana: $185,000
cat(sprintf("Si Fav   → %s: $%s\n",
            opt_fav$alternativa, format(round(opt_fav$valor), big.mark=",")))
## Si Fav   → Grande: $333,010
cat(sprintf("Si Desf  → %s: $%s\n",
            opt_desf$alternativa, format(round(opt_desf$valor), big.mark=",")))
## Si Desf  → 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("VECP:  $%s\n", format(round(vecp), big.mark=",")))
## VECP:  $285,000
cat(sprintf("VEIP:  $%s\n", format(round(veip), big.mark=",")))
## VEIP:  $1e+05
cat(sprintf("VEII:  $%s  (max a pagar por la consultora)\n",
            format(round(veii), big.mark=",")))
## VEII:  $51,300  (max a pagar por la consultora)
# Gráfico: comparación VME bajo distintos escenarios
df_vme <- data.frame(
  Escenario = c("Sin info\n(A2 Mediana)",
                "Si Favorable\n(A1 Grande)",
                "Si Desfav.\n(A3 Pequeña)",
                "Con info\n(esperado)",
                "Cert. Perfecta\n(VECP)"),
  VME = c(opt_sin_info$valor, opt_fav$valor,
           opt_desf$valor, vme_con_info, vecp),
  Tipo = c("Base","Info","Info","Esperado","Perfecto")
)
df_vme$Escenario <- factor(df_vme$Escenario, levels=df_vme$Escenario)

ggplot(df_vme, aes(x=Escenario, y=VME/1000, fill=Tipo)) +
  geom_col(width=0.6, show.legend=FALSE) +
  geom_text(aes(label=paste0("$",round(VME/1000,0),"k")),
            vjust=-0.4, size=3.8, fontface="bold") +
  scale_fill_manual(values=c(Base="#3a7fbd",Info="#d97706",
                              Esperado="#0f7a52",Perfecto="#b0305a")) +
  labs(title="Comparación de VME por Nivel de Información",
       subtitle="TechParts S.A. - VEII = VME(con info) - VME(sin info)",
       x=NULL, y="VME (miles de $)") +
  theme_minimal() +
  annotate("segment", x=1, xend=4,
           y=opt_sin_info$valor/1000, yend=opt_sin_info$valor/1000,
           linetype="dashed", color="#3a7fbd", linewidth=0.7) +
  annotate("label", x=2.5, y=opt_sin_info$valor/1000,
           label=paste0("VEII = $",round(veii/1000,1),"k"),
           fill="#edf2f7", color="#3a7fbd", size=3.5)

Tener información extra hace ganar más plata, porque te ayuda a elegir mejor qué hacer; sin info decides medio a ciegas, pero con info tomas decisiones más acertadas y aumentas la ganancia.