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\USER\OneDrive\Escritorio\Universidad\Gestion\7mo\ANÁLISIS DE DATOS E INTELIGENCIA DE NEGOCIOS\tema 04\Data\arbol_decisiones_expansion.db
## Extensions: TRUE
Agregar Municipio nuevo a base de datos
# Valores para el nuevo municipio
nuevo_mercado <- data.frame(
Mercado_ID = 4, # Un ID único
Nombre_Mercado = "Apan"
)
nuevo_estudio <- data.frame(
Estudio_ID = 4, # Un ID único
Mercado_ID = 4, # Relación con el Mercado_ID
Demanda = 1700, # Ejemplo de valor para la demanda
Competencia = 4, # Ejemplo de valor para la competencia
Crecimiento = 6 # Ejemplo de valor de crecimiento
)
nueva_opcion <- data.frame(
Opcion_ID = 4, # Un ID único
Mercado_ID = 4, # Relación con el Mercado_ID
Estrategia = "Foco en productos locales",
Inversion_Requerida = 170000 # Ejemplo de valor
)
# Verificar si el ID ya existe en la tabla Mercados
id_existente <- dbGetQuery(con, "SELECT Mercado_ID FROM Mercados WHERE Nombre_Mercado = 'Apan'")
# Comprobar si el resultado tiene filas (es decir, si ya existe en la tabla)
if (nrow(id_existente) == 0) {
# Calcula el próximo ID disponible si no existe
proximo_id <- dbGetQuery(con, "SELECT MAX(Mercado_ID) + 1 AS Proximo_ID FROM Mercados")
proximo_id <- ifelse(is.na(proximo_id$Proximo_ID), 1, proximo_id$Proximo_ID)
# Inserta en la tabla Mercados
dbExecute(con, sprintf("
INSERT INTO Mercados (Mercado_ID, Nombre_Mercado)
VALUES (%d, 'Apan');
", proximo_id))
# Inserta en la tabla Estudios_Mercado
dbExecute(con, sprintf("
INSERT INTO Estudios_Mercado (Estudio_ID, Mercado_ID, Demanda, Competencia, Crecimiento)
VALUES (%d, %d, 1700, 4, 6);
", proximo_id, proximo_id))
# Inserta en la tabla Opciones_Estratégicas
dbExecute(con, sprintf("
INSERT INTO Opciones_Estratégicas (Opcion_ID, Mercado_ID, Estrategia, Inversion_Requerida)
VALUES (%d, %d, 'Foco en productos locales', 170000);
", proximo_id, proximo_id))
cat("Nuevo registro insertado con éxito.\n")
} else {
cat("El municipio Apan ya existe en la tabla Mercados.\n")
}
## El municipio Apan ya existe en la tabla Mercados.
1.2 Obtener lista de tablas disponibles en la base
SELECT name
FROM sqlite_master
WHERE type = "table";
3 records
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
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 Apan |
Mercado pequeño pero con baja competencia, alta
probabilidad de éxito. |
2023-07-20 |
2.2 Tabla Mercados
SELECT *
FROM Mercados
LIMIT 4;
4 records
1 |
Huichapan |
50000 |
Media |
1500000 |
0.65 |
2 |
Tecozautla |
35000 |
Alta |
1000000 |
0.55 |
3 |
Nopala |
25000 |
Baja |
750000 |
0.75 |
4 |
Apan |
30000 |
Media |
800000 |
0.00 |
2.3 Tabla Opciones Estratégicas
SELECT *
FROM Opciones_Estratégicas
LIMIT 5;
5 records
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 |
# Verifica si el ID ya existe en la tabla Mercados
id_existente <- dbGetQuery(con, "SELECT Mercado_ID FROM Mercados WHERE Nombre_Mercado = 'Apan'")
# Comprobar si el resultado tiene filas (es decir, si ya existe en la tabla)
if (nrow(id_existente) == 0) {
# Calcula el próximo ID disponible si no existe
proximo_id <- dbGetQuery(con, "SELECT MAX(Mercado_ID) + 1 AS Proximo_ID FROM Mercados")
proximo_id <- ifelse(is.na(proximo_id$Proximo_ID), 1, proximo_id$Proximo_ID)
# Inserta en la tabla Mercados
dbExecute(con, sprintf("
INSERT INTO Mercados (Mercado_ID, Nombre_Mercado)
VALUES (%d, 'Apan');
", proximo_id))
# Inserta en la tabla Estudios_Mercado
dbExecute(con, sprintf("
INSERT INTO Estudios_Mercado (Estudio_ID, Mercado_ID, Demanda, Competencia, Crecimiento)
VALUES (%d, %d, 1700, 4, 6);
", proximo_id, proximo_id))
# Inserta en la tabla Opciones_Estratégicas
dbExecute(con, sprintf("
INSERT INTO Opciones_Estratégicas (Opcion_ID, Mercado_ID, Estrategia, Inversion_Requerida)
VALUES (%d, %d, 'Foco en productos locales', 170000);
", proximo_id, proximo_id))
cat("Nuevo registro insertado con éxito.\n")
} else {
cat("El municipio Apan ya existe en la tabla Mercados.\n")
}
## El municipio Apan ya existe en la tabla Mercados.
# Primero, comprobamos si el municipio ya existe en la tabla
municipio_existente <- dbGetQuery(con, "SELECT Mercado_ID FROM Mercados WHERE Nombre_Mercado = 'Apan'")
if (nrow(municipio_existente) == 0) {
# Si no existe, insertamos el nuevo registro
proximo_id <- dbGetQuery(con, "SELECT MAX(Mercado_ID) + 1 AS Proximo_ID FROM Mercados")
proximo_id <- ifelse(is.na(proximo_id$Proximo_ID), 1, proximo_id$Proximo_ID)
# Inserta el nuevo municipio en la tabla Mercados
dbExecute(con, sprintf("
INSERT INTO Mercados (Mercado_ID, Nombre_Mercado)
VALUES (%d, 'Apan');
", proximo_id))
cat("Nuevo municipio 'Apan' insertado con éxito.\n")
} else {
cat("El municipio 'Apan' ya existe en la tabla Mercados.\n")
}
## El municipio 'Apan' ya existe en la tabla Mercados.
# Obtener el Mercado_ID de Apan
id_Apan <- dbGetQuery(con, "SELECT Mercado_ID FROM Mercados WHERE Nombre_Mercado = 'Apan'")
# Verificar si se encontró el ID y proceder a la inserción
if (nrow(id_Apan) > 4) {
# Extraer el valor de Mercado_ID
mercado_id <- id_Apan$Mercado_ID
# Preparar la consulta para insertar un nuevo registro en Estudios_Mercado
sql_insercion <- sprintf("
INSERT INTO Estudios_Mercado (Mercado_ID, Columna1, Columna2, Columna3)
VALUES (%d, 'Valor1', 'Valor2', 'Valor3');
", mercado_id)
# Ejecutar la consulta de inserción
dbExecute(con, sql_insercion)
cat("Nuevo registro insertado en Estudios_Mercado con éxito.\n")
} else {
cat("No se pudo insertar en Estudios_Mercado porque Apan no tiene un ID válido.\n")
}
## No se pudo insertar en Estudios_Mercado porque Apan no tiene un ID válido.
if (nrow(id_Apan) > 5) {
mercado_id <- id_Apan$Mercado_ID
# Verificar si el Mercado_ID ya está en la tabla Estudios_Mercado
id_existente <- dbGetQuery(con, sprintf("SELECT * FROM Estudios_Mercado WHERE Mercado_ID = %d", mercado_id))
if (nrow(id_existente) == 5) {
# Si no existe, se inserta un nuevo registro
# Asegúrate de que la descripción sea adecuada
sql_insercion <- sprintf("
INSERT INTO Estudios_Mercado (Mercado_ID, Descripción)
VALUES (%d, 'Descripción de Apan');
", mercado_id)
# Ejecutar la consulta de inserción
dbExecute(con, sql_insercion)
cat("Nuevo registro insertado en Estudios_Mercado con éxito.\n")
} else {
cat("El Mercado_ID de Apan ya existe en la tabla Estudios_Mercado.\n")
}
} else {
cat("No se encontró el Mercado_ID de Apan.\n")
}
## No se encontró el Mercado_ID de Apan.
# Verificar si ya existe un registro con el Mercado_ID 4 en la tabla Estudios_Mercado
id_existente <- dbGetQuery(con, "SELECT * FROM Estudios_Mercado WHERE Mercado_ID = 4")
if (nrow(id_existente) == 0) {
# Insertar el nuevo registro en la tabla Estudios_Mercado
sql_insercion <- "INSERT INTO Estudios_Mercado (Mercado_ID, Descripción) VALUES (4, 'Estudio relacionado con Apan')"
# Ejecutar la consulta de inserción
dbExecute(con, sql_insercion)
cat("Nuevo registro insertado en Estudios_Mercado con éxito.\n")
} else {
cat("El registro con el Mercado_ID 4 ya existe en la tabla Estudios_Mercado.\n")
}
## El registro con el Mercado_ID 4 ya existe en la tabla Estudios_Mercado.
Actualizacion tabla Estudios_Mercado
# Definir los valores para las columnas Resultados y Fecha_Estudio
resultados_nuevos <- "Mercado pequeño pero con baja competencia, alta probabilidad de éxito."
fecha_estudio_nueva <- "2023-07-20"
# Actualizar el registro en la tabla Estudios_Mercado
sql_actualizacion <- sprintf(
"UPDATE Estudios_Mercado SET Resultados = '%s', Fecha_Estudio = '%s' WHERE Estudio_ID = %d",
resultados_nuevos,
fecha_estudio_nueva,
nuevo_estudio$Estudio_ID
)
# Ejecutar la consulta de actualización
dbExecute(con, sql_actualizacion)
## [1] 1
cat("Las columnas Resultados y Fecha_Estudio se han actualizado con éxito.\n")
## Las columnas Resultados y Fecha_Estudio se han actualizado con éxito.
# Consultar y mostrar todos los registros de la tabla Estudios_Mercado
resultados_estudios <- dbGetQuery(con, "SELECT * FROM Estudios_Mercado")
print(resultados_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 Apan
## 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
3 Manejo de tablas con SQL
3.1 Unión de dos tablas con SQL
-- Consultamos los datos de las tablas Estudios_Mercado y Mercados
SELECT estudios_mercado.*, mercado.*
FROM Estudios_Mercado AS estudios_mercado
INNER JOIN Mercados AS mercado
ON estudios_mercado.Mercado_ID = mercado.Mercado_ID;
4 records
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 Apan |
Mercado pequeño pero con baja competencia, alta
probabilidad de éxito. |
2023-07-20 |
4 |
Apan |
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 == "Apan"
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 = "Apan";
1 records
4 |
4 |
Estudio relacionado con Apan |
Mercado pequeño pero con baja competencia, alta
probabilidad de éxito. |
2023-07-20 |
4 |
Apan |
30000 |
Media |
800000 |
Alta |
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
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 Apan 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 Apan
## 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
Asignar valores a Apan en tabla mercados
# Paso 1: Verificar si el Mercado_ID 4 existe en la tabla Mercados
consulta_id <- dbGetQuery(con, "SELECT Mercado_ID, Nombre_Mercado FROM Mercados WHERE Mercado_ID = 4")
# Verificar si la consulta devolvió resultados
if (nrow(consulta_id) > 0) {
# Imprimir los resultados para confirmar que el ID existe
print(consulta_id)
# Paso 2: Realizar la actualización de la tabla Mercados si el ID existe
# Definir los valores para la actualización
tamano_mercado_nuevo <- 30000 # Ejemplo de tamaño de mercado
competencia_nueva <- "Media" # Ejemplo de competencia
costo_entrada_nuevo <- 800000 # Ejemplo de costo de entrada
probabilidad_exito_nueva <- "Alta" # Ejemplo de probabilidad de éxito
# Crear la consulta de actualización
sql_actualizacion_mercado <- sprintf(
"UPDATE Mercados SET Tamaño_Mercado = %d, Competencia = '%s', Costo_Entrada = %f, Probabilidad_Éxito = '%s' WHERE Mercado_ID = 4",
tamano_mercado_nuevo,
competencia_nueva,
costo_entrada_nuevo,
probabilidad_exito_nueva
)
# Ejecutar la consulta de actualización
dbExecute(con, sql_actualizacion_mercado)
cat("Las columnas Tamaño_Mercado, Competencia, Costo_Entrada y Probabilidad_Éxito se han actualizado con éxito para Apan.\n")
} else {
cat("No se pudo realizar la actualización. Mercado_ID 4 no encontrado.\n")
}
## Mercado_ID Nombre_Mercado
## 1 4 Apan
## Las columnas Tamaño_Mercado, Competencia, Costo_Entrada y Probabilidad_Éxito se han actualizado con éxito para Apan.
# Verificar si el duplicado con Mercado_ID 5 existe en la tabla
consulta_duplicado <- dbGetQuery(con, "SELECT Mercado_ID, Nombre_Mercado FROM Mercados WHERE Mercado_ID = 5")
# Comprobar si el duplicado existe
if (nrow(consulta_duplicado) > 0) {
cat("Se encontró un duplicado con Mercado_ID 5. Procediendo a eliminarlo.\n")
# Eliminar el duplicado
dbExecute(con, "DELETE FROM Mercados WHERE Mercado_ID = 5")
cat("El duplicado con Mercado_ID 5 ha sido eliminado.\n")
# Opcional: Verificar la tabla después de la eliminación
consulta_verificacion <- dbGetQuery(con, "SELECT * FROM Mercados WHERE Mercado_ID = 5")
if (nrow(consulta_verificacion) == 0) {
cat("La eliminación se realizó con éxito. No hay registros con Mercado_ID 5.\n")
} else {
cat("Error al eliminar el duplicado. El registro aún existe.\n")
}
} else {
cat("No se encontró un duplicado con Mercado_ID 5. No se realizó ninguna acción.\n")
}
## No se encontró un duplicado con Mercado_ID 5. No se realizó ninguna acción.
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 Apan 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
## 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 Estudio relacionado con Apan
## 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 Apan 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
## 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 Estudio relacionado con Apan
## 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. 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()
