TAREA 2: Unir datos espaciales

library (tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.3     ✓ purrr   0.3.4
## ✓ tibble  3.1.1     ✓ dplyr   1.0.5
## ✓ tidyr   1.1.3     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library (sf)
## Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1

Mapa coroplético que muestre la distribución geográfica de una variable numérica

Utilizamos la misma base de datos geoespacial de la tarea anterior. Primero cargamos un geojson con los datos georreferenciados de AMBA, del cual obtendremos luego los datos de las comunas de CABA.

partidos_amba <- st_read("partidos_amba.geojson", stringsAsFactors= TRUE)
## Reading layer `partidos_amba' from data source `/Users/mariacandelariadavid/Desktop/TP 1 CIUDADES/partidos_amba.geojson' using driver `GeoJSON'
## Simple feature collection with 48 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -59.3392 ymin: -35.23893 xmax: -57.70946 ymax: -34.23007
## Geodetic CRS:  WGS 84
head (partidos_amba)
## Simple feature collection with 6 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -59.05579 ymin: -34.91331 xmax: -58.27953 ymax: -34.26732
## Geodetic CRS:  WGS 84
##       nombre provincia area_km2                       geometry
## 1 Avellaneda       GBA    57.25 MULTIPOLYGON (((-58.33444 -...
## 2      Tigre       GBA   381.99 MULTIPOLYGON (((-58.5167 -3...
## 3      Pilar       GBA   382.95 MULTIPOLYGON (((-58.90312 -...
## 4     Moreno       GBA   186.36 MULTIPOLYGON (((-58.82401 -...
## 5      Merlo       GBA   173.97 MULTIPOLYGON (((-58.72917 -...
## 6 La Matanza       GBA   328.26 MULTIPOLYGON (((-58.52885 -...

Realizamos un mapa coroplético de AMBA y rellenamos cada partido o comuna según su área en kimlómetros cuadrados.

ggplot (partidos_amba) +geom_sf (aes(fill=area_km2)) + labs(title = "AMBA") +
  scale_fill_viridis_c() +
  theme_light()

Filtramos por CABA para hacer un mapa coroplético de las comunas. En este caso, no concatenamos funciones dado que preferimos crear una nueva base de datos con los datos de CABA para luego utilizarla para unir las dos bases de datos geoespaciales.

comunas_caba <- filter (partidos_amba, provincia== "CABA")
head (comunas_caba)
## Simple feature collection with 6 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.50426 ymin: -34.70628 xmax: -58.37004 ymax: -34.53143
## Geodetic CRS:  WGS 84
##      nombre provincia area_km2                       geometry
## 1  Comuna 2      CABA     6.30 MULTIPOLYGON (((-58.40084 -...
## 2  Comuna 3      CABA     6.39 MULTIPOLYGON (((-58.39365 -...
## 3  Comuna 6      CABA     6.85 MULTIPOLYGON (((-58.45919 -...
## 4 Comuna 13      CABA    14.73 MULTIPOLYGON (((-58.45579 -...
## 5  Comuna 8      CABA    21.61 MULTIPOLYGON (((-58.44404 -...
## 6 Comuna 15      CABA    14.32 MULTIPOLYGON (((-58.46808 -...
ggplot(comunas_caba)+
  geom_sf(aes(fill=area_km2), color="white")+
  geom_sf_text(aes(label = nombre), size=2) +
    labs(title = "Comunas CABA",
         caption= "Fuente: BADATA") +
  scale_fill_viridis_c() +
  theme_light()
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Ahora cargamos la base de datos de los puntos de culto de la ciudad de Buenos Aires en formato CSV, es decir, una base de datos tradicional.

lugares_culto <- read.csv ("lugares-de-culto.csv", stringsAsFactors = TRUE)
class (lugares_culto)
## [1] "data.frame"
head (lugares_culto)
##        grupo                       culto              nombre_institucion
## 1 Cristianos Católico Apostólico Romano                   Espíritu Santo
## 2 Cristianos Católico Apostólico Romano  Asuncion De La Santisima Virgen
## 3 Cristianos Católico Apostólico Romano                 Corazón De Jesus
## 4 Cristianos Católico Apostólico Romano                      Buen Pastor
## 5 Cristianos Católico Apostólico Romano         Cristo Obrero Y San Blas
## 6 Cristianos Católico Apostólico Romano        Inmaculada Concepción (b)
##                 domicilio        barrio cgpc       cp       lat      long
## 1            Pacheco 2059 Villa Urquiza 12.0 C1431FIE -34.57613 -58.48112
## 2        Avda. Gaona 2798        Flores  7.0 C1406FMI -34.61631 -58.46551
## 3  Avda. General Paz 5370  V.Pueyrredon 12.0 C1419FYQ -34.57548 -58.51154
## 4           Aranguren 691     Caballito  6.0 C1405CRM -34.61433 -58.44211
## 5           Lafuente 3242 Villa Soldati  8.0 C1437BVO -34.66310 -58.43826
## 6 Vuelta De Obligado 2042      Belgrano 13.0 C1428ADF -34.56195 -58.45530

Hacemos un gráfico de puntos para ver la distribución de los puntos de culto en la Ciudad de Buenos Aires:

ggplot(lugares_culto) +
  geom_point(aes(x=long, y=lat)) +
    labs(title = "Puntos de culto en CABA",
         caption= "Fuente: BADATA") 
## Warning: Removed 69 rows containing missing values (geom_point).

Pareciera tener la forma del mapa de CABA. Para verlo con mas claridad proyectamos el gráfico de puntos sobre el mapa de CABA realizado al comienzo:

ggplot()+
  geom_sf(data=comunas_caba, fill="gray75", color="white")+
  geom_point(data=lugares_culto, aes(x=long, y=lat))  + labs(title = " Distribución de lugares  de culto en CABA", 
         caption= "Fuente: Badata") 
## Warning: Removed 69 rows containing missing values (geom_point).

Dado que nos dimos cuenta que un par de registros no tienen el dato de la longitud y latitud, y que eso sería un problema al momento de convertir nuestro set de datos tradicional en uno espacial, filtramos:

culto_geo <-lugares_culto %>%
  filter(!is.na(long))
culto_geo <- culto_geo %>%
  filter(!is.na(lat))

Transformamos nuestro dataset tradicional en un dataset espacial

culto_geo2 <- st_as_sf(culto_geo, coords = c("long", "lat"), crs = 4326)

Vemos que realmente se haya convertido:

head (culto_geo2)
## Simple feature collection with 6 features and 7 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -58.51154 ymin: -34.6631 xmax: -58.43826 ymax: -34.56195
## Geodetic CRS:  WGS 84
##        grupo                       culto              nombre_institucion
## 1 Cristianos Católico Apostólico Romano                   Espíritu Santo
## 2 Cristianos Católico Apostólico Romano  Asuncion De La Santisima Virgen
## 3 Cristianos Católico Apostólico Romano                 Corazón De Jesus
## 4 Cristianos Católico Apostólico Romano                      Buen Pastor
## 5 Cristianos Católico Apostólico Romano         Cristo Obrero Y San Blas
## 6 Cristianos Católico Apostólico Romano        Inmaculada Concepción (b)
##                 domicilio        barrio cgpc       cp
## 1            Pacheco 2059 Villa Urquiza 12.0 C1431FIE
## 2        Avda. Gaona 2798        Flores  7.0 C1406FMI
## 3  Avda. General Paz 5370  V.Pueyrredon 12.0 C1419FYQ
## 4           Aranguren 691     Caballito  6.0 C1405CRM
## 5           Lafuente 3242 Villa Soldati  8.0 C1437BVO
## 6 Vuelta De Obligado 2042      Belgrano 13.0 C1428ADF
##                      geometry
## 1 POINT (-58.48112 -34.57613)
## 2 POINT (-58.46551 -34.61631)
## 3 POINT (-58.51154 -34.57548)
## 4 POINT (-58.44211 -34.61433)
## 5  POINT (-58.43826 -34.6631)
## 6  POINT (-58.4553 -34.56195)
class (culto_geo2)
## [1] "sf"         "data.frame"

Ahora mapeamos:

ggplot(culto_geo2)+
  geom_sf() +
    labs(title = "Puntos de culto en CABA",
         caption= "Fuente: BADATA") 

Ahora nuestro mapa, representado por los puntos, tiene la forma del mapa de la ciudad de Buenos Aires. Para verlo con mayor claridad:

ggplot()+
  geom_sf(data=comunas_caba, fill="gray75", color="white")+
  geom_sf(data=culto_geo2, aes(color=grupo), alpha=0.5)+
  geom_sf(data=culto_geo2, aes(color=grupo), alpha=0.5) + labs(title = " Distribución de lugares  de culto en CABA", 
         caption= "Fuente: Badata") 

Unión de datasets

Ahora unimos ambos datasets espaciales (el dataset de las comunas de caba y el dataset de los puntos de culto de CABA)

culto_caba <-  st_join(culto_geo2, comunas_caba)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar

Ahora tenemos los datos de ambos dataset en uno:

summary (culto_caba)
##                         grupo                                culto    
##  Cristianos                :681   Católico Apostólico Romano    :231  
##  Judíos                    : 68   Pentecostales                 :107  
##  Testigos de Jehová        : 24   Judíos                        : 68  
##  Escuela Científico Basilio: 20   Bautistas                     : 59  
##  Espírita                  : 15   Iglesias Independientes       : 44  
##  Otros                     : 14   Unión de las Asambleas de Dios: 32  
##  (Other)                   : 33   (Other)                       :314  
##                          nombre_institucion                        domicilio  
##  Cristiana Evangélica             : 22      Alsina 380                  :  2  
##  Salón Del Reino                  : 13      Argerich 392                :  2  
##  Del Nazareno                     :  5      Dean Funes 2116             :  2  
##                                   :  4      Gallo 782                   :  2  
##  Nuestra Señora De La Misericordia:  4      Juan Agustin Garcia 2044/48 :  2  
##  Evangélica                       :  3      Nicolás Repetto 825         :  2  
##  (Other)                          :804      (Other)                     :843  
##               barrio         cgpc           cp            nombre    provincia 
##  Flores          : 56   -      :183          :371   Comuna 7 : 93   CABA:855  
##  Almagro         : 42   7.0    : 78   1406   : 15   Comuna 13: 75   GBA :  0  
##  Palermo         : 41   13.0   : 55   1407   : 12   Comuna 12: 70             
##  Caballito       : 39   15.0   : 54   1429   :  8   Comuna 9 : 70             
##  Belgrano        : 37   1.0    : 51   1419   :  7   Comuna 1 : 60             
##  Parque Chacabuco: 34   12.0   : 51   1437   :  7   Comuna 5 : 60             
##  (Other)         :606   (Other):383   (Other):435   (Other)  :427             
##     area_km2              geometry  
##  Min.   : 6.30   POINT        :855  
##  1st Qu.:12.40   epsg:4326    :  0  
##  Median :14.32   +proj=long...:  0  
##  Mean   :13.86                      
##  3rd Qu.:15.76                      
##  Max.   :22.14                      
## 

Mapeamos este nuevo dataset:

ggplot()+  
  geom_sf(data=comunas_caba, fill="gray75", color="white")+  geom_sf(data=culto_geo2, aes(color=grupo), alpha=0.5) + labs(title = " Distribución de lugares  de culto en CABA", 
         caption= "Fuente: Badata") +
  scale_fill_distiller(palette = "YlOrRd", direction = 1) +
  theme_light() 

Cantidad de puntos de culto por comuna

Ahora queremos ver la cantidad de puntos de culto que hay por comuna en CABA. Para esto usamos la función group_by () y summarise ().

culto_caba2<- culto_caba %>%
  group_by(nombre) %>%
  summarise(cantidad=n())
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
head (culto_caba2)
## Simple feature collection with 6 features and 2 fields
## Geometry type: MULTIPOINT
## Dimension:     XY
## Bounding box:  xmin: -58.53018 ymin: -34.64501 xmax: -58.36652 ymax: -34.53631
## Geodetic CRS:  WGS 84
## # A tibble: 6 x 3
##   nombre   cantidad                                                     geometry
##   <fct>       <int>                                             <MULTIPOINT [°]>
## 1 Comuna 1       60 ((-58.39263 -34.60242), (-58.39122 -34.62024), (-58.39084 -…
## 2 Comuna …       58 ((-58.53018 -34.61587), (-58.52862 -34.61663), (-58.52615 -…
## 3 Comuna …       54 ((-58.52611 -34.60801), (-58.52499 -34.61083), (-58.52401 -…
## 4 Comuna …       70 ((-58.51253 -34.5778), (-58.51154 -34.57548), (-58.51094 -3…
## 5 Comuna …       75 ((-58.47436 -34.54241), (-58.47112 -34.56789), (-58.47096 -…
## 6 Comuna …       45 ((-58.44407 -34.58425), (-58.44304 -34.58505), (-58.44264 -…

Para poder pegar este nuevo dataset al dataset de las comunas le quitamos la geometría:

culto_caba2 <- culto_caba2 %>%
  st_set_geometry(NULL)
head(culto_caba2)
## # A tibble: 6 x 2
##   nombre    cantidad
##   <fct>        <int>
## 1 Comuna 1        60
## 2 Comuna 10       58
## 3 Comuna 11       54
## 4 Comuna 12       70
## 5 Comuna 13       75
## 6 Comuna 14       45

Con la función left_join () pegamos el dataset (ahora tradicional) “culto_caba3” al dataset geoespacial de comunas_caba:

culto_caba3<- left_join(comunas_caba, culto_caba2, by="nombre")
summary (culto_caba3)
##        nombre  provincia    area_km2         cantidad             geometry 
##  Comuna 1 :1   CABA:15   Min.   : 6.300   Min.   :27.0   MULTIPOLYGON :15  
##  Comuna 10:1   GBA : 0   1st Qu.: 9.625   1st Qu.:47.5   epsg:4326    : 0  
##  Comuna 11:1             Median :14.320   Median :58.0   +proj=long...: 0  
##  Comuna 12:1             Mean   :13.574   Mean   :57.0                     
##  Comuna 13:1             3rd Qu.:16.020   3rd Qu.:65.0                     
##  Comuna 14:1             Max.   :22.140   Max.   :93.0                     
##  (Other)  :9

Ahora mapeamos la cantidad de puntos de culto por comuna en CABA:

ggplot()+
  geom_sf(data=culto_caba3, aes(fill=cantidad)) + geom_sf_text(data=culto_caba3, aes(label=nombre), size=2) +
  labs(title = "Cantidad de lugares de culto por comuna", subtitle= "CABA",
         fill = "Cantidad",
         caption= "Fuente: Badata") +
  scale_fill_distiller(palette = "YlOrRd", direction = 1) +
  theme_light()
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

En el mapa anterior se puede ver que la Comuna 1, 7 y 13 son las que más cantidad de puntos de culto tienen. Para verlo con mayor detenimiento filtramos por dichas comunas y mapeamos:

ggplot()+
  geom_sf(data=filter(culto_caba3, nombre=="Comuna 7" | nombre=="Comuna 13" | nombre== "Comuna 9" ), aes(fill=cantidad))+ 
    labs(title = "Cantidad de lugares de culto por comuna",
         subtitle = "Comuna 1,7 y 13 ",
         fill = "Cantidad",
         caption= "Fuente: Badata") +
  scale_fill_distiller(palette = "YlOrRd", direction = 1) +
  theme_light()

`Para que las comunas no queden flotando, le agregamos el mapa de CABA detrás:

ggplot()+ geom_sf(data=comunas_caba) +
  geom_sf(data=filter(culto_caba3, nombre=="Comuna 7" | nombre=="Comuna 13" | nombre== "Comuna 9" ), aes(fill=cantidad)) +labs(title = "Cantidad de lugares de culto",
         subtitle = "Comuna 1,7 y 13",
         fill = "Cantidad",
         caption= "Fuente: Badata") +
  scale_fill_distiller(palette = "YlOrRd", direction = 1) +
  theme_light()

Vemos que de las tres comunas seleccionadas la que mayor cantidad de puntos de culto tiene es la comuna 7, seguida por la comuna 13 y, por último, la comuna 1. Sin embargo, sii bien las tres comunas son las que mas cantidad de puntos de culto parecen tener, vamos a ver qué comuna tiene mas cantidad de puntos de culto por kilómetro cuadrado:

ggplot()+
  geom_sf(data=culto_caba3, aes(fill=cantidad/area_km2)) + geom_sf_text(data=culto_caba3, aes(label=nombre), size=2)+
    labs(title = "Puntos de culto por km2",
         subtitle = "Comunas CABA",
         fill = "Cantidad/km2",
         caption= "Fuente: BAdata") +
  scale_fill_distiller(palette = "YlOrRd", direction = 1) +
  theme_light()
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Cuando vemos la cantidad de puntos de culto por km2, se observa que la comuna 7 sigue siendo la comuna con mayor cantidad de puntos de culto pero la comuna 13 y 1 ya no. En este caso,la comuna 5 y la comuna 3 parecen tener mayor cantidad de puntos de culto por km2 que las comuna 9 y la comuna 13.