MATERIA: Ciencia de Datos para Ciudades 2

TAREA 1: Unir Datos Espaciales

1. Elegir una ciudad de cualquier parte del mundo que les interese (ya que seguirán trabajando con ella a lo largo del curso) y que disponga de un portal de datos abiertos que ofrezca un shapefile (formato geojson o shp) de polígonos con alguna división geográfica: barrios, comunas, etc.

2. Del mismo portal de datos donde descargaron el shapefile, o de otra fuente si la tienen, elegir un dataset con registros geo-referenciados. Por ejemplo, las escuelas de la ciudad (o las comisarías, o las propiedades en alquiler, etc) con sus coordenadas. Puede ser en formato csv o shapefile.

Para este trabajo elegimos la Ciudad de Buenos Aires. Trabajamos con la información del GCBA con respecto a los casos de COVID-19 y con los centros donde se realizan los operativos DetectAR (registros geo-referenciados). Utilizamos dos datasets que poseen la información mencionada. Además, nuestra división geográfica también está dada por el dataset de barrios de CABA.

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.1.0     v dplyr   1.0.5
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(sf)
## Warning: package 'sf' was built under R version 4.0.5
## Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1

Para comenzar, cargamos el dataset de casos de COVID-19:

casos_covid19 <- read.csv("data/casos_covid19.csv", 
                         encoding = "UTF-8", stringsAsFactors = TRUE)

Filtramos para obtener solamente los registros de CABA:

covid_CABA <- filter(casos_covid19, provincia=="CABA", !is.na(comuna))
summary(covid_CABA)
##  X.U.FEFF.numero_de_caso                fecha_apertura_snvs 
##  Min.   :  718084        21MAY2021:00:00:00.000000:  16287  
##  1st Qu.: 5543018        22MAY2021:00:00:00.000000:  14796  
##  Median : 7749479        15MAY2021:00:00:00.000000:  13354  
##  Mean   : 7878804        11MAY2021:00:00:00.000000:  13284  
##  3rd Qu.:11128334        25MAY2021:00:00:00.000000:  13198  
##  Max.   :14480219        02FEB2021:00:00:00.000000:  11785  
##                          (Other)                  :1403829  
##                  fecha_toma_muestra                 fecha_clasificacion 
##  20MAY2021:00:00:00.000000:  11908   20MAY2021:00:00:00.000000:  11901  
##  19MAY2021:00:00:00.000000:  11596   19MAY2021:00:00:00.000000:  11581  
##  17MAY2021:00:00:00.000000:  11547   17MAY2021:00:00:00.000000:  11439  
##  31JAN2021:00:00:00.000000:  11374   31JAN2021:00:00:00.000000:  11289  
##  01FEB2021:00:00:00.000000:  11093   01FEB2021:00:00:00.000000:  11135  
##  18MAY2021:00:00:00.000000:  10939   18MAY2021:00:00:00.000000:  10958  
##  (Other)                  :1418076   (Other)                  :1418230  
##         provincia             barrio           comuna             genero      
##  CABA        :1486533   PALERMO  :128610   Min.   : 1.000   femenino :788836  
##  Buenos Aires:      0   CABALLITO: 89699   1st Qu.: 4.000   masculino:697697  
##  Catamarca   :      0   RECOLETA : 84078   Median : 8.000                     
##  Chaco       :      0   FLORES   : 77518   Mean   : 8.122                     
##  Chubut      :      0   BALVANERA: 70570   3rd Qu.:12.000                     
##  Córdoba     :      0   BELGRANO : 69421   Max.   :15.000                     
##  (Other)     :      0   (Other)  :966637                                      
##       edad          clasificacion                    fecha_fallecimiento 
##  Min.   :-10.0   confirmado: 416909                            :1475364  
##  1st Qu.: 26.0   descartado:1056049   03MAY2021:00:00:00.000000:     67  
##  Median : 39.0   sospechoso:  13575   02AUG2020:00:00:00.000000:     66  
##  Mean   : 40.5                        27APR2021:00:00:00.000000:     66  
##  3rd Qu.: 54.0                        20JUL2020:00:00:00.000000:     62  
##  Max.   :221.0                        14JUL2020:00:00:00.000000:     59  
##  NA's   :249                          (Other)                  :  10849  
##  fallecido                          fecha_alta     
##  si  :  11169                            :1420146  
##  NA's:1475364   06JUL2020:00:00:00.000000:    528  
##                 31JUL2020:00:00:00.000000:    528  
##                 03JUL2020:00:00:00.000000:    527  
##                 07JUL2020:00:00:00.000000:    495  
##                 13JUL2020:00:00:00.000000:    490  
##                 (Other)                  :  63819  
##                 tipo_contagio    
##  Comunitario           : 308464  
##  Contacto              :  53352  
##  En Investigación      :  39818  
##  Importado             :    327  
##  Trabajador de la Salud:  14016  
##  NA's                  :1070556  
## 

A continuación, cargamos los datasets espaciales (operativos detectAR y barrios de CABA):

operativo_detectar <- st_read("data/operativo-detectar/programa_detectar_WGS84.shp", stringsAsFactors = TRUE)
## Reading layer `programa_detectar_WGS84' from data source `C:\Users\Victoria\Desktop\MEU - Ciencia de Datos 2\Data\operativo-detectar\programa_detectar_WGS84.shp' using driver `ESRI Shapefile'
## Simple feature collection with 26 features and 8 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -58.50202 ymin: -34.6847 xmax: -58.36287 ymax: -34.56426
## Geodetic CRS:  WGS 84
summary(operativo_detectar)
##        id                                                              lugar   
##  Min.   : 1.00   Barrio Mitre: Centro de Jubilados y Pensionados Sin Rumbo: 1  
##  1st Qu.: 8.25   Biblioteca Baldomero Fernández Moreno                    : 1  
##  Median :19.50   Casa de la Cultura                                       : 1  
##  Mean   :22.12   Centro de Día nro 24 - Caminemos Juntos                  : 1  
##  3rd Qu.:36.75   Centro de Formación Profesional 24                       : 1  
##  Max.   :43.00   Centro de Formación Profesional 38                       : 1  
##                  (Other)                                                  :20  
##                                      direccion                       calle   
##  24 de Noviembre 1020.                    : 1   24 de Noviembre         : 1  
##  Av Cruz y Escalada                       : 1   Av. Gral. Iriarte       : 1  
##  Av. Gral. Iriarte 3500                   : 1   Av. Patricias Argentinas: 1  
##  Av. Patricias Argentinas 277             : 1   Av. San Juan            : 1  
##  Av. San Juan 2128                        : 1   Balcarce                : 1  
##  Avenida General Fernández de la Cruz 2145: 1   (Other)                 :17  
##  (Other)                                  :20   NA's                    : 4  
##   calle2         comuna                            observacio     altura    
##  NA's:26   Comuna 15:4   Central de Derivación Balvanera: 1   Min.   :   0  
##            Comuna 8 :4   Detectar Barrio Carrillo       : 1   1st Qu.:1042  
##            Comuna 4 :3   Detectar de Constitución       : 1   Median :2136  
##            Comuna 1 :2   Detectar Movil Paternal        : 1   Mean   :2094  
##            Comuna 3 :2   Detectar Pompeya               : 1   3rd Qu.:3260  
##            Comuna 7 :2   (Other)                        : 3   Max.   :5144  
##            (Other)  :9   NA's                           :18                 
##           geometry 
##  POINT        :26  
##  epsg:4326    : 0  
##  +proj=long...: 0  
##                    
##                    
##                    
## 
barrios <- st_read("data/barrios_badata.shp", stringsAsFactors = TRUE)
## Reading layer `barrios_badata' from data source `C:\Users\Victoria\Desktop\MEU - Ciencia de Datos 2\Data\barrios_badata.shp' using driver `ESRI Shapefile'
## Simple feature collection with 48 features and 5 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 93743.42 ymin: 91566.42 xmax: 111751.4 ymax: 111401.7
## Projected CRS: Argentina_GKBsAs
summary(barrios)
##        BARRIO       COMUNA         PERIMETRO          AREA             OBJETO  
##  AGRONOMIA: 1   Min.   : 1.000   Min.   : 4531   Min.   : 1232270   BARRIO:48  
##  ALMAGRO  : 1   1st Qu.: 4.000   1st Qu.: 6554   1st Qu.: 2222027              
##  BALVANERA: 1   Median : 9.500   Median : 8254   Median : 3679709              
##  BARRACAS : 1   Mean   : 8.458   Mean   : 9863   Mean   : 4242703              
##  BELGRANO : 1   3rd Qu.:12.000   3rd Qu.:11127   3rd Qu.: 5142993              
##  BOCA     : 1   Max.   :15.000   Max.   :22127   Max.   :15845871              
##  (Other)  :42                                                                  
##           geometry 
##  POLYGON      :48  
##  epsg:NA      : 0  
##  +proj=tmer...: 0  
##                    
##                    
##                    
## 

3. Realizar un “join espacial”, asignando a cada registro geo-referenciado la unidad geográfica (barrio, comuna, etc.) que le corresponda.

Unimos los datasets espaciales barrios y operativo_detectar para vincular los centros del mencionado operativo con su correspondiente barrio. Para esto, primero tenemos que convertirlos a la misma coordenada geográfica:

operativo_detectar2 <- operativo_detectar %>% st_transform(st_crs(barrios))
detectarporbarrio <- st_join(barrios,operativo_detectar2)
names(detectarporbarrio)
##  [1] "BARRIO"     "COMUNA"     "PERIMETRO"  "AREA"       "OBJETO"    
##  [6] "id"         "lugar"      "direccion"  "calle"      "calle2"    
## [11] "comuna"     "observacio" "altura"     "geometry"

Agregamos una columna con valor numérico para poder calcular la cantidad de centros DetectAR por barrio:

detectarporbarrio2 <- detectarporbarrio  %>%
mutate(centro=1) 
detectarporbarrio3 <- detectarporbarrio2 %>%
     group_by(BARRIO) %>%
  summarise(centro=n())
head (detectarporbarrio3)
## Simple feature collection with 6 features and 2 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 96308.15 ymin: 96337.82 xmax: 111751.4 ymax: 110825.4
## Projected CRS: Argentina_GKBsAs
## # A tibble: 6 x 3
##   BARRIO    centro                                                      geometry
##   <fct>      <int>                                                 <POLYGON [m]>
## 1 AGRONOMIA      1 ((98732.58 103788.8, 98662.52 103570, 98619.61 103430.8, 985~
## 2 ALMAGRO        1 ((104625.1 101679.9, 104630 101532.7, 104635.6 101401.1, 104~
## 3 BALVANERA      1 ((104713.3 103467.4, 104862.3 103457.4, 104941.8 103457.8, 1~
## 4 BARRACAS       1 ((108524.3 99590.57, 108529.4 99539.17, 108532.2 99513.34, 1~
## 5 BELGRANO       1 ((101168.8 110389.9, 101160.5 110386.4, 101152 110383.6, 101~
## 6 BOCA           1 ((109996.1 99938.77, 109998.1 99935.16, 110003.3 99925.54, 1~
detectarporbarrio3 <- arrange(detectarporbarrio3, desc(centro))
head (detectarporbarrio3)
## Simple feature collection with 6 features and 2 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 94273.2 ymin: 93825 xmax: 106614.3 ymax: 105654.9
## Projected CRS: Argentina_GKBsAs
## # A tibble: 6 x 3
##   BARRIO      centro                                                    geometry
##   <fct>        <int>                                               <POLYGON [m]>
## 1 VILLA SOLD~      3 ((101298.8 97570.93, 101326.7 97569.9, 101433.2 97575.35, ~
## 2 CHACARITA        2 ((100961.3 103692, 100884.7 103629.1, 100874.4 103620.4, 1~
## 3 FLORES           2 ((100264.6 96946.23, 100219.7 96986.16, 100200.5 97003.22,~
## 4 MATADEROS        2 ((96405.6 94981.17, 96405.03 94980.77, 96396.77 94988.34, ~
## 5 SAN CRISTO~      2 ((106579.6 100853, 106585.5 100722.8, 106588.3 100646, 106~
## 6 AGRONOMIA        1 ((98732.58 103788.8, 98662.52 103570, 98619.61 103430.8, 9~

3.1. Utilizar ggplot() para realizar un gráfico (barras, puntos, o el que prefieran) para mostrar los resultados de cantidad por barrio.

Representamos las cantidades de centros DetectAR por barrio en un gráfico:

ggplot(detectarporbarrio3) + 
  geom_point(aes(x = centro, y = BARRIO, color=BARRIO), show.legend = FALSE)+
  labs(title = "Testeo COVID-19 en CABA", subtitle = "Cantidad operativos DetectAR por barrio", x = "Cantidad de operativos DetectAR", y = "Barrios", caption = "Fuente: Buenos Aires Data") +
  theme_minimal()

Vemos que algunos barrios tienen más de un dispositivo DetectAR. Villa Soldati es el barrio que más posee, con 3 en total, seguido por Chacarita, Flores, Mataderos y San Cristobal, con 2 cada uno.

Solo a fines prácticos, aplicamos un facetado por barrio:

ggplot(detectarporbarrio3) + 
  geom_point(aes(x = centro, y = BARRIO, color=BARRIO), show.legend = FALSE)+
  labs(title = "Testeo COVID-19 en CABA", subtitle = "Cantidad operativos DetectAR por barrio", x = "Cantidad de operativos DetectAR", y = "Barrios", caption = "Fuente: Buenos Aires Data") +
  theme_minimal()+
  facet_wrap(~BARRIO)

3.2. Utilizar ggplot() para realizar un mapa coroplético con los límites de los barrios, cuyo color de relleno indique la cantidad de casos encontrada en cada uno.

A continuación, analizamos gráficamente la relación entre los centros DetectAR y la cantidad de casos por barrio de CABA.

Trabajamos con el dataset de casos COVID en CABA, a modo de obtener la cantidad de casos por barrio:

covid_CABA1 <- covid_CABA %>%
     group_by(barrio) %>%
  summarise(cantidad=n())
covid_CABA1 <- rename(covid_CABA1, "BARRIO"="barrio")

Unimos el dataset covid_CABA1 con el de barrios para agregarle referencias geográficas y volverlo espacial:

covid_barrios <- barrios %>%
  left_join(covid_CABA1, by="BARRIO")

Verificamos que el nuevo dataset sea espacial:

class(covid_barrios)
## [1] "sf"         "data.frame"

Pasamos a graficar:

ggplot() +
  geom_sf(data = covid_barrios, aes(fill=cantidad))+
  labs(title =  "Testeo COVID-19 en CABA", subtitle = "Cantidad de casos COVID por Barrio", fill= "Cantidad de casos", caption= "Fuente: Buenos Aires Data")+
  scale_fill_gradient(low="khaki2", high="deeppink4")+
  theme_void()+
  geom_sf_label(data= covid_barrios, aes(label = BARRIO), size=1)

En este mapa se observa que Palermo es el barrio con mayor número de casos, seguido de Caballito.

Para que estos datos sean comparables entre barrios, relacionamos la cantidad de observaciones con la superficie (ha) de cada uno:

ggplot() +
  geom_sf(data = covid_barrios, aes(fill=(cantidad/AREA)*10000)) +
  labs(title =  "Testeo COVID-19 en CABA", subtitle = "Cantidad de casos COVID por Barrio", fill= "Cantidad de casos / Área", caption= "Fuente: Buenos Aires Data") +
  scale_fill_gradient(low="khaki2", high="deeppink4")+
  theme_void()+
  geom_sf_label(data= covid_barrios, aes(label = BARRIO), size=1)

Aquí podemos ver que los resultados cambian con respecto a aquellos del mapa coroplético anterior. El mayor número de casos se concentra en los barrios de Almagro y Balvanera.

A continuación, sumamos al mapa coroplético la ubicación de los operativos DetectAR

detectarporbarrio2 <- st_join(operativo_detectar2,barrios)
class(detectarporbarrio2)
## [1] "sf"         "data.frame"
ggplot()+
  geom_sf(data = covid_barrios, aes(fill=(cantidad/AREA)*10000)) +
  geom_sf(data = detectarporbarrio2, alpha=0.5, show.legend = FALSE) +
  labs(title = "Testeo COVID-19 en CABA", subtitle = "Cantidad de casos COVID por Barrio y Operativos DetectAR", fill= "Cantidad de casos / Área", caption= "Fuente: Buenos Aires Data") +
  scale_fill_gradient(low="khaki2", high="deeppink4")+
  theme_void()

Como vemos, los operativos DetectAR se encuentran bastante dispersos por la Ciudad, con una concentración en su zona sur. A simple vista, no parecen tener relación aparente con el número de casos registrado por barrio. Lo paradójico es la concentración de operativos en Villa Soldati, barrio que manifiesta tener una de las más bajas cantidad de casos sobre superficie.