Distribución de puntos reciclables en CABA

Separando residuos

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 dos 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”

Recolectando la data

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)
library(rgdal)
library(readxl)

campanas_verdes<-read.csv("./data/tp_contenedores/campanas-verdes.csv", encoding = "UTF-8")

poblacion<-read_xlsx("./data/tp_contenedores/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.~

Analizando

Cantidad de campanas verdes por comuna

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()
plotly

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.

Cantidad de campanas verdes según cantidad de habitantes

#junto la data
campanas_por_comuna<-campanas_por_comuna%>%
  inner_join(poblacion, campanas_por_comuna, by="comuna")%>%
  mutate(densidad=round(poblacion/cantidad, digits = 0))
library(DT)

tabla<-datatable(campanas_por_comuna)
datatables

Genero un gráfico 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")
plotly

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

Densidad de campanas verdes

Veamos la densidad de la distribución de campanas verdes en la Ciudad de Buenos Aires:

#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

Mapa interactivo

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("./data/tp_contenedores/contenedores_verdes_wgs84.shp")
## OGR data source with driver: ESRI Shapefile 
## Source: "E:\Joaquin\Analisis Varios\Portfolio\content\portfolio\data\tp_contenedores\contenedores_verdes_wgs84.shp", layer: "contenedores_verdes_wgs84"
## with 2974 features
## It has 5 fields
puntos_verdes_shp<-readOGR("./data/tp_contenedores/puntos_verdes_wgs84.shp")
## OGR data source with driver: ESRI Shapefile 
## Source: "E:\Joaquin\Analisis Varios\Portfolio\content\portfolio\data\tp_contenedores\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"))
leaflet