En el análisis espacial tenemos una larga tradición de software especializado para el estudio de la dependencia y la proximidad espacial de áreas, como Geoda y Qgis. Sin embargo, es difícil realizar un análisis de patrón de puntos espaciales sin utilizar polígonos en este tipo de software. Afortunadamente R, con sus librerias especializadas en patrones de puntos, nos ofrece una buena alternativa para el análisis espacial.
La criminología ha analizado el impacto de las medidas de confinamiento en las ciudades alrededor del mundo. Algunas investigaciones encuentran reducciones significativas en la frecuencia y la distribución de ciertos delitos, pero los resultados varían por ciudad y región. ¿Qué pasó en la Ciudad de México con los reportes de disparos?
Para tratar de responder la pregunta, utilicemos la base de datos disponible en un archivo rar llamado “Tutoriales” (descarga directa), el cual contiene los tweets sobre disparos previos a la pandemia (2018-2019) y un archivo con el área de la Ciudad de México. Las bases de datos provienen de una investigación propia publicada en el International Journal of Geo-Information y puede consultarse acá con más detalle.
Trabajaremos con los archivos espaciales (shapefiles) que contienen el área de la Ciudad de México y los tweets de balazos, pero es fundamental copiar y pegar todos los archivos a la misma carpeta de trabajo (dbf, prj, qpj, etc), ya que contienen información geográfica necesaria para el funcionamiento del código.
Además, necesitamos instalar y cargar las siguientes librerías espaciales:
# install.packages("spatstat")
# install.packages("sf")
# install.packages("maptools")
# install.packages("raster")
library(spatstat)
library(sf)
library(maptools)
library(raster)
Una vez que tengamos las librerías cargadas y ambos archivos en nuestro equipo (shapefiles y demás archivos), necesitamos cargarlos al entorno de Rstudio donde trabajaremos. Asignamos los archivos a objetos para su visualización y análisis con la función st_read y posteriormente usamos as.owin para cambiar la clase de Ciudad de México y la función ppp para los tweets sobre disparos.
cdmx <- st_read("cdmx utm.shp")
## Reading layer `cdmx utm' from data source `C:\Users\enriq\Documents\2023\Tutoriales\cdmx utm.shp' using driver `ESRI Shapefile'
## Simple feature collection with 16 features and 4 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 461655.7 ymin: 2106166 xmax: 506274.7 ymax: 2166422
## Projected CRS: Mexico ITRF2008 / UTM zone 14N
cdmx <- as.owin(cdmx)
cdmx.km <-rescale(cdmx, 1000)
La función st_read asigna el archivo shapefile al objeto cdmx (abreviatura de la Ciudad de México). Como resultado, dicha función muestra información útil del archivo, por ejemplo, la proyección cartográfica, que en este caso es “UTM zone 14N”. Con otras bases de datos, es necesario manejarlas previamente para homologar ambas proyeccciones antes de utilizarlas en R. El software Qgis puede ser una buena opción para ello.
La segunda línea del código convierte cdmx a un objeto de clase owin. La línea final reescala el área de la Ciudad de México a kilómetros en un archivo que titulamos cdmx.km para facilitar su visualización posterior.
Realizamos el mismo procedimiento de lectura con st_read, pero convertimos el archivo de puntos espaciales en un objeto ppp, además de que agregamos la función marks y reescalamos.
balazos <- st_read("balazos 2018-2019 utm.shp")
## Reading layer `balazos 2018-2019 utm' from data source `C:\Users\enriq\Documents\2023\Tutoriales\balazos 2018-2019 utm.shp' using driver `ESRI Shapefile'
## Simple feature collection with 141 features and 6 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 472644.2 ymin: 2122913 xmax: 499472.6 ymax: 2154590
## Projected CRS: Mexico ITRF2008 / UTM zone 14N
balazos <- as.ppp(balazos)
marks(balazos) <- NULL
balazos <- rescale(balazos, 1000)
La función st_read también nos muestra información útil del archivo, como la proyección geográfica (CRS), que es la misma para este archivo y para el anterior cdmx (UTM zone 14N).
Una vez que tenemos nuestros dos objetos espaciales podemos graficarlos en el mismo sistema de coordenadas proyectadas con la instrucción plot de R base. Además, podemos utilizar otros argumentos que conozcamos de plot para manejar el gráfico. Aquí solo se muestra la función básica.
plot(balazos)
Enmarquemos el gráfico de balazos dentro del contorno de la Ciudad de México, con nuestro archivo cdmx.km. Hay que correr las siguientes líneas de forma simultánea. Es necesario notar que Window es una de las pocas funciones que usa la primera letra en mayúscula: es W no w.
Window(balazos) <- cdmx.km
plot(balazos, main = "Tweets sobre disparos en CDMX")
La función npoints nos revela que hay 141 tweets que reportan disparos. Sin embargo, ¿Cómo están distribuidos los tweets en la CDMX?
npoints(balazos)
## [1] 141
Este tipo de mapas es idóneo para visualizar la concentración del fenómeno de estudio en el área de interés. Con el siguiente código que utiliza la función quadratcount podemos utilizar una retícula de 5 columnas por 6 filas y ordenar a R que nos muestre un conteo de tweets sobre los cuadrados que creamos en la CDMX.
qu <- quadratcount(balazos, nx = 5 , ny = 6)
plot(balazos, pch=20, cols="red", main = NULL)
plot(qu, add =TRUE)
Una variación estética del mapa anterior es introducir el canal de color. Con la función intensity podemos incorporar este elemento y mostrar la intensidad del fenómeno espacial en una gama de amarillo hasta azul, que representa la intensidad de los reportes de mayor a menor.
qu.densidad <- intensity(qu)
plot(intensity(qu, image=TRUE), main = NULL, las=1)
plot(balazos, pch=20, cex=0.6, col=rgb(0,0,0,.5), add=TRUE)
El mapa muestra una concentración de disparos en el poniente de la CDMX, que corresponde a la alcaldía de Miguel Hidalgo, además de otros posibles clústeres menores en el centro y oriente de la ciudad.
Hay que tener cuidado con la interpretación de los mapas que hemos diseñado, ya que en este primer tutorial, aún no hemos realizado un análisis estadístico, más allá de un conteo simple de frecuencias. Es necesario probar si el patrón espacial observado es aleatorio o no lo es, ya que podemos estar engañados por nuestros propios mapas y tal vez vemos una concentración resultado del azar.
Al respecto, aquí hay un ensayo interesante sobre “Mentir con mapas” sobre las elecciones locales de 2021 en la Ciudad de México.
En la segunda y tercera parte de este tutorial se presenta el análisis espacial y el estudio de significancia de los datos utilizados en este código. Además de responder la pregunta ¿Cambió el patrón de tweets sobre disparos durante la pandemia? Spoiler: problamente sí.
Si quieres invitarme un café por este trabajo, invítame uno real (porque no tengo patreon). Ya en serio, quiero agradecer a todos mis profesores y profesoras de R y análisis espacial: en el LNPP, en el Seminario de UCSD y a la gran comunidad de anális de datos y políticas públicas en twitter.
Lawrence, T., Baddeley, A., Milne, R. K., & Nair, G. (2016). Point pattern analysis on a region of a sphere. Stat, 5(1), 144-157.
García-Tejeda, E., Fondevila, G., & Siordia, O. S. (2021). Spatial Analysis of Gunshot Reports on Twitter in Mexico City. ISPRS International Journal of Geo-Information, 10(8), 540.
Autómata Geointeligente De Internet (2020). CentroGeo