Introducción

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.

1. Conectar a la Base de Datos

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)

1.1 Leer Path

# 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

1.2 Ver tablas

# 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"

1.3 Columnas tablas

# 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

1.3 Vista previa

# 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

2. Cargar Datos

# 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

2.1 Desconectar base

dbDisconnect(con)

3. Asignación de probabilidades y cálculo de valor esperado

# 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

4. Construcción y Visualización del árbol de decisiones

# 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)

4.1 Podado de árbol de decisiones

# 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)

5. Selección de opciones

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

6. Evaluación del árbol de decisiones

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

7. Análisis de sensibilidad

#```{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()