#Introducción
La toma de decisiones en entornos de incertidumbre es fundamental para las startups tecnológicas, ya que cada alternativa estratégica implica distintos niveles de riesgo, inversión y retorno esperado. En este contexto, una empresa emergente debe elegir entre lanzar su producto a gran escala, realizar un lanzamiento piloto que permita validar el mercado antes de escalar, o abandonar el proyecto. El comportamiento del mercado es incierto y puede influir significativamente en los resultados de cada opción, mientras que el piloto ofrece la posibilidad de reducir la incertidumbre antes de tomar una decisión definitiva. Ante esta situación, el problema consiste en determinar cuál estrategia resulta más conveniente, utilizando herramientas como el árbol de decisión y el Valor Monetario Esperado para apoyar una elección óptima bajo condiciones de riesgo.
# ====================================================
# ÁRBOL MULTIETAPA — Startup de Tecnología
# Análisis de sensibilidad incluido
# ====================================================
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
Se cargan las librerías necesarias para el desarrollo del modelo y el análisis de resultados:
library(ggplot2)
Permite realizar gráficos y visualizaciones de datos, útiles para
interpretar resultados y análisis de sensibilidad.
library(dplyr)
Facilita la manipulación y transformación de datos, como filtrado,
selección y creación de variables.
library(tidyr)
Se utiliza para organizar y estructurar los datos en formatos adecuados
para el análisis, especialmente al trabajar con tablas y
modelos.
# Parámetros base
inv_nac <- 200000
inv_piloto <- 60000
p_mer <- c(0.30, 0.50, 0.20)
payoff_mer <- c(800000, 300000, -50000)
p_exito <- 0.55
recup_fall <- 10000
Se definen los valores iniciales que representan los costos, probabilidades y resultados del problema:
inv_nac <- 200000
Inversión necesaria para realizar el lanzamiento a nivel
nacional.
inv_piloto <- 60000
Costo de implementar un lanzamiento piloto.
p_mer <- c(0.30, 0.50, 0.20)
Vector de probabilidades asociado a los posibles escenarios de mercado
(grande, medio y pequeño).
payoff_mer <- c(800000, 300000, -50000)
Beneficios o pérdidas correspondientes a cada tipo de mercado en el
lanzamiento nacional.
p_exito <- 0.55
Probabilidad de que el lanzamiento piloto sea exitoso.
recup_fall <- 10000
Monto recuperado en caso de que el piloto falle.
# Función de evaluación
eval_arbol <- function(p_ex=0.55, p_gr=0.30) {
pm <- c(p_gr, 0.50, 1-p_gr-0.50)
vme_nac <- sum(payoff_mer * pm) - inv_nac
vme_escal <- sum(payoff_mer * pm) - inv_nac # misma inversión
vme_piloto <- p_ex*vme_escal + (1-p_ex)*recup_fall - inv_piloto
list(Nacional=vme_nac, Piloto=vme_piloto, Cerrar=0,
Optima=max(vme_nac, vme_piloto, 0),
Decision=c("Nacional","Piloto","Cerrar")[which.max(c(vme_nac,vme_piloto,0))])
}
Se define una función que permite calcular el Valor Monetario Esperado (VME) de cada alternativa y determinar la mejor decisión:
eval_arbol <- function(p_ex=0.55, p_gr=0.30)
Se crea una función que evalúa el árbol de decisión, permitiendo variar
la probabilidad de éxito del piloto (p_ex) y la
probabilidad de mercado grande (p_gr).
pm <- c(p_gr, 0.50, 1-p_gr-0.50)
Se construye el vector de probabilidades del mercado (grande, medio y
pequeño), ajustando dinámicamente según el valor de
p_gr.
vme_nac <- sum(payoff_mer * pm) - inv_nac
Se calcula el VME del lanzamiento nacional, considerando los beneficios
esperados en cada escenario y restando la inversión.
vme_escal <- sum(payoff_mer * pm) - inv_nac
Se calcula el VME de escalar el piloto en caso de éxito, asumiendo la
misma estructura que el lanzamiento nacional.
vme_piloto <- p_ex*vme_escal + (1-p_ex)*recup_fall - inv_piloto
Se calcula el VME del piloto:
list(...)
Se devuelven los resultados en forma de lista, incluyendo:
# Caso base
base <- eval_arbol()
cat("===== STARTUP — CASO BASE =====\n")
## ===== STARTUP — CASO BASE =====
cat(sprintf("VME Nacional: $%s\n", format(round(base$Nacional),big.mark=",")))
## VME Nacional: $180,000
cat(sprintf("VME Piloto: $%s\n", format(round(base$Piloto), big.mark=",")))
## VME Piloto: $43,500
cat(sprintf("Decisión óptima: %s ($%s)\n",
base$Decision, format(round(base$Optima), big.mark=",")))
## Decisión óptima: Nacional ($180,000)
Se evalúa el escenario inicial del modelo utilizando los valores por defecto:
base <- eval_arbol()
Se ejecuta la función de evaluación para obtener los resultados del caso
base del problema.
cat("===== STARTUP — CASO BASE =====\n")
Se imprime un título para organizar la salida de los
resultados.
cat(sprintf("VME Nacional: $%s\n", format(round(base$Nacional),big.mark=",")))
Se muestra el Valor Monetario Esperado (VME) de la alternativa de
lanzamiento nacional.
cat(sprintf("VME Piloto: $%s\n", format(round(base$Piloto), big.mark=",")))
Se muestra el VME correspondiente a la alternativa del piloto.
cat(sprintf("Decisión óptima: %s ($%s)\n", base$Decision, format(round(base$Optima), big.mark=",")))
Se presenta la mejor decisión, es decir, la alternativa que maximiza el
VME junto con su valor esperado.
# Sensibilidad: P(éxito piloto)
p_exitos <- seq(0.10, 0.90, 0.02)
sens <- lapply(p_exitos, function(p) {
res <- eval_arbol(p_ex=p)
data.frame(p_exito=p, Nacional=res$Nacional,
Piloto=res$Piloto, Cerrar=0)
}) |> bind_rows()
Se evalúa cómo cambia la decisión al modificar la probabilidad de éxito del piloto:
p_exitos <- seq(0.10, 0.90, 0.02)
Se genera una secuencia de valores para la probabilidad de éxito del
piloto, variando en un rango amplio.
sens <- lapply(p_exitos, function(p) { ... })
Se aplica la función de evaluación del árbol para cada valor de
probabilidad, permitiendo analizar distintos escenarios.
res <- eval_arbol(p_ex=p)
Se calcula el resultado del modelo para cada valor de probabilidad de
éxito.
data.frame(...)
Se almacenan los resultados en un data frame, incluyendo:
|> bind_rows()
Se combinan todos los resultados en una sola tabla, facilitando su
análisis y posterior visualización.
# Punto de indiferencia Nacional vs Piloto
indiferencia <- approx(sens$Piloto-sens$Nacional,
sens$p_exito, xout=0)$y
cat(sprintf("\nPunto de indiferencia: P(éxito)=%.2f\n", indiferencia))
##
## Punto de indiferencia: P(éxito)=NA
cat(sprintf("Si P(éxito) > %.2f → Piloto es mejor que Nacional\n", indiferencia))
## Si P(éxito) > NA → Piloto es mejor que Nacional
Se determina el valor de probabilidad en el cual ambas alternativas generan el mismo resultado esperado:
indiferencia <- approx(sens$Piloto - sens$Nacional, sens$p_exito, xout=0)$y
Se utiliza interpolación para encontrar el punto donde la diferencia
entre el VME del piloto y el nacional es cero, es decir, donde ambas
alternativas son equivalentes.
cat(sprintf("\nPunto de indiferencia: P(éxito)=%.2f\n", indiferencia))
Se imprime el valor de la probabilidad de éxito del piloto en el cual no
hay preferencia entre las dos opciones.
cat(sprintf("Si P(éxito) > %.2f → Piloto es mejor que Nacional\n", indiferencia))
Se interpreta el resultado indicando que, si la probabilidad de éxito
del piloto supera ese valor, la opción del piloto se vuelve más
conveniente que el lanzamiento nacional.
# Gráfico de sensibilidad
sens_long <- pivot_longer(sens, -p_exito,
names_to="Alternativa", values_to="VME")
ggplot(sens_long, aes(x=p_exito, y=VME/1000, color=Alternativa)) +
geom_line(linewidth=1.2) +
geom_vline(xintercept=c(0.55, indiferencia),
linetype=c("solid","dashed"), alpha=0.5) +
scale_color_manual(values=c(Nacional="#3a7fbd",Piloto="#d97706",Cerrar="#8a9ab5")) +
scale_x_continuous(labels=scales::percent) +
labs(title="Análisis de Sensibilidad — Startup",
subtitle=sprintf("Indiferencia en P(éxito)=%.0f%%. Caso base=55%% (línea sólida)",
indiferencia*100),
x="P(Éxito Piloto)", y="VME (miles $)") +
theme_minimal()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_vline()`).
Se construye una visualización que muestra cómo varía el VME de cada alternativa según la probabilidad de éxito del piloto:
sens_long <- pivot_longer(sens, -p_exito, names_to="Alternativa", values_to="VME")
Se transforma la base de datos a formato largo, facilitando la creación
de gráficos comparativos entre alternativas.
ggplot(sens_long, aes(x=p_exito, y=VME/1000, color=Alternativa)) +
Se inicializa el gráfico, definiendo:
geom_line(linewidth=1.2)
Se agregan líneas para representar la evolución del VME de cada
alternativa.
geom_vline(xintercept=c(0.55, indiferencia), linetype=c("solid","dashed"), alpha=0.5)
Se añaden líneas verticales de referencia:
scale_color_manual(...)
Se asignan colores personalizados a cada alternativa para mejorar la
interpretación visual.
scale_x_continuous(labels=scales::percent)
Se formatea el eje X en porcentaje.
labs(...)
Se agregan título, subtítulo y etiquetas a los ejes, proporcionando
contexto al gráfico.
theme_minimal()
Se aplica un estilo visual limpio y sencillo.
#Árbol de decisión
library(DiagrammeR)
grViz("
digraph {
graph [layout = dot, rankdir = LR, nodesep=0.6, ranksep=0.8]
node [fontname = Helvetica]
# ===== DECISIÓN INICIAL =====
D0 [label = 'Decisión', shape = box, style = filled, fillcolor = '#4A90E2', fontcolor = white]
# ===== NODOS DE AZAR =====
C1 [label = 'Mercado', shape = circle, style = filled, fillcolor = '#F5A623']
C2 [label = 'Resultado Piloto', shape = circle, style = filled, fillcolor = '#F5A623']
C3 [label = 'Mercado', shape = circle, style = filled, fillcolor = '#F5A623']
# ===== TERMINALES =====
node [shape = box, style = rounded]
# Nacional
N1 [label = 'Grande\n$800k']
N2 [label = 'Medio\n$300k']
N3 [label = 'Pequeño\n-$50k']
# Piloto
P1 [label = 'Fracaso\n$10k']
# Éxito → mercado
M1 [label = 'Grande\n$800k']
M2 [label = 'Medio\n$300k']
M3 [label = 'Pequeño\n-$50k']
# Cerrar
C0 [label = 'Cerrar\n$0']
# ===== CONEXIONES =====
# Decisión inicial
D0 -> C1 [label = 'Lanzar Nacional']
D0 -> C2 [label = 'Piloto']
D0 -> C0 [label = 'Cerrar']
# ===== NACIONAL =====
C1 -> N1 [label = 'Grande']
C1 -> N2 [label = 'Medio']
C1 -> N3 [label = 'Pequeño']
# ===== PILOTO =====
C2 -> C3 [label = 'Éxito']
C2 -> P1 [label = 'Fracaso']
# Éxito → mercado
C3 -> M1 [label = 'Grande']
C3 -> M2 [label = 'Medio']
C3 -> M3 [label = 'Pequeño']
}
")
Comclusion
El análisis muestra que, bajo incertidumbre de mercado, la mejor estrategia es aquella que permite reducir riesgos antes de comprometer grandes recursos. En el caso estudiado, esto corresponde a realizar un piloto primero: se obtiene información clave que guía la decisión final, maximizando el valor esperado de la inversión.
Si el piloto es exitoso, se procede con la inversión a gran escala. Si el piloto falla, se minimizan pérdidas evitando comprometer recursos mayores.
En términos generales, el resultado resalta que tomar decisiones escalonadas y basadas en información parcial reduce riesgos y mejora el desempeño esperado, mostrando la importancia de combinar análisis cuantitativo con planificación estratégica.