En este primer documento se explorará cómo utilizar el ecosistema de RStudio para transformar bases de datos en visualizaciones espaciales interactivas. El análisis territorial es fundamental para el diseño y evaluación de políticas públicas.
El ejercicio se dividirá en dos bloques:
Comenzaremos por cargar nuestro entorno de trabajo. Utilizaremos
tidyverse para la limpieza de datos, leaflet
para el motor cartográfico, y readxl para importar bases
locales.
library(tidyverse)
library(leaflet)
library(readxl)
Conectaremos nuestro script al portal de datos abiertos para descargar el registro de víctimas de 2024. Posteriormente, seleccionaremos únicamente las coordenadas y el tipo de delito.
fgj <- read_csv("https://archivo.datos.cdmx.gob.mx/FGJ/victimas/victimasFGJ_2024.csv")
# Selección de columnas de interés
fgj_corto <- fgj %>%
select(delito, latitud, longitud)
Veamos la tabla con el “Top 10” de los delitos más frecuentes en esta base de datos:
# Exploración de la frecuencia de los delitos
fgj_corto %>%
count(delito, sort = TRUE) %>%
head(10) %>%
knitr::kable(col.names = c("Tipo de Delito", "Frecuencia"))
| Tipo de Delito | Frecuencia |
|---|---|
| VIOLENCIA FAMILIAR | 23841 |
| FRAUDE | 13795 |
| AMENAZAS | 12711 |
| ROBO DE ACCESORIOS DE AUTO | 5694 |
| ROBO DE OBJETOS | 5228 |
| USURPACIÓN DE IDENTIDAD | 4480 |
| ROBO DE OBJETOS DEL INTERIOR DE UN VEHICULO | 3763 |
| ROBO A TRANSEUNTE EN VIA PUBLICA CON VIOLENCIA | 3667 |
| ABUSO SEXUAL | 2798 |
| DESPOJO | 2285 |
Aislaremos un delito patrimonial específico asegurándonos de
descartar registros sin coordenadas válidas (NA).
d1 <- fgj_corto %>%
filter(delito == "ROBO DE ACCESORIOS DE AUTO") %>%
filter(!is.na(latitud), !is.na(longitud))
Ubicación de cada carpeta de investigación en el territorio.
leaflet() %>%
addProviderTiles(providers$CartoDB) %>%
addCircles(
data = d1,
lng = ~longitud,
lat = ~latitud
)
Agrupamos los incidentes mediante clústeres dinámicos para evitar la saturación visual.
leaflet() %>%
addProviderTiles(providers$CartoDB) %>%
addCircleMarkers(
data = d1,
lng = ~longitud,
lat = ~latitud,
clusterOptions = markerClusterOptions()
)
Base de datos: Organized Crime Violence in Mexico (OCVED)
Créditos: Javier Osorio Fuente: https://github.com/javierosorio/OCVED_2.0
ocved <- read_xlsx("~/Desktop/Rstudio Spacial Data Analysis Lab/OCVED_2.0.xlsx") %>%
mutate(latitude = as.numeric(latitude),
longitude = as.numeric(longitude))
Se aplican colores categóricos, un fondo oscuro y un panel de control de capas. Además, expandiremos el mapa para una mejor exploración.
# Creación de la paleta de colores para el tipo de actor
paleta_actores <- colorFactor(
palette = "Set1",
domain = ocved$actor_main
)
# Renderización del mapa
leaflet(data = ocved, width = "110%", height = "700px") %>%
addProviderTiles(providers$CartoDB.DarkMatter) %>%
addCircleMarkers(
lng = ~longitude,
lat = ~latitude,
group = ~actor_main,
color = ~paleta_actores(actor_main),
fillColor = ~paleta_actores(actor_main),
radius = 5,
stroke = TRUE,
weight = 1,
opacity = 1,
fillOpacity = 0.8,
label = ~paste("Actor:", actor_main)
) %>%
addLayersControl(
overlayGroups = unique(ocved$actor_main),
options = layersControlOptions(collapsed = FALSE)
) %>%
addLegend(
position = "bottomright",
pal = paleta_actores,
values = ~actor_main,
title = "Tipo de Actor (OCVED)",
opacity = 1
)