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 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ā€

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)
## 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.~

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

#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.

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

Densidad de campanas verdes

#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("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