library(tidyverse)
## Registered S3 methods overwritten by 'ggplot2':
##   method         from 
##   [.quosures     rlang
##   c.quosures     rlang
##   print.quosures rlang
## Registered S3 method overwritten by 'rvest':
##   method            from
##   read_xml.response xml2
## -- Attaching packages --------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.1       v purrr   0.3.2  
## v tibble  2.1.1       v dplyr   0.8.0.1
## v tidyr   0.8.3       v stringr 1.4.0  
## v readr   1.3.1       v forcats 0.4.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggmap)
## Warning: package 'ggmap' was built under R version 3.6.1
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
library(lubridate)
## Warning: package 'lubridate' was built under R version 3.6.1
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date

#TP4 - Descubriendo patrones temporales y espaciales en los datos ## Ciencia de Datos para Ciudades II

Vamos a trabajar con los datos de SUACI (sist. unico de atencion ciudadana), para ver los patrones espacio temporales de las quejas y reclamos de los vecinos de la Ciudad de Buenos Aires. Si bien hay datos del 2019, vamos a trabajar con los del año pasado, para poder observar variaciones a lo largo de todo el año calendario.

suaci <- read.csv("C:/MEU (DiTella)/2019 - A2/2 Trimestre/MU115 - Ciencia de datos 2/Datos2/BA/SUACI/sistema-unico-de-atencion-ciudadana-2018.csv", encoding="UTF-8")

exploramos los datos

dim(suaci)
## [1] 893291     19
names(suaci)
##  [1] "contacto"                  "periodo"                  
##  [3] "categoria"                 "subcategoria"             
##  [5] "concepto"                  "tipo_prestacion"          
##  [7] "fecha_ingreso"             "hora_ingreso"             
##  [9] "domicilio_cgpc"            "domicilio_barrio"         
## [11] "domicilio_calle"           "domicilio_altura"         
## [13] "domicilio_esquina_proxima" "lat"                      
## [15] "long"                      "canal"                    
## [17] "genero"                    "estado_del_contacto"      
## [19] "fecha_cierre_contacto"
head(suaci)
##      contacto periodo                  categoria        subcategoria
## 1 00000001/18  201801                   TRÁNSITO       DENUNCIA VIAL
## 2 00000002/18  201801                   TRÁNSITO       DENUNCIA VIAL
## 3 00000003/18  201801                   TRÁNSITO       DENUNCIA VIAL
## 4 00000004/18  201801 ARBOLADO Y ESPACIOS VERDES PLANTACIÓN DE ÁRBOL
## 5 00000005/18  201801                   TRÁNSITO       DENUNCIA VIAL
## 6 00000006/18  201801                   TRÁNSITO       DENUNCIA VIAL
##                   concepto tipo_prestacion fecha_ingreso  hora_ingreso
## 1 VEHÍCULO MAL ESTACIONADO        DENUNCIA    2018-01-01 12:03:30 a.m.
## 2 VEHÍCULO MAL ESTACIONADO        DENUNCIA    2018-01-01 12:19:33 a.m.
## 3 VEHÍCULO MAL ESTACIONADO        DENUNCIA    2018-01-01 12:19:33 a.m.
## 4      PLANTACIÓN DE ÁRBOL       SOLICITUD    2018-01-01 12:19:36 a.m.
## 5 VEHÍCULO MAL ESTACIONADO        DENUNCIA    2018-01-01 12:20:33 a.m.
## 6 VEHÍCULO MAL ESTACIONADO        DENUNCIA    2018-01-01 12:20:58 a.m.
##   domicilio_cgpc domicilio_barrio       domicilio_calle domicilio_altura
## 1      COMUNA 13            NUÑEZ        PAZ, GRAL. AV.             1020
## 2      COMUNA 13            NUÑEZ                 VEDIA             2225
## 3      COMUNA 13            NUÑEZ    VUELTA DE OBLIGADO             4759
## 4      COMUNA 14          PALERMO REPUBLICA DE LA INDIA             2866
## 5      COMUNA 13            NUÑEZ                 VEDIA             2225
## 6       COMUNA 6        CABALLITO             GUAYAQUIL              325
##   domicilio_esquina_proxima       lat      long canal    genero
## 1                           -34.53893 -58.47435   App masculino
## 2                           -34.53902 -58.47312   App masculino
## 3                           -34.53969 -58.47343   App masculino
## 4                           -34.57929 -58.41552   App masculino
## 5                           -34.53902 -58.47312   App masculino
## 6                           -34.62006 -58.43336   App  femenino
##   estado_del_contacto fecha_cierre_contacto
## 1             Cerrado            2018-01-03
## 2             Cerrado            2018-01-01
## 3             Cerrado            2018-01-03
## 4             Cerrado            2018-09-05
## 5             Cerrado            2018-01-03
## 6             Cerrado            2018-01-03

El dataset cuenta con la informacion necesaria para el ejercicio: fechas y coordenadas.

Ordenamos las categorias con mas reclamos.

suaci %>% 
    count(categoria) %>% 
    top_n(5) %>% 
    arrange(desc(n))
## Selecting by n
## # A tibble: 5 x 2
##   categoria                       n
##   <fct>                       <int>
## 1 LIMPIEZA Y RECOLECCIÓN     296730
## 2 TRÁNSITO                   288098
## 3 ARBOLADO Y ESPACIOS VERDES  69348
## 4 CALLES Y VEREDAS            65094
## 5 ALUMBRADO                   39781

Y analizamos la temporalidad de los contactos relacionados a limpieza y recolección de residuos.

suaci %>% 
    filter(categoria == "LIMPIEZA Y RECOLECCIÓN") %>% 
    ggplot() +
        geom_bar(aes(x = month(fecha_ingreso, label = TRUE)))

A simple vista

Repetimos el gráfico, pero esta vez incluimos las subcategorias para ver si podemos explicar la variacion mensual de los reclamos.

suaci %>% 
    filter(categoria == "LIMPIEZA Y RECOLECCIÓN") %>% 
    ggplot() +
        geom_bar(aes(x = month(fecha_ingreso, label = TRUE), fill = subcategoria))

Si bien resulta dificil encontrar una tendencia, se observa que en la primera mitad del año hay mas reclamos que en la segunda. Tambien se podria decir en terminos generales que los meses calurosos hay mas reclamos que en los meses frios, y esto podria estar relacionado con la intensidad del olor de la basura cuando hay mayores temperaturas. Tambien se podria especular con que en Enero, el mes con mas reclamos, las empresas de recolección de residuos bajan las dotaciones por vacaciones. O que los vecinos que se quedan en la ciudad de vacaciones tienen mas tiempo libre para quejarse.

Para ver que pasa con los demas reclamos vamos a retomar el top 5

suaci_frecuentes <- suaci %>% 
    count(categoria) %>% 
    top_n(5) %>% 
    pull(categoria)
## Selecting by n

Y graficamos en forma de lineas

# Primero realizamos un conteo de delitos por tipo y por mes del año
conteo <-  suaci %>% 
    filter(categoria %in% suaci_frecuentes) %>% 
    count(categoria, mes = month(fecha_ingreso, label = TRUE))
   
# Y ahora a mostras las cantidades mensuales como líneas 
ggplot(conteo) +
    geom_line(aes(x = mes, y = n, group = categoria, color = categoria))+
  expand_limits(y = 0)+
      theme_minimal()

Podemos ver rapidamente que los reclamos por recolección y los de transito van muy por encima del resto de las categorias. Tambien podemos ver que la categoria de transito tiene una estacionalidad mucho mas marcada que las demas: los reclamos por transito bajan mucho los meses de vacaciones, cuando estan cerrados los colegios y la mayoria de las familias se toman vacaciones.

Veamos como se comportan los reclamos durante la semana

# Primero realizamos un conteo de delitos por tipo y por mes del año
conteo <-  suaci %>% 
    filter(categoria %in% suaci_frecuentes) %>% 
    count(categoria, diasemana = wday(fecha_ingreso, label = TRUE))
   
# Y ahora a mostras las cantidades mensuales como líneas 
ggplot(conteo) +
    geom_line(aes(x = diasemana, y = n, group = categoria, color = categoria))+
  expand_limits(y = 0)+
      theme_minimal()

En todas las categorias se observa una variacion importante entre el domingo y el lunes, y entre el viernes y el sabado.

##Analisis Espacial

Ya cargamos la libreria ggmap, ahora vamos a procurarnos un mapa de Buenos Aires. Primero filtramos los datos sin coordenadas, luego obtenemos el “bounding box” de nuestros datos, y finalmente se los pasamos a get_stamenmap().

suaci <- suaci %>% 
    filter(lat <0, long <0)

bbox <- c(min(suaci$long, na.rm = TRUE),
          min(suaci$lat, na.rm = TRUE),
          max(suaci$long, na.rm = TRUE),
          max(suaci$lat, na.rm = TRUE))

CABA <- get_stamenmap(bbox = bbox, 
                      maptype = "toner-lite",
                      zoom=13)
## Source : http://tile.stamen.com/toner-lite/13/2764/4934.png
## Source : http://tile.stamen.com/toner-lite/13/2765/4934.png
## Source : http://tile.stamen.com/toner-lite/13/2766/4934.png
## Source : http://tile.stamen.com/toner-lite/13/2767/4934.png
## Source : http://tile.stamen.com/toner-lite/13/2768/4934.png
## Source : http://tile.stamen.com/toner-lite/13/2764/4935.png
## Source : http://tile.stamen.com/toner-lite/13/2765/4935.png
## Source : http://tile.stamen.com/toner-lite/13/2766/4935.png
## Source : http://tile.stamen.com/toner-lite/13/2767/4935.png
## Source : http://tile.stamen.com/toner-lite/13/2768/4935.png
## Source : http://tile.stamen.com/toner-lite/13/2764/4936.png
## Source : http://tile.stamen.com/toner-lite/13/2765/4936.png
## Source : http://tile.stamen.com/toner-lite/13/2766/4936.png
## Source : http://tile.stamen.com/toner-lite/13/2767/4936.png
## Source : http://tile.stamen.com/toner-lite/13/2768/4936.png
## Source : http://tile.stamen.com/toner-lite/13/2764/4937.png
## Source : http://tile.stamen.com/toner-lite/13/2765/4937.png
## Source : http://tile.stamen.com/toner-lite/13/2766/4937.png
## Source : http://tile.stamen.com/toner-lite/13/2767/4937.png
## Source : http://tile.stamen.com/toner-lite/13/2768/4937.png
## Source : http://tile.stamen.com/toner-lite/13/2764/4938.png
## Source : http://tile.stamen.com/toner-lite/13/2765/4938.png
## Source : http://tile.stamen.com/toner-lite/13/2766/4938.png
## Source : http://tile.stamen.com/toner-lite/13/2767/4938.png
## Source : http://tile.stamen.com/toner-lite/13/2768/4938.png

revisamos el mapa base

ggmap(CABA)

Para empezar vamos a mapear densidades que muestre donde se concentran la mayor cantidad de observaciones.

ggmap(CABA) +
    geom_bin2d(data = suaci, aes(x = long, y = lat), bins = 75) +
    scale_fill_viridis_c()
## Warning: Removed 4 rows containing missing values (geom_tile).

Se ve que la mayor cantidad de reclamos se centra en el corredor Norte, pero no es muy claro el mapa. Vamos a probar con un kernel density

ggmap(CABA) +
    geom_density2d(data = suaci, aes(x = long, y = lat, color = stat(level))) +
    scale_color_viridis_c()

Podemos ver que hay varios puntos calientes a lo largo del corredor norte, y un foco de reclamos en Barracas, cerca del acceso a Capital por Puente Pueyrredon (congestión vehicular?)

Si empezamos a visualizar por categorias podemos darnos una idea mas acabada de que pasa en esos hotspots. Tomamos las 5 categorias del Top5.

ggmap(CABA) +
    geom_point(data = filter(suaci, categoria %in% suaci_frecuentes),
                      aes(x = long, y = lat, color = categoria),
                      size = 0.02, alpha = 0.1)+
   guides(color = guide_legend(override.aes = list(size=2, alpha = 1))) +
    scale_color_brewer(palette = "Set1")

Por la cantidad de puntos, la info resulta dificil de leer, asi que armamos un mapa de facetado por categorias

ggmap(CABA) +
    geom_point(data = filter(suaci, categoria %in% suaci_frecuentes), 
               aes(x = long, y = lat, color = categoria),
               size = 0.005, alpha = 0.1) +
    scale_color_brewer(palette = "Set1") +
    facet_wrap(~categoria)+
  
  guides(color = guide_legend(override.aes = list(size=2, alpha = 1))) +
    scale_color_brewer(palette = "Set1")+
 
    labs(title = "Distribución geográfica por tipo de reclamos",
         color = "Top 5 reclamos")
## Scale for 'colour' is already present. Adding another scale for
## 'colour', which will replace the existing scale.

Para hacer las diferencias aún mas nítidas, podemos facetar una estimación de densidad:

ggmap(CABA) +
    geom_density2d(data = filter(suaci, categoria %in% suaci_frecuentes), 
                   aes(x = long, y = lat, color = stat(level))) +
    scale_color_viridis_c() +
    facet_wrap(~categoria)+
  
      labs(title = "Densidad geográfica por tipo de reclamos",
         color = "Top 5 reclamos")

En el caso del tránsito se observa una concentración de reclamos en la zona norte, mientras que en limpieza el foco se traslada a Recoleta. Arbolado es la mas homogénea en terminos de localización de reclamos.

Veamos que pasa geográficamente con los reclamos de limpieza y recolección a lo largo del año:

suaci <- suaci %>% 
    mutate(mes = month(fecha_ingreso, label = TRUE))


ggmap(CABA) +
    geom_density2d(data = filter(suaci, 
                                 categoria == "LIMPIEZA Y RECOLECCIÓN"),
                   aes(x = long, 
                       y = lat, 
                       color = stat(level))) +
  
    scale_color_viridis_c() +
    facet_wrap(~mes, nrow = 3) +
    labs(title = "Concentración espacial de reclamos de limpieza",
         subtitle = "según el mes")

Se puede ver como los patrones espaciales mantienen ciertas similaridades a lo largo de los meses (concentración en la zona de recoleta), siendo mayo uno de los meses más atípicos, con una concentración de reclamos en la zona sur.