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.
Estos son los paquetes que vamos a utilizar en este documento:
library(tidyverse)
library(sf)
library(plotly)
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
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...
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.
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.
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.
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()
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())
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