1. 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.

# Cargamos paquetes necesarios y limpiamos la memoria
rm(list = ls()) # Remueve trabajos previos
# Cargar librerías necesarias
pacman::p_load(RSQLite, DBI, rpart, rpart.plot, 
               tidyr, janitor, dplyr, ggplot2)
# Quitar notación científica
options(scipen=999)

1.1 Leer la ruta del archivo

# Ruta a la base de datos
db_path <- "arbol_decisiones_expansion.db"

# Establecer la conexión
con <- dbConnect(RSQLite::SQLite(), db_path)

# Imprimir conexión (se llama con)
con
## <SQLiteConnection>
##   Path: C:\Users\gus16\OneDrive\Documentos\Tema 4\arbol_decisiones_expansion.db
##   Extensions: TRUE

1.2 Obtener lista de tablas disponibles en la base

SELECT name
FROM sqlite_master
WHERE type = "table";
3 records
name
Mercados
Opciones_Estratégicas
Estudios_Mercado

2. Exploración del contenido de las tablas

2.1 Tabla Estudios de Mercado

SELECT * 
FROM Estudios_Mercado
UNION ALL
SELECT 4, 4, 'Análisis de consumo en Chapantongo', 2500000, 'Media'
LIMIT 5;
5 records
Estudio_ID Mercado_ID Descripción Resultados Fecha_Estudio
1 1 Estudio de Demanda en Huichapan Se espera un crecimiento moderado con una tendencia favorable a la expansión. 2023-05-01
2 2 Análisis de Competencia en Tecozautla Alta competencia local, requiere una estrategia diferenciada para el éxito. 2023-06-15
3 3 Estudio de Población en Nopala Mercado pequeño pero con baja competencia, alta probabilidad de éxito. 2023-07-20
4 4 Análisis de consumo en Chapantongo NA NA
4 4 Análisis de consumo en Chapantongo 2500000 Media

2.2 Tabla Mercados

SELECT *
FROM Mercados
LIMIT 4;
4 records
Mercado_ID Nombre_Mercado Tamaño_Mercado Competencia Costo_Entrada Probabilidad_Éxito
1 Huichapan 50000 Media 1500000 0.65
2 Tecozautla 35000 Alta 1000000 0.55
3 Nopala 25000 Baja 750000 0.75
4 Chapantongo 1200 3.0 450 0.80

2.3 Tabla Opciones Estratégicas

SELECT *
FROM Opciones_Estratégicas
UNION ALL
SELECT 10, 4, 'Expansión Total', 1500000, 3000000, 0.7
UNION ALL
SELECT 11, 4, 'Alianza Estratégica', 800000, 1800000, 0.8
UNION ALL
SELECT 12, 4, 'Expansión Parcial', 1000000, 2200000, 0.75
LIMIT 5;
5 records
Opción_ID Mercado_ID Nombre_Opción Costo_Opción Beneficio_Estimado Probabilidad_Éxito_Opción
1 1 Expansión Total 2000000 3000000 0.70
2 1 Alianza Estratégica 1000000 2000000 0.65
3 1 Expansión Parcial 1200000 2500000 0.60
4 2 Expansión Total 1500000 2500000 0.60
5 2 Alianza Estratégica 800000 1800000 0.55

3 Manejo de tablas con SQL

3.1 Unión de dos tablas con SQL

-- Vamos a unir dos tablas: Estudios de Mercado y Mercados a partir
-- de la columnna Mercado_ID
-- Se usan alias de las tablas con función AS

SELECT estudios_mercado.*, mercado.*
FROM Estudios_Mercado AS estudios_mercado
INNER JOIN Mercados AS mercado
ON estudios_mercado.Mercado_ID = mercado.Mercado_ID;


-- La última línea menciona el nombre de las columnas que se parecen
-- Para acceder a una columna en R se usa $, en SQL se usa .
4 records
Estudio_ID Mercado_ID Descripción Resultados Fecha_Estudio Mercado_ID Nombre_Mercado Tamaño_Mercado Competencia Costo_Entrada Probabilidad_Éxito
1 1 Estudio de Demanda en Huichapan Se espera un crecimiento moderado con una tendencia favorable a la expansión. 2023-05-01 1 Huichapan 50000 Media 1500000 0.65
2 2 Análisis de Competencia en Tecozautla Alta competencia local, requiere una estrategia diferenciada para el éxito. 2023-06-15 2 Tecozautla 35000 Alta 1000000 0.55
3 3 Estudio de Población en Nopala Mercado pequeño pero con baja competencia, alta probabilidad de éxito. 2023-07-20 3 Nopala 25000 Baja 750000 0.75
4 4 Análisis de consumo en Chapantongo NA NA 4 Chapantongo 1200 3.0 450 0.80

3.2 Consulta cruzada de tablas

-- Unir tablas Estudios_Mercado con Mercados, usando columna Mercado_ID
-- Filtrar para columna Nombre_Mercado == "Nopala"
SELECT estudios_mercado.*, mercado.*
FROM Estudios_Mercado AS estudios_mercado
INNER JOIN Mercados AS mercado
ON estudios_mercado.Mercado_ID = mercado.Mercado_ID
WHERE mercado.Nombre_Mercado = "Nopala";
1 records
Estudio_ID Mercado_ID Descripción Resultados Fecha_Estudio Mercado_ID Nombre_Mercado Tamaño_Mercado Competencia Costo_Entrada Probabilidad_Éxito
3 3 Estudio de Población en Nopala Mercado pequeño pero con baja competencia, alta probabilidad de éxito. 2023-07-20 3 Nopala 25000 Baja 750000 0.75

4. Exploración de columnas en una tabla

4.1 Columnas de tabla Estudios de Mercado

-- Similar a función str()  en R
-- Información necesaria para realizar nuevos registros
PRAGMA table_info(Estudios_Mercado);
5 records
cid name type notnull dflt_value pk
0 Estudio_ID INTEGER 0 NA 1
1 Mercado_ID INTEGER 0 NA 0
2 Descripción TEXT 0 NA 0
3 Resultados TEXT 0 NA 0
4 Fecha_Estudio DATE 0 NA 0

5. Vista previa de los datos en R

# Ejemplo de programación en R
# Guardar lista de tablas en un objeto llamado tables
# Vamos a leer las tablas completas porque no son muy grandes
tables <-  dbGetQuery(con, "SELECT name FROM sqlite_master WHERE type = 'table';")$name

# Loop para tener vista previa el contenido de cada tabla
for (table in tables){
  my_query <- paste("SELECT * FROM", table, "LIMIT 5")
  data_table <- dbGetQuery(con, my_query)
  print(data_table)
}
##   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
## 4          4    Chapantongo           1200         3.0           450
## 5          5    Chapantongo           1000           5           200
##   Probabilidad_Éxito
## 1               0.65
## 2               0.55
## 3               0.75
## 4               0.80
## 5               0.75
##   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
##   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
## 4          4          4    Análisis de consumo en Chapantongo
##                                                                      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.
## 4                                                                          <NA>
##   Fecha_Estudio
## 1    2023-05-01
## 2    2023-06-15
## 3    2023-07-20
## 4          <NA>

6. Cargar los datos de las tablas

# Con esto las tablas ya están por separado como objetos en R
mercados <- dbGetQuery(con, "SELECT * FROM Mercados")
opciones <- dbGetQuery(con, "SELECT * FROM Opciones_Estratégicas")
estudios <- dbGetQuery(con, "SELECT * FROM Estudios_Mercado")

# Imprimir tablas
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
## 4          4    Chapantongo           1200         3.0           450
## 5          5    Chapantongo           1000           5           200
##   Probabilidad_Éxito
## 1               0.65
## 2               0.55
## 3               0.75
## 4               0.80
## 5               0.75
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
## 7         7          3     Expansión Total      1200000            2000000
## 8         8          3 Alianza Estratégica       600000            1500000
## 9         9          3   Expansión Parcial       800000            1800000
##   Probabilidad_Éxito_Opción
## 1                      0.70
## 2                      0.65
## 3                      0.60
## 4                      0.60
## 5                      0.55
## 6                      0.50
## 7                      0.75
## 8                      0.70
## 9                      0.65
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
## 4          4          4    Análisis de consumo en Chapantongo
##                                                                      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.
## 4                                                                          <NA>
##   Fecha_Estudio
## 1    2023-05-01
## 2    2023-06-15
## 3    2023-07-20
## 4          <NA>

7. Desconectar la base de datos

# A partir de este paso ya no puedo acceder a la base de datos
dbDisconnect(con)

8. Ajustar nombres de las columnas en las tablas

# Eliminar acentos y espacios de nombres de columnas
mercados <- clean_names(mercados)
opciones <- clean_names(opciones)
estudios <- clean_names(estudios)

# Imprimir resultados
mercados
##   mercado_id nombre_mercado tamano_mercado competencia costo_entrada
## 1          1      Huichapan          50000       Media       1500000
## 2          2     Tecozautla          35000        Alta       1000000
## 3          3         Nopala          25000        Baja        750000
## 4          4    Chapantongo           1200         3.0           450
## 5          5    Chapantongo           1000           5           200
##   probabilidad_exito
## 1               0.65
## 2               0.55
## 3               0.75
## 4               0.80
## 5               0.75
opciones
##   opcion_id mercado_id       nombre_opcion costo_opcion 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
## 7         7          3     Expansión Total      1200000            2000000
## 8         8          3 Alianza Estratégica       600000            1500000
## 9         9          3   Expansión Parcial       800000            1800000
##   probabilidad_exito_opcion
## 1                      0.70
## 2                      0.65
## 3                      0.60
## 4                      0.60
## 5                      0.55
## 6                      0.50
## 7                      0.75
## 8                      0.70
## 9                      0.65
estudios
##   estudio_id mercado_id                           descripcion
## 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
## 4          4          4    Análisis de consumo en Chapantongo
##                                                                      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.
## 4                                                                          <NA>
##   fecha_estudio
## 1    2023-05-01
## 2    2023-06-15
## 3    2023-07-20
## 4          <NA>

9. Asignar probabilidades

# 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_opcion <- as.character(opciones$nombre_opcion)
opciones <- opciones %>%
  mutate(nombre_opcion = case_when(
    nombre_opcion == "Expansión Total" ~ "exp_total",
    nombre_opcion == "Alianza Estratégica" ~ "alia_estr",
    nombre_opcion == "Expansión Parcial" ~ "exp_par"
  ))

# Asignar probabilidades y calcular el valor esperado para cada opción
opciones <- opciones %>%
  mutate(valor_esperado = probabilidad_exito_opcion * beneficio_estimado - 
                          (1 - probabilidad_exito_opcion) * costo_opcion)

# Convertir los valores monetarios a miles de pesos y asegurarse de que no usen notación científica
opciones <- opciones %>%
  mutate(costo_opcion = costo_opcion / 1000,
         beneficio_estimado = beneficio_estimado / 1000,
         valor_esperado = valor_esperado / 1000)

# Renombrar columnas para simplificar
names(opciones) <- c("op_id", "merc_id", "nom_op", "cost_op", "ben_est", "prob_exito", "merc_nom", "val_esp")

# Visualizar el resultado de la transformación
print(opciones)
##   op_id merc_id    nom_op cost_op ben_est prob_exito   merc_nom val_esp
## 1     1       1 exp_total    2000    3000       0.70  Huichapan    1500
## 2     2       1 alia_estr    1000    2000       0.65  Huichapan     950
## 3     3       1   exp_par    1200    2500       0.60  Huichapan    1020
## 4     4       2 exp_total    1500    2500       0.60 Tecozautla     900
## 5     5       2 alia_estr     800    1800       0.55 Tecozautla     630
## 6     6       2   exp_par    1000    2200       0.50 Tecozautla     600
## 7     7       3 exp_total    1200    2000       0.75     Nopala    1200
## 8     8       3 alia_estr     600    1500       0.70     Nopala     870
## 9     9       3   exp_par     800    1800       0.65     Nopala     890

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

# Crear un modelo de árbol de decisiones con rpart
arbol <- rpart(val_esp ~ merc_nom + nom_op + cost_op + prob_exito, 
               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)

10.1 Podado de árbol de decisiones

# Paso 1: Visualizar la tabla de costos de complejidad
printcp(arbol)
## 
## Regression tree:
## rpart(formula = val_esp ~ merc_nom + nom_op + cost_op + prob_exito, 
##     data = opciones, method = "anova", control = rpart.control(minsplit = 2, 
##         cp = 0))
## 
## Variables actually used in tree construction:
## [1] cost_op    merc_nom   nom_op     prob_exito
## 
## 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)

11. Selección de opciones

# Crear la tabla con el valor esperado para cada municipio y opción
tabla_valores <- opciones %>%
  select(merc_nom, nom_op, val_esp)

print(tabla_valores)
##     merc_nom    nom_op val_esp
## 1  Huichapan exp_total    1500
## 2  Huichapan alia_estr     950
## 3  Huichapan   exp_par    1020
## 4 Tecozautla exp_total     900
## 5 Tecozautla alia_estr     630
## 6 Tecozautla   exp_par     600
## 7     Nopala exp_total    1200
## 8     Nopala alia_estr     870
## 9     Nopala   exp_par     890
# Encontrar el municipio con el valor esperado máximo para la opción "ExpTotal"
municipio_max <- tabla_valores %>%
  filter(val_esp == max(val_esp))

# Imprimir un mensaje personalizado
municipio <- municipio_max$merc_nom
valor <- municipio_max$val_esp
estrategia <- municipio_max$nom_op

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 exp_total lo que lo convierte en la mejor opción para la expansión."

12. Evaluación del árbol de decisiones

# Evaluar y comparar las opciones dentro de cada municipio
evaluacion <- tabla_valores %>%
  group_by(merc_nom) %>%
  summarise(
    exp_total = val_esp[nom_op == "exp_total"],
    alia_estr = val_esp[nom_op == "alia_estr"],
    exp_par = val_esp[nom_op == "exp_par"]
  )

print(evaluacion)
## # A tibble: 3 × 4
##   merc_nom   exp_total alia_estr exp_par
##   <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(merc_nom) %>%
  filter(val_esp == max(val_esp)) %>%
  arrange(desc(val_esp))

print(mejor_opcion_por_municipio)
## # A tibble: 3 × 3
## # Groups:   merc_nom [3]
##   merc_nom   nom_op    val_esp
##   <chr>      <chr>       <dbl>
## 1 Huichapan  exp_total    1500
## 2 Nopala     exp_total    1200
## 3 Tecozautla exp_total     900
# Imprimir un mensaje personalizado para cada municipio
for (i in 1:nrow(mejor_opcion_por_municipio)) {
  municipio <- mejor_opcion_por_municipio$merc_nom[i]
  valor <- mejor_opcion_por_municipio$val_esp[i]
  estrategia <- mejor_opcion_por_municipio$nom_op[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 exp_total con un valor esperado de 1500 miles de pesos."
## [1] "En Nopala la mejor opción es exp_total con un valor esperado de 1200 miles de pesos."
## [1] "En Tecozautla la mejor opción es exp_total 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$merc_nom
comparacion_exp_total <- tabla_valores %>%
  filter(merc_nom == municipio_seleccionado)

print("Comparación de opciones en el municipio seleccionado:")
## [1] "Comparación de opciones en el municipio seleccionado:"
print(as.matrix(comparacion_exp_total))
##      merc_nom    nom_op      val_esp
## [1,] "Huichapan" "exp_total" "1500" 
## [2,] "Huichapan" "alia_estr" " 950" 
## [3,] "Huichapan" "exp_par"   "1020"
# Obtener el índice de la fila donde está el mayor valor esperado
indice_max <- which.max(comparacion_exp_total$val_esp)

# Construir la justificación con la opción correspondiente
razon <- paste("La opción", comparacion_exp_total$nom_op[indice_max], "fue seleccionada en", municipio_seleccionado, 
               "debido a que presentó el mayor valor esperado de", comparacion_exp_total$val_esp[indice_max], 
               "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 exp_total fue seleccionada en Huichapan debido a que presentó el mayor valor esperado de 1500 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."

13. Análisis de 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(
    prob_exito = rep(probabilidades, times = nrow(opciones)),
    val_esp_sens = calcular_valor_esperado(prob_exito, cost_op, ben_est)
  )

# Modificar el nombre del municipio para incluir la opción elegida
sensibilidad <- sensibilidad %>%
  left_join(mejor_opcion_por_municipio, by = c("merc_nom", "nom_op", "val_esp")) %>%
  mutate(merc_nom = paste(merc_nom, " \n(", nom_op, ")", sep = ""))

# Mostrar una tabla de resultados del análisis de sensibilidad para "ExpTotal" en cada municipio
sensibilidad_exp_total <- sensibilidad %>%
  filter(nom_op == "exp_total") %>%
  arrange(merc_nom, prob_exito)

print(sensibilidad_exp_total)
##    op_id merc_id    nom_op cost_op ben_est prob_exito                 merc_nom
## 1      1       1 exp_total    2000    3000       0.50  Huichapan \n(exp_total)
## 2      1       1 exp_total    2000    3000       0.55  Huichapan \n(exp_total)
## 3      1       1 exp_total    2000    3000       0.60  Huichapan \n(exp_total)
## 4      1       1 exp_total    2000    3000       0.65  Huichapan \n(exp_total)
## 5      1       1 exp_total    2000    3000       0.70  Huichapan \n(exp_total)
## 6      1       1 exp_total    2000    3000       0.75  Huichapan \n(exp_total)
## 7      1       1 exp_total    2000    3000       0.80  Huichapan \n(exp_total)
## 8      1       1 exp_total    2000    3000       0.85  Huichapan \n(exp_total)
## 9      1       1 exp_total    2000    3000       0.90  Huichapan \n(exp_total)
## 10     7       3 exp_total    1200    2000       0.50     Nopala \n(exp_total)
## 11     7       3 exp_total    1200    2000       0.55     Nopala \n(exp_total)
## 12     7       3 exp_total    1200    2000       0.60     Nopala \n(exp_total)
## 13     7       3 exp_total    1200    2000       0.65     Nopala \n(exp_total)
## 14     7       3 exp_total    1200    2000       0.70     Nopala \n(exp_total)
## 15     7       3 exp_total    1200    2000       0.75     Nopala \n(exp_total)
## 16     7       3 exp_total    1200    2000       0.80     Nopala \n(exp_total)
## 17     7       3 exp_total    1200    2000       0.85     Nopala \n(exp_total)
## 18     7       3 exp_total    1200    2000       0.90     Nopala \n(exp_total)
## 19     4       2 exp_total    1500    2500       0.50 Tecozautla \n(exp_total)
## 20     4       2 exp_total    1500    2500       0.55 Tecozautla \n(exp_total)
## 21     4       2 exp_total    1500    2500       0.60 Tecozautla \n(exp_total)
## 22     4       2 exp_total    1500    2500       0.65 Tecozautla \n(exp_total)
## 23     4       2 exp_total    1500    2500       0.70 Tecozautla \n(exp_total)
## 24     4       2 exp_total    1500    2500       0.75 Tecozautla \n(exp_total)
## 25     4       2 exp_total    1500    2500       0.80 Tecozautla \n(exp_total)
## 26     4       2 exp_total    1500    2500       0.85 Tecozautla \n(exp_total)
## 27     4       2 exp_total    1500    2500       0.90 Tecozautla \n(exp_total)
##    val_esp val_esp_sens
## 1     1500          500
## 2     1500          750
## 3     1500         1000
## 4     1500         1250
## 5     1500         1500
## 6     1500         1750
## 7     1500         2000
## 8     1500         2250
## 9     1500         2500
## 10    1200          400
## 11    1200          560
## 12    1200          720
## 13    1200          880
## 14    1200         1040
## 15    1200         1200
## 16    1200         1360
## 17    1200         1520
## 18    1200         1680
## 19     900          500
## 20     900          700
## 21     900          900
## 22     900         1100
## 23     900         1300
## 24     900         1500
## 25     900         1700
## 26     900         1900
## 27     900         2100
ggplot(sensibilidad_exp_total, aes(x = prob_exito, y = val_esp_sens, color = merc_nom)) +
  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()