knitr::opts_chunk$set(warning = FALSE, message = FALSE)
library(tidyverse)
library(sf)
library(knitr)
library(kableExtra)



Uniones Espaciales y Análisis Geoespacial

El dataset utilizado corresponde a los crímenes denunciados en la ciudad de Buenos Aires durante los años 2019, 2020 y 2021. Éste fue descargado desde la plataforma del curso ‘Introducción a la Ciencia de Datos’ que forma parte de la ‘Diplomatura en Ciudades y Políticas Urbanas’ dictada por la Universidad Torcuatto Di Tella. Además se trabaja con los polígonos geográficos de los barrios de CABA.

df_crimes <- read.csv("data/delitos_2019_2021.csv", stringsAsFactors = TRUE)
df_crimes <- df_crimes %>% 
  mutate(across(c("anio", "comuna"), as.factor))
df_crimes %>% 
  head(10) %>% 
  kbl(align = "c", longtable = TRUE) %>% 
  kable_styling(bootstrap_options = c("striped", "condensed"), font_size = 11)
fecha franja_horaria anio mes periodo tipo subtipo uso_armas comuna victimas comisaria_mas_cerca lat lon
01/01/20 10 2020 enero 2020-01 Hurto (sin violencia) 10 NA Comisaria Vecinal 10-B -34.62664 -58.52761
01/01/20 22 2020 enero 2020-01 Homicidio Femicidio 11 1 Comisaria Vecinal 11-B -34.61127 -58.52539
01/01/20 19 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B -34.62543 -58.52501
01/01/20 17 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B -34.62543 -58.52501
01/01/20 2 2020 enero 2020-01 Hurto (sin violencia) 11 NA Comisaria Vecinal 11-B -34.60679 -58.52073
01/01/20 5 2020 enero 2020-01 Robo (con violencia) 9 NA Comisaria Comunal 9 -34.65520 -58.51430
01/01/20 2 2020 enero 2020-01 Hurto (sin violencia) 10 NA Comisaria Vecinal 10-B -34.62763 -58.51336
01/01/20 2 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B -34.62131 -58.51289
01/01/20 1 2020 enero 2020-01 Hurto (sin violencia) 9 NA Comisaria Comunal 9 -34.65903 -58.51064
01/01/20 8 2020 enero 2020-01 Hurto (sin violencia) 11 NA Comisaria Vecinal 11-B (edificio anexo) -34.58959 -58.50954
geodf_barrios <- st_read("data/barrios.geojson")
## Reading layer `barrios2' from data source 
##   `D:\Documentos\Cambalache\Proyectos\2022 Diplomatura Di Tella\Urban Data Science - Scetta\02_TasksR\data\barrios.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 48 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## Geodetic CRS:  WGS 84

Scatterplot de delitos

Para obtener una rápida previsualización de la distribución de los delitos denunciados en CABA se genera un gráfico de puntos superpuesto a la geometría de líneas de los barrios que la componen.

ggplot() +
  geom_point(
    data = df_crimes, #sample(df_crimes, 2000, replace = TRUE),
    aes(x = lon, y = lat),
    alpha = 0.01,
    size = 0.35,
    ) +
  geom_sf(data=geodf_barrios, fill = NA, color = "white", size = 0.75) +
  theme_light() +
  labs(title = "Distribución de los crímenes denunciados en CABA 2019-2021 por barrio ",
       color = NULL,
       x = NULL,
       y = NULL,
       caption = ("Fuente: Delitos 2019-2021")) +
  theme(plot.margin = margin(15, 5, 15, 5),
        aspect.ratio = 1,
        panel.grid.major = element_line(color = "gray80",
                                        linetype = "dashed"),
        panel.background = element_rect(fill = "white",
                                        colour = "gray100",
                                        size = 2,
                                        linetype = "solid"),
        plot.title = element_text(size = 10,
                                  face = "bold",
                                  hjust = .5,
                                  vjust = 2.5,
                                  colour = "gray20"),
        plot.caption = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.x = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.y = element_text(size = 5,
                                    colour = "gray20"),
        legend.position = "right",
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20")
        )

Esta previsualización nos permite reconocer la concentración de los delitos denunciados sobre las avenidas, posiblemente debido a las denuncias relacionadas a siniestros viales. Por otro lado, se observan a primera vista puntos conflictivos en la ciudad. Por ejemplo, el área cercana a la facultad de Ciencias Sociales, ciertos sectores del centro de la ciudad y la zona de Retiro.


Transformación de los datos a datos espaciales

Se transforman los datos de delitos provenientes de un archivo en formato ‘.csv’ en datos de tipo espacial para poder realizar operaciones que requieren la geolocalización de las observaciones del dataset.

df_crimes <- df_crimes %>% 
  filter(!is.na(lon) & !is.na(lat))
summary(df_crimes[c("lon", "lat")])
##       lon              lat        
##  Min.   :-58.53   Min.   :-34.70  
##  1st Qu.:-58.47   1st Qu.:-34.63  
##  Median :-58.43   Median :-34.61  
##  Mean   :-58.44   Mean   :-34.61  
##  3rd Qu.:-58.40   3rd Qu.:-34.59  
##  Max.   :-58.34   Max.   :-34.53
geodf_crimes <- df_crimes %>% 
  st_as_sf(coords = c("lon", "lat"), crs = 4326)
geodf_crimes %>% 
  head(10) %>% 
  kbl(align = "c", longtable = TRUE) %>% 
  kable_styling(bootstrap_options = c("striped", "condensed"), font_size = 11)
fecha franja_horaria anio mes periodo tipo subtipo uso_armas comuna victimas comisaria_mas_cerca geometry
01/01/20 10 2020 enero 2020-01 Hurto (sin violencia) 10 NA Comisaria Vecinal 10-B POINT (-58.52761 -34.62664)
01/01/20 22 2020 enero 2020-01 Homicidio Femicidio 11 1 Comisaria Vecinal 11-B POINT (-58.52539 -34.61127)
01/01/20 19 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B POINT (-58.52501 -34.62543)
01/01/20 17 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B POINT (-58.52501 -34.62543)
01/01/20 2 2020 enero 2020-01 Hurto (sin violencia) 11 NA Comisaria Vecinal 11-B POINT (-58.52073 -34.60679)
01/01/20 5 2020 enero 2020-01 Robo (con violencia) 9 NA Comisaria Comunal 9 POINT (-58.5143 -34.6552)
01/01/20 2 2020 enero 2020-01 Hurto (sin violencia) 10 NA Comisaria Vecinal 10-B POINT (-58.51336 -34.62763)
01/01/20 2 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B POINT (-58.51289 -34.62131)
01/01/20 1 2020 enero 2020-01 Hurto (sin violencia) 9 NA Comisaria Comunal 9 POINT (-58.51064 -34.65903)
01/01/20 8 2020 enero 2020-01 Hurto (sin violencia) 11 NA Comisaria Vecinal 11-B (edificio anexo) POINT (-58.50954 -34.58959)

Combinación de los datos de crímenes y barrios

Se combinan ambos dataset, brindando información relativa a los barrios a cada una de las observaciones del dataset de crímenes denunciados. Se utiliza la geolocalización de éstas, generada en el apartado anterior, para ubicar cada denuncia en el barrio correspondiente.

geodf_crimes <- st_join(geodf_crimes, geodf_barrios)
geodf_crimes %>% 
  head(10) %>% 
  kbl(align = "c", longtable = TRUE) %>% 
  kable_styling(bootstrap_options = c("striped", "condensed"), font_size = 11)
fecha franja_horaria anio mes periodo tipo subtipo uso_armas comuna.x victimas comisaria_mas_cerca BARRIO PERIMETRO AREA comuna.y area_km2 POBLACION geometry
01/01/20 10 2020 enero 2020-01 Hurto (sin violencia) 10 NA Comisaria Vecinal 10-B VERSALLES 5650.46628643000 1406833.59580000001 10 1.407 13822 POINT (-58.52761 -34.62664)
01/01/20 22 2020 enero 2020-01 Homicidio Femicidio 11 1 Comisaria Vecinal 11-B VILLA DEVOTO 11562.00680000000 6404480.85371000040 11 6.404 66521 POINT (-58.52539 -34.61127)
01/01/20 19 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B VERSALLES 5650.46628643000 1406833.59580000001 10 1.407 13822 POINT (-58.52501 -34.62543)
01/01/20 17 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B VERSALLES 5650.46628643000 1406833.59580000001 10 1.407 13822 POINT (-58.52501 -34.62543)
01/01/20 2 2020 enero 2020-01 Hurto (sin violencia) 11 NA Comisaria Vecinal 11-B VILLA DEVOTO 11562.00680000000 6404480.85371000040 11 6.404 66521 POINT (-58.52073 -34.60679)
01/01/20 5 2020 enero 2020-01 Robo (con violencia) 9 NA Comisaria Comunal 9 MATADEROS 11124.63579210000 7398178.84035000019 9 7.398 64436 POINT (-58.5143 -34.6552)
01/01/20 2 2020 enero 2020-01 Hurto (sin violencia) 10 NA Comisaria Vecinal 10-B VILLA LURO 8652.93003127000 2566936.87251000013 10 2.567 32502 POINT (-58.51336 -34.62763)
01/01/20 2 2020 enero 2020-01 Robo (con violencia) 10 NA Comisaria Vecinal 10-B MONTE CASTRO 7361.03641755000 2627481.32507999986 10 2.627 33623 POINT (-58.51289 -34.62131)
01/01/20 1 2020 enero 2020-01 Hurto (sin violencia) 9 NA Comisaria Comunal 9 MATADEROS 11124.63579210000 7398178.84035000019 9 7.398 64436 POINT (-58.51064 -34.65903)
01/01/20 8 2020 enero 2020-01 Hurto (sin violencia) 11 NA Comisaria Vecinal 11-B (edificio anexo) VILLA DEVOTO 11562.00680000000 6404480.85371000040 11 6.404 66521 POINT (-58.50954 -34.58959)

Evaluación de las denuncias por barrio

Una vez combinados ambos datasets se elimina la geometría del resultante para poder procesar el dataset con mayor agilidad. Se procesan los datos disponibles para obtener la cantidad de delitos por barrio y el ratio de los mismos por cada 1000 habitantes.

df_crimes <- st_set_geometry(geodf_crimes, NULL)
df_crimes_sum <- df_crimes %>%
  group_by(BARRIO, POBLACION) %>% 
  summarise(DENUNCIAS = n()) %>%
  mutate(c_mil = round(DENUNCIAS/(POBLACION/1000), digits=1)) %>% 
  arrange(desc(DENUNCIAS)) %>%
  select(-POBLACION)        
df_crimes_sum %>% 
  head(10) %>% 
  kbl(align = "c", longtable = TRUE) %>% 
  kable_styling(bootstrap_options = c("striped", "condensed"), font_size = 11)
BARRIO DENUNCIAS c_mil
PALERMO 23110 102.0
BALVANERA 19953 143.6
FLORES 14008 85.3
RECOLETA 13204 83.6
CABALLITO 12247 69.6
ALMAGRO 11413 86.7
SAN NICOLAS 10566 360.9
VILLA LUGANO 9734 77.0
BELGRANO 9429 74.7
BARRACAS 9119 101.9

Se encuentra que la mayor cantidad de delitos denunciados ocurren en el barrio Palermo, correspondiente al microcentro de la ciudad. Lo siguen el barrio Balvanera y Flores. Por otro lado, el mayor ratio entre denuncias ocurridas vs población se produce en el barrio San Nicolás. Esta situación cobra sentido si se considera la cantidad de personas que viajan diariamente al barrio en cuestión pero que no son habitantes de éste.


Mapa Coroplético de delitos por barrio

Se realiza un mapa coroplético para reconocer gráficamente aquellos barrios con la mayor cantidad de denuncias sufridas.

geodf_barrios <- left_join(geodf_barrios, df_crimes_sum, by = "BARRIO")
ggplot() +
  geom_sf(data = geodf_barrios, aes(fill = DENUNCIAS), color = "white", size = 0.25) +
  scale_fill_distiller(palette = "YlOrRd", direction = 1, name = "Denuncias") +
  theme_light() +
  labs(title = "Distribución de los crímenes denunciados en CABA 2019-2021 por barrio ",
       caption = ("Fuente: Delitos 2019-2021")) +
  theme(plot.margin = margin(15, 5, 15, 5),
        aspect.ratio = 1,
        panel.grid.major = element_line(color = "gray80",
                                        linetype = "dashed"),
        panel.background = element_rect(fill = "white",
                                        colour = "gray100",
                                        size = 2,
                                        linetype = "solid"),
        plot.title = element_text(size = 10,
                                  face = "bold",
                                  hjust = .5,
                                  vjust = 2.5,
                                  colour = "gray20"),
        plot.caption = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.x = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.y = element_text(size = 5,
                                    colour = "gray20"),
        legend.position = "right",
        legend.title = element_text(size = 10,
                                    colour = "gray20"),
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20")
        )

Se observa que los barrios ubicados al noreste de la ciudad son en los que se realizaron la mayor cantidad de denuncias. Resulta interesante notar que Palermo, el barrio con mayor cantidad de denuncias como se vio en el apartado anterior, es el barrio de mayor superficie e intuitivamente el de mayor población. Ambas características constribuyen a entender la situación.

Se realiza un nuevo mapa coroplético pero utilizando como valor la cantidad de denuncias por cada 1000 habitantes estables de cada barrio, esta información contribuye a la comprensión del estado de situación.

ggplot() +
  geom_sf(data = geodf_barrios, aes(fill = c_mil), color = "white", size = 0.25) +
  scale_fill_distiller(palette = "YlOrRd", direction = 1, name = "Denuncias/1000 hab.") +
  theme_light() +
  labs(title = "Ratio de los crímenes denunciados cada 1000 hab en CABA 2019-2021 por barrio ",
       caption = ("Fuente: Delitos 2019-2021")) +
  theme(plot.margin = margin(15, 5, 15, 5),
        aspect.ratio = 1,
        panel.grid.major = element_line(color = "gray80",
                                        linetype = "dashed"),
        panel.background = element_rect(fill = "white",
                                        colour = "gray100",
                                        size = 2,
                                        linetype = "solid"),
        plot.title = element_text(size = 10,
                                  face = "bold",
                                  hjust = .5,
                                  vjust = 2.5,
                                  colour = "gray20"),
        plot.caption = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.x = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.y = element_text(size = 5,
                                    colour = "gray20"),
        legend.position = "right",
        legend.title = element_text(size = 10,
                                    colour = "gray20"),
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20")
        )

Se observa que, a diferencia del mapa realizado en el apartado anterior, los barrios con mayor ratio de denuncias vs población se ubican en el microcentro y las zonas aledañas. Razón de esto es la cantidad de personas que viajan diariamente al sector y que no son considerados dentro de la población estable del barrio.


Gráfico de barras de delitos por año en cada barrio

La información disponible se utiliza para generar un gráfico de barras discriminado por barrio y por año. Resulta de especial interés la selección de la tríada de años para evaluar la evolución entre el estado pre-pandemia y el estado post-pandemia de cada uno de los barrios.

df_barrio_anio <- df_crimes %>%
  group_by(BARRIO, anio) %>%
  summarise(denuncias = n()) %>% 
  filter(!is.na(BARRIO))
ggplot(df_barrio_anio) +
  geom_bar(stat = "identity",
           aes(x = BARRIO, y = denuncias, fill = anio),
           position = position_dodge()
           ) +
  scale_fill_brewer(palette = "RdYlGn") +
  theme_light() +
  labs(title = "Cantidad de delitos por barrio",
       fill = NULL,
       y = NULL,
       x = NULL,
       caption = ("Fuente: Delitos 2019-21")) +
  theme(plot.margin = margin(15, 5, 15, 5),
        aspect.ratio = .35,
        panel.grid.major = element_line(color = "gray80",
                                        linetype = "dashed"),        
        panel.background = element_rect(fill = "gray100",
                                        colour = "gray100",
                                        size = 2,
                                        linetype = "solid"),

        plot.title = element_text(size = 10,
                                  face = "bold",
                                  hjust = .5,
                                  vjust = 2.5,
                                  colour = "gray20"),
        plot.caption = element_text(size = 5,
                                    colour = "gray20"),
        axis.title.x = element_text(size = 7.5,
                                    colour = "gray20"),
        axis.text.x = element_text(size = 5,
                                    colour = "gray20",
                                   angle = 90),
        axis.text.y = element_text(size = 5,
                                    colour = "gray20"),
        legend.position = "top",
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20"),
        legend.spacing.x = unit(.5, 'cm')
        ) +
        guides(fill = guide_legend(override.aes = list(size = 5),
                                   label.position = "bottom"))

Resulta interesante notar que el barrio San Nicolás, sexto en el conteo total de delitos denunciados durante la tríada de años, se encuentra tercero en los crímenes denunciados durante el año 2019. Por otro lado, se encuentra mucho más abajo en la tabla de crímenes denunciados durante el año 2021. En efecto, a excepción de Villa Soldati, en todos los barrios se observa una disminución entre las denuncias realizadas durante el año 2019 y el año 2021. Sin embargo, es destacable mencionar que San Nicolás posee la mayor disminución relativa de denuncias entre los años mencionados. Una posible explicación de esto es el fortalecimiento de los centros radiales de la ciudad y la implementación del teletrabajo, lo que ha reducido la cantidad de personas externas al barrio viajando diariamente a éste.

Utilizando los mismos datos se realiza un nuevo gráfico de barras comparando los valores relativos de denuncias por barrios en cada uno de los años estudiados.

ggplot(df_barrio_anio) +
  geom_bar(stat = "identity",
           aes(x = BARRIO, y = denuncias, fill = anio),
           position = position_fill()
           ) +
  # scale_fill_viridis_d(begin = 0.15, end = 0.92) +
  scale_fill_brewer(palette = "RdYlGn") +
  theme_light() +
  labs(title = "Cantidad de delitos por barrio",
       fill = NULL,
       y = NULL,
       x = NULL,
       caption = ("Fuente: Delitos 2019-21")) +
  theme(plot.margin = margin(15, 5, 15, 5),
        aspect.ratio = .35,
        panel.grid.major = element_line(color = "gray80",
                                        linetype = "dashed"),        
        panel.background = element_rect(fill = "gray100",
                                        colour = "gray100",
                                        size = 2,
                                        linetype = "solid"),

        plot.title = element_text(size = 10,
                                  face = "bold",
                                  hjust = .5,
                                  vjust = 2.5,
                                  colour = "gray20"),
        plot.caption = element_text(size = 5,
                                    colour = "gray20"),
        axis.title.x = element_text(size = 7.5,
                                    colour = "gray20"),
        axis.text.x = element_text(size = 5,
                                    colour = "gray20",
                                   angle = 90),
        axis.text.y = element_text(size = 5,
                                    colour = "gray20"),
        legend.position = "top",
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20"),
        legend.spacing.x = unit(.5, 'cm')
        ) +
        guides(fill = guide_legend(override.aes = list(size = 5),
                                   label.position = "bottom"))

Efectivamente, este gráfico permite observar la gran disminución relativa de denuncias en el barrio de San Nicolás. Además, se reconoce una situación similar en los barrios Monserrat y Retiro. Puede notarse, por otro lado, que la proporción del total de los crímenes denunciados durante el año 2020, año de la pandemia y de las medidas sanitarias más estrictas, resulta similar en todos los barrios.


Mapa Coroplético de delitos por año

Se realiza un mapa coroplético discriminado por año para analizar el tópico introducido en el apartado anterior.

geodf_barrio_anio <- left_join(geodf_barrios, df_barrio_anio, by = "BARRIO")
ggplot() +
  geom_sf(data = geodf_barrio_anio, aes(fill = denuncias), color = "white", size = 0.25) +
  facet_wrap(vars(anio), nrow = 1) +
  scale_fill_distiller(palette = "YlOrRd", direction = 1, name = "Denuncias") +
  theme_light() +
  labs(title = "Distribución de los crímenes denunciados en CABA 2019-2021 por barrio ",
       caption = ("Fuente: Delitos 2019-2021")) +
  theme(plot.margin = margin(15, 5, 15, 5),
        aspect.ratio = 1,
        panel.grid.major = element_line(color = "gray80",
                                        linetype = "dashed"),
        panel.background = element_rect(fill = "white",
                                        colour = "gray100",
                                        size = 2,
                                        linetype = "solid"),
        plot.title = element_text(size = 10,
                                  face = "bold",
                                  hjust = .5,
                                  vjust = 2.5,
                                  colour = "gray20"),
        plot.caption = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.x = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.y = element_text(size = 5,
                                    colour = "gray20"),
        legend.position = "right",
        legend.title = element_text(size = 10,
                                    colour = "gray20"),
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20")
        )

La comparativa de los tres gráficos permite comprobar la disminución de denuncias durante el año 2020, de manera proporcional y en todos los barrios. Además, aporta otra muestra de la disminución de denuncias en el barrio San Nicolás, y sus aledaños, en el año 2021, en relación al resto de los barrios de CABA.


Mapa Coroplético de delitos por superficie

Se realiza un mapa coroplético evaluando el ratio de denuncias en función de la superficie de cada uno de los barrios.

geodf_barrio_area <- geodf_barrio_anio %>%
  group_by(BARRIO, area_km2) %>% 
  summarise(denuncias = sum(DENUNCIAS)) %>% 
  mutate(c_km2 = round(denuncias/area_km2, digits = 1))
ggplot() +
  geom_sf(data = geodf_barrio_area, aes(fill = c_km2), color = "white", size = 0.25) +
  scale_fill_distiller(palette = "YlOrRd", direction = 1, name = "denuncias/km2") +
  theme_light() +
  labs(title = "Ratio de los crímenes denunciados por superficie en CABA 2019-2021 por barrio",
       caption = ("Fuente: Delitos 2019-2021")) +
  theme(plot.margin = margin(15, 5, 15, 5),
        aspect.ratio = 1,
        panel.grid.major = element_line(color = "gray80",
                                        linetype = "dashed"),
        panel.background = element_rect(fill = "white",
                                        colour = "gray100",
                                        size = 2,
                                        linetype = "solid"),
        plot.title = element_text(size = 10,
                                  face = "bold",
                                  hjust = .5,
                                  vjust = 2.5,
                                  colour = "gray20"),
        plot.caption = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.x = element_text(size = 5,
                                    colour = "gray20"),
        axis.text.y = element_text(size = 5,
                                    colour = "gray20"),
        legend.position = "right",
        legend.title = element_text(size = 10,
                                    colour = "gray20"),
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20")
        )

Se observa en el gráfico, y en relación a los generados en los apartados anteriores, que el ratio de crímenes denunciados en función de la superficie de cada barrio, se reduce de manera casi lineal, desde el centro de la ciudad hacia el cordón perimetral. Esta situación se encuentra asociada a la distribución de la población en el territorio y al aumento del área de los barrios hacia las afueras de CABA.