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, Nopala e Ixmiquilpan.

# 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\GABRIEL C\OneDrive\Documentos\Semestre 7\Analisisd\Proyecto4\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
LIMIT 5;
4 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 Estudio relacionado con Ixmiquilpan Mercado pequeño pero con baja competencia, alta probabilidad de éxito. 2023-07-20

2.2 Tabla Mercados

SELECT *
FROM Mercados
LIMIT 5;
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 Ixmiquilpan 30000 Media 800000 0.00

2.3 Tabla Opciones Estratégicas

SELECT *
FROM Opciones_Estratégicas
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 Estudio relacionado con Ixmiquilpan Mercado pequeño pero con baja competencia, alta probabilidad de éxito. 2023-07-20 4 Ixmiquilpan 30000 Media 800000 0.00

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)
}
## Warning: Column `Probabilidad_Éxito`: mixed type, first seen values of type
## real, coercing other values of type string
##   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    Ixmiquilpan          30000       Media        800000
##   Probabilidad_Éxito
## 1               0.65
## 2               0.55
## 3               0.75
## 4               0.00
##   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   Estudio relacionado con Ixmiquilpan
##                                                                      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        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
## 4    2023-07-20

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")
## Warning: Column `Probabilidad_Éxito`: mixed type, first seen values of type
## real, coercing other values of type string
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    Ixmiquilpan          30000       Media        800000
##   Probabilidad_Éxito
## 1               0.65
## 2               0.55
## 3               0.75
## 4               0.00
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
## 10        10          4     Expansión Total      1400000            2600000
## 11        11          4 Alianza Estratégica       900000            1900000
## 12        12          4   Expansión Parcial      1100000            2300000
##    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
## 10                      0.70
## 11                      0.65
## 12                      0.60
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   Estudio relacionado con Ixmiquilpan
##                                                                      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        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
## 4    2023-07-20

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    Ixmiquilpan          30000       Media        800000
##   probabilidad_exito
## 1               0.65
## 2               0.55
## 3               0.75
## 4               0.00
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
## 10        10          4     Expansión Total      1400000            2600000
## 11        11          4 Alianza Estratégica       900000            1900000
## 12        12          4   Expansión Parcial      1100000            2300000
##    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
## 10                      0.70
## 11                      0.65
## 12                      0.60
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   Estudio relacionado con Ixmiquilpan
##                                                                      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        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
## 4    2023-07-20

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    10       4 exp_total    1400    2600       0.70 Ixmiquilpan    1400
## 11    11       4 alia_estr     900    1900       0.65 Ixmiquilpan     920
## 12    12       4   exp_par    1100    2300       0.60 Ixmiquilpan     940

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  
## 
## Root node error: 796100/12 = 66342
## 
## n= 12 
## 
##             CP nsplit   rel error xerror    xstd
## 1  0.529267680      0 1.000000000 1.1647 0.44190
## 2  0.205166855      1 0.470732320 1.3462 0.44923
## 3  0.188941925      2 0.265565465 1.2575 0.41761
## 4  0.052338483      3 0.076623540 1.0146 0.44781
## 5  0.011761504      4 0.024285056 1.1290 0.50633
## 6  0.006280618      5 0.012523552 1.1715 0.51472
## 7  0.004840263      6 0.006242934 1.2821 0.56476
## 8  0.000565256      7 0.001402671 1.2421 0.55562
## 9  0.000523385      8 0.000837416 1.2405 0.55590
## 10 0.000251225      9 0.000314031 1.2405 0.55590
## 11 0.000062806     10 0.000062806 1.2288 0.55234
## 12 0.000000000     11 0.000000000 1.2276 0.55255
# 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
## 10 Ixmiquilpan exp_total    1400
## 11 Ixmiquilpan alia_estr     920
## 12 Ixmiquilpan   exp_par     940
# 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: 4 × 4
##   merc_nom    exp_total alia_estr exp_par
##   <chr>           <dbl>     <dbl>   <dbl>
## 1 Huichapan        1500       950    1020
## 2 Ixmiquilpan      1400       920     940
## 3 Nopala           1200       870     890
## 4 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: 4 × 3
## # Groups:   merc_nom [4]
##   merc_nom    nom_op    val_esp
##   <chr>       <chr>       <dbl>
## 1 Huichapan   exp_total    1500
## 2 Ixmiquilpan exp_total    1400
## 3 Nopala      exp_total    1200
## 4 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 Ixmiquilpan la mejor opción es exp_total con un valor esperado de 1400 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    10       4 exp_total    1400    2600       0.50 Ixmiquilpan \n(exp_total)
## 11    10       4 exp_total    1400    2600       0.55 Ixmiquilpan \n(exp_total)
## 12    10       4 exp_total    1400    2600       0.60 Ixmiquilpan \n(exp_total)
## 13    10       4 exp_total    1400    2600       0.65 Ixmiquilpan \n(exp_total)
## 14    10       4 exp_total    1400    2600       0.70 Ixmiquilpan \n(exp_total)
## 15    10       4 exp_total    1400    2600       0.75 Ixmiquilpan \n(exp_total)
## 16    10       4 exp_total    1400    2600       0.80 Ixmiquilpan \n(exp_total)
## 17    10       4 exp_total    1400    2600       0.85 Ixmiquilpan \n(exp_total)
## 18    10       4 exp_total    1400    2600       0.90 Ixmiquilpan \n(exp_total)
## 19     7       3 exp_total    1200    2000       0.50      Nopala \n(exp_total)
## 20     7       3 exp_total    1200    2000       0.55      Nopala \n(exp_total)
## 21     7       3 exp_total    1200    2000       0.60      Nopala \n(exp_total)
## 22     7       3 exp_total    1200    2000       0.65      Nopala \n(exp_total)
## 23     7       3 exp_total    1200    2000       0.70      Nopala \n(exp_total)
## 24     7       3 exp_total    1200    2000       0.75      Nopala \n(exp_total)
## 25     7       3 exp_total    1200    2000       0.80      Nopala \n(exp_total)
## 26     7       3 exp_total    1200    2000       0.85      Nopala \n(exp_total)
## 27     7       3 exp_total    1200    2000       0.90      Nopala \n(exp_total)
## 28     4       2 exp_total    1500    2500       0.50  Tecozautla \n(exp_total)
## 29     4       2 exp_total    1500    2500       0.55  Tecozautla \n(exp_total)
## 30     4       2 exp_total    1500    2500       0.60  Tecozautla \n(exp_total)
## 31     4       2 exp_total    1500    2500       0.65  Tecozautla \n(exp_total)
## 32     4       2 exp_total    1500    2500       0.70  Tecozautla \n(exp_total)
## 33     4       2 exp_total    1500    2500       0.75  Tecozautla \n(exp_total)
## 34     4       2 exp_total    1500    2500       0.80  Tecozautla \n(exp_total)
## 35     4       2 exp_total    1500    2500       0.85  Tecozautla \n(exp_total)
## 36     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    1400          600
## 11    1400          800
## 12    1400         1000
## 13    1400         1200
## 14    1400         1400
## 15    1400         1600
## 16    1400         1800
## 17    1400         2000
## 18    1400         2200
## 19    1200          400
## 20    1200          560
## 21    1200          720
## 22    1200          880
## 23    1200         1040
## 24    1200         1200
## 25    1200         1360
## 26    1200         1520
## 27    1200         1680
## 28     900          500
## 29     900          700
## 30     900          900
## 31     900         1100
## 32     900         1300
## 33     900         1500
## 34     900         1700
## 35     900         1900
## 36     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()