# ====================================================
# 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.