library(tidyverse)
library(sf)
library(ggrepel)
Diagrama de dispersión
Siguiendo con la idea de ayudar al usuario a poder identificar cómo han ido variando los delitos en el tiempo, ahora vamos a hacer un diagrama de dispersión (scatterplot) en el que vamos a comparar los incidentes de los últmos dos meses en la base de datos (julio y agosto de 2022) para un delito en específico.
Una vez más, empezamos por cargar los paquetes que vamos a usar:
Ahora podemos leer y explorar la base de donde vamos a sacar esta gráfica.
<- read_rds("01_input/mapa_simplificado.rds")
base_mapa Encoding(base_mapa$subtipo_de_delito) <- "latin1"
Encoding(base_mapa$entidad) <- "latin1"
head(base_mapa)
fecha | subtipo_de_delito | clave_ent | entidad | Total | CVEGEO | NOMGEO | geometry |
---|---|---|---|---|---|---|---|
2022-07-01 | Robo a casa habitación | 01 | Aguascalientes | 164 | 01 | Aguascalientes | MULTIPOLYGON (((-102.2417 2… |
2022-07-01 | Robo a casa habitación | 02 | Baja California | 294 | 02 | Baja California | MULTIPOLYGON (((-112.3 28.3… |
2022-07-01 | Robo a casa habitación | 03 | Baja California Sur | 120 | 03 | Baja California Sur | MULTIPOLYGON (((-109.8051 2… |
2022-07-01 | Robo a casa habitación | 04 | Campeche | 120 | 04 | Campeche | MULTIPOLYGON (((-90.45286 2… |
2022-07-01 | Robo a casa habitación | 05 | Coahuila de Zaragoza | 140 | 05 | Coahuila de Zaragoza | MULTIPOLYGON (((-102.2657 2… |
2022-07-01 | Robo a casa habitación | 06 | Colima | 123 | 06 | Colima | MULTIPOLYGON (((-114.7019 1… |
Esta base es muy similar a la que usamos en la serie de tiempo, sólo que viene desagregada por entidad de la república, entonces tenemos una serie de tiempo para cada estado.
El diagrama de dispersión que vamos a hacer compara un mes con el mes anterior, para ayudar al usuario en la comparación, vamos a agregar una diagonal que representa el caso en el que no hubo cambios entre los meses. Para agregar esta diagonal, necesitamos calcular el máximo para el delito seleccionado por el usuario:
<- base_mapa %>%
eje filter(subtipo_de_delito=="Homicidio doloso") %>%
filter(Total==max(Total))
eje
fecha | subtipo_de_delito | clave_ent | entidad | Total | CVEGEO | NOMGEO | geometry |
---|---|---|---|---|---|---|---|
2022-07-01 | Homicidio doloso | 11 | Guanajuato | 298 | 11 | Guanajuato | MULTIPOLYGON (((-101.3059 2… |
Ya con este valor calculado, vamos primero a procesar los datos para hacer nuestra gráfica. Queremos, en lugar de la serie de tiempo, un DataFrame que tenga las entidades en las filas y dos columnas con los valores que corresponden a las fechas que queremos comparar. Para eso, lo que tenemos que hacer es pivotear las tablas y pasar las fechas (que están en renglones) a columnas:
%>%
base_mapa filter(subtipo_de_delito=="Homicidio doloso") %>%
st_drop_geometry() %>%
pivot_wider(id_cols = c('clave_ent','entidad'),
names_from = 'fecha',
values_from = 'Total')
clave_ent | entidad | 2022-07-01 | 2022-08-01 |
---|---|---|---|
01 | Aguascalientes | 7 | 11 |
02 | Baja California | 265 | 234 |
03 | Baja California Sur | 2 | 3 |
04 | Campeche | 9 | 1 |
05 | Coahuila de Zaragoza | 13 | 6 |
06 | Colima | 57 | 75 |
07 | Chiapas | 42 | 32 |
08 | Chihuahua | 200 | 202 |
09 | Ciudad de México | 67 | 79 |
10 | Durango | 11 | 14 |
11 | Guanajuato | 298 | 251 |
12 | Guerrero | 128 | 92 |
13 | Hidalgo | 26 | 17 |
14 | Jalisco | 193 | 175 |
15 | México | 210 | 221 |
16 | Michoacán de Ocampo | 166 | 180 |
17 | Morelos | 99 | 88 |
18 | Nayarit | 13 | 9 |
19 | Nuevo León | 120 | 155 |
20 | Oaxaca | 89 | 115 |
21 | Puebla | 82 | 90 |
22 | Querétaro | 16 | 11 |
23 | Quintana Roo | 51 | 55 |
24 | San Luis Potosí | 47 | 51 |
25 | Sinaloa | 37 | 33 |
26 | Sonora | 141 | 131 |
27 | Tabasco | 29 | 27 |
28 | Tamaulipas | 41 | 51 |
29 | Tlaxcala | 9 | 12 |
30 | Veracruz de Ignacio de la Llave | 86 | 98 |
31 | Yucatán | 4 | 4 |
32 | Zacatecas | 123 | 101 |
Ahora sí, ya con los datos bien acomodados, podemos hacer la gráfica que queremos:
%>%
base_mapa filter(subtipo_de_delito=="Homicidio doloso") %>%
st_drop_geometry() %>%
pivot_wider(id_cols = c('clave_ent','entidad'),
names_from = 'fecha',
values_from = 'Total') %>%
ggplot(aes(`2022-07-01`,`2022-08-01`))+
geom_point()+
scale_y_continuous(limits = c(0,eje$Total))+
scale_x_continuous(limits = c(0,eje$Total))+
geom_abline()+
theme_classic()+
::geom_text_repel(aes(label=entidad)) ggrepel
Warning: ggrepel: 10 unlabeled data points (too many overlaps). Consider
increasing max.overlaps
Todos los puntos que quedan por debajo de la diagonal nos indican una disminución en el último mes, mientras que por encima nos indican un aumento.