1. Introducción y Preparación de Datos

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:

  1. Base de Datos Abiertos: Consumo directo de los datos de la Fiscalía General de Justicia de la CDMX.
  2. Base de Datos Académicos: Análisis multicapa utilizando la base de datos de Violencia del Crimen Organizado en México (OCVED).

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)    


SECCIÓN A

2. Datos Abiertos FGJ CDMX

2.1. Extracción y Limpieza

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)

2.1.2. Exploración de Datos

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

2.2. Visualización Geográfica: Robo de Accesorios de Auto

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))

2.2.1. Mapa A.1: Dispersión de Puntos Simples

Ubicación de cada carpeta de investigación en el territorio.

leaflet() %>% 
  addProviderTiles(providers$CartoDB) %>% 
  addCircles(
    data = d1,
    lng = ~longitud,
    lat = ~latitud
  )

2.2.2. Mapa A.2: Agrupación Espacial mediante Clústeres

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() 
  )


SECCIÓN B

3. Análisis Multicapa con Datos OCVED

Base de datos: Organized Crime Violence in Mexico (OCVED)
Créditos: Javier Osorio Fuente: https://github.com/javierosorio/OCVED_2.0

3.1. Carga de Datos Locales

ocved <- read_xlsx("~/Desktop/Rstudio Spacial Data Analysis Lab/OCVED_2.0.xlsx") %>% 
  mutate(latitude = as.numeric(latitude),
         longitude = as.numeric(longitude))

3.2. Mapa Interactivo

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
  )