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



Geoprocesamiento de Datos

Los dataset utilizados corresponden por un lado, a los crímenes denunciados en la ciudad Autónoma de Buenos Aires durante los años 2019, 2020 y 2021, y por otro lado a las comisarías ubicadas en la misma. Ambos fueron descargados 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_pstation <- read.csv("data/comisarias.csv", stringsAsFactors = TRUE)
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

Preparación de la Información

Scatterplot de delitos y comisarías

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, incorporando en una capa subsiguiente la posición de las comisarías.

ggplot() +
  geom_sf(data = geodf_barrios, fill = NA, color = "gray60", size = 0.25) +
  geom_point(data = df_crimes, aes(x = lon, y = lat), color = "#e08214", size = 0.5, alpha = 0.02) + 
  geom_point(data = df_pstation, aes(x = lon, y = lat), alpha = 1, shape = 20, color = "#542788") +
  theme_void()

Esta previsualización 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. Por otro lado, se observa en general, que la distribución de las comisarías se corresponde con los sectores con mayor cantidad de denuncias. Esto da cuenta de una correcta decisión, a priori, de la disposición de las mismas.


Descarga del mapa base

Se descarga el ‘stamenmap’ base de la Ciudad Autónoma de Buenos Aires para utilizar de referencia en el desarrollo posterior del ejercicio. Esta operación se realiza mediante la generación de un ‘bounding box’ a partir de la geometría de los barrios descargada de la feunte del ejercicio.

bbox_caba <- as.numeric(st_bbox(geodf_barrios))
basemap_caba <- get_stamenmap(bbox = bbox_caba,
                              maptype = "terrain-lines",
                              zoom = 12)
ggmap(basemap_caba) +
  theme_void()


Transformación de los datos a datos espaciales

Se transforman los datos de delitos y comisarías 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.

geodf_crimes <- df_crimes %>%
  filter(!is.na(df_crimes$lon) & !is.na(df_crimes$lat)) %>% 
  st_as_sf(coords = c("lon", "lat"), crs = 4326)

geodf_pstation <- df_pstation %>%
  filter(!is.na(df_pstation$lon) & !is.na(df_pstation$lat)) %>% 
  st_as_sf(coords = c("lon", "lat"), crs = 4326)
geodf_crimes %>% 
  head(5) %>% 
  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)
geodf_crimes %>% 
  head(5) %>% 
  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)

Conversión de los datos espaciales a ‘POSGAR 94 / Argentina 6’

Se convierten ambos dataset de tipo espacial generados, delitos y comisarías, reproyectandolo en el sistema de coordenadas POSGAR 94 para poder realizar operaciones espaciales en la unidad de medida ‘metros’.

geodf_crimes_posgar <- geodf_crimes %>% 
  st_transform(crs = 32610)

geodf_pstation_posgar <- geodf_pstation %>% 
  st_transform(crs = 32610)
st_crs(geodf_pstation_posgar)$units
## [1] "m"

Cálculo y gráfica de buffer para cada comisaría

Se convierten ambos dataset de tipo espacial generados, delitos y comisarías, reproyectandolo en el sistema de coordenadas POSGAR 94 para poder realizar operaciones espaciales en la unidad de medida ‘metros’.

buffer_pstation <- geodf_pstation_posgar %>% 
  st_buffer(1000)
ggbuffer_pstation <- buffer_pstation %>% 
  st_transform(crs = 4326)
ggplot() +
  geom_sf(data = geodf_barrios, inherit.aes = FALSE, fill = NA, color = "gray60", size = 0.25) +
  geom_sf(data = ggbuffer_pstation, fill = "#542788", color = "#8073ac", alpha = 0.1) +
  geom_point(data = df_pstation, aes(x = lon, y = lat), alpha = 1, shape = 20, color = "#542788") +
  theme_void()


Gráfica de crímenes y comisarías sobre mapa de CABA

Antes de comenzar el análisis exploratorio a partir de procesar la información recibida, se realiza un gráfico plasmando toda la información disponible: comisarías con su radio de influencia y crímenes denunciados sobre el mapa obtenido de ‘stamenmap’ de CABA.

ggmap(basemap_caba) +
  geom_point(data = df_crimes, aes(x = lon, y = lat), color = "#e08214", size = 0.5, alpha = 0.02) + 
#  geom_sf(data = geodf_barrios, inherit.aes = FALSE, fill = NA, color = "gray40", size = 0.25) +
  geom_sf(data = ggbuffer_pstation, inherit.aes = FALSE, fill = "#542788", color = "#8073ac", alpha = 0.1) +
  geom_point(data = df_pstation, aes(x = lon, y = lat), alpha = 1, shape = 20, color = "#542788") +
  theme_void()

``


Análisis Exploratorio de los Datos

Conteo de crímenes por radio de influencia

Mediante el procesamiento geográfico de los datos se obtiene la cantidad de crímenes que ocurrieron dentro del radio de influencia de cada comisaría determinado en 1 km a la redonda. De esta manera averiguamos cuales son las 5 comisarías con mayor solicitación de denuncias dentro de su buffer.

df_crimes_inbuffer <- st_intersection(geodf_crimes_posgar, buffer_pstation)
df_crimes_inbuffer %>%
  head(5) %>%
  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 id nombre calle altura calle2 direccion telefonos observaciones observaciones_2 barrio comuna.1 codigo_postal codigo_postal_argentino geometry
204 01/01/20 20 2020 enero 2020-01 Hurto (sin violencia) 1 NA Comisaria Vecinal 1-D 1 Comisaria Vecinal 1-D Lavalle 451 LAVALLE 451 4322-8033/8221 NA SAN NICOLAS 1 1047 C1047AAI POINT (6616787 -6457289)
209 01/01/20 10 2020 enero 2020-01 Robo (con violencia) Arma de fuego 1 NA Comisaria Vecinal 1-D 1 Comisaria Vecinal 1-D Lavalle 451 LAVALLE 451 4322-8033/8221 NA SAN NICOLAS 1 1047 C1047AAI POINT (6617392 -6457119)
210 01/01/20 1 2020 enero 2020-01 Robo (con violencia) 1 NA Comisaria Vecinal 1-D 1 Comisaria Vecinal 1-D Lavalle 451 LAVALLE 451 4322-8033/8221 NA SAN NICOLAS 1 1047 C1047AAI POINT (6617552 -6457261)
215 01/01/20 4 2020 enero 2020-01 Robo (con violencia) Arma cortante 1 NA Comisaria Vecinal 1-D 1 Comisaria Vecinal 1-D Lavalle 451 LAVALLE 451 4322-8033/8221 NA SAN NICOLAS 1 1047 C1047AAI POINT (6617649 -6458447)
216 01/01/20 23 2020 enero 2020-01 Lesiones Siniestro Vial 1 NA Comisaria Vecinal 1-D 1 Comisaria Vecinal 1-D Lavalle 451 LAVALLE 451 4322-8033/8221 NA SAN NICOLAS 1 1047 C1047AAI POINT (6617653 -6458453)
crimes_per_pstation <- df_crimes_inbuffer %>% 
  st_set_geometry(NULL) %>% 
  group_by(nombre) %>% 
  summarise(cantidad = n()) %>% 
  arrange(desc(cantidad))
crimes_per_pstation %>%
  head(5) %>%
  kbl(align = "c", longtable = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "condensed"), font_size = 11)
nombre cantidad
Comisaria Vecinal 3-A 8463
Comisaria Comunal 3 6505
Comisaria Vecinal 2-B 6068
Comisaria Vecinal 1-C (edificio anexo) 6046
Comisaria Vecinal 1-D 5977

Se observa, tras el procesamiento, cuales son las 5 comisarías con más crímenes denunciados dentro de un radio de influencia de 1km a la redonda.


Gráfica de las comisarías más solicitadas

Se grafican las 5 comisarías con mayor cantidad de crímenes denunciados a su alrededor para conocer su ubicación dentro de la ciudad y la cercanía entre ellas.

ggmap(basemap_caba) +
  geom_sf(data = ggbuffer_pstation %>% 
            filter(nombre %in% head(crimes_per_pstation, 5)$nombre),
          inherit.aes = FALSE, fill = "#542788", color = "#8073ac", alpha = 0.1) +
  geom_point(data = df_pstation %>% 
            filter(nombre %in% head(crimes_per_pstation, 5)$nombre),
            aes(x = lon, y = lat), alpha = 1, shape = 20, color = "#542788") +
  theme_void()

A partir de la gráfica se observa que las zonas en las que se ubican las comisarías con mayor cantodad de denuncias dentro de su radio de influencia se ubican próximas entre sí, en el barrio San Nicolás y aledaños, y en el entorno de la facultad de ciencias sociales. Esta situación es lógica debido al descubrimiento del ejercicio anterior, en el que se percibía la gran superioridad de crímenes por cada 1000 habitantes que había en esas zonas.


Gráfica de mapa de densidad de delitos

Se realiza un mapa de densidad de delitos en la ciudad de CABA y se proyecta sobre el mapa y la geometría de los barrios que la componen. El mapa de densidad sirve para observar cuales son los puntos más críticos dentro del panorama. A su vez, se proyectan sobre este las comisarías con sus respectivos radios de influencia desarrollados en el apartado anterior.

geodf_caba <- geodf_barrios %>% 
  st_buffer(0.001) %>% 
  mutate(ciudad = "CABA") %>% 
  st_make_valid() %>% 
  group_by(ciudad) %>% 
  summarise(geometry = sf::st_union(geometry)) %>% 
  ungroup()
ggplot() +
  geom_sf(data = geodf_barrios, fill = NA, color = "gray80", size = 0.25) +
  geom_sf(data = geodf_caba, fill = NA, color = "gray60", size = 0.25) +
  theme_void()

ggmap(basemap_caba) +
  stat_density2d(data = geodf_crimes %>% 
                   cbind(st_coordinates(geodf_crimes)), #%>% 
#                   sample_n(1000),
                 aes(x = X, y = Y, fill = ..density..),
                 geom = "tile", contour = geodf_caba, alpha = 0.5) +
  geom_sf(data = geodf_barrios, inherit.aes = FALSE, fill = NA, color = "gray55", size = 0.01) +
  geom_sf(data = geodf_caba, inherit.aes = FALSE, fill = NA, color = "gray45", size = .01) +
  geom_sf(data = ggbuffer_pstation, inherit.aes = FALSE, fill = "#542788", color = "#8073ac", alpha = 0.1) +
  geom_point(data = df_pstation, aes(x = lon, y = lat), alpha = 1, shape = 20, color = "#542788") +
  scale_fill_distiller(palette = "YlOrRd", direction = 1, name = "crimenes") +
  theme_light() +
  labs(title = "Densidad de crímenes denunciados en CABA 2019-2021",
       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.title = element_text(size = 10,
                                    colour = "gray20"),
        legend.text  = element_text(size = 7.5,
                                    colour = "gray20")
        )

El mapa de densidad permite observar que las zonas más críticas están relativamente bien servidas por la ubicación de las comisarías. Si se detectan zonas comprometidas fuera del radio de influencia de cualquier comisaría pero inmediatamente aledañas a más de un buffer de ellas, por lo que pensar en relocalizar alguna de las comisarías no tendría gran impacto en relación al costo que supone.