#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)
#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)
#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
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.
#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 <- 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)
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)
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)
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)
Calcular RMSE
# Calcular RMSE
rmse <- function(y_real, y_pred) {
sqrt(mean((y_real - y_pred)^2))
}
# 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)
pred_rf <- predict(modelo_rf)
rmse_rf <- rmse(y_ml, pred_rf)
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
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.
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.
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.
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.
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.
Random Forest, tuvo el peor desempeño, probablemente debido a la baja cantidad de observaciones (solo 32 estados).
Existen efectos espaciales significativos.
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.
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.
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.
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.
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.