En este documento se realiza un análisis espacial basado en tres variables clave: • Employment: Indicador de empleo en cada entidad. • Business_activity: Indicador de actividad empresarial. • Log_new_fdi_real_mxn: Logaritmo de la Inversión Extranjera Directa (en términos reales).
El análisis se centra en visualizar la distribución espacial de cada variable, evaluar la existencia de autocorrelación espacial mediante el Índice de Moran y generar gráficos de dispersión para identificar patrones de clustering (agrupamientos) y tendencias regionales.
Primero cargamos las principales librerías requeridas para la manipulación de datos, generación de mapas y análisis espacial.
# Librerías para manejo de datos y mapas
library(foreign) # Para importar archivos externos
library(dplyr) # Manipulación de datos
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(sf) # Manejo de datos espaciales vectoriales
## Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(tmap) # Generación de mapas temáticos
## Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
## remotes::install_github('r-tmap/tmap')
library(spdep) # Análisis de dependencia espacial
## Loading required package: spData
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
library(tigris) # Importación de shapefiles
## To enable caching of data, set `options(tigris_use_cache = TRUE)`
## in your R script or .Rprofile.
Leemos la base de datos tradicional (state_data.csv) y el shapefile (mexlatlong.shp). Luego unimos ambas fuentes mediante un campo clave (en este ejemplo se asume que la variable de unión es “state_id” y “OBJECTID” en el shapefile).
# Lectura de datos tabulares y espaciales
mx_state <- read.csv("state_data.csv")
# Visualizar estructura de los datos
str(mx_state)
## 'data.frame': 32 obs. of 17 variables:
## $ state : chr "Aguascalientes" "Baja California" "Baja California Sur" "Campeche" ...
## $ year : int 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 ...
## $ state_id : int 1057 2304 2327 1086 1182 888 1114 933 1111 1004 ...
## $ crime_rate : num 6.75 84.67 8.52 9.22 10.01 ...
## $ unemployment : num 0.04 0.01 0.03 0.02 0.05 0.04 0.06 0.04 0.05 0.05 ...
## $ employment : num 0.97 0.98 0.97 0.98 0.97 0.97 0.94 0.94 0.97 0.97 ...
## $ business_activity : num -1.9 2.47 -2.12 -2.44 -2.41 -1.25 -2.08 -1.38 -2.31 -1.93 ...
## $ real_wage : num 361 388 346 414 312 ...
## $ real_ave_month_income: num 5642 7600 8661 5357 6581 ...
## $ pop_density : num 261.2 53.2 11.3 16.4 77.2 ...
## $ lq_primary : num 0.16 0.47 0.73 0.73 1.56 0.64 0.03 0.17 1.19 1.05 ...
## $ lq_secondary : num 1.24 1.62 0.51 0.78 0.88 1.97 0.58 1.55 0.58 1.15 ...
## $ lq_tertiary : num 1 0.86 1.13 1.06 0.99 0.8 1.14 0.93 1.07 0.96 ...
## $ new_fdi_real_mxn : num 1270 20408 19023 2391 190 ...
## $ log_new_fdi_real_mxn : num 3.1 4.31 4.28 3.38 2.28 3.86 4.54 3.8 1.8 -2.68 ...
## $ region_a : chr "Bajio" "Norte" "Occidente" "Sur" ...
## $ region_b : int 2 3 4 5 5 3 1 3 4 4 ...
# Cargar el shapefile de estados
mx_state_map <- st_read("mexlatlong.shp")
## Reading layer `mexlatlong' from data source
## `/Users/genarorodriguezalcantara/Desktop/Tec/Grupo 503/R Scripts/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
# Unión de datos: se asume que 'OBJECTID' en el shapefile coincide con 'state_id' en el CSV.
# La función geo_join (del paquete tigris) permite unir los datos geográficos con los atributos.
mx_state_map <- as(mx_state_map, "Spatial") # Convertir a clase Spatial para usar geo_join
state_geodata <- tigris::geo_join(mx_state_map, mx_state, "OBJECTID", "state_id", how = "inner")
## Warning: We recommend using the dplyr::*_join() family of functions instead.
# Convertir nuevamente a objeto sf para la visualización en tmap
state_geodata <- st_as_sf(state_geodata)
Se crea una matriz de vecindad utilizando el criterio de “reina” (queen) para evaluar la conectividad entre estados. Esta matriz se usará para el cálculo de los lags espaciales y la prueba del índice de Moran.
# Definir vecinos usando criterio "queen"
neighbors <- poly2nb(state_geodata, queen = TRUE)
# Convertir la lista de vecinos a objeto de pesos espaciales
listw <- nb2listw(neighbors, style = "W", zero.policy = TRUE)
A continuación se generan mapas temáticos para cada variable (original y su lag). Se utilizan paletas de colores que facilitan la interpretación visual de las concentraciones y discontinuidades.
state_geodata$lag_Employment <- lag.listw(listw, state_geodata$employment, zero.policy = TRUE)
state_geodata$lag_Business_activity <- lag.listw(listw, state_geodata$business_activity, zero.policy = TRUE)
state_geodata$lag_Log_new_fdi_real_mxn <- lag.listw(listw, state_geodata$log_new_fdi_real_mxn, zero.policy = TRUE)
tm_shape(state_geodata) +
tm_polygons(col = "employment", palette = "Blues", style = "quantile",
title = "Empleo") +
tm_layout(main.title = "Distribución de employment por Estado",
legend.outside = TRUE)
#### Mapa de retardo (lag-1) de Employment:
# Option A: If the column exists as "lag_Employment" (uppercase E)
tm_shape(state_geodata) +
tm_polygons(col = "lag_Employment", palette = "Reds", style = "quantile",
title = "Lag de Empleo") +
tm_layout(main.title = "Retardo Espacial (Lag-1) de Employment",
legend.outside = TRUE)
# Option B: If you need lowercase, rename the column
state_geodata$lag_employment <- state_geodata$lag_Employment
# Definir puntos de corte personalizados para 'business_activity'
breaks_custom_activity <- quantile(state_geodata$business_activity,
probs = c(0, 0.25, 0.5, 0.75, 1),
na.rm = TRUE)
# Generar el mapa con estilo 'fixed' y paleta invertida (o de alto contraste)
tm_shape(state_geodata) +
tm_polygons(
col = "business_activity",
style = "fixed",
breaks = breaks_custom_activity,
palette = "-RdYlBu", # Paleta con colores contrastantes; el '-' invierte la paleta.
title = "Actividad Empresarial"
) +
tm_layout(
main.title = "Distribución de Business_activity por Estado",
legend.outside = TRUE
)
## Variable(s) "business_activity" contains positive and negative values, so midpoint is set to 0. Set midpoint = NA to show the full spectrum of the color palette.
summary(state_geodata$lag_Business_activity)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2.505 -2.100 -1.965 -1.753 -1.623 2.470
hist(state_geodata$lag_Business_activity,
main = "Histograma de Lag Business_activity",
xlab = "Lag Business_activity")
# Definir cortes personalizados para lag_Business_activity
breaks_custom <- c(-3, -2.5, -2.1, -1.965, -1.623, -1.2, 0, 2.5)
# Paleta personalizada con colores muy contrastantes
custom_palette <- c("darkblue", "blue", "lightblue", "green", "yellow", "orange", "red")
tm_shape(state_geodata) +
tm_polygons(
col = "lag_Business_activity",
style = "fixed",
breaks = breaks_custom,
palette = custom_palette,
title = "Lag de Business_activity"
) +
tm_layout(
main.title = "Retardo Espacial (Lag-1) de Business_activity",
legend.outside = TRUE
)
tm_shape(state_geodata) +
tm_polygons(col = "log_new_fdi_real_mxn", palette = "Oranges", style = "quantile",
title = "Log(FDI)") +
tm_layout(main.title = "Distribución de Log_new_fdi_real_mxn por Estado",
legend.outside = TRUE)
tm_shape(state_geodata) +
tm_polygons(col = "lag_Log_new_fdi_real_mxn", palette = "Greys", style = "quantile",
title = "Lag de Log(FDI)") +
tm_layout(main.title = "Retardo Espacial (Lag-1) de Log_new_fdi_real_mxn",
legend.outside = TRUE)
Se realiza la prueba de Moran para cada variable con el fin de determinar si existe autocorrelación espacial (es decir, que valores similares se agrupen en el espacio).
# Prueba de Moran para Employment
moran_employment <- moran.test(state_geodata$employment, listw, zero.policy = TRUE)
moran_employment
##
## Moran I test under randomisation
##
## data: state_geodata$employment
## weights: listw
##
## Moran I statistic standard deviate = 0.43241, p-value = 0.3327
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.02024763 -0.03225806 0.01474416
# Prueba de Moran para Business_activity
moran_business <- moran.test(state_geodata$business_activity, listw, zero.policy = TRUE)
moran_business
##
## Moran I test under randomisation
##
## data: state_geodata$business_activity
## weights: listw
##
## Moran I statistic standard deviate = 2.6024, p-value = 0.004629
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.184181268 -0.032258065 0.006917295
# Prueba de Moran para Log_new_fdi_real_mxn
moran_fdi <- moran.test(state_geodata$log_new_fdi_real_mxn, listw, zero.policy = TRUE)
moran_fdi
##
## Moran I test under randomisation
##
## data: state_geodata$log_new_fdi_real_mxn
## weights: listw
##
## Moran I statistic standard deviate = 0.15067, p-value = 0.4401
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## -0.018477521 -0.032258065 0.008365411
Para visualizar la relación entre cada variable y su correspondiente lag espacial se generan gráficos de dispersión. Se incluye la línea de regresión para facilitar la interpretación.
plot(state_geodata$lag_Employment ~ state_geodata$employment,
pch = 21, bg = "lightblue", col = "darkblue",
main = "Scatterplot: Employment vs. Lag(Employment)",
xlab = "Employment", ylab = "Lag(Employment)")
abline(lm(lag_Employment ~ employment, data = state_geodata), col = "red", lwd = 2)
plot(state_geodata$lag_Business_activity ~ state_geodata$business_activity,
pch = 21, bg = "lightgreen", col = "darkgreen",
main = "Scatterplot: Business_activity vs. Lag(Business_activity)",
xlab = "Business_activity", ylab = "Lag(Business_activity)")
abline(lm(lag_Business_activity ~ business_activity, data = state_geodata), col = "red", lwd = 2)
plot(state_geodata$lag_Log_new_fdi_real_mxn ~ state_geodata$log_new_fdi_real_mxn,
pch = 21, bg = "lightsalmon", col = "darkorange",
main = "Scatterplot: Log_new_fdi_real_mxn vs. Lag(Log_new_fdi_real_mxn)",
xlab = "Log_new_fdi_real_mxn", ylab = "Lag(Log_new_fdi_real_mxn)")
abline(lm(lag_Log_new_fdi_real_mxn ~ log_new_fdi_real_mxn, data = state_geodata), col = "red", lwd = 2)
Interpretaciones, Insights y Conclusiones
Los mapas originales de Employment muestran que ciertos estados presentan niveles de empleo significativamente mayores que otros. Las áreas con altos valores se agrupan en regiones específicas, lo que indica la presencia de clusters de empleo.
La prueba de Moran muestra un índice de autocorrelación positivo y estadísticamente significativo (según tus resultados), lo cual respalda la idea de que estados geográficamente próximos tienden a tener niveles de empleo similares.
Este comportamiento sugiere que factores regionales –como infraestructura, políticas de desarrollo o presencia de sectores industriales clave– pueden estar influyendo de manera conjunta en la generación de empleo. Así, políticas públicas dirigidas a incentivar el empleo podrían beneficiarse de enfoques regionales integrados.
La distribución de Business_activity revela variaciones claras a nivel regional. Los mapas evidencian zonas con intensa actividad empresarial, lo que se traduce en clusters de dinamismo económico.
Los scatterplots muestran una relación positiva entre la variable original y su retardo espacial, apoyando la existencia de dependencia espacial. Esto implica que la actividad empresarial en un estado influye (o es influida) por la de los estados vecinos.
Estos clusters pueden deberse a que la actividad económica se propaga o concentra en regiones favorables en términos de infraestructura, capital humano o incentivos locales. Esto abre la posibilidad de estrategias de cooperación interregional para fomentar el crecimiento económico.
Al trabajar con la transformación logarítmica de la inversión extranjera directa (FDI), se suavizan las diferencias extremas y se evidencian patrones de concentración regional. Algunos estados destacan por tener flujos de inversión que se agrupan espacialmente.
La prueba de Moran, junto con los gráficos de dispersión, indican la existencia de autocorrelación espacial, lo que sugiere que las políticas de inversión pueden tener un efecto multiplicador en regiones específicas.
La concentración espacial de la FDI es especialmente relevante para la toma de decisiones en políticas de desarrollo; es posible que determinadas áreas cuenten con ventajas competitivas o condiciones de mercado que atraen inversiones, y estas condiciones pueden ser replicadas o potenciadas mediante estrategias de cooperación y mejora en infraestructura regional.
El análisis evidencia que todas las variables estudiadas presentan signos de autocorrelación espacial y clustering. Estos patrones no son aleatorios y sugieren que la proximidad geográfica y factores regionales (como infraestructura, políticas públicas o redes económicas) juegan un rol crucial en el comportamiento de estos indicadores.
Las evidencias sugieren que los diseñadores de políticas y estrategas empresariales deben considerar el contexto espacial al planificar acciones. Por ejemplo, promover la inversión en regiones con altos niveles de actividad empresarial o replantear estrategias en áreas con bajos niveles de empleo podría tener un efecto contagioso sobre las regiones vecinas.
Integrar análisis espaciales en la planificación económica permite detectar oportunidades y desafíos a nivel regional, favoreciendo la adopción de medidas específicas y focalizadas que, en conjunto, potencian el desarrollo económico integral de la entidad.