Uso de R/R-Studio y mapeo de datos.

En el presente encuentro vamos a trabajar sobre datos extraídos del portal del GCABA sobre la cantidad de llamados al sistema de contacto (147) discriminado por barrio. Estos datos fueron extraídos de la pagina del GCABA y manipulados “a mano” en un procesador de texto o en Excel exclusivemente para este trabajo. Y fue guardado en formato .csv (separado por comas).

Básicamente se resumieron los datos contando la cantidad de veces que que se repetía un llamado o un contacto de un barrio.

El objetivo de este projecto es determinar de manera gráfica la densidad de llamados o contactos al 147 por cantidad de habitantes en cada barrio de la CABA.

Comencemos:

Cargar datos de contactos y poblacionales.

Vamos a comenzar cargando los paquetes o librerias con las funciones que utilizaremos en el proyecto y los archivos con los datos.
Utilizamos la función read.csv( ) para leeer y cargar el archivo .csv convertido en un dataframe con el cuál trabajaremos.

#install.packages("tidyverse")
library(tidyverse) #Para manejar datos
## -- 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()
#install.packages("sf")
library(sf) #manejo de mapas y poligonos
## Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
contactos <- read.csv('https://raw.githubusercontent.com/esalvatierra/DGBCABA20/master/gcba_contactos.csv')
contactos
##               BARRIO CONTACTOS
## 1          AGRONOMIA      5378
## 2            ALMAGRO     35420
## 3          BALVANERA     28818
## 4           BARRACAS     33106
## 5           BELGRANO     56936
## 6               BOCA     18495
## 7              BOEDO     12926
## 8          CABALLITO     50301
## 9          CHACARITA     11076
## 10           COGHLAN      8920
## 11        COLEGIALES     18637
## 12      CONSTITUCION      7569
## 13            FLORES     38462
## 14          FLORESTA     13589
## 15           LINIERS     21606
## 16         MATADEROS     19771
## 17         MONSERRAT     10716
## 18      MONTE CASTRO     15459
## 19     NUEVA POMPEYA     11762
## 20             NUÑEZ     26556
## 21           PALERMO     75068
## 22 PARQUE AVELLANEDA     14914
## 23  PARQUE CHACABUCO     24560
## 24       PARQUE CHAS      8948
## 25  PARQUE PATRICIOS     13559
## 26          PATERNAL      7255
## 27     PUERTO MADERO      1939
## 28          RECOLETA     30339
## 29            RETIRO     38646
## 30          SAAVEDRA      8232
## 31     SAN CRISTOBAL     41050
## 32       SAN NICOLAS     18526
## 33         SAN TELMO      5281
## 34   VELEZ SARSFIELD     11586
## 35         VERSALLES      5835
## 36      VILLA CRESPO     25748
## 37  VILLA DEL PARQUE     25224
## 38      VILLA DEVOTO     34361
## 39 VILLA GRAL. MITRE     11417
## 40      VILLA LUGANO     24853
## 41        VILLA LURO     11485
## 42     VILLA ORTUZAR     11150
## 43  VILLA PUEYRREDON     18985
## 44        VILLA REAL      5496
## 45   VILLA RIACHUELO      5311
## 46  VILLA SANTA RITA     13265
## 47     VILLA SOLDATI      9811
## 48     VILLA URQUIZA     40146

Podemos ver que es un dataframe con 48 observaciones de 2 variables, BARRIO y CONTACTOS.

#Graficamos
ggplot(contactos) +
  geom_col(aes(x = BARRIO, y = CONTACTOS)) +
  coord_flip()

Cargamos los datos de habitantes por barrio de CABA obtenidos del censo nacional 2010. Estos datos fueron manipulados para que las etiquetas de cada columna coincidieran con las etiquetas de las columnas de los demás objetos. Esto nos permitirá integrar las tablas más facilmente utilizando la funcion left_join( ) más adelante.

#Censo Nacional 2010: Poblacion x comuna
poblacion <- read.csv("https://raw.githubusercontent.com/esalvatierra/DGBCABA20/master/caba_pob_barrios_2010.csv")
head(poblacion)
##      BARRIO POBLACION
## 1 AGRONOMIA     13912
## 2   ALMAGRO    131699
## 3 BALVANERA    138926
## 4  BARRACAS     89452
## 5  BELGRANO    126267
## 6      BOCA     45113

Incorporamos el mapa.

El mapa de CABA, está definido por un archivo que tiene las coordenadas de polígonos definidos por líneas que unen puntos de una determinada latidud y longitud. En este caso es un archivo denomidado ‘geojson’.
Al igual que cuando usamos read.csv() para leer un archivo .csv y cargarlo como un dataframe, el comando st_read() es que equivalente para archivos de información geográfica, conocidos como “shapefiles”.

El resultado también es un dataframe.

barrios <- st_read('https://raw.githubusercontent.com/esalvatierra/DGBCABA20/master/CABA_barrios.geojson')
## Reading layer `CABA_barrios' from data source `https://raw.githubusercontent.com/esalvatierra/DGBCABA20/master/CABA_barrios.geojson' using driver `GeoJSON'
## Simple feature collection with 48 features and 4 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33514 ymax: -34.52754
## Geodetic CRS:  WGS 84

Para generar el mapa a partir de un dataframe espacial creado por sf utilizaremos la ggplot( ) que posee una función especial para este tipo de archivos geom_sf( ).

#graficamos por barrio
ggplot(barrios) +
  geom_sf()

Si queremos agregar una leyenda al mapa que identifique cada barrio con su número, podemos usar el “modifiacdor de la estética” aes(), con el parámetro fill (relleno) que indica cómo será llenado o coloreado cada polígono de acuerdo a la variable que querramos. Si usamos BARRIO como factor la llenar el mapa, nos queda este gráfico:

ggplot(barrios) +
  geom_sf(aes(fill = factor(BARRIO)))

Si quisieramos rellenar con diferentes colores correspondientes a cada COMUNA (es una variable que está en el objeto barrios) podemos escribirlo así:

ggplot(barrios) +
  geom_sf(aes(fill = factor(COMUNA)))

Hasta ahora, hemos generado tres objetos de R con los datos de la cantidad de llamadas (“contactos”), la cantidad de habitantes por barrio según el censo nacional de 2010 (“poblacion”) y el archivo con los mapas o poligonos del tipo geojson (“barrios”). El siguiente paso es armar un solo objeto con todos los datos necesarios para poder obtener el mapa de densidad.

Agregamos los datos de poblacion en el objeto “contacto”.

Hasta ahora el objeto “contactos” tiene 48 observaciones de 2 variables. En el paso siguiente, vamos a incorporar una columna con las variables del objeto “población” haciendo match en una fila en común. En este caso, la fila en común es $BARRIO.

En R, las variables dentro de un objeto se nombran con el símbolo $ adelante. En este caso, si quisieramos referirnos a la variable BARRIO del dataframe “contactos”, debemos señalarlo como contactos$BARRIO.

contactos <- left_join(contactos, poblacion)
## Joining, by = "BARRIO"
head(contactos)
##      BARRIO CONTACTOS POBLACION
## 1 AGRONOMIA      5378     13912
## 2   ALMAGRO     35420    131699
## 3 BALVANERA     28818    138926
## 4  BARRACAS     33106     89452
## 5  BELGRANO     56936    126267
## 6      BOCA     18495     45113

En este momento, “contactos” pasó de tener 2 columnas a tener 3. Es un dataframe de 48 filas por 3 columnas df[48,3].

Estos datos, son solo una tabla de columnas y filas. En este punto debemos agregar estos datos al objeto que tiene la informaci[on oara generar el mapa, en nuestro proyecto ese objeto es “barrios”.
Utilizamos nuevamente la función left_join():

Antes de ejecutar la siguiente línea, reparen en la cantidad de variables de “barrios”: 5

#agregamos datos a los barrios
barrios <- left_join(barrios, contactos)
## Joining, by = "BARRIO"

Ahora “barrio” tiene 7 variables, le agregamos $CONTACTOS y $POBLACION y podemos graficar sobre los polígos de los barrios los datos basados en esas variables.

Podemos usar una caracteristica del paquete ggplot2 prediseñada para colocar colores según los valores.

ggplot(barrios) +
  geom_sf(aes(fill = CONTACTOS)) +
  scale_fill_distiller(palette = "Spectral")

En este caso graficamos el mapa de calor del número de contactos por barrio. Podemos observar que PALERMO es el barrio con mayo cantidad de contactos a la línea147, por ello se pinta con el color rojo correspondiente a valores mayores.

Sin embargo, nuestro objetivo era graficar la densidad o cantidad de contactos por habitantes. Para ello podemos utilizar el cociente entre CONTACTOS / POBLACION directamente en la función correspondiente de ggplot().

ggplot(barrios) +
  geom_sf(aes(fill = CONTACTOS / POBLACION)) +
  scale_fill_distiller(palette = "Spectral")

Este paso nos permite determinar que la mayor cantidad de llamados por habitantes ocurre en el barrio de San Cristobal.

Este proyecto, permitió ir desde los datos separados en distintas fuentes, reordenarlos, asociaciarlos entre sí y extraer información que podría ser usada para generar acciones de gobierno, toma de desiciones comerciales, de gestión., etc, etc.

En Campus les dejo otros datasets para ser utilizados de manera similar.

¿Se animan a analizar otros patrones?….