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.
Comencemos:
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
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.