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.