library(knitr)
knitr::opts_chunk$set(warning = FALSE, message = FALSE)
library(tidyverse)
library(sf)
library(ggmap)
library(kableExtra)
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
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()
``
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.