El objetivo de este análisis es construir y visualizar un árbol de decisiones que ayude a “El Mercader de Venecia” a tomar decisiones estratégicas para expandirse a tres municipios del estado de Hidalgo: Huichapan, Tecozautla y Nopala. A continuación, se describen los pasos seguidos para crear y analizar el árbol de decisiones.
rm = list(ls())
# Cargar las librerías necesarias
library(RSQLite)
library(DBI)
library(rpart)
library(rpart.plot)
library(dplyr)
##
## 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
library(tidyr)
library(ggplot2)
# Asegurar que no se utilice notación científica en la visualización
options(scipen = 999)
# Conectar a la base de datos
db_path <- "arbol_decisiones_expansion.db"
db_path
## [1] "arbol_decisiones_expansion.db"
con <- dbConnect(RSQLite::SQLite(), db_path) # Establelcer conección
dbListTables(con)
## [1] "Estudios_Mercado" "Mercados" "Opciones_Estratégicas"
# Selecciona las primeras 5 filas de la tabla
# Esto es lenguaje SQL lo que está en mayúsculas
query <- "SELECT * FROM Estudios_Mercado LIMIT 5" # TExto consulta
# Si lo ocupo, sólo debo ajustar el query
dbGetQuery(con, query)
## Estudio_ID Mercado_ID Descripción
## 1 1 1 Estudio de Demanda en Huichapan
## 2 2 2 Análisis de Competencia en Tecozautla
## 3 3 3 Estudio de Población en Nopala
## Resultados
## 1 Se espera un crecimiento moderado con una tendencia favorable a la expansión.
## 2 Alta competencia local, requiere una estrategia diferenciada para el éxito.
## 3 Mercado pequeño pero con baja competencia, alta probabilidad de éxito.
## Fecha_Estudio
## 1 2023-05-01
## 2 2023-06-15
## 3 2023-07-20
query <- "SELECT * FROM Mercados LIMIT 5"
dbGetQuery(con, query)
## Mercado_ID Nombre_Mercado Tamaño_Mercado Competencia Costo_Entrada
## 1 1 Huichapan 50000 Media 1500000
## 2 2 Tecozautla 35000 Alta 1000000
## 3 3 Nopala 25000 Baja 750000
## Probabilidad_Éxito
## 1 0.65
## 2 0.55
## 3 0.75
Vamos a unir dos tablas:Estudios_Mercado y Mercado, a partir de una columna que tienen en común: Merado_ID.
# Genera dos talas provisionales llamadas estudio_mercado y mercado
# Estudios_Mercado AS estudio_mercado
query <- "SELECT estudio_mercado.*, mercado.*
FROM
Estudios_Mercado AS estudio_mercado
INNER JOIN
Mercados AS mercado
ON
estudio_mercado.Mercado_ID = mercado.Mercado_ID;"
dbGetQuery(con, query)
## Estudio_ID Mercado_ID Descripción
## 1 1 1 Estudio de Demanda en Huichapan
## 2 2 2 Análisis de Competencia en Tecozautla
## 3 3 3 Estudio de Población en Nopala
## Resultados
## 1 Se espera un crecimiento moderado con una tendencia favorable a la expansión.
## 2 Alta competencia local, requiere una estrategia diferenciada para el éxito.
## 3 Mercado pequeño pero con baja competencia, alta probabilidad de éxito.
## Fecha_Estudio Mercado_ID Nombre_Mercado Tamaño_Mercado Competencia
## 1 2023-05-01 1 Huichapan 50000 Media
## 2 2023-06-15 2 Tecozautla 35000 Alta
## 3 2023-07-20 3 Nopala 25000 Baja
## Costo_Entrada Probabilidad_Éxito
## 1 1500000 0.65
## 2 1000000 0.55
## 3 750000 0.75
Consultamos valores de una tabla, con ayuda de otra tabla.
# Con los valores de una tabla, consultamos la otra tabla
# Quiero conocer los resultados de Estudios_Mercado para Nopala,
# Pero Nopala no aparee en Estudio_Mercado, sólo aparece Mercado_ID
query <- "SELECT estudios_mercado.*
FROM
Estudios_Mercado estudios_mercado
INNER JOin
Mercados AS mercado
ON
estudios_mercado.Mercado_ID = mercado.Mercado_ID
WHERE
mercado.Nombre_Mercado = 'Nopala';
"
dbGetQuery(con, query)
## Estudio_ID Mercado_ID Descripción
## 1 3 3 Estudio de Población en Nopala
## Resultados
## 1 Mercado pequeño pero con baja competencia, alta probabilidad de éxito.
## Fecha_Estudio
## 1 2023-07-20
Ya establecimos la conexión con la base de datos (es lo mismo para SQL), ahora queremos saber cuáles son las tablas presentes en el archivo y cuales son las columnas presentes. Atención: hay varias tablas , pero todas están en el mismo archivo .db
# Ver las tablas almacenadas en la base de datos
tables <- dbListTables(con)
print("Tablas disponibles en la base de datos:") # Imprimir mensaje
## [1] "Tablas disponibles en la base de datos:"
print(tables)
## [1] "Estudios_Mercado" "Mercados" "Opciones_Estratégicas"
# Este paso es necesario para realizar un nuevo registro
# Pegar este resultado en el asitete y pedir guía para
# realizar uevo registro
query <- "PRAGMA table_info(Estudios_Mercado);"
dbGetQuery(con, query)
## cid name type notnull dflt_value pk
## 1 0 Estudio_ID INTEGER 0 NA 1
## 2 1 Mercado_ID INTEGER 0 NA 0
## 3 2 Descripción TEXT 0 NA 0
## 4 3 Resultados TEXT 0 NA 0
## 5 4 Fecha_Estudio DATE 0 NA 0
# Ver el contenido de cada tabla (similar a head())
for (table in tables) {
cat("\nContenido de la tabla:", table, "\n")
query <- paste("SELECT * FROM", table, "LIMIT 5") # Selecciona las primeras 5 filas de la tabla
data <- dbGetQuery(con, query)
print(data)
}
##
## Contenido de la tabla: Estudios_Mercado
## Estudio_ID Mercado_ID Descripción
## 1 1 1 Estudio de Demanda en Huichapan
## 2 2 2 Análisis de Competencia en Tecozautla
## 3 3 3 Estudio de Población en Nopala
## Resultados
## 1 Se espera un crecimiento moderado con una tendencia favorable a la expansión.
## 2 Alta competencia local, requiere una estrategia diferenciada para el éxito.
## 3 Mercado pequeño pero con baja competencia, alta probabilidad de éxito.
## Fecha_Estudio
## 1 2023-05-01
## 2 2023-06-15
## 3 2023-07-20
##
## Contenido de la tabla: Mercados
## Mercado_ID Nombre_Mercado Tamaño_Mercado Competencia Costo_Entrada
## 1 1 Huichapan 50000 Media 1500000
## 2 2 Tecozautla 35000 Alta 1000000
## 3 3 Nopala 25000 Baja 750000
## Probabilidad_Éxito
## 1 0.65
## 2 0.55
## 3 0.75
##
## Contenido de la tabla: Opciones_Estratégicas
## Opción_ID Mercado_ID Nombre_Opción Costo_Opción Beneficio_Estimado
## 1 1 1 Expansión Total 2000000 3000000
## 2 2 1 Alianza Estratégica 1000000 2000000
## 3 3 1 Expansión Parcial 1200000 2500000
## 4 4 2 Expansión Total 1500000 2500000
## 5 5 2 Alianza Estratégica 800000 1800000
## Probabilidad_Éxito_Opción
## 1 0.70
## 2 0.65
## 3 0.60
## 4 0.60
## 5 0.55
# Cargar las tablas de la base de datos
mercados <- dbGetQuery(con, "SELECT * FROM Mercados")
opciones <- dbGetQuery(con, "SELECT * FROM Opciones_Estratégicas")
estudios <- dbGetQuery(con, "SELECT * FROM Estudios_Mercado")
# Mostrar un vistazo rápido a los datos cargados
head(mercados)
## Mercado_ID Nombre_Mercado Tamaño_Mercado Competencia Costo_Entrada
## 1 1 Huichapan 50000 Media 1500000
## 2 2 Tecozautla 35000 Alta 1000000
## 3 3 Nopala 25000 Baja 750000
## Probabilidad_Éxito
## 1 0.65
## 2 0.55
## 3 0.75
head(opciones)
## Opción_ID Mercado_ID Nombre_Opción Costo_Opción Beneficio_Estimado
## 1 1 1 Expansión Total 2000000 3000000
## 2 2 1 Alianza Estratégica 1000000 2000000
## 3 3 1 Expansión Parcial 1200000 2500000
## 4 4 2 Expansión Total 1500000 2500000
## 5 5 2 Alianza Estratégica 800000 1800000
## 6 6 2 Expansión Parcial 1000000 2200000
## Probabilidad_Éxito_Opción
## 1 0.70
## 2 0.65
## 3 0.60
## 4 0.60
## 5 0.55
## 6 0.50
head(estudios)
## Estudio_ID Mercado_ID Descripción
## 1 1 1 Estudio de Demanda en Huichapan
## 2 2 2 Análisis de Competencia en Tecozautla
## 3 3 3 Estudio de Población en Nopala
## Resultados
## 1 Se espera un crecimiento moderado con una tendencia favorable a la expansión.
## 2 Alta competencia local, requiere una estrategia diferenciada para el éxito.
## 3 Mercado pequeño pero con baja competencia, alta probabilidad de éxito.
## Fecha_Estudio
## 1 2023-05-01
## 2 2023-06-15
## 3 2023-07-20
dbDisconnect(con)
# Convertir Mercado_ID a factor y agregar nombres de municipios para asegurarnos de que se visualicen correctamente
opciones$Mercado_Nombre <- mercados$Nombre_Mercado[match(opciones$Mercado_ID, mercados$Mercado_ID)]
# Crear acrónimos para las opciones estratégicas
opciones$Nombre_Opción <- recode(opciones$Nombre_Opción,
"Expansión Total" = "ExpTotal",
"Alianza Estratégica" = "AliAEstr",
"Expansión Parcial" = "ExpPar")
# Asignar probabilidades y calcular el valor esperado para cada opción
opciones <- opciones %>%
mutate(Valor_Esperado = Probabilidad_Éxito_Opción * Beneficio_Estimado -
(1 - Probabilidad_Éxito_Opción) * Costo_Opción)
# Convertir los valores monetarios a miles de pesos y asegurarse de que no usen notación científica
opciones <- opciones %>%
mutate(Costo_Opción = Costo_Opción / 1000,
Beneficio_Estimado = Beneficio_Estimado / 1000,
Valor_Esperado = Valor_Esperado / 1000)
names(opciones) <- c("OpID", "MercID", "NomOp", "CostOp", "BenEst", "ProbExito", "MercNom", "ValEsp")
# Visualizar el resultado de la transformación
print(opciones)
## OpID MercID NomOp CostOp BenEst ProbExito MercNom ValEsp
## 1 1 1 ExpTotal 2000 3000 0.70 Huichapan 1500
## 2 2 1 AliAEstr 1000 2000 0.65 Huichapan 950
## 3 3 1 ExpPar 1200 2500 0.60 Huichapan 1020
## 4 4 2 ExpTotal 1500 2500 0.60 Tecozautla 900
## 5 5 2 AliAEstr 800 1800 0.55 Tecozautla 630
## 6 6 2 ExpPar 1000 2200 0.50 Tecozautla 600
## 7 7 3 ExpTotal 1200 2000 0.75 Nopala 1200
## 8 8 3 AliAEstr 600 1500 0.70 Nopala 870
## 9 9 3 ExpPar 800 1800 0.65 Nopala 890
# Crear un modelo de árbol de decisiones con rpart
arbol <- rpart(ValEsp ~ MercNom + NomOp + CostOp + ProbExito,
data = opciones,
method = "anova",
control = rpart.control(minsplit = 2, cp = 0))
# Visualizar el árbol de decisiones con rpart.plot
rpart.plot(arbol, main = "Árbol de decisiones para expansión a \nnuevos mercados (miles de pesos)",
type = 4, extra = 101, # Muestra el valor ajustado del nodo
under = TRUE,
fallen.leaves = TRUE,
digits = 1, # Mostrar cantidades con tres decimales
box.palette = "RdYlGn",
tweak = 1.2)
# Paso 1: Visualizar la tabla de costos de complejidad
printcp(arbol)
##
## Regression tree:
## rpart(formula = ValEsp ~ MercNom + NomOp + CostOp + ProbExito,
## data = opciones, method = "anova", control = rpart.control(minsplit = 2,
## cp = 0))
##
## Variables actually used in tree construction:
## [1] CostOp MercNom NomOp ProbExito
##
## Root node error: 607289/9 = 67477
##
## n= 9
##
## CP nsplit rel error xerror xstd
## 1 0.558118047 0 1.000000000 1.2656 0.58778
## 2 0.314210700 1 0.441881953 1.9169 0.58147
## 3 0.103020711 2 0.127671253 1.5123 0.51459
## 4 0.019106777 3 0.024650542 1.6116 0.65266
## 5 0.004034324 4 0.005543765 1.5113 0.59917
## 6 0.000740998 5 0.001509441 1.4393 0.57910
## 7 0.000686109 6 0.000768443 1.4647 0.57860
## 8 0.000082333 7 0.000082333 1.4647 0.57860
## 9 0.000000000 8 0.000000000 1.4692 0.57826
# Paso 2: Seleccionar un valor de cp que permita una poda menos agresiva
# Aquí, seleccionaremos un cp más pequeño, que no sea el mínimo, pero que aún reduzca el tamaño del árbol
# Usamos la tabla para identificar un valor adecuado
best_cp <- arbol$cptable[which.min(arbol$cptable[,"xerror"]), "CP"]
# Probar con un cp un poco menor al seleccionado automáticamente
# Puedes intentar reducir el valor ligeramente
adjusted_cp <- best_cp / 2 # Esto es un ejemplo, puede ser ajustado según la tabla `printcp`
# Paso 3: Podar el árbol utilizando el valor ajustado de cp
arbol_podado <- prune(arbol, cp = adjusted_cp)
# Paso 4: Visualizar el árbol podado
rpart.plot(arbol_podado, main = "Árbol de decisiones podado para expansión a \nnuevos mercados (miles de pesos",
type = 4, extra = 101,
under = TRUE,
fallen.leaves = TRUE,
digits = 1,
box.palette = "RdYlGn",
tweak = 1.2)
# Crear la tabla con el valor esperado para cada municipio y opción
tabla_valores <- opciones %>%
select(MercNom, NomOp, ValEsp)
print(tabla_valores)
## MercNom NomOp ValEsp
## 1 Huichapan ExpTotal 1500
## 2 Huichapan AliAEstr 950
## 3 Huichapan ExpPar 1020
## 4 Tecozautla ExpTotal 900
## 5 Tecozautla AliAEstr 630
## 6 Tecozautla ExpPar 600
## 7 Nopala ExpTotal 1200
## 8 Nopala AliAEstr 870
## 9 Nopala ExpPar 890
# Encontrar el municipio con el valor esperado máximo para la opción "ExpTotal"
municipio_max <- tabla_valores %>%
filter(ValEsp == max(ValEsp))
# Imprimir un mensaje personalizado
municipio <- municipio_max$MercNom
valor <- municipio_max$ValEsp
estrategia <- municipio_max$NomOp
mensaje <- paste("El municipio elegido es", municipio, "con un valor esperado máximo de",
valor, "miles de pesos en la opción", estrategia,
"lo que lo convierte en la mejor opción para la expansión.")
print(mensaje)
## [1] "El municipio elegido es Huichapan con un valor esperado máximo de 1500 miles de pesos en la opción ExpTotal lo que lo convierte en la mejor opción para la expansión."
# Evaluar y comparar las opciones dentro de cada municipio
evaluacion <- tabla_valores %>%
group_by(MercNom) %>%
summarise(
ExpTotal = ValEsp[NomOp == "ExpTotal"],
AliAEstr = ValEsp[NomOp == "AliAEstr"],
ExpPar = ValEsp[NomOp == "ExpPar"]
)
print(evaluacion)
## # A tibble: 3 × 4
## MercNom ExpTotal AliAEstr ExpPar
## <chr> <dbl> <dbl> <dbl>
## 1 Huichapan 1500 950 1020
## 2 Nopala 1200 870 890
## 3 Tecozautla 900 630 600
# Encontrar la mejor opción para cada municipio
mejor_opcion_por_municipio <- tabla_valores %>%
group_by(MercNom) %>%
filter(ValEsp == max(ValEsp)) %>%
arrange(desc(ValEsp))
print(mejor_opcion_por_municipio)
## # A tibble: 3 × 3
## # Groups: MercNom [3]
## MercNom NomOp ValEsp
## <chr> <chr> <dbl>
## 1 Huichapan ExpTotal 1500
## 2 Nopala ExpTotal 1200
## 3 Tecozautla ExpTotal 900
# Imprimir un mensaje personalizado para cada municipio
for (i in 1:nrow(mejor_opcion_por_municipio)) {
municipio <- mejor_opcion_por_municipio$MercNom[i]
valor <- mejor_opcion_por_municipio$ValEsp[i]
estrategia <- mejor_opcion_por_municipio$NomOp[i]
mensaje <- paste("En", municipio, "la mejor opción es", estrategia,
"con un valor esperado de", valor, "miles de pesos.")
print(mensaje)
}
## [1] "En Huichapan la mejor opción es ExpTotal con un valor esperado de 1500 miles de pesos."
## [1] "En Nopala la mejor opción es ExpTotal con un valor esperado de 1200 miles de pesos."
## [1] "En Tecozautla la mejor opción es ExpTotal con un valor esperado de 900 miles de pesos."
# Análisis adicional para la opción "ExpTotal"
# Comparar "ExpTotal" con otras opciones en el municipio seleccionado
municipio_seleccionado <- municipio_max$MercNom
comparacion_exp_total <- tabla_valores %>%
filter(MercNom == municipio_seleccionado)
print("Comparación de opciones en el municipio seleccionado:")
## [1] "Comparación de opciones en el municipio seleccionado:"
print(comparacion_exp_total)
## MercNom NomOp ValEsp
## 1 Huichapan ExpTotal 1500
## 2 Huichapan AliAEstr 950
## 3 Huichapan ExpPar 1020
# Justificar la elección
razon <- paste("La opción 'ExpTotal' fue seleccionada en", municipio_seleccionado,
"debido a que presentó el mayor valor esperado de", valor,
"miles de pesos. Esta opción es preferible a las demás, dado que maximiza el retorno esperado, considerando tanto el beneficio estimado como la probabilidad de éxito.")
print(razon)
## [1] "La opción 'ExpTotal' fue seleccionada en Huichapan debido a que presentó el mayor valor esperado de 900 miles de pesos. Esta opción es preferible a las demás, dado que maximiza el retorno esperado, considerando tanto el beneficio estimado como la probabilidad de éxito."
#```{r Sensibilidad}
# Definir un rango de variación para la probabilidad de éxito (por ejemplo, entre 0.5 y 0.9)
probabilidades <- seq(0.5, 0.9, by = 0.05)
# Crear una función para calcular el valor esperado basado en la probabilidad de éxito variable
calcular_valor_esperado <- function(prob, cost, beneficio) {
return(prob * beneficio - (1 - prob) * cost)
}
# Calcular el número total de combinaciones de opciones y probabilidades
n_combinaciones <- nrow(opciones) * length(probabilidades)
# Aplicar el análisis de sensibilidad para cada opción y cada probabilidad de éxito
sensibilidad <- opciones %>%
slice(rep(1:n(), each = length(probabilidades))) %>%
mutate(
ProbabilidadExito = rep(probabilidades, times = nrow(opciones)),
ValEspSens = calcular_valor_esperado(ProbabilidadExito, CostOp, BenEst)
)
# Modificar el nombre del municipio para incluir la opción elegida
sensibilidad <- sensibilidad %>%
left_join(mejor_opcion_por_municipio, by = "MercNom") %>%
mutate(MercNom = paste(MercNom, "\n(", NomOp.y, ")", sep = ""))
# Mostrar una tabla de resultados del análisis de sensibilidad para "ExpTotal" en cada municipio
sensibilidad_exp_total <- sensibilidad %>%
filter(NomOp.x == "ExpTotal") %>%
arrange(MercNom, ProbabilidadExito)
print(sensibilidad_exp_total)
## OpID MercID NomOp.x CostOp BenEst ProbExito MercNom ValEsp.x
## 1 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 2 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 3 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 4 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 5 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 6 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 7 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 8 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 9 1 1 ExpTotal 2000 3000 0.70 Huichapan\n(ExpTotal) 1500
## 10 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 11 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 12 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 13 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 14 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 15 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 16 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 17 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 18 7 3 ExpTotal 1200 2000 0.75 Nopala\n(ExpTotal) 1200
## 19 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 20 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 21 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 22 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 23 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 24 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 25 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 26 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## 27 4 2 ExpTotal 1500 2500 0.60 Tecozautla\n(ExpTotal) 900
## ProbabilidadExito ValEspSens NomOp.y ValEsp.y
## 1 0.50 500 ExpTotal 1500
## 2 0.55 750 ExpTotal 1500
## 3 0.60 1000 ExpTotal 1500
## 4 0.65 1250 ExpTotal 1500
## 5 0.70 1500 ExpTotal 1500
## 6 0.75 1750 ExpTotal 1500
## 7 0.80 2000 ExpTotal 1500
## 8 0.85 2250 ExpTotal 1500
## 9 0.90 2500 ExpTotal 1500
## 10 0.50 400 ExpTotal 1200
## 11 0.55 560 ExpTotal 1200
## 12 0.60 720 ExpTotal 1200
## 13 0.65 880 ExpTotal 1200
## 14 0.70 1040 ExpTotal 1200
## 15 0.75 1200 ExpTotal 1200
## 16 0.80 1360 ExpTotal 1200
## 17 0.85 1520 ExpTotal 1200
## 18 0.90 1680 ExpTotal 1200
## 19 0.50 500 ExpTotal 900
## 20 0.55 700 ExpTotal 900
## 21 0.60 900 ExpTotal 900
## 22 0.65 1100 ExpTotal 900
## 23 0.70 1300 ExpTotal 900
## 24 0.75 1500 ExpTotal 900
## 25 0.80 1700 ExpTotal 900
## 26 0.85 1900 ExpTotal 900
## 27 0.90 2100 ExpTotal 900
ggplot(sensibilidad_exp_total, aes(x = ProbabilidadExito, y = ValEspSens, color = MercNom)) +
geom_line() +
labs(title = "Análisis de Sensibilidad del Valor Esperado",
x = "Probabilidad de Éxito",
y = "Valor Esperado (miles de pesos)",
color = "Municipio \n(Opción)") +
theme_minimal()