Cuenta la leyenda que durante el Aislamiento Social Preventivo y Obligatorio del 2020, muchos habitantes de la ciudad de Buenos Aires incorporaron el hĆ”bito de separar residuos como conducta ecológica. En mi caso fue sencillo sumarme al movimiento āorgĆ”nico e inorgĆ”nico, asunto separadoā ya que cerca de mi casa se ubican 2 Campanas Verdes (nombre prolijo de los contenedores para reciclables) y un Punto Verde. Pero un amigo, que tambiĆ©n quiso empezar a separar residuos, me contó que le habĆa costado encontrar un container verde cerca de su casa y que cuando quiso buscar en la pĆ”gina del GCBA se encontró con un excel inmenso que no pudo entender. En ese momento pensĆ©, esta es una tarea para poner la ciencia de datos al servicio de la comunidad. AsĆ que lo primero que pensĆ© fue en armar un mapa interactivo, pero posteriormente algunas preguntas fueron surgiendo. El siguiente es un pequeƱo anĆ”lisis de la distribución de puntos reciclables en CABA y su relación con la distribución poblacional.
āCampanas verdesā
āPuntos Verdesā
Primero vamos a descargar la data a usar para el anƔlisis, en principio en estos links
https://data.buenosaires.gob.ar/dataset/campanas-verdes
https://data.buenosaires.gob.ar/dataset/puntos-verdes/resource/juqdkmgo-1716-resource
https://www.estadisticaciudad.gob.ar/eyc/?p=76599
Y vamos a levantar los datasets con R
# install.packages("tidyverse")
# install.packages("rgdal")
# install.packages("readxl")
library(tidyverse)
## Warning: package 'readr' was built under R version 4.1.1
library(rgdal)
library(readxl)
campanas_verdes<-read.csv("campanas-verdes.csv", encoding = "UTF-8")
poblacion<-read_xlsx("PDE.xlsx",
sheet = "2020",
skip = 1)%>%
slice(3:17)%>%
rename("varones"="...3",
"mujeres"="...4", "comuna"="Comuna",
"superficie"="Superficie (km2)",
"poblacion"="Población")%>%
mutate(comuna=as.factor(comuna),
poblacion=as.numeric(poblacion))
Exploremos un poco la estructura de la data levantada
glimpse(campanas_verdes)
## Rows: 2,974
## Columns: 6
## $ WKT <chr> "POINT (-58.4436445327415 -34.5893377789048)", "POINT (-58.~
## $ direccion <chr> "AGUIRRE 1447", "BERMUDEZ 1697", "CACHI 163", "CERVANTES 38~
## $ barrio <chr> "CHACARITA", "MONTE CASTRO", "NUEVA POMPEYA", "VILLA DEVOTO~
## $ comuna <int> 15, 10, 4, 11, 15, 15, 15, 15, 15, 15, 5, 5, 5, 5, 5, 8, 10~
## $ materiales <chr> "Papel / Cartón", "Papel / Cartón", "Papel / Cartón / PlÔst~
## $ mas_info <chr> "Los materiales deben estar limpios y secos", "Los material~
glimpse(poblacion)
## Rows: 15
## Columns: 6
## $ comuna <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1~
## $ poblacion <dbl> 256405, 149430, 193276, 240100, 1875~
## $ varones <chr> "127651", "66707", "91310", "114957"~
## $ mujeres <chr> "128754", "82723", "101966", "125143~
## $ superficie <dbl> 17.76490, 6.30245, 6.38500, 21.66900~
## $ `Densidad poblacional (hab/km2)` <dbl> 14433.24, 23709.83, 30270.32, 11080.~
Veamos la distribucion de campanas por comuna
#armo un df con la data que voy a necesitar para graficar
campanas_por_comuna<-campanas_verdes%>%
group_by(comuna)%>%
summarise(cantidad=n())%>%
mutate(comuna=as.factor(comuna))%>%
arrange(cantidad)
#grafico el df
plot_campanas_por_comuna<-ggplot(data = campanas_por_comuna, aes(x=reorder(comuna, cantidad),
y=cantidad,
fill=comuna))+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45))+
labs(title = "Cantidad de campanas verdes por comuna",
x= "comuna",
fill= "comuna")+
geom_bar(stat = "identity", position = "identity")+
coord_flip()
#meto un plotly para que sea interactivo
library(plotly)
ggplotly(plot_campanas_por_comuna,tooltip = c("cantidad", "comuna"))
Bien! Ya tenemos nuestros primeros datos. En principio vemos que las comunas que tienen mayor cantidad de campanas verdes son las 13, 12 y 10 y las que menor cantidad tienen son la 2, 3 y 1. Pero esta informacion mucho no nos dice. Veamos la cantidad de campanas verdes por habitante de cada comuna, asĆ podemos ver la densidad de campanas verdes.
#junto la data
campanas_por_comuna<-campanas_por_comuna%>%
inner_join(poblacion, campanas_por_comuna, by="comuna")%>%
mutate(densidad=round(poblacion/cantidad, digits = 0))
| comuna | cantidad | poblacion | varones | mujeres | superficie | Densidad poblacional (hab/km2) | densidad |
|---|---|---|---|---|---|---|---|
| 2 | 85 | 149430 | 66707 | 82723 | 6.30245 | 23709.83 | 1758 |
| 3 | 114 | 193276 | 91310 | 101966 | 6.38500 | 30270.32 | 1695 |
| 1 | 117 | 256405 | 127651 | 128754 | 17.76490 | 14433.24 | 2191 |
| 14 | 121 | 227115 | 102784 | 124331 | 15.84650 | 14332.19 | 1877 |
| 6 | 129 | 185456 | 84790 | 100666 | 6.85100 | 27069.92 | 1438 |
| 5 | 162 | 187518 | 86312 | 101206 | 6.65905 | 28159.87 | 1158 |
| 7 | 166 | 241861 | 113923 | 127938 | 12.42760 | 19461.60 | 1457 |
| 8 | 169 | 228953 | 109653 | 119300 | 22.29200 | 10270.64 | 1355 |
| 4 | 171 | 240100 | 114957 | 125143 | 21.66900 | 11080.35 | 1404 |
| 11 | 237 | 190076 | 89756 | 100320 | 14.11930 | 13462.14 | 802 |
| 15 | 269 | 182465 | 85398 | 97067 | 14.32271 | 12739.56 | 678 |
| 9 | 278 | 171264 | 82856 | 88408 | 16.50600 | 10375.86 | 616 |
| 10 | 292 | 170592 | 80065 | 90527 | 12.65690 | 13478.18 | 584 |
| 12 | 331 | 214777 | 100392 | 114385 | 15.56760 | 13796.41 | 649 |
| 13 | 333 | 236358 | 107991 | 128367 | 14.65175 | 16131.73 | 710 |
Grafico para entender la distribución de campanas verdes por comuna
plot_densidad<-ggplot(campanas_por_comuna, aes(x=poblacion, y=cantidad, color=comuna, lab1=densidad))+
geom_point(size=3)+
theme_minimal()+
labs(title = "Cantidad de campanas verdes segĆŗn cantidad de habitantes")
ggplotly(plot_densidad, tooltip = c("cantidad", "comuna", "densidad"))
Bueno ahora tenemos un poco mĆ”s de información. En principio uno esperarĆa que el grĆ”fico tuviera una forma de pendiente desde el rincón inferior izquierdo hasta el superior derecho, es decir que a mayor cantidad de habitantes (asumiendo que cada habitante produce una cantidad de residuos similar), mayor cantidad de campanas verdes. Pero esto no es lo que sucede, por ejemplo vemos que la comuna 1 es la que peor relación presenta entre cantidad de población y cantidad de campanas verdes disponibles. El grĆ”fico no estĆ” mal, pero tratemos de ver la info con un poco mas de detalle, y para esto nada mejor que un mapa
#cargamos una nueva libreria que nos va a permitir manipular datasets con info geogrƔfica
library(sf)
#traigamos la informacion geografica de las comunas en caba
mapa_caba_link<-read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/perimetro/perimetro.geojson")
campanas_verdes_geo<-st_read("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/subsecretaria-de-higiene-urbana/campanas-verdes/campanas-verdes.geojson")
## Reading layer `contenedores_verdes_wgs84' from data source
## `https://cdn.buenosaires.gob.ar/datosabiertos/datasets/subsecretaria-de-higiene-urbana/campanas-verdes/campanas-verdes.geojson'
## using driver `GeoJSON'
## Simple feature collection with 2974 features and 5 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -58.52952 ymin: -34.69468 xmax: -58.35585 ymax: -34.53716
## Geodetic CRS: WGS 84
#vamos a necesitar separar los valores de las coordenadas de cada campana
campanas_verdes_coords_separadas <- campanas_verdes_geo %>%
mutate(lat = unlist(map(geometry,1)),
long = unlist(map(geometry,2)))
#grafiquemos el mapa de calor
plot_calor<-ggplot()+
geom_sf(data=mapa_caba_link)+
geom_density2d_filled(data = campanas_verdes_coords_separadas, aes(x=lat, y=long), alpha=0.5)+
theme_minimal()+
labs(title = "Densidad de campanas verdes")
plot_calor
Por último armemos el mapa que necesitaba mi amigo para poder ubicar los puntos verdes cerca de su casa. Vamos a agregar también la info de los Puntos Verdes. Ahora cualquier persona puede consultarlo!
library(leaflet)
campanas_verdes_shp<-readOGR("contenedores_verdes_wgs84.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\ds-menta\Desktop\Joaquin\unsam\TP\contenedores_verdes_wgs84.shp", layer: "contenedores_verdes_wgs84"
## with 2974 features
## It has 5 fields
puntos_verdes_shp<-readOGR("puntos_verdes_wgs84.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\ds-menta\Desktop\Joaquin\unsam\TP\puntos_verdes_wgs84.shp", layer: "puntos_verdes_wgs84"
## with 80 features
## It has 13 fields
## Integer64 fields read as strings: altura
mapa_reciclables<-leaflet()%>%
addProviderTiles("OpenStreetMap.Mapnik")%>%
addMarkers(data=campanas_verdes_shp,
group = "contenedores para reciclables",
clusterOptions = markerClusterOptions(removeOutsideVisibleBounds = F))%>%
addMarkers(data=puntos_verdes_shp,
group = "puntos verdes",
clusterOptions = markerClusterOptions(removeOutsideVisibleBounds = F))%>%
addLayersControl(position = "bottomleft",
overlayGroups = c("contenedores para reciclables", "puntos verdes"))
mapa_reciclables