[Descargar - RMarkdown]
Agregar puntos a polígonos
data.table
), explorar y
filtrar datos (dplyr
).sf
).st_intersects
(sf
).st_write
(sf
).Es común que tengamos datos a nivel punto y los queramos agregar a una escala mayor. Generalmente, tenemos datos socioeconómicos a nivel municipal. Por lo tanto, queremos agregar la información a nivel punto a los polígonos. De esta forma, podemos generar variables para incoporar en nuestras regresiones espaciales.
Agregar el número de tiendas que existen dentro de un polígono. En este caso, cuántas tiendas de frutas y verduras existen por municipio en la Zona Metropolitana del Valle de México (incluye Ciudad de México, 59 municipios del estado de México y 1 municipio del estado de Hidalgo).
Vamos a utilizar sf
para leer los datos espaciales,
hacer transformaciones de proyecciones y hacer intersección entre las
tiendas (puntos) y los municipios (polígonos). Primero, para analizar
los datos de las tiendas, utilizaremos dplyr
, mostrando
algunos comandos para explorar y filtrar los datos y después con
sf
pasar de una tabla csv (no espacial, pero conteniendo
las coordenadas de los puntos) a una tabla sf (espacial).
Leer los paquetes estadísticos:
library(data.table)
library(dplyr)
library(sf)
library(ggplot2)
library(tmap)
Importar datos:
#Importar datos espaciales
muni = st_read("./data/mx_city_metro.shp")
## Reading layer `mx_city_metro' from data source
## `/Users/irenefarah/Downloads/sp_econ/data/mx_city_metro.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 76 features and 40 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 2745632 ymin: 774927.1 xmax: 2855437 ymax: 899488.5
## proj4string: +proj=lcc +lat_1=17.5 +lat_2=29.5 +lat_0=12 +lon_0=-102 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m +no_defs
Bajar datos de comercio al por menor del DENUE (Directorio Estadístico Nacional de Unidades Económicas) de la página del INEGI (Instituto Nacional de Estadística y Geografía) de México.
Leer datos de comercio al por menor y filtrar por geografías de interés:
#fread lee csv mucho más rápido (data.table)
df=fread("data/denue_inegi_46112-46311_.csv")%>%
filter(cve_ent==9 | cve_ent==15 | cve_ent==13)# filtrar por entidad federativa (cdmx, hidalgo, edomex)
head(df)
## id clee
## 1: 8117497 09005461140003241000000000U3
## 2: 774758 09005461121003521000000000U8
## 3: 673456 09005461121008721000000000U9
## 4: 743038 09002461150001821000000000U0
## 5: 673369 09005461121009281000000000U3
## 6: 775603 09016461130005491000000000U0
## nom_estab raz_social codigo_act
## 1: 02 PRODUCTOS NATURISTAS 461140
## 2: 03 CARNICERIA DE CARNES ROJAS SIN NOMBRE 461121
## 3: 07 TOCINERIA SIN NOMBRE 461121
## 4: 10 ABARROTES Y CREMERIA 461150
## 5: 10 TOCINERIA PEPE 461121
## 6: 101 VERDURA 461130
## nombre_act
## 1: Comercio al por menor de semillas y granos alimenticios, especias y chiles secos
## 2: Comercio al por menor de carnes rojas
## 3: Comercio al por menor de carnes rojas
## 4: Comercio al por menor de leche, otros productos l\xe1cteos y embutidos
## 5: Comercio al por menor de carnes rojas
## 6: Comercio al por menor de frutas y verduras frescas
## per_ocu tipo_vial nom_vial tipo_v_e_1
## 1: 0 a 5 personas CALLE PONIENTE 122 CALLE
## 2: 0 a 5 personas CALLE PONIENTE 122 CALLE
## 3: 0 a 5 personas CALLE PONIENTE 122 CALLE
## 4: 0 a 5 personas CALLE 12 CALLE
## 5: 0 a 5 personas CALLE PONIENTE 152 EJE VIAL
## 6: 0 a 5 personas CALZADA CALZADA DE BECERRA CALLE
## nom_v_e_1 tipo_v_e_2 nom_v_e_2
## 1: NORTE 19-A CALLE NORTE 21
## 2: NORTE 19-A CALLE NORTE 21
## 3: NORTE 19-A CALLE NORTE 21
## 4: 21 CALLE 19
## 5: CENTRAL LAZARO CARDENAS AVENIDA MIGUEL OTHON DE MENDIZABAL ORIENTE
## 6: HEROES DE 1810 VIADUCTO PRESIDENTE MIGUEL ALEMAN
## tipo_v_e_3 nom_v_e_3 numero_ext letra_ext edificio
## 1: CALLE PONIENTE 126 NA SN MERCADO PUBLICO
## 2: CALLE PONIENTE 126 NA SN MERCADO PUBLICO
## 3: CALLE PONIENTE 126 NA SN MERCADO PUBLICO
## 4: CALLE 14 NA SN MERCADO PUBLICO
## 5: PRIVADA NINGUNO NA SN MERCADO PUBLICO
## 6: VIADUCTO PRESIDENTE MIGUEL ALEM\xc1N 33 MERCADO PUBLICO
## edificio_e numero_int letra_int tipo_asent nomb_asent
## 1: PLANTA BAJA NA COLONIA NUEVA VALLEJO
## 2: PLANTA BAJA NA COLONIA NUEVA VALLEJO
## 3: PLANTA BAJA NA COLONIA NUEVA VALLEJO
## 4: PLANTA BAJA NA COLONIA PRO HOGAR
## 5: PLANTA BAJA 10 COLONIA LINDAVISTA PATERA VALLEJO
## 6: PLANTA BAJA 101 COLONIA TACUBAYA
## tipoCenCom nom_CenCom num_local cod_postal
## 1: MERCADO PUBLICO MERCADO 93 MAGDALENA DE LAS SALINAS 02 7750
## 2: MERCADO PUBLICO MERCADO 93 MAGDALENA DE LAS SALINAS 3 7750
## 3: MERCADO PUBLICO MERCADO 93 MAGDALENA DE LAS SALINAS 7 7750
## 4: MERCADO PUBLICO MERCADO PUBLICO SEDECO PRO HOGAR 10 2600
## 5: MERCADO PUBLICO MERCADO 366-1 LINDAVISTA-VALLEJO-PATERA 10 2300
## 6: MERCADO PUBLICO MERCADO DE TACUBAYA 101 11870
## cve_ent entidad cve_mun municipio cve_loc
## 1: 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 2: 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 3: 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 4: 9 Ciudad de M\xe9xico 2 Azcapotzalco 1
## 5: 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 6: 9 Ciudad de M\xe9xico 16 Miguel Hidalgo 1
## localidad
## 1: Gustavo A. Madero
## 2: Gustavo A. Madero
## 3: Gustavo A. Madero
## 4: Azcapotzalco
## 5: Gustavo A. Madero
## 6: Miguel Hidalgo
## ageb manzana telefono correoelec www tipoUniEco latitud longitud
## 1: 1237 13 Fijo 19.48495 -99.14869
## 2: 1237 13 Fijo 19.48495 -99.14869
## 3: 1237 13 Fijo 19.48495 -99.14869
## 4: 0400 5 Fijo 19.47589 -99.15395
## 5: 0510 1 Fijo 19.50113 -99.15310
## 6: 1194 9 Fijo 19.39871 -99.18782
## fecha_alta
## 1: 2019-11
## 2: 2010-07
## 3: 2014-12
## 4: 2010-07
## 5: 2014-12
## 6: 2010-07
Primero tenemos que examinar el tipo de tiendas en nuestros datos
para filtrar por comercio al por menor de frutas y verduras.
Examinar los tipo de tiendas en los datos (codigos
SCIAN):
df%>%
group_by(codigo_act)%>%
summarise(n=n()) #Ver que tipo de tiendas hay dentro del comercio al por menor
## # A tibble: 19 × 2
## codigo_act n
## <int> <int>
## 1 461121 17898
## 2 461122 22739
## 3 461123 1173
## 4 461130 30134
## 5 461140 6983
## 6 461150 10082
## 7 461160 21450
## 8 461170 5507
## 9 461190 12738
## 10 461211 1711
## 11 461212 2963
## 12 461213 4090
## 13 461220 124
## 14 462111 1288
## 15 462112 7769
## 16 462210 636
## 17 463111 1796
## 18 463112 1446
## 19 463113 5316
Según el código SCIAN:
461121: Comercio al por menor de carnes rojas
461122: Comercio al por menor de carne de aves
461123: Comercio al por menor de pescados y mariscos
461130 Comercio al por menor de frutas y verduras frescas
461140: Comercio al por menor de semillas y granos alimenticios,
especias y chiles secos
461150: Comercio al por menor de leche, otros productos lácteos y
embutidos
461160: Comercio al por menor de dulces y materias primas para
repostería
461170: Comercio al por menor de paletas de hielo y helados
461190: Comercio al por menor de otros alimentos
461211: Comercio al por menor de vinos y licores
461212: Comercio al por menor de cerveza
461213: Comercio al por menor de bebidas no alcohólicas y hielo
461220: Comercio al por menor de cigarros, puros y tabaco
462111: Comercio al por menor en supermercados
462112: Comercio al por menor en minisupers
462210: Comercio al por menor en tiendas departamentales
463111: Comercio al por menor de telas
463112: Comercio al por menor de blancos
463113: Comercio al por menor de artículos de mercería y bonetería
Filtrar los datos por comercio al por menor de frutas y verduras:
fv= df%>%
filter(codigo_act==461130)
head(fv)
## id clee nom_estab
## 1: 775603 09016461130005491000000000U0 101 VERDURA
## 2: 7802536 09002461130008201000000000U0 104 VERDULERIA
## 3: 742963 09002461130000071000000000U5 108 VER5DURAS EL BURRITO
## 4: 743108 09002461130003341000000000U9 119 VERDURAS Y FLORES
## 5: 743034 09002461130003911000000000U9 122-113 FRUTAS Y VERDURAS SIN NOMBRE
## 6: 743106 09002461130004291000000000U5 123 VERDURAS
## raz_social codigo_act nombre_act
## 1: 461130 Comercio al por menor de frutas y verduras frescas
## 2: 461130 Comercio al por menor de frutas y verduras frescas
## 3: 461130 Comercio al por menor de frutas y verduras frescas
## 4: 461130 Comercio al por menor de frutas y verduras frescas
## 5: 461130 Comercio al por menor de frutas y verduras frescas
## 6: 461130 Comercio al por menor de frutas y verduras frescas
## per_ocu tipo_vial nom_vial tipo_v_e_1 nom_v_e_1
## 1: 0 a 5 personas CALZADA CALZADA DE BECERRA CALLE HEROES DE 1810
## 2: 0 a 5 personas CALLE 12 CALLE 21
## 3: 0 a 5 personas CALLE 12 CALLE 21
## 4: 0 a 5 personas CALLE 12 CALLE 21
## 5: 0 a 5 personas CALLE 12 CALLE 21
## 6: 0 a 5 personas CALLE 12 CALLE 21
## tipo_v_e_2 nom_v_e_2 tipo_v_e_3 nom_v_e_3
## 1: VIADUCTO PRESIDENTE MIGUEL ALEMAN VIADUCTO PRESIDENTE MIGUEL ALEM\xc1N
## 2: CALLE 19 CALLE 14
## 3: CALLE 19 CALLE 14
## 4: CALLE 19 CALLE 14
## 5: CALLE 19 CALLE 14
## 6: CALLE 19 CALLE 14
## numero_ext letra_ext edificio edificio_e numero_int letra_int
## 1: 33 MERCADO PUBLICO PLANTA BAJA 101
## 2: 0 SN MERCADO PUBLICO PLANTA BAJA 0
## 3: NA SN MERCADO PUBLICO PLANTA BAJA NA
## 4: 0 SN MERCADO PUBLICO PLANTA BAJA 11
## 5: NA SN MERCADO PUBLICO PLANTA BAJA 112
## 6: 0 SN MERCADO PUBLICO PLANTA BAJA 44
## tipo_asent nomb_asent tipoCenCom nom_CenCom
## 1: COLONIA TACUBAYA MERCADO PUBLICO MERCADO DE TACUBAYA
## 2: COLONIA PRO HOGAR MERCADO PUBLICO MERCADO PUBLICO SEDECO PRO HOGAR
## 3: COLONIA PRO HOGAR MERCADO PUBLICO MERCADO PUBLICO SEDECO PRO HOGAR
## 4: COLONIA PRO HOGAR MERCADO PUBLICO MERCADO PUBLICO SEDECO PRO HOGAR
## 5: COLONIA PRO HOGAR MERCADO PUBLICO MERCADO PUBLICO SEDECO PRO HOGAR
## 6: COLONIA PRO HOGAR MERCADO PUBLICO MERCADO PUBLICO SEDECO PRO HOGAR
## num_local cod_postal cve_ent entidad cve_mun municipio
## 1: 101 11870 9 Ciudad de M\xe9xico 16 Miguel Hidalgo
## 2: 104 2600 9 Ciudad de M\xe9xico 2 Azcapotzalco
## 3: 108 2600 9 Ciudad de M\xe9xico 2 Azcapotzalco
## 4: 119 2600 9 Ciudad de M\xe9xico 2 Azcapotzalco
## 5: 112 133 2600 9 Ciudad de M\xe9xico 2 Azcapotzalco
## 6: 123 2600 9 Ciudad de M\xe9xico 2 Azcapotzalco
## cve_loc
## 1: 1
## 2: 1
## 3: 1
## 4: 1
## 5: 1
## 6: 1
## localidad
## 1: Miguel Hidalgo
## 2: Azcapotzalco
## 3: Azcapotzalco
## 4: Azcapotzalco
## 5: Azcapotzalco
## 6: Azcapotzalco
## ageb manzana telefono correoelec www tipoUniEco latitud longitud
## 1: 1194 9 Fijo 19.39871 -99.18782
## 2: 0400 5 Fijo 19.47589 -99.15395
## 3: 0400 5 39469571 Fijo 19.47589 -99.15395
## 4: 0400 5 5553560394 Fijo 19.47589 -99.15395
## 5: 0400 5 Fijo 19.47589 -99.15395
## 6: 0400 5 Fijo 19.47589 -99.15395
## fecha_alta
## 1: 2010-07
## 2: 2019-11
## 3: 2010-07
## 4: 2010-07
## 5: 2010-07
## 6: 2010-07
Ya que tenemos los datos que queremos, los vamos a convertir de una
tabla no espacial a una tabla espacial (sf). De esta forma podemos hacer
una intersección entre los puntos y los polígonos. Noten cómo la
conversión agrega la columna geometry
al final de la
tabla.
Pasar de csv a sf:
fv_sf = st_as_sf(df, # nombre tabla
coords = c('longitud', 'latitud'), # columnas con long y lat
crs = 4326, remove = FALSE) # CRS, con codigo EPSG
head(fv_sf)
## Simple feature collection with 6 features and 42 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -99.18782 ymin: 19.39871 xmax: -99.14869 ymax: 19.50113
## CRS: EPSG:4326
## id clee nom_estab
## 1 8117497 09005461140003241000000000U3 02 PRODUCTOS NATURISTAS
## 2 774758 09005461121003521000000000U8 03 CARNICERIA DE CARNES ROJAS SIN NOMBRE
## 3 673456 09005461121008721000000000U9 07 TOCINERIA SIN NOMBRE
## 4 743038 09002461150001821000000000U0 10 ABARROTES Y CREMERIA
## 5 673369 09005461121009281000000000U3 10 TOCINERIA PEPE
## 6 775603 09016461130005491000000000U0 101 VERDURA
## raz_social codigo_act
## 1 461140
## 2 461121
## 3 461121
## 4 461150
## 5 461121
## 6 461130
## nombre_act
## 1 Comercio al por menor de semillas y granos alimenticios, especias y chiles secos
## 2 Comercio al por menor de carnes rojas
## 3 Comercio al por menor de carnes rojas
## 4 Comercio al por menor de leche, otros productos l\xe1cteos y embutidos
## 5 Comercio al por menor de carnes rojas
## 6 Comercio al por menor de frutas y verduras frescas
## per_ocu tipo_vial nom_vial tipo_v_e_1
## 1 0 a 5 personas CALLE PONIENTE 122 CALLE
## 2 0 a 5 personas CALLE PONIENTE 122 CALLE
## 3 0 a 5 personas CALLE PONIENTE 122 CALLE
## 4 0 a 5 personas CALLE 12 CALLE
## 5 0 a 5 personas CALLE PONIENTE 152 EJE VIAL
## 6 0 a 5 personas CALZADA CALZADA DE BECERRA CALLE
## nom_v_e_1 tipo_v_e_2 nom_v_e_2
## 1 NORTE 19-A CALLE NORTE 21
## 2 NORTE 19-A CALLE NORTE 21
## 3 NORTE 19-A CALLE NORTE 21
## 4 21 CALLE 19
## 5 CENTRAL LAZARO CARDENAS AVENIDA MIGUEL OTHON DE MENDIZABAL ORIENTE
## 6 HEROES DE 1810 VIADUCTO PRESIDENTE MIGUEL ALEMAN
## tipo_v_e_3 nom_v_e_3 numero_ext letra_ext edificio
## 1 CALLE PONIENTE 126 NA SN MERCADO PUBLICO
## 2 CALLE PONIENTE 126 NA SN MERCADO PUBLICO
## 3 CALLE PONIENTE 126 NA SN MERCADO PUBLICO
## 4 CALLE 14 NA SN MERCADO PUBLICO
## 5 PRIVADA NINGUNO NA SN MERCADO PUBLICO
## 6 VIADUCTO PRESIDENTE MIGUEL ALEM\xc1N 33 MERCADO PUBLICO
## edificio_e numero_int letra_int tipo_asent nomb_asent
## 1 PLANTA BAJA NA COLONIA NUEVA VALLEJO
## 2 PLANTA BAJA NA COLONIA NUEVA VALLEJO
## 3 PLANTA BAJA NA COLONIA NUEVA VALLEJO
## 4 PLANTA BAJA NA COLONIA PRO HOGAR
## 5 PLANTA BAJA 10 COLONIA LINDAVISTA PATERA VALLEJO
## 6 PLANTA BAJA 101 COLONIA TACUBAYA
## tipoCenCom nom_CenCom num_local cod_postal
## 1 MERCADO PUBLICO MERCADO 93 MAGDALENA DE LAS SALINAS 02 7750
## 2 MERCADO PUBLICO MERCADO 93 MAGDALENA DE LAS SALINAS 3 7750
## 3 MERCADO PUBLICO MERCADO 93 MAGDALENA DE LAS SALINAS 7 7750
## 4 MERCADO PUBLICO MERCADO PUBLICO SEDECO PRO HOGAR 10 2600
## 5 MERCADO PUBLICO MERCADO 366-1 LINDAVISTA-VALLEJO-PATERA 10 2300
## 6 MERCADO PUBLICO MERCADO DE TACUBAYA 101 11870
## cve_ent entidad cve_mun municipio cve_loc
## 1 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 2 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 3 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 4 9 Ciudad de M\xe9xico 2 Azcapotzalco 1
## 5 9 Ciudad de M\xe9xico 5 Gustavo A. Madero 1
## 6 9 Ciudad de M\xe9xico 16 Miguel Hidalgo 1
## localidad
## 1 Gustavo A. Madero
## 2 Gustavo A. Madero
## 3 Gustavo A. Madero
## 4 Azcapotzalco
## 5 Gustavo A. Madero
## 6 Miguel Hidalgo
## ageb manzana telefono correoelec www tipoUniEco latitud longitud fecha_alta
## 1 1237 13 Fijo 19.48495 -99.14869 2019-11
## 2 1237 13 Fijo 19.48495 -99.14869 2010-07
## 3 1237 13 Fijo 19.48495 -99.14869 2014-12
## 4 0400 5 Fijo 19.47589 -99.15395 2010-07
## 5 0510 1 Fijo 19.50113 -99.15310 2014-12
## 6 1194 9 Fijo 19.39871 -99.18782 2010-07
## geometry
## 1 POINT (-99.14869 19.48495)
## 2 POINT (-99.14869 19.48495)
## 3 POINT (-99.14869 19.48495)
## 4 POINT (-99.15395 19.47589)
## 5 POINT (-99.1531 19.50113)
## 6 POINT (-99.18782 19.39871)
Para verificar que tanto puntos como polígonos están en la misma
proyección, verificar sus SRC (Sistema de Referencia de Coordenadas) con
st_crs.
Si están en SRC distintas, usar
st_transform
.
Verificar SRC:
st_crs(muni)
## Coordinate Reference System:
## No user input
## wkt:
## PROJCS["Lambert_Conformal_Conic",
## GEOGCS["GCS_GRS 1980(IUGG, 1980)",
## DATUM["unknown",
## SPHEROID["GRS80",6378137,298.257222101]],
## PRIMEM["Greenwich",0],
## UNIT["Degree",0.017453292519943295]],
## PROJECTION["Lambert_Conformal_Conic_2SP"],
## PARAMETER["standard_parallel_1",17.5],
## PARAMETER["standard_parallel_2",29.5],
## PARAMETER["latitude_of_origin",12],
## PARAMETER["central_meridian",-102],
## PARAMETER["false_easting",2500000],
## PARAMETER["false_northing",0],
## UNIT["Meter",1]]
st_crs(fv_sf)
## Coordinate Reference System:
## User input: EPSG:4326
## wkt:
## GEOGCS["WGS 84",
## DATUM["WGS_1984",
## SPHEROID["WGS 84",6378137,298.257223563,
## AUTHORITY["EPSG","7030"]],
## AUTHORITY["EPSG","6326"]],
## PRIMEM["Greenwich",0,
## AUTHORITY["EPSG","8901"]],
## UNIT["degree",0.0174532925199433,
## AUTHORITY["EPSG","9122"]],
## AUTHORITY["EPSG","4326"]]
Transformar SRC:
municipios_4326 = st_transform(muni, 4326)
st_crs(municipios_4326)
## Coordinate Reference System:
## User input: EPSG:4326
## wkt:
## GEOGCS["WGS 84",
## DATUM["WGS_1984",
## SPHEROID["WGS 84",6378137,298.257223563,
## AUTHORITY["EPSG","7030"]],
## AUTHORITY["EPSG","6326"]],
## PRIMEM["Greenwich",0,
## AUTHORITY["EPSG","8901"]],
## UNIT["degree",0.0174532925199433,
## AUTHORITY["EPSG","9122"]],
## AUTHORITY["EPSG","4326"]]
Para estar seguros de nuestros datos, mapeamos los municipios y las tiendas. Noten que muchas tiendas están fuera de nuestro polígono de interés porque incluímos municipios de los estados que no se encuentran dentro de la Zona Metropolitana del Valle de México.
Mapear las tiendas de frutas y verduras:
plot(municipios_4326$geometry)
plot(fv_sf$geometry, pch=20, col="red", size=.5, add=T)
Agregar puntos a polígonos:
#Numero de abarrotes por municipio
municipios_4326$sum_fv <- lengths(st_intersects(municipios_4326, fv_sf))
Mapear los datos agregados a nivel municipal:
tm_shape(municipios_4326) +
tm_polygons(col = 'sum_fv',
border.col = 'darkgreen',
alpha = 0.5)
ggplot(municipios_4326, aes(fill = sum_fv)) +
geom_sf() +
scale_fill_viridis_c() +
theme_minimal() +
labs(title = "Concentración de frutas y verduras en la ZMVM")
Exportar los datos a un nuevo shapefile (distinta proyección y con el número de tiendas de frutas y verduras por municipio):
st_write(municipios_4326, "municipios_fv.shp")
## Writing layer `municipios_fv' to data source
## `municipios_fv.shp' using driver `ESRI Shapefile'
## Writing 76 features with 41 fields and geometry type Multi Polygon.