Introducción

Los datos georreferenciados son datos espaciales que representan ubicaciones exactas sobre la superficie de la Tierra.

En R, se pueden visualizar mapas geográficos de forma sencilla con el paquete sf y archivos con formato geojson.

El objetivo de este documento es visualizar un mapa de la Cuidad Autónoma de Buenos Aires que contenga la tasa por 100 mil habitantes de casos confirmados de coronavirus según barrio.

Librerías

Estos son los paquetes que vamos a utilizar en este documento:

library(tidyverse)
library(sf)
library(plotly)

Carga de datos

La función st_read() permite cargar datos georreferenciados en R, funciona de la misma forma que read.csv(), por lo que se puede leer un archivo de internet.

Puede consultar el archivo geojson de barrios de la Ciudad de Buenos Aires en el portal de datos abiertos de CABA.

BarriosCaba <- st_read("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson")
## Reading layer `barrios_badata' from data source `http://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson' using driver `GeoJSON'
## Simple feature collection with 48 features and 4 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## CRS:            4326

Con la función head() se pueden ver las columnas y las primeras 6 filas del data frame.

head(BarriosCaba)
## Simple feature collection with 6 features and 4 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.50617 ymin: -34.63064 xmax: -58.41192 ymax: -34.57829
## CRS:            4326
##             barrio comuna perimetro    area                       geometry
## 1        CHACARITA     15  7724.853 3115707 POLYGON ((-58.45282 -34.595...
## 2         PATERNAL     15  7087.513 2229829 POLYGON ((-58.46558 -34.596...
## 3     VILLA CRESPO     15  8131.857 3615978 POLYGON ((-58.42375 -34.597...
## 4 VILLA DEL PARQUE     11  7705.390 3399596 POLYGON ((-58.49461 -34.614...
## 5          ALMAGRO      5  8537.901 4050752 POLYGON ((-58.41287 -34.614...
## 6        CABALLITO      6 10990.964 6851029 POLYGON ((-58.43061 -34.607...

Este data frame no tiene la tasa de casos confirmados x 100 mil habitantes, por lo debemos agregar el dato faltante.

Para lograr esto voy a trabajar con un excel propio que contiene la tasa de casos de Covid-19 segun barrio.

Este archivo lo arme en base a los Boletines Epidemiológicos de CABA, los cuales pueden consultar en https://www.buenosaires.gob.ar/salud/boletines-periodicos/boletines-epidemiologicos-semanales-2018-2019.

TasaCovid <- read.csv("C:\\Users\\jonathan.rzezak\\Desktop\\R\\tasa covid por barrios.csv")

names(TasaCovid)
## [1] "barrio"     "tasa.covid"
head(TasaCovid)
##            barrio tasa.covid
## 1          RETIRO    3321.41
## 2          FLORES     840.57
## 3        BARRACAS     368.61
## 4       BALVANERA     223.50
## 5   NUEVA POMPEYA     217.84
## 6 VILLA RIACHUELO     206.35

Cruzando variables

Como el data frame BarriosCaba no tiene informacion sobre la tasa de Covid-19, se puede unir los datos del df TasaCovid mendiante un join.

La funcion left_join() utiliza como referencia la tabla de la izquierda, para agregar los nuevos datos que aporta la tabla de la derecha, el resultado será un nuevo data frame con los datos combinados.

CabaTasaCovid <- left_join(BarriosCaba,
                           TasaCovid,
                           by="barrio")

Veamos el resultado:

head(CabaTasaCovid)
## Simple feature collection with 6 features and 5 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.50617 ymin: -34.63064 xmax: -58.41192 ymax: -34.57829
## CRS:            4326
##             barrio comuna perimetro    area tasa.covid
## 1        CHACARITA     15  7724.853 3115707      76.16
## 2         PATERNAL     15  7087.513 2229829     147.05
## 3     VILLA CRESPO     15  8131.857 3615978      86.79
## 4 VILLA DEL PARQUE     11  7705.390 3399596      61.72
## 5          ALMAGRO      5  8537.901 4050752     118.16
## 6        CABALLITO      6 10990.964 6851029      87.20
##                         geometry
## 1 POLYGON ((-58.45282 -34.595...
## 2 POLYGON ((-58.46558 -34.596...
## 3 POLYGON ((-58.42375 -34.597...
## 4 POLYGON ((-58.49461 -34.614...
## 5 POLYGON ((-58.41287 -34.614...
## 6 POLYGON ((-58.43061 -34.607...

Graficando datos georreferenciados

Para visualizar datos espaciales se puede utilizar la función geom_sf:

ggplot(CabaTasaCovid)+
  geom_sf(aes(fill=tasa.covid))+              
  scale_fill_distiller(palette="Spectral")+
  labs(title = "Tasa x 100 mil habitantes de casos confirmados de Covid 19 según barrio",
       subtitle = "Fuente: Boletín Epidemiológico hasta el 29/05 del GCBA",
       caption= "Elaboración propia Rstudio")+
  theme_bw()

El parámetro fill, que está dentro de aes(), le indica a ggplot que llene cada polígono con un color distinto según la columna tasa.covid

La capa scale_fill_distiller() con paleta = spectral visualiza los datos con una escala de colores que va de azul hacia rojo.

Agregando datos espaciales

En el barrio de Retiro la tasa de Covid-19 es muy alta debido a que hay una gran concentración de zonas vulnerables, en las cuales las condiciones sanitarias son muy malas.

Por otro lado, según los boletines epidemiológicos, la tasa de Covid-19 en Flores es muy alta debido a que en ese barrio se encuentran la mayor cantidad de geriátricos en CABA.

Para comprobar esto, se puede visualizar los barrios de la Ciudad de Buenos Aires, pero con las ubicaciones de todos los geriátricos.

Para ello, voy a utilizar este archivo geojson de la Infraestructura de Datos Espaciales (IDECABA) que pueden consultar en https://idecaba.estadisticaciudad.gob.ar/layers/ide:geriatricos.

GeriatricosCaba <- st_read("https://idecaba.estadisticaciudad.gob.ar/geoserver/wfs?srsName=EPSG%3A4326&typename=ide%3Ageriatricos&outputFormat=json&version=1.0.0&service=WFS&request=GetFeature")
## Reading layer `OGRGeoJSON' from data source `https://idecaba.estadisticaciudad.gob.ar/geoserver/wfs?srsName=EPSG%3A4326&typename=ide%3Ageriatricos&outputFormat=json&version=1.0.0&service=WFS&request=GetFeature' using driver `GeoJSON'
## Simple feature collection with 558 features and 15 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: -58.52932 ymin: -34.69048 xmax: -58.3698 ymax: -34.53976
## CRS:            4326

Visualizar más de un dato espacial es muy sencillo, lo único que hay que hacer es agregar una capa de geom_sf().

ggplot()+
  geom_sf(data = BarriosCaba)+
  geom_sf(data = GeriatricosCaba)+
  labs(title = "Geriátricos de la Cuidad de Buenos Aires según barrio",
       subtitle = "Fuente: IDECABA y portal de datos abiertos del GCBA",
       caption= "Elaboracion propia con Rstudio")+
  theme_bw()

Si bien podemos observar una gran cantidad de geriátricos en Flores, se puede realizar otro tipo de grafico para comprobar la hipótesis.

Gráfico de barras

Con un gráfico de barras se puede chequear de forma rápida la cantidad de barrios de forma rápida.

La función geom_bar() permite definir, dentro de aes() , las variables categóricas en el eje “x” y en el eje “y” (sino se especifica nada) la cantidad de veces que se repite el dato.

ggplot(GeriatricosCaba)+
  geom_bar(aes(x = BARRIOS))+
  labs(title = "Geriátricos de la Cuidad de Buenos Aires según barrio")+
  theme_bw()

Como el nombre de los ejes son muy largos y resultan ilegibles, se puede utilizar la función coord_flip() para invertir los ejes.

ggplot(GeriatricosCaba)+
  geom_bar(aes(x = BARRIOS))+
  labs(title = "Geriátricos de la Cuidad de Buenos Aires según barrio",
       subtitle = "Fuente: IDECABA",
       y= "Cantidad de Geriátricos",
       x= NULL) +  #Eliminamos el nombre del eje "x" para que las los nombren ocupen mayor espacio
  theme_bw() +
  coord_flip()

Como se puede observar, es cierto que en el barrio de Flores existe la mayor cantidad de Geriátricos.

Reordenando variables

Para poder visualizar los valores de un eje de mayor a menor, hay que reordenar la variable barrios en función de otra variable (generalmente numérica).

Para lograr esto se puede utilizar la función reorder(), sin embargo como el data frame no tiene una variable que indique la cantidad de geriátricos (es decir n), hay que definirlo con un count().

Como la función count() va a contar la cantidad de barrios, no podemos utilizar geom_bar(), por lo que lo reemplazamos con geom_col().

GeriatricosCaba %>%
  count(BARRIOS) %>%
  mutate(BARRIOS = reorder(BARRIOS, n)) %>%
  ggplot(aes(BARRIOS,n))+
  geom_col()+
  labs(title = "Geriátricos de la Cuidad de Buenos Aires según barrio",
       subtitle = "Fuente: IDECABA",
       y= "Cantidad de Geriátricos",
       x= NULL) + 
  theme_bw() +
  coord_flip()

Gráficos de barras interactivos

Un problema frecuente a la hora de realizar una visualización estática, es la dificultad que tenemos a la hora de leer los datos.

Para solucionar esto, utilizaremos la función ggplotly() para convertir este grafico estático en uno interactivo.

GeriatricosCabav2 <- GeriatricosCaba %>%
  count(BARRIOS) %>%
  mutate(BARRIOS = reorder(BARRIOS, n))

ggplotly(ggplot(GeriatricosCabav2,aes(BARRIOS,n))+
  geom_col()+
  labs(title = "Geriátricos de la Cuidad de Buenos Aires según barrio",
       subtitle = "Fuente: IDECABA",
       y= "Cantidad de Geriátricos",
       x= NULL) + 
  theme_bw() +
  coord_flip())

Etiqueta de datos

Otra opción es agregar una etiqueta de datos, se puede realizar con la funcion geom_text().

GeriatricosCaba %>%
  count(BARRIOS) %>%
  mutate(BARRIOS = reorder(BARRIOS, n)) %>%
  ggplot(aes(BARRIOS,n)) +
  geom_col() +
  geom_text(aes(label=n), hjust= -0.2) + 
  labs(title = "Geriátricos de la Cuidad de Buenos Aires según barrio",
       subtitle = "Fuente: IDECABA",
       y= "Cantidad de Geriátricos",
       x= NULL) + 
  theme_bw() +
  coord_flip()

 


Elaborado por Jonathan Rzezak