1) Brevemente, describir con sus propias palabras qué es un ESDA y cuál es su principal propósito en el proceso de analítica de datos.
EL ESDA por sus siglas en inglés o análisis exploratorio de datos espaciales, es un conjunto de herramientas y técnicas que se utilizan para poder análizar las tendencias y patrones de datos espaciales. Como principal objetivo, se busca indentificar estructuras, tendencias, concentraciones o irregularidades en la distribución de mis datos y a partir de ello, poder otorgar recomendacioes de valor dependiendo las necesidades.
2) Brevemente, describir con sus propias palabras el concepto de autocorrelación espacial así como 1-2 ejemplos relacionados con dicho concepto.
La autocorrelación espacial me indica qué tan probable es que se sigan las tendencias de mi vecino más cercano.
Ejemplo 1: La inversión extranjera que hay en un estado vecino, en caso de tener autocorrelación espacial positiva relevante y significativa, es similar en los estados aledaños. (Estados del norte poseen una alta inversión extranjera)
Ejemplo 2: La distribución de los precios de vivienda que hay en una colonia, es similar al de una colonia aledaña en caso de tener autocorrelación espacial positiva y significante. (En San Pedro, las colonias tinen precios de vivienda altos)
3) Con base en el archivo de datos asignado realizar selección de variables y elaborar ESDA que incluye:
library(readxl) # Para leer archivos Excel
library(dplyr) # Manipulación de datos
library(ggplot2)
library(readxl)
library(scales) # Para formatear números en el eje y (opcional)
library(sf)
#install.packages("sf")
#install.packages("tmap")
#install.packages("spdep")
library(tmap)
library(tmaptools)
library(spdep)
df<- read_excel("C:\\Users\\LuisD\\Documents\\OCTAVO SEMESTRE\\TURISMO MONTERREY\\tourism_state_data.xlsx")
View(df)
head(df)
## # A tibble: 6 × 18
## state year state_id tourism_gdp crime_rate college_education unemployment
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Aguascal… 2006 1057 11995. 2.32 0.164 0.05
## 2 Baja Cal… 2006 2304 54372. 15.5 0.181 0.03
## 3 Baja Cal… 2006 2327 24238. 4.54 0.191 0.02
## 4 Campeche 2006 1086 13032. 4.19 0.154 0.01
## 5 Chiapas 2006 1182 22730. 11.6 0.0875 0.04
## 6 Chihuahua 2006 888 37096. 19.4 0.153 0.04
## # ℹ 11 more variables: employment <dbl>, business_activity <dbl>,
## # real_wage <dbl>, pop_density <dbl>, good_governance <dbl>,
## # ratio_public_investment <dbl>, exchange_rate <dbl>, inpc <dbl>,
## # border_distance <dbl>, region...17 <chr>, region...18 <dbl>
summary(df)
## state year state_id tourism_gdp
## Length:544 Min. :2006 Min. : 888 Min. : 6240
## Class :character 1st Qu.:2010 1st Qu.:1047 1st Qu.: 22685
## Mode :character Median :2014 Median :1081 Median : 32482
## Mean :2014 Mean :1219 Mean : 56520
## 3rd Qu.:2018 3rd Qu.:1118 3rd Qu.: 59014
## Max. :2022 Max. :2357 Max. :472642
## crime_rate college_education unemployment employment
## Min. : 1.710 Min. :0.08751 Min. :0.01000 Min. :0.8900
## 1st Qu.: 8.107 1st Qu.:0.16703 1st Qu.:0.03000 1st Qu.:0.9500
## Median : 13.880 Median :0.20304 Median :0.04000 Median :0.9700
## Mean : 22.163 Mean :0.21106 Mean :0.04251 Mean :0.9639
## 3rd Qu.: 26.314 3rd Qu.:0.25085 3rd Qu.:0.05000 3rd Qu.:0.9754
## Max. :181.510 Max. :0.43761 Max. :0.10000 Max. :0.9928
## business_activity real_wage pop_density good_governance
## Min. :-2.980 Min. :239.3 Min. : 7.74 Min. : 0.000
## 1st Qu.:-2.260 1st Qu.:282.5 1st Qu.: 39.56 1st Qu.: 0.180
## Median :-2.070 Median :306.2 Median : 61.77 Median : 0.500
## Mean :-1.757 Mean :314.9 Mean : 299.46 Mean : 2.362
## 3rd Qu.:-1.768 3rd Qu.:335.4 3rd Qu.: 150.46 3rd Qu.: 1.350
## Max. : 2.470 Max. :481.7 Max. :6211.45 Max. :200.020
## ratio_public_investment exchange_rate inpc border_distance
## Min. :0.000000 Min. :10.85 Min. : 62.69 Min. : 8.83
## 1st Qu.:0.000000 1st Qu.:12.87 1st Qu.: 74.93 1st Qu.: 613.26
## Median :0.000000 Median :14.51 Median : 87.19 Median : 751.64
## Mean :0.005736 Mean :15.91 Mean : 89.08 Mean : 704.92
## 3rd Qu.:0.010000 3rd Qu.:19.47 3rd Qu.:103.02 3rd Qu.: 875.76
## Max. :0.067644 Max. :20.52 Max. :126.48 Max. :1252.66
## region...17 region...18
## Length:544 Min. :1.000
## Class :character 1st Qu.:2.000
## Mode :character Median :3.000
## Mean :3.188
## 3rd Qu.:4.250
## Max. :5.000
##Estadisticos Descriptivos
####Evolución de turismo nacional
# Agrupar por año y sumar tourism_gdp
df_resumen <- df %>%
group_by(year) %>%
summarise(total_tourism_gdp = sum(tourism_gdp, na.rm = TRUE))
# Crear la gráfica de línea mejorada
ggplot(df_resumen, aes(x = year, y = total_tourism_gdp)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "red", size = 3) +
scale_x_continuous(breaks = seq(min(df_resumen$year), max(df_resumen$year), by = 1)) +
labs(title = "Ganancias por Turismo por Año",
x = "Año",
y = "Ganancias") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# Agrupar por año y calcular el promedio de crime_rate
df_resumen <- df %>%
group_by(year) %>%
summarise(avg_crime_rate = mean(crime_rate, na.rm = TRUE))
# Crear la gráfica de línea mejorada
ggplot(df_resumen, aes(x = year, y = avg_crime_rate)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "red", size = 3) +
scale_x_continuous(breaks = seq(min(df_resumen$year), max(df_resumen$year), by = 1)) +
labs(title = "Promedio Anual de crimen por 100,000 habitantes",
x = "Año",
y = "Promedio de crimen") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# Agrupar por año y calcular el promedio de real_wage
df_resumen_real_wage <- df %>%
group_by(year) %>%
summarise(avg_real_wage = mean(real_wage, na.rm = TRUE))
# Crear la gráfica de línea para real_wage
ggplot(df_resumen_real_wage, aes(x = year, y = avg_real_wage)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "red", size = 3) +
scale_x_continuous(breaks = seq(min(df_resumen_real_wage$year),
max(df_resumen_real_wage$year), by = 1)) +
labs(title = "Promedio Nacional de sueldo por Año",
x = "Año",
y = "Sueldo") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# Agrupar por año y calcular el promedio de good_governance
df_resumen_good_governance <- df %>%
group_by(year) %>%
summarise(avg_good_governance = mean(good_governance, na.rm = TRUE))
# Crear la gráfica de línea para good_governance
ggplot(df_resumen_good_governance, aes(x = year, y = avg_good_governance)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "red", size = 3) +
scale_x_continuous(breaks = seq(min(df_resumen_good_governance$year),
max(df_resumen_good_governance$year), by = 1)) +
labs(title = "Promedio Nacional de buena governanza por Año",
x = "Año",
y = "Buena governanza") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
### Dispersión regional
# 1. Renombrar la variable "region...17" a "region"
df <- df %>%
rename(region = `region...17`)
df_region_tourism_gdp <- df %>%
group_by(region) %>%
summarise(avg_tourism_gdp = mean(tourism_gdp, na.rm = TRUE)) %>%
arrange(desc(avg_tourism_gdp))
# Gráfico de barras para tourism_gdp
ggplot(df_region_tourism_gdp, aes(x = reorder(region, -avg_tourism_gdp), y = avg_tourism_gdp, fill = region)) +
geom_bar(stat = "identity") +
labs(title = "Promedio de Tourism GDP por Región",
x = "Región",
y = "Promedio Tourism GDP") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
#### 3. Promedio de crime_rate por región
df_region_crime_rate <- df %>%
group_by(region) %>%
summarise(avg_crime_rate = mean(crime_rate, na.rm = TRUE)) %>%
arrange(desc(avg_crime_rate))
# Gráfico de barras para crime_rate
ggplot(df_region_crime_rate, aes(x = reorder(region, -avg_crime_rate), y = avg_crime_rate, fill = region)) +
geom_bar(stat = "identity") +
labs(title = "Promedio de Crime Rate por Región",
x = "Región",
y = "Promedio Crime Rate") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
df_region_good_governance <- df %>%
group_by(region) %>%
summarise(avg_good_governance = mean(good_governance, na.rm = TRUE)) %>%
arrange(desc(avg_good_governance))
# Gráfico de barras para good_governance
ggplot(df_region_good_governance, aes(x = reorder(region, -avg_good_governance), y = avg_good_governance, fill = region)) +
geom_bar(stat = "identity") +
labs(title = "Promedio de Good Governance por Región",
x = "Región",
y = "Promedio Good Governance") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
#### 5. Agrupar por región y calcular el promedio de real_wage,
ordenando de mayor a menor
df_region_real_wage <- df %>%
group_by(region) %>%
summarise(avg_real_wage = mean(real_wage, na.rm = TRUE)) %>%
arrange(desc(avg_real_wage))
# 5. Crear el gráfico de barras con las regiones ordenadas
ggplot(df_region_real_wage, aes(x = reorder(region, -avg_real_wage), y = avg_real_wage, fill = region)) +
geom_bar(stat = "identity") +
labs(title = "Promedio de Real Wage por Región",
x = "Región",
y = "Promedio Real Wage") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
### Dispersión estatal
# Agrupar por estado y calcular el promedio de tourism_gdp
df_state_tourism_gdp <- df %>%
group_by(state) %>%
summarise(avg_tourism_gdp = mean(tourism_gdp, na.rm = TRUE))
# Seleccionar el top 10 de estados con mayor promedio de tourism_gdp
df_top10_tourism_gdp <- df_state_tourism_gdp %>%
slice_max(order_by = avg_tourism_gdp, n = 10)
# Gráfico de barras para tourism_gdp (Top 10)
ggplot(df_top10_tourism_gdp, aes(x = reorder(state, -avg_tourism_gdp), y = avg_tourism_gdp, fill = state)) +
geom_bar(stat = "identity") +
labs(title = "Top 10 Estados por Promedio Tourism GDP",
x = "Estado",
y = "Promedio Tourism GDP") +
scale_y_continuous(labels = comma) + # Opcional: formatea los números con comas
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# Agrupar por estado y calcular el promedio de crime_rate
df_state_crime_rate <- df %>%
group_by(state) %>%
summarise(avg_crime_rate = mean(crime_rate, na.rm = TRUE))
# Seleccionar el top 10 de estados con mayor promedio de crime_rate
df_top10_crime_rate <- df_state_crime_rate %>%
slice_max(order_by = avg_crime_rate, n = 10)
# Gráfico de barras para crime_rate (Top 10)
ggplot(df_top10_crime_rate, aes(x = reorder(state, -avg_crime_rate), y = avg_crime_rate, fill = state)) +
geom_bar(stat = "identity") +
labs(title = "Top 10 Estados por Promedio Crime Rate",
x = "Estado",
y = "Promedio Crime Rate") +
scale_y_continuous(labels = comma) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# Agrupar por estado y calcular el promedio de good_governance
df_state_good_governance <- df %>%
group_by(state) %>%
summarise(avg_good_governance = mean(good_governance, na.rm = TRUE))
# Seleccionar el top 10 de estados con mayor promedio de good_governance
df_top10_good_governance <- df_state_good_governance %>%
slice_max(order_by = avg_good_governance, n = 10)
# Gráfico de barras para good_governance (Top 10)
ggplot(df_top10_good_governance, aes(x = reorder(state, -avg_good_governance), y = avg_good_governance, fill = state)) +
geom_bar(stat = "identity") +
labs(title = "Top 10 Estados por Promedio Good Governance",
x = "Estado",
y = "Promedio Good Governance") +
scale_y_continuous(labels = comma) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# Agrupar por estado y calcular el promedio de real_wage
df_state_real_wage <- df %>%
group_by(state) %>%
summarise(avg_real_wage = mean(real_wage, na.rm = TRUE))
# Seleccionar el top 10 de estados con mayor promedio de real_wage
df_top10_real_wage <- df_state_real_wage %>%
slice_max(order_by = avg_real_wage, n = 10)
# Gráfico de barras para real_wage (Top 10)
ggplot(df_top10_real_wage, aes(x = reorder(state, -avg_real_wage), y = avg_real_wage, fill = state)) +
geom_bar(stat = "identity") +
labs(title = "Top 10 Estados por Promedio Real Wage",
x = "Estado",
y = "Promedio Real Wage") +
scale_y_continuous(labels = comma) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
options(scipen = 999) # Evita notación científica
# Crear el boxplot de tourism_gdp por año
ggplot(df, aes(x = factor(year), y = tourism_gdp)) +
geom_boxplot(fill = "skyblue", color = "darkblue") +
labs(title = "Distribución de Tourism GDP a Nivel Nacional por Año",
x = "Año",
y = "Tourism GDP") +
scale_y_continuous(labels = comma) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(df, aes(x = factor(year), y = crime_rate)) +
geom_boxplot(fill = "tomato", color = "darkred") +
labs(title = "Distribución de Crime Rate a Nivel Nacional por Año",
x = "Año",
y = "Crime Rate") +
scale_y_continuous(labels = comma) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(df, aes(x = factor(year), y = real_wage)) +
geom_boxplot(fill = "lightgreen", color = "darkgreen") +
labs(title = "Distribución de Real Wage a Nivel Nacional por Año",
x = "Año",
y = "Real Wage") +
scale_y_continuous(labels = comma) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(df, aes(x = factor(year), y = good_governance)) +
# Quitar símbolo de outliers
geom_boxplot(fill = "plum", color = "purple", outlier.shape = NA) +
labs(title = "Distribución de Good Governance a Nivel Nacional por Año (Con Límite)",
x = "Año",
y = "Good Governance") +
# Limitar el rango del eje y
coord_cartesian(ylim = c(0, 25)) + # Ajusta (0, 10) a tu rango preferido
scale_y_continuous(labels = comma) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1)
)
library(scales) # Para formatear números, si lo requieres
options(scipen = 999) # Evita la notación científica
# 1. Calcular el promedio de tourism_gdp por estado y seleccionar el top 10
df_state_tourism <- df %>%
group_by(state) %>%
summarise(avg_tourism_gdp = mean(tourism_gdp, na.rm = TRUE)) %>%
slice_max(order_by = avg_tourism_gdp, n = 10)
# 2. Filtrar el dataframe original para conservar solo los estados del top 10
top_states_tourism <- df_state_tourism$state
df_top_tourism <- df %>% filter(state %in% top_states_tourism)
# 3. Generar el boxplot de tourism_gdp para los top 10 estados
ggplot(df_top_tourism, aes(x = reorder(state, tourism_gdp, FUN = median, na.rm = TRUE),
y = tourism_gdp, fill = state)) +
geom_boxplot() +
labs(title = "Boxplot de Tourism GDP para Top 10 Estados",
x = "Estado",
y = "Tourism GDP") +
scale_y_continuous(labels = comma) + # Opcional: formatea los números del eje y
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# 1. Calcular el promedio de crime_rate por estado y seleccionar el top 10
df_state_crime <- df %>%
group_by(state) %>%
summarise(avg_crime_rate = mean(crime_rate, na.rm = TRUE)) %>%
slice_max(order_by = avg_crime_rate, n = 10)
# 2. Filtrar el dataframe original para conservar solo los estados del top 10
top_states_crime <- df_state_crime$state
df_top_crime <- df %>% filter(state %in% top_states_crime)
# 3. Generar el boxplot de crime_rate para los top 10 estados
ggplot(df_top_crime, aes(x = reorder(state, crime_rate, FUN = median, na.rm = TRUE),
y = crime_rate, fill = state)) +
geom_boxplot() +
labs(title = "Boxplot de Crime Rate para Top 10 Estados",
x = "Estado",
y = "Crime Rate") +
scale_y_continuous(labels = comma) + # Opcional: formatea los números del eje y
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# 1. Calcular el promedio de good_governance por estado y seleccionar el top 10
df_state_governance <- df %>%
group_by(state) %>%
summarise(avg_good_governance = mean(good_governance, na.rm = TRUE)) %>%
slice_max(order_by = avg_good_governance, n = 10)
# 2. Filtrar el dataframe original para conservar solo los estados del top 10
top_states_governance <- df_state_governance$state
df_top_governance <- df %>% filter(state %in% top_states_governance)
# 3. Generar el boxplot de good_governance para los top 10 estados
ggplot(df_top_governance, aes(x = reorder(state, good_governance, FUN = median, na.rm = TRUE),
y = good_governance, fill = state)) +
geom_boxplot() +
labs(title = "Boxplot de Good Governance para Top 10 Estados",
x = "Estado",
y = "Good Governance") +
scale_y_continuous(labels = comma) + # Opcional: formatea los números del eje y
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# 1. Calcular el promedio de real_wage por estado y seleccionar el top 10
df_state_realwage <- df %>%
group_by(state) %>%
summarise(avg_real_wage = mean(real_wage, na.rm = TRUE)) %>%
slice_max(order_by = avg_real_wage, n = 10)
# 2. Filtrar el dataframe original para conservar solo los estados del top 10
top_states_realwage <- df_state_realwage$state
df_top_realwage <- df %>% filter(state %in% top_states_realwage)
# 3. Generar el boxplot de real_wage para los top 10 estados
ggplot(df_top_realwage, aes(x = reorder(state, real_wage, FUN = median, na.rm = TRUE),
y = real_wage, fill = state)) +
geom_boxplot() +
labs(title = "Boxplot de Real Wage para Top 10 Estados",
x = "Estado",
y = "Real Wage") +
scale_y_continuous(labels = comma) + # Opcional: formatea los números del eje y
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, face = "bold"))
# Leer el archivo .shp
estados_mx <- st_read("C:\\Users\\LuisD\\Documents\\OCTAVO SEMESTRE\\TURISMO MONTERREY\\mx_spatial_data\\mx_spatial_data\\mx_maps\\mx_states\\mexlatlong.shp")
## Reading layer `mexlatlong' from data source
## `C:\Users\LuisD\Documents\OCTAVO SEMESTRE\TURISMO MONTERREY\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(estados_mx)
## [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(estados_mx)
## 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...
plot(st_geometry(estados_mx))
# Unir shapefile con los datos
estados_datos <- left_join(estados_mx, df, by = c("ADMIN_NAME" = "state"))
# Crear matriz de vecinos y pesos
vecinos <- poly2nb(estados_datos)
pesos <- nb2listw(vecinos, style = "W")
library(tmap)
# Modo estático (puedes cambiarlo a "view" si quieres mapas interactivos)
tmap_mode("plot")
# Mapa 1: tourism_gdp
tm_shape(estados_datos) +
tm_polygons("tourism_gdp",
palette = "Blues",
title = "PIB Turístico") +
tm_layout(main.title = "Distribución Espacial del PIB Turístico",
legend.outside = TRUE)
# Mapa 2: crime_rate
tm_shape(estados_datos) +
tm_polygons("crime_rate",
palette = "Reds",
title = "Índice de Criminalidad") +
tm_layout(main.title = "Distribución Espacial del Crimen",
legend.outside = TRUE)
# Mapa 3: good_governance
tm_shape(estados_datos) +
tm_polygons("good_governance",
palette = "Greens",
title = "Índice de Buen Gobierno") +
tm_layout(main.title = "Distribución Espacial del Buen Gobierno",
legend.outside = TRUE)
# Mapa 4: real_wage
tm_shape(estados_datos) +
tm_polygons("real_wage",
palette = "Purples",
title = "Salario Real") +
tm_layout(main.title = "Distribución Espacial del Salario Real",
legend.outside = TRUE)
library(spdep)
estados_validos <- estados_datos[!is.na(estados_datos$tourism_gdp), ]
estados_validos <- estados_datos[!is.na(estados_datos$real_wage), ]
estados_validos <- estados_datos[!is.na(estados_datos$crime_rate), ]
estados_validos <- estados_datos[!is.na(estados_datos$good_governance), ]
vecinos_validos <- poly2nb(estados_validos)
pesos_validos <- nb2listw(vecinos_validos, style = "W")
moran_gdp_turismo <- moran.test(estados_validos$tourism_gdp, pesos_validos, zero.policy = TRUE)
moran_gdp_turismo
##
## Moran I test under randomisation
##
## data: estados_validos$tourism_gdp
## weights: pesos_validos
##
## Moran I statistic standard deviate = 2.8037, p-value = 0.002526
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.01580368341 -0.00190114068 0.00003987752
En este primer caso para la variable PIB de turismo podemos observar dos cosas: - El Moran I Statistic es de 0.015 por lo que es un valor relativamente bajo - El P value es de 0.0025 por lo que existe significancia estadística Es decir, hay cierta agrupación estadísticamente significativa de estados con PIB turístico similar, pero esta agrupación es muy débil.
moran_crimen <- moran.test(estados_validos$crime_rate, pesos_validos, zero.policy = TRUE)
moran_crimen
##
## Moran I test under randomisation
##
## data: estados_validos$crime_rate
## weights: pesos_validos
##
## Moran I statistic standard deviate = 28.098, p-value <
## 0.00000000000000022
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.17473678872 -0.00190114068 0.00003952118
Para la variable de crimen contamos con un valor de Moran de 0.1747 el cual es más alto que el del PIB y su P-value es extremadamente bajo por lo que existe significancia estadística, es decir, los estados con altas tasas de criminalidad tienden a estar cerca de otros con tasas similares
moran_gobierno <- moran.test(estados_validos$good_governance, pesos_validos, zero.policy = TRUE)
moran_gobierno
##
## Moran I test under randomisation
##
## data: estados_validos$good_governance
## weights: pesos_validos
##
## Moran I statistic standard deviate = 3.6914, p-value = 0.0001115
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.01433605218 -0.00190114068 0.00001934785
En la variable de Buen Gobierno contamos nuevamente con un valor del Moran Statistic bajo (0.0143) y un P-value también bajo (<0.05) por lo que existe una autocorrelación débil pero significativa, lo cual sugiere que los estados con mejor (o peor) gobernanza tienden a estar agrupados, pero el patrón no es tan marcado como para ser observado a simple vista
moran_salario <- moran.test(estados_validos$real_wage, pesos_validos, zero.policy = TRUE)
moran_salario
##
## Moran I test under randomisation
##
## data: estados_validos$real_wage
## weights: pesos_validos
##
## Moran I statistic standard deviate = 22.319, p-value <
## 0.00000000000000022
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.13930452561 -0.00190114068 0.00004002578
Finalmente para el caso de los salarios reales contamos con un valor del Moral Statistic de 0.139 y un P-value extremadamente bajo por lo que si existe una autocorrelación positiva esstadísticamente significativa por lo que podemos decir que hay una tendencia regional en los niveles salariales reales en donde los estados con sueldos altos cerca de otros con sueldos altos
Para este caso únicamente seleccionamos las variables “crime_rate” y “real_wage” pues fueron las que presentaron los valores más altos en el Moran I Statistic además de un P-value extremadamente bajos
estados_validos$local_moran_crimen <- local_moran_crimen[,1]
estados_validos$pval_moran_crimen <- local_moran_crimen[,5]
tm_shape(estados_validos) +
tm_polygons("local_moran_crimen",
palette = "RdBu",
title = "Local Moran I - Crime Rate") +
tm_layout(main.title = "Clusters Espaciales del Crime Rate",
legend.outside = TRUE)
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title = )`
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "RdBu" is named
## "brewer.rd_bu"
## Multiple palettes called "rd_bu" found: "brewer.rd_bu", "matplotlib.rd_bu". The first one, "brewer.rd_bu", is returned.
##
## [scale] tm_polygons:() the data variable assigned to 'fill' contains positive and negative values, so midpoint is set to 0. Set 'midpoint = NA' in 'fill.scale = tm_scale_intervals(<HERE>)' to use all visual values (e.g. colors)
Podemos observar claramente como los clusters se agrupan por región
norte que es donde se concentra la mayor parte del crimen, una menor
concentración en los estados de color café y vuelve a subir pero no
tanto en la región centro-sur del país
estados_validos$local_moran_salarios <- local_moran_salarios[,1]
estados_validos$pval_moran_salarios <- local_moran_salarios[,5]
tm_shape(estados_validos) +
tm_polygons("local_moran_salarios",
palette = "RdBu",
title = "Local Moran I - Salarios") +
tm_layout(main.title = "Clusters Espaciales de Salarios",
legend.outside = TRUE)
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title = )`
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "RdBu" is named
## "brewer.rd_bu"
## Multiple palettes called "rd_bu" found: "brewer.rd_bu", "matplotlib.rd_bu". The first one, "brewer.rd_bu", is returned.
##
## [scale] tm_polygons:() the data variable assigned to 'fill' contains positive and negative values, so midpoint is set to 0. Set 'midpoint = NA' in 'fill.scale = tm_scale_intervals(<HERE>)' to use all visual values (e.g. colors)
En el caso para los clusters de salarios, podemos ver una concentración
de salarios altos bastante marcada en el norte del país con los estados
de Nuevo León y Tamaulipas así como con Sinaloa y BCS, de la misma
manera se vuelven a agrupar Chihuahua y Sonora, podemos ver que en este
mapa los clusters son mas claros debido a la variación de los salarios
que es mayor a la presentada con las tasas de criminalidad