PREGUNTAS 1 y 2

1) Brevemente, describir cómo el análisis espacial de datos se relaciona con la herramienta de inteligencia de negocios “Location Intelligence”:

  1. Estos dos procesos están estrechamente relacionados entre sí pues tanto el “Análisis Espacial de Datos” como “Location Intelligence” se enfoncan en poder comprender el comportamiento que existe en un área geográfica para poder realizar una toma de decisiones estratégica. Visto desde otro punto de vista Location Intelligence se apoya del análisis espacial de datos para obtener insights accionables, la combinación de ambos procesos es de suma importancia para poder aprovechar de la mejor manera la información geográfica.

2) Describir 3 – 5 principales diferencias entre un modelo de regresión lineal no espacial versus un modelo de regresión lineal espacial.

  1. La regresión espacial tiene en cuenta la ubicación de las observaciones, mientras que una regresión convencional, no tiene en consideración este detalle.
  2. Asimimo, al considerar la ubicación, los modelos espaciales consideran el impacto que hay entre las variables y su ubicación.
  3. En la regresión espacial, el término de error, puede tener una relación espacial. En un modelo lineal, se asume que los errores son independientes e indéticamente distribuidos.
  4. Algunos modelos espaciales, permiten estimar efectos directos que impactan en la misma ubicación, así como indirectos que afectan vecinos. La regresión convencional solo mide el efecto directo.
  5. Los modelos espaciales requieren una matriz de pesos que mida las relaciones geográficas. Lo anterior, no sucede en un caso lineal.

Modelo de regresión no espacial

#INSTALAR LIBRERÍAS
#install.packages("stringi")
#install.packages("spatialreg")
library(stringi)
library(dplyr)     
library(ggplot2)  
library(readxl)
library(scales)  
library(sf)
library(tmap)
library(tmaptools)
library(spdep)
library(spatialreg)
library(randomForest)

3) A partir de las bases de datos “tourism_state_data.xlsx” y “desempeno_historico_hoteles_estados.xlsx” especificar y estimar 1 modelo de regresión no espacial.

#LEER LOS ARCHIVOS
df_turismo<- read_excel("C:\\Users\\Diego Pérez\\Downloads\\tourism_state_data.xlsx")
df_hoteles<- read_excel("C:\\Users\\Diego Pérez\\Downloads\\turismo_llegadas_extranjeros.xlsx")
View(df_turismo)
View(df_hoteles)
# Filtrar solo datos del año 2022
df_turismo <- df_turismo %>%
  filter(year == 2022)

# Renombrar columnas si es necesario
names(df_turismo)[which(names(df_turismo) == "region...17")] <- "region"
names(df_turismo)[which(names(df_turismo) == "region...18")] <- "region_numero"

# Hacer la unión sin modificar los nombres de estado
df_turismo <- df_turismo %>%
  left_join(df_hoteles %>% select(estado, total_visitantes),
            by = c("state" = "estado"))
#Vemos nuestra base de datos
df_turismo <- df_turismo %>%
  mutate(state = ifelse(state == "estado de mexico", "mexico", state))

View(df_turismo)

Modelo de Regresión no Lineal con Variable Llegadas de Turistas Extranjeros

#Realizamos modelo de regresión no lineal 
modelo_lineal <- lm(total_visitantes ~ tourism_gdp + crime_rate + college_education +
                      unemployment + employment + business_activity + real_wage +
                      pop_density + good_governance + ratio_public_investment,
                    data = df_turismo)

# Ver resumen de resultados
summary(modelo_lineal)
## 
## Call:
## lm(formula = total_visitantes ~ tourism_gdp + crime_rate + college_education + 
##     unemployment + employment + business_activity + real_wage + 
##     pop_density + good_governance + ratio_public_investment, 
##     data = df_turismo)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1881805  -271161    66503   443204  1239009 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             -2.022e+07  3.952e+07  -0.512  0.61423    
## tourism_gdp              6.810e+00  4.664e+00   1.460  0.15908    
## crime_rate              -1.120e+04  6.440e+03  -1.739  0.09665 .  
## college_education        9.793e+06  4.610e+06   2.124  0.04571 *  
## unemployment            -3.903e+06  3.426e+07  -0.114  0.91039    
## employment               2.094e+07  3.962e+07   0.529  0.60268    
## business_activity       -1.184e+07  3.249e+06  -3.644  0.00152 ** 
## real_wage               -7.801e+03  5.419e+03  -1.440  0.16469    
## pop_density             -5.874e+00  3.328e+02  -0.018  0.98609    
## good_governance          4.331e+05  8.076e+04   5.363 2.56e-05 ***
## ratio_public_investment -1.537e+08  4.966e+07  -3.094  0.00550 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 892300 on 21 degrees of freedom
## Multiple R-squared:  0.8916, Adjusted R-squared:   0.84 
## F-statistic: 17.28 on 10 and 21 DF,  p-value: 5.69e-08

4) De acuerdo al ESDA de la Actividad 1 ¿porqué sí / no se justifica el uso de análisis de regresión espacial?

El análisis de regresión espacial resultó util para la actividad realizada, ya que se estudia el comportamiento de variables a nivel estatal en México. Este tipo de análisis proporciona una perspectiva más completa al permitir entender cómo se relacionan las variables dentro de un contexto geográfico, reconociendo que los datos ubicados geográficamente cerca tienden a estar correlacionados entre sí. En el caso específico de la actividad, permitió identificar con mayor claridad las diferencias regionales, por ejemplo, en los niveles salariales, donde se observaron zonas con salarios consistentemente más altos o más bajos. Además, este enfoque facilita detectar regiones donde el comportamiento de una variable se desvía del patrón general, como cuando un estado presenta altos ingresos mientras su vecino inmediato muestra lo contrario, lo que sugiere dinámicas espaciales más complejas.

5) Especificar y estimar 3 modelos diferentes de regresión espacial (e.g., SAR, SEM, SDM)

#Cargamos los datos shape y verificamos su estructura 
shapefile <- st_read("C:\\Users\\Diego Pérez\\Downloads\\mx_spatial_data\\mx_spatial_data\\mx_maps\\mx_states\\mexlatlong.shp") 
## Reading layer `mexlatlong' from data source 
##   `C:\Users\Diego Pérez\Downloads\mx_spatial_data\mx_spatial_data\mx_maps\mx_states\mexlatlong.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 32 features and 19 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -118.4042 ymin: 14.55055 xmax: -86.73862 ymax: 32.71846
## Geodetic CRS:  WGS 84
names(shapefile)
##  [1] "OBJECTID"   "FIPS_ADMIN" "GMI_ADMIN"  "ADMIN_NAME" "FIPS_CNTRY"
##  [6] "GMI_CNTRY"  "CNTRY_NAME" "POP_ADMIN"  "TYPE_ENG"   "TYPE_LOC"  
## [11] "SQKM"       "SQMI"       "COLOR_MAP"  "Shape_Leng" "Shape_Area"
## [16] "OBJECTID_1" "OBJECTID_2" "longitude"  "latitude"   "geometry"
head(shapefile)
## Simple feature collection with 6 features and 19 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -109.4428 ymin: 22.21486 xmax: -97.1375 ymax: 31.78389
## Geodetic CRS:  WGS 84
##   OBJECTID FIPS_ADMIN GMI_ADMIN ADMIN_NAME FIPS_CNTRY GMI_CNTRY CNTRY_NAME
## 1      888       MX06   MEX-CHH  Chihuahua         MX       MEX     Mexico
## 2      933       MX07   MEX-CDZ   Coahuila         MX       MEX     Mexico
## 3      976       MX19   MEX-NLE Nuevo Leon         MX       MEX     Mexico
## 4      978       MX28   MEX-TML Tamaulipas         MX       MEX     Mexico
## 5      998       MX25   MEX-SIN    Sinaloa         MX       MEX     Mexico
## 6     1004       MX10   MEX-DRN    Durango         MX       MEX     Mexico
##   POP_ADMIN TYPE_ENG TYPE_LOC      SQKM     SQMI COLOR_MAP Shape_Leng
## 1   2656214    State   Estado 247935.02 95727.70        12   22.60928
## 2   2145539    State   Estado 150843.95 58240.87         2   18.99309
## 3   3370912    State   Estado  65173.05 25163.31         3   15.42617
## 4   2272724    State   Estado  79502.24 30695.81        11   18.02314
## 5   2397706    State   Estado  57638.85 22254.36         5   16.46605
## 6   1467826    State   Estado 120674.60 46592.46         4   17.51290
##   Shape_Area OBJECTID_1 OBJECTID_2  longitude latitude
## 1  22.890985          1        888 -106.44431 28.80303
## 2  13.733655          2        933 -102.03356 27.30662
## 3   5.844668          3        976  -99.83125 25.60105
## 4   7.056563          4        978  -98.62181 24.29819
## 5   5.145524          5        998 -107.48280 25.02179
## 6  10.764853          6       1004 -104.92001 24.93519
##                         geometry
## 1 MULTIPOLYGON (((-103.6309 2...
## 2 MULTIPOLYGON (((-102.6669 2...
## 3 MULTIPOLYGON (((-99.7139 27...
## 4 MULTIPOLYGON (((-98.61609 2...
## 5 MULTIPOLYGON (((-108.3942 2...
## 6 MULTIPOLYGON (((-104.3114 2...
# Primero, asegúrate que ambos sean del mismo tipo
shapefile$OBJECTID <- as.numeric(shapefile$OBJECTID)
df_turismo$state_id <- as.numeric(df_turismo$state_id)

# Join por ID
estados_datos <- left_join(shapefile, df_turismo, by = c("OBJECTID" = "state_id"))
# Obtener solo las columnas numéricas sin geometría
datos_numericos <- estados_datos %>%
  st_drop_geometry() %>%
  select(tourism_gdp, crime_rate, college_education, unemployment,
         employment, business_activity, real_wage, pop_density,
         good_governance, ratio_public_investment)

# Estandarizar con scale()
datos_estandarizados <- as.data.frame(scale(datos_numericos))

# Combinar con la geometría y otras variables importantes
estados_datos_std <- estados_datos %>%
  select(total_visitantes, geometry) %>%
  bind_cols(datos_estandarizados)
# Crear vecinos y lista de pesos
vecinos <- poly2nb(estados_datos_std)
pesos <- nb2listw(vecinos, style = "W", zero.policy = TRUE)

#Creación de formula espacial
formula_espacial <- total_visitantes ~ tourism_gdp + crime_rate + college_education +
                    unemployment + business_activity + real_wage +pop_density

Modelo SAR (Spatial Autoregressive Model)

modelo_sar <- lagsarlm(formula_espacial, data = estados_datos_std, listw = pesos, zero.policy = TRUE)
## Warning in lagsarlm(formula_espacial, data = estados_datos_std, listw = pesos, : inversion of asymptotic covariance matrix failed for tol.solve = 2.22044604925031e-16 
##   número de condición recíproco = 7.0604e-26 - using numerical Hessian.
summary(modelo_sar)
## 
## Call:lagsarlm(formula = formula_espacial, data = estados_datos_std, 
##     listw = pesos, zero.policy = TRUE)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3455217  -754653    15407   521541  6765740 
## 
## Type: lag 
## Coefficients: (numerical Hessian approximate standard errors) 
##                   Estimate Std. Error z value  Pr(>|z|)
## (Intercept)         921469     325062  2.8347  0.004586
## tourism_gdp        1952871     496130  3.9362 8.278e-05
## crime_rate          -66906     310128 -0.2157  0.829192
## college_education  1139387     380460  2.9948  0.002747
## unemployment       -277972     407692 -0.6818  0.495353
## business_activity  -125034     329749 -0.3792  0.704553
## real_wage          -374904     409213 -0.9162  0.359583
## pop_density       -1666374     543558 -3.0657  0.002172
## 
## Rho: -0.063854, LR test value: 0.093976, p-value: 0.75918
## Approximate (numerical Hessian) standard error: 0.20431
##     z-value: -0.31254, p-value: 0.75463
## Wald statistic: 0.097684, p-value: 0.75463
## 
## Log likelihood: -502.6744 for lag model
## ML residual variance (sigma squared): 2.5786e+12, (sigma: 1605800)
## Number of observations: 32 
## Number of parameters estimated: 10 
## AIC: 1025.3, (AIC for lm: 1023.4)

SEM - Spatial Error Model

model_c <- errorsarlm(formula_espacial, data = estados_datos_std, listw = pesos, zero.policy = TRUE) 
## Warning in errorsarlm(formula_espacial, data = estados_datos_std, listw = pesos, : inversion of asymptotic covariance matrix failed for tol.solve = 2.22044604925031e-16 
##   número de condición recíproco = 1.47547e-25 - using numerical Hessian.
summary(model_c)
## 
## Call:errorsarlm(formula = formula_espacial, data = estados_datos_std, 
##     listw = pesos, zero.policy = TRUE)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -3327371.7  -649821.4     7217.7   513518.6  6604846.2 
## 
## Type: error 
## Coefficients: (asymptotic standard errors) 
##                   Estimate Std. Error z value  Pr(>|z|)
## (Intercept)         843002     222422  3.7901 0.0001506
## tourism_gdp        2036179     511676  3.9794 6.908e-05
## crime_rate         -243820     306722 -0.7949 0.4266585
## college_education  1147430     350640  3.2724 0.0010664
## unemployment       -383788     380856 -1.0077 0.3135986
## business_activity  -143515     344419 -0.4167 0.6769079
## real_wage          -245679     397164 -0.6186 0.5361910
## pop_density       -1864200     544714 -3.4223 0.0006208
## 
## Lambda: -0.25999, LR test value: 0.52395, p-value: 0.46916
## Approximate (numerical Hessian) standard error: 0.37711
##     z-value: -0.68942, p-value: 0.49056
## Wald statistic: 0.4753, p-value: 0.49056
## 
## Log likelihood: -502.4595 for error model
## ML residual variance (sigma squared): 2.5049e+12, (sigma: 1582700)
## Number of observations: 32 
## Number of parameters estimated: 10 
## AIC: 1024.9, (AIC for lm: 1023.4)

Spatial Durbin Model

model_d <- lagsarlm(formula_espacial, data = estados_datos_std, listw = pesos, zero.policy = TRUE, type="mixed") 
## Warning in lagsarlm(formula_espacial, data = estados_datos_std, listw = pesos, : inversion of asymptotic covariance matrix failed for tol.solve = 2.22044604925031e-16 
##   número de condición recíproco = 1.30412e-25 - using numerical Hessian.
summary(model_d)
## 
## Call:lagsarlm(formula = formula_espacial, data = estados_datos_std, 
##     listw = pesos, type = "mixed", zero.policy = TRUE)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1957395  -666180   -92008   731111  3644042 
## 
## Type: mixed 
## Coefficients: (numerical Hessian approximate standard errors) 
##                       Estimate Std. Error z value  Pr(>|z|)
## (Intercept)            1495064     317330  4.7114  2.46e-06
## tourism_gdp            1374930     504781  2.7238 0.0064532
## crime_rate             -482576     274910 -1.7554 0.0791921
## college_education       409909     407063  1.0070 0.3139394
## unemployment           -542126     344241 -1.5748 0.1152917
## business_activity      -551471     309103 -1.7841 0.0744068
## real_wage               367577     386761  0.9504 0.3419099
## pop_density           -1168390     544294 -2.1466 0.0318239
## lag.tourism_gdp         162513    1323184  0.1228 0.9022501
## lag.crime_rate        -1981441     520527 -3.8066 0.0001409
## lag.college_education  2578928     971675  2.6541 0.0079519
## lag.unemployment      -3324327    1104626 -3.0095 0.0026171
## lag.business_activity  -732334     484433 -1.5117 0.1306018
## lag.real_wage          1907740     771552  2.4726 0.0134134
## lag.pop_density       -1430235    1401019 -1.0209 0.3073239
## 
## Rho: -0.66286, LR test value: 6.2771, p-value: 0.012231
## Approximate (numerical Hessian) standard error: 0.23625
##     z-value: -2.8058, p-value: 0.0050191
## Wald statistic: 7.8725, p-value: 0.0050191
## 
## Log likelihood: -493.5157 for mixed model
## ML residual variance (sigma squared): 1.3044e+12, (sigma: 1142100)
## Number of observations: 32 
## Number of parameters estimated: 17 
## AIC: 1021, (AIC for lm: 1025.3)

6) Especificar y estimar 1 modelo de regresión mediante el uso de machine learning (e.g., support vector machine, decision trees, random forest, XGBoost regression, etc.)

Modelo RandomForest

# Seleccionar datos de entrenamiento
set.seed(123)  # para reproducibilidad

# Variables predictoras
X_ml <- estados_datos_std %>%
  st_drop_geometry() %>%
  select(tourism_gdp, crime_rate, college_education, unemployment, 
         employment, business_activity, real_wage, pop_density)

# Variable dependiente
y_ml <- estados_datos_std$total_visitantes

# Entrenar el modelo Random Forest
modelo_rf <- randomForest(x = X_ml, y = y_ml, ntree = 500, importance = TRUE)

# Ver resultados
print(modelo_rf)
## 
## Call:
##  randomForest(x = X_ml, y = y_ml, ntree = 500, importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##           Mean of squared residuals: 4.613301e+12
##                     % Var explained: 4.31
# Importancia de cada variable
importance(modelo_rf)
##                     %IncMSE IncNodePurity
## tourism_gdp       3.5447938  3.120073e+13
## crime_rate        0.0538395  8.626571e+12
## college_education 6.8567600  3.191269e+13
## unemployment      3.2192822  5.681166e+12
## employment        1.1349750  8.682096e+12
## business_activity 0.3369611  7.193952e+12
## real_wage         1.8161283  9.162462e+12
## pop_density       0.3626430  1.201754e+13
varImpPlot(modelo_rf)

7) Mediante el uso de Root Mean Square Error – RMSE seleccionar 1-2 modelos de regresión estimados en 3) - 6) y describir los principales resultados estimados.

Calcular RMSE

# Calcular RMSE
rmse <- function(y_real, y_pred) {
  sqrt(mean((y_real - y_pred)^2))
}

Modelos Espaciales (SAR, SEM, SDM)

# SAR
pred_sar <- modelo_sar$fit
rmse_sar <- rmse(estados_datos_std$total_visitantes, pred_sar)

# SEM
pred_sem <- model_c$fit
rmse_sem <- rmse(estados_datos_std$total_visitantes, pred_sem)

# SDM
pred_sdm <- model_d$fit
rmse_sdm <- rmse(estados_datos_std$total_visitantes, pred_sdm)

Random Forest

pred_rf <- predict(modelo_rf)
rmse_rf <- rmse(y_ml, pred_rf)

Resultados

cat("RMSE Comparativo:\n")
## RMSE Comparativo:
cat("SAR: ", rmse_sar, "\n")
## SAR:  1605793
cat("SEM: ", rmse_sem, "\n")
## SEM:  1582681
cat("SDM: ", rmse_sdm, "\n")
## SDM:  1142111
cat("Random Forest: ", rmse_rf, "\n")
## Random Forest:  2147860

Selección de Modelos y Resultados

Se compararon cinco modelos de regresión usando el RMSE):

  • SDM obtuvo el mejor desempeño (RMSE = 1,142,111), lo que confirma la relevancia de incorporar variables espaciales tanto propias como de estados vecinos. En particular, se identificaron efectos significativos de la educación y el desempleo en entidades vecinas.

  • SEM también presentó un buen desempeño (RMSE = 1,582,681), aunque el parámetro espacial (lambda) no fue significativo, lo cual indica que no hay errores espaciales relevantes.

  • Random Forest tuvo el peor ajuste, con un RMSE de 2,147,860 y apenas explicó el 4.3% de la varianza.

Con base en estos resultados, se seleccionan SDM y SEM como los mejores modelos para interpretar los factores que influyen en las llegadas de turistas extranjeros a nivel estatal.

8) Describir los principales 5 – 7 hallazgos del análisis de regresión no espacial y espacial. Principalmente, ¿cómo es el impacto de las variables que incluyen una especificación espacial de estados vecinos (W) sobre la variable dependiente Y?

Principales Hallazgos del Análisis de Regresión

  1. La variable (tourism_gdp) es la variable más significativa en los modelos. Su relación positiva indica que los estados con mayor actividad económica turística tienden a recibir más turistas extranjeros.

  2. El nivel educativo (college_education) también mostró una fuerte influencia positiva sobre la llegada de turistas extranjeros. Estados con mayor proporción de población con estudios universitarios atraen más visitantes.

  3. La densidad poblacional (pop_density) tiene un efecto negativo significativo, lo que sugiere que estados más saturados o urbanos pueden ser menos atractivos para turistas internacionales.

  4. En el modelo SDM se encontró que:

    • El desempleo en estados vecinos (lag.unemployment) tiene un efecto negativo muy significativo, lo que podría indicar que regiones con poco empleo en los alrededores son menos atractivas.

    • El nivel educativo en estados vecinos (lag.college_education) tiene un efecto positivo.

    • El salario real en estados vecinos (lag.real_wage) también influye positivamente, mostrando que la capacidad adquisitiva puede ser un imán para turistas.

  5. Random Forest, tuvo el peor desempeño, probablemente debido a la baja cantidad de observaciones (solo 32 estados).

  6. Existen efectos espaciales significativos.

9) A partir de los modelos de regresión seleccionados y los hallazgos identificados describir 2 – 3 sugerencias relacionadas con la toma de decisiones para:

a. Identificar las variables que explican un incremento / disminución en la actividad turística a nivel estatal

  1. PIB turístico estatal (tourism_gdp): Se recomienda fortalecer las actividades económicas directamente ligadas al turismo, como servicios de hospedaje, transporte y actividades culturales. Este indicador fue el más consistente en su influencia positiva.

  2. Educación superior (college_education): El nivel educativo de la población local impacta positivamente en la atracción turística. Se sugiere invertir en capital humano y profesionalización del sector servicios.

  3. Densidad poblacional (pop_density): Una alta densidad mostró un efecto negativo. Esto puede relacionarse con saturación urbana o problemas de infraestructura. Se recomienda mejorar la movilidad, limpieza urbana y servicios públicos en destinos densamente poblados.

b. Incrementar la actividad turística a nivel regional de entidades federativas seleccionadas

  1. Coordinación regional educativa y laboral: Dado que el modelo SDM mostró que la educación y el empleo en estados vecinos también influyen, se recomienda implementar políticas para elevar el nivel educativo y reducir el desempleo.

  2. Inversión en estados estratégicos con influencia regional: Identificar entidades que puedan “beneficiar” a estados cercanos. Por ejemplo, estados con infraestructura fuerte pueden atraer turistas que luego se muevan a regiones cercanas, impulsando el turismo en estas zonas.