Total de Víctimas ENVIPE (2024)

Author

Isaías M - Entropía

Introducción

La Encuesta Nacional de Victimización y Percepción sobre Seguridad Pública (ENVIPE) 2024 es la décima cuarta entrega de la serie estadística generada por el Subsistema Nacional de Información de Gobierno, Seguridad Pública e Impartición de Justicia (SNIGSPIJ), coordinada por el Instituto Nacional de Estadística y Geografía (INEGI). Con este proyecto se da continuidad a las temáticas abordadas en las ediciones anteriores de esta encuesta, cuyos resultados han sido declarados Información de Interés Nacional por la Junta de Gobierno del INEGI. (INEGI, 2024)

Para mayor información y descarga de datos, cuestionarios, etcétera visite el enlace: ENVIPE

Puedes ir al repositorio en este enlace: Tabluados ENVIPE

1. Carga de librerías

library(readr)       # Nos  ayuda a leer archivos en formato Excel
library(dplyr)       # Permite el uso de pipes |> los que conectan funciones

Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(janitor)     # Limpieza de columnas 

Adjuntando el paquete: 'janitor'
The following objects are masked from 'package:stats':

    chisq.test, fisher.test
library(srvyr)       # Análisis de muestras complejas 

Adjuntando el paquete: 'srvyr'
The following object is masked from 'package:stats':

    filter
library(stringr)     # Trabajar con cadenas de texto
suppressPackageStartupMessages(library(here))

2. Lectura de archivos

Creamos una variable llamada df (dataframe) que contiene los datos de la tabla TPer_Vic2 que es la que contiene las variables para estimar la cantidad de hogares y víctimas. Al correr la función head() nos dará los primeros n registros que le pidamos, eso ayuda a visualizar si los datos se cargaron adecuadamente.

df <- read_csv( here('datos/datos-originales/TPer_Vic2.csv') )
New names:
• `` -> `...1`
Warning: One or more parsing issues, call `problems()` on your data frame for details,
e.g.:
  dat <- vroom(...)
  problems(dat)
Rows: 89630 Columns: 150
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (36): ID_VIV, ID_HOG, ID_PER, UPM, VIV_SEL, HOGAR, RESUL_H, R_SEL, AREAM...
dbl (37): ...1, SEXO, EDAD, AP6_1_1, AP6_2, AP6_3, AP6_4_01, AP6_5_01, AP6_4...
lgl (77): AP6_10_2, AP6_11_1, AP6_12_1, AP6_13_1_1, AP6_13_1_2, AP6_13_1_3, ...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Mostramos el encabezado de las primeras filas.

kableExtra::kable(head(df , 3), caption = "Encabezado de las tres primeras filas.") 
Encabezado de las tres primeras filas.
…1 ID_VIV ID_HOG ID_PER UPM VIV_SEL HOGAR RESUL_H R_SEL SEXO EDAD AREAM CVE_ENT NOM_ENT CVE_MUN NOM_MUN AP6_1_1 AP6_1_2 AP6_2 AP6_3 AP6_4_01 AP6_5_01 AP6_6_01 AP6_4_02 AP6_5_02 AP6_6_02 AP6_4_03 AP6_6_03 AP6_4_04 AP6_6_04 AP6_7 AP6_8 AP6_9 AP6_10_1 AP6_10_2 AP6_11_1 AP6_12_1 AP6_13_1_1 AP6_13_1_2 AP6_13_1_3 AP6_13_1_4 AP6_11_2 AP6_12_2 AP6_13_2_1 AP6_13_2_2 AP6_13_2_3 AP6_13_2_4 AP6_11_3 AP6_12_3 AP6_13_3_1 AP6_13_3_2 AP6_13_3_3 AP6_13_3_4 AP6_11_4 AP6_12_4 AP6_13_4_1 AP6_13_4_2 AP6_13_4_3 AP6_13_4_4 AP6_11_5 AP6_12_5 AP6_13_5_1 AP6_13_5_2 AP6_13_5_3 AP6_13_5_4 AP6_11_6 AP6_12_6 AP6_13_6_1 AP6_13_6_2 AP6_13_6_3 AP6_13_6_4 AP6_11_7 AP6_12_7 AP6_13_7_1 AP6_13_7_2 AP6_13_7_3 AP6_13_7_4 AP6_14 AP6_15_1 AP6_15_2 AP6_16_1 AP6_17_1 AP6_18_1 AP6_16_2 AP6_17_2 AP6_18_2 AP6_16_3 AP6_17_3 AP6_18_3 AP6_16_4 AP6_17_4 AP6_18_4 AP6_16_5 AP6_17_5 AP6_18_5 AP6_16_6 AP6_17_6 AP6_18_6 AP6_16_7 AP6_17_7 AP6_18_7 AP6_19 AP6_20_1 AP6_20_2 AP6_21_1 AP6_22_1 AP6_21_2 AP6_22_2 AP6_21_3 AP6_22_3 AP6_21_4 AP6_22_4 AP6_21_5 AP6_22_5 AP6_21_6 AP6_22_6 AP6_21_7 AP6_22_7 AP7_1 AP7_2 AP7_3_05 AP7_4_05 AP7_3_06 AP7_4_06 AP7_3_07 AP7_4_07 AP7_3_08 AP7_4_08 AP7_3_09 AP7_4_09 AP7_3_10 AP7_4_10 AP7_3_11 AP7_4_11 AP7_3_12 AP7_4_12 AP7_3_13 AP7_4_13 AP7_3_14 AP7_4_14 AP7_3_15 AP7_4_15 FAC_HOG FAC_ELE FAC_HOG_AM FAC_ELE_AM DOMINIO ESTRATO EST_DIS UPM_DIS
1 0806910.03 0806910.03.01 0806910.03.01.02 0806910 03 01 B 02 2 31 NA 08 CHIHUAHUA 037 JUAREZ 1 01 1 2 2 NA NA 2 NA NA 2 NA 2 NA 2 NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 000503 001005 NA NA U 4 141 003227
2 0805607.04 0805607.04.01 0805607.04.01.01 0805607 04 01 A 01 1 52 NA 08 CHIHUAHUA 037 JUAREZ 1 03 2 1 1 1 01 1 1 01 2 NA 2 NA 1 1 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 2 NA 2 NA 1 02 1 01 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 000369 001478 NA NA U 3 139 003131
3 0805737.02 0805737.02.01 0805737.02.01.01 0805737 02 01 B 01 1 75 NA 08 CHIHUAHUA 037 JUAREZ 1 01 2 2 2 NA NA 2 NA NA 2 NA 2 NA 2 NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 000322 000322 NA NA U 3 139 003143

3. Procesamiento de datos (Generales)

3.1. Limpiamos los nombres de las columnas, para poder estandarizar. Y cargamos el conjunto de datos de nuevo en la variable df. Observé que el factor de expansión del hogar viene en como tipo character para la base de 2024 por ello lo convierto a entero.

df <- clean_names(df)

# Modificación del tipo de dato del factor de expansión

df$fac_hog <- as.integer(df$fac_hog)

Volvemos a mostrar los primeros registros para ver la modificación de nombre de las columnas.

Encabezado de las tres primeras filas.
x1 id_viv id_hog id_per upm viv_sel hogar resul_h r_sel sexo edad aream cve_ent nom_ent cve_mun nom_mun ap6_1_1 ap6_1_2 ap6_2 ap6_3 ap6_4_01 ap6_5_01 ap6_6_01 ap6_4_02 ap6_5_02 ap6_6_02 ap6_4_03 ap6_6_03 ap6_4_04 ap6_6_04 ap6_7 ap6_8 ap6_9 ap6_10_1 ap6_10_2 ap6_11_1 ap6_12_1 ap6_13_1_1 ap6_13_1_2 ap6_13_1_3 ap6_13_1_4 ap6_11_2 ap6_12_2 ap6_13_2_1 ap6_13_2_2 ap6_13_2_3 ap6_13_2_4 ap6_11_3 ap6_12_3 ap6_13_3_1 ap6_13_3_2 ap6_13_3_3 ap6_13_3_4 ap6_11_4 ap6_12_4 ap6_13_4_1 ap6_13_4_2 ap6_13_4_3 ap6_13_4_4 ap6_11_5 ap6_12_5 ap6_13_5_1 ap6_13_5_2 ap6_13_5_3 ap6_13_5_4 ap6_11_6 ap6_12_6 ap6_13_6_1 ap6_13_6_2 ap6_13_6_3 ap6_13_6_4 ap6_11_7 ap6_12_7 ap6_13_7_1 ap6_13_7_2 ap6_13_7_3 ap6_13_7_4 ap6_14 ap6_15_1 ap6_15_2 ap6_16_1 ap6_17_1 ap6_18_1 ap6_16_2 ap6_17_2 ap6_18_2 ap6_16_3 ap6_17_3 ap6_18_3 ap6_16_4 ap6_17_4 ap6_18_4 ap6_16_5 ap6_17_5 ap6_18_5 ap6_16_6 ap6_17_6 ap6_18_6 ap6_16_7 ap6_17_7 ap6_18_7 ap6_19 ap6_20_1 ap6_20_2 ap6_21_1 ap6_22_1 ap6_21_2 ap6_22_2 ap6_21_3 ap6_22_3 ap6_21_4 ap6_22_4 ap6_21_5 ap6_22_5 ap6_21_6 ap6_22_6 ap6_21_7 ap6_22_7 ap7_1 ap7_2 ap7_3_05 ap7_4_05 ap7_3_06 ap7_4_06 ap7_3_07 ap7_4_07 ap7_3_08 ap7_4_08 ap7_3_09 ap7_4_09 ap7_3_10 ap7_4_10 ap7_3_11 ap7_4_11 ap7_3_12 ap7_4_12 ap7_3_13 ap7_4_13 ap7_3_14 ap7_4_14 ap7_3_15 ap7_4_15 fac_hog fac_ele fac_hog_am fac_ele_am dominio estrato est_dis upm_dis
1 0806910.03 0806910.03.01 0806910.03.01.02 0806910 03 01 B 02 2 31 NA 08 CHIHUAHUA 037 JUAREZ 1 01 1 2 2 NA NA 2 NA NA 2 NA 2 NA 2 NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 503 001005 NA NA U 4 141 003227
2 0805607.04 0805607.04.01 0805607.04.01.01 0805607 04 01 A 01 1 52 NA 08 CHIHUAHUA 037 JUAREZ 1 03 2 1 1 1 01 1 1 01 2 NA 2 NA 1 1 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 2 NA 2 NA 1 02 1 01 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 369 001478 NA NA U 3 139 003131
3 0805737.02 0805737.02.01 0805737.02.01.01 0805737 02 01 B 01 1 75 NA 08 CHIHUAHUA 037 JUAREZ 1 01 2 2 2 NA NA 2 NA NA 2 NA 2 NA 2 NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2 2 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 2 NA 322 000322 NA NA U 3 139 003143

4. Procesamiento de datos (Para responder nuestra pregunta)

4.1. Podemos filtrar solo las columnas necesarias. Para ello necesitamos tener el diseño muestral estrato y upm: estrato est_dis upm_dis los factores de expansión para la estimación fac_hog y fac_ele 4.2. Necesitamos las variables que contienen la pregunta que queremos responder entonces, filtremos. Creamos un vector que tiene el nombre de las variables que necesitamos desl muestreo y auxiliares

vars <- c('id_viv','id_hog', 'upm', 'cve_ent', # Variables de identificación y geográficas
          'estrato', 'est_dis', 'fac_hog', 'fac_ele',  # Variables del diseño muestral
          'ap6_5_01', 'ap6_5_02')   # Variables auxiliares para el filtrado o procesamiento (saber si los bienes perdidos eran del hogar)

Creamos otro vector que tiene el nombre de las variables que contienen nuestras preguntas. Estos pasos no son estrictamente de esta manera.

preg <- c('AP6_4_01',  # Sobre el Robo total de vehículo (automóvil, camioneta o camión)
          'AP6_4_02',  # Sobre el  Robo de accesorios, refacciones o  herramientas de vehículos (automóvil, camioneta, camión)
          #'AP6_4_03', # Sobre la Pinta de barda o grafiti en su casa, *NO* se debe incluir (con base en la documentación de la encuesta)
          'AP6_4_04' , # Si Alguien entró a su casa o departamento sin permiso mediante el uso de la fuerza y robó o intentó robar algo
          'AP6_7')     # Alguno del grupo B (personales) ) 

Delitos del grupo B

  • 05 Robo o asalto en la calle o en el transporte público (incluye robo en banco o cajero automático)
  • 06 Robo en forma distinta a la anterior
  • 07 Alguien usó su chequera, número de tarjeta o cuenta bancaria sin su permiso para realizar cargos o para extraer dinero de sus cuentas (fraude bancario) o le dio dinero falso
  • 08 Entregó dinero por un producto o un servicio que no recibió conforme a lo acordado (fraude al consumidor)
  • 09 Amenazas, presiones o engaños para exigirle dinero o bienes; o para que hiciera algo o dejara de hacerlo (extorsión)
  • 10 Amenazas verbales de alguien plenamente identificado o por escrito hacia su persona diciendo que le va a causar un daño a usted, a su familia, a sus bienes o su trabajo
  • 11 Alguien sólo por actitud abusiva o por una discusión lo(a) golpeó generándole una lesión física (moretones, fracturas, cortadas, etcétera)
  • 12 Lo secuestraron para exigir dinero o bienes
  • 13 Alguien en contra de su voluntad lo(a) agredió mediante hostigamiento o intimidación sexual, manoseo, exhibicionismo o intento de violación
  • 14 Fue obligado(a) mediante violencia física o amenaza por alguien conocido o desconocido a tener una actividad sexual no deseada (violación sexual)
  • 15 Otros delitos distintos a los anteriores

Procesamientos NO necesarios, es la forma en la que resolví el ejercicio. Tú puedes resolverlo de otra manera :)

preg1 <- tolower(preg)     #  Para filtrar deben estar en minúsculas
vfilt <- c(vars, preg1)    #  Se juntan en un solo vector
preg <- preg1              #  Utilizo una variable dummy
preg <- paste0(preg, '_r') #  Genero un nombre dummy para procesamientos

print(preg)
[1] "ap6_4_01_r" "ap6_4_02_r" "ap6_4_04_r" "ap6_7_r"   

Filtremos el dataframe usando los nombres de variables separados.

df_vict <- df |> select( all_of(vfilt)) 

Comencemos a preguntarle cosas a la base de datos.

¿Cuántos hogares se estiman en Mexico?

Para responder, podemos simplemente sumar los factores de expansión de hogar fac_hog y no debemos filtrar ni agregar ya que queremos saber a nivel nacional esta estimación.

hog <- sum(df_vict$fac_hog, na.rm = T)

hog_mx <- hog # Me llevaré este valor para un cálculo más adelante

print(paste0('Se estiman ' , round(hog/1000000, 2) , ' millones de hogares en México en 2024'))
[1] "Se estiman 38.56 millones de hogares en México en 2024"

Y bien, de esos Hogares ¿Cuántos se estima que fueron victimizados en 2024 en Mexico?

  • Planteamiento: Necesito saber quiénes respondieron que les ocurrió durante 2024 alguna conducta de las tarjetas A y B (delitos en hogares o personales) ya sea a alguien de su hogar o a quienes respondieron.
  • Restricciones: En los delitos de Robo de vehículo y Robo parcial de vehículo debemos confirmar que estos pertenecían al hogar.
  • Debido esa pregunta se divide en varias columnas en la base de datos como vimos en el filtro, crearé una variable dummy que guarde los resultados de cada pregunta. Solo necesito saber por ahora si respondió a alguna.
  • En mi caso, decidí crear una función que nos ayude a codificar las variables DRY (don’t repeat yourself), esto con la finalidad de crear una nueva variable dummy y así estimar lo que necesitamos.

Crear la función para recodificar las respuestas de las tarjetas A y B

recodifica <- function(x) { 
  r <-  ifelse(x == 1, 1, 0)
  return(r)}

Recodificar y crear variables auxiliares

df_salida <- df_vict |>  # A la base de datos filtrada le aplico los procesamientos y creamos una nueva variable
  # Comienzo a generar variables dummy que guarden el resultdo de la respuesta
  mutate ( ap6_4_01_r = ifelse( ap6_4_01 == 1 & ap6_5_01 == 1,1,0 ),  # En Robo de vehículo debemos confirmar si era del hogar o no.
           ap6_4_02_r = ifelse( ap6_4_02 == 1 & ap6_5_02 == 1,1,0 ),  # En Robo parcial de vehículo debemos confirmar si era del hogar o no.
           #ap6_4_03_r = recodifica(ap6_4_03), # No debemos incluir las pintas a bardas
           ap6_4_04_r = recodifica(ap6_4_04), 
           ap6_7_r =    recodifica(ap6_7),
           vic_res = rowSums( dplyr::across(all_of (preg) )), # Hago la suma de todas mis variables dummy
           vic_hog = ifelse(vic_res > 0, 1, 0 ), # Si alguna es mayor a cero, significa que al menos en una respondieron que sí, de otro modo quedan como ceros 
           vic_hog_est = vic_hog * fac_hog) # Podemos probar a estimar con los factores de expansión

Veamos qué pasa si sumamos los datos ya ponderados por su factor de expansión. Obtenemos la estimación puntual de Víctimas en Hogares

hog_vic <- sum(df_salida$vic_hog_est)
print(hog_vic)
[1] 10609475

A continuación, creamos un objeto de diseño muestral para poder realizar cálculos de muestras complejas desde la biblioteca srvyr

dis_muest <- df_salida |> # A la tabla de la nueva variable le aplicamos las funciones necesarias para crear el objeto de diseño muestral
  as_survey_design(ids= upm,         # Indicamos cuáles son los identificadores de las Unidades Primarias de Muestreo
                   strata= est_dis,  # Indicamos el estrato al cuál pertenecen esas UPMs
                   weights= fac_hog) # Indicamos cuál es la variable que guarda los pesos o factores de expansión

Respondamos de una buena vez cuántos hogares fueron vćtimas de algún delito en 2024. Recuerda leer muy bien el documento sobre el diseño muestral para entender mejor tus resultados.

hog_vict <- dis_muest |>    # A nuestro objeto de diseño muestral le aplicamos funciones que calcularn lo que necesitamos 
  #group_by() |> # Esta función más adelante la usaremos para agrupar por otras variables, por ahora se queda comentada.
  
  # Vamos a realizar un sumario
  summarise( vic_hogar = survey_total( vic_hog ,     # Utilizamos la variable dummy, que nos indica si fuero víctimas de al menos algún delito.
                                      vartype = c("cv", "ci"), # Qué quiero que nos regrese además de las estimaciones. Requiero el coeficiente de variación y los intervalos de confianza 
                                      level=0.9) # Necesito indicarle a qué nivel de confianza se deben crear los intervalos.
             ) 
# Me llevo la estimación puntual para luego realizar otros cálculos

hog_vic <- hog_vict$vic_hogar

hog_vict |> kableExtra::kable() # Ponemos guapa a la tabla
vic_hogar vic_hogar_cv vic_hogar_low vic_hogar_upp
10609475 0.0085137 10460891 10758059

Conclusiones

Sabemos que se estiman 38,560,539 Hogares en México y que de ellos, 10,609,475 tuvieron en 2022 al menos una víctima. Entonces, si hacemos el cálculo:

prop_hv <- hog_vic  / hog_mx 
  
print(prop_hv)
[1] 0.2751381

Recuerda que sí lo multiplicas por 100 tienes un porcentaje, que algunas veces de acuerdo a su forma de cálculo pueden representar algún tipo de indicador epidemiológico.

porc_hv <- prop_hv * 100

print(paste0( 'Durante 2024 se estimaron ', round(hog/1000000, 2) ,  ' millones de hogares en México, de los cuales se estima que hubo ', round(hog_vic/1000000, 2) , ' hogares víctima, lo que significa que en un ', round (porc_hv,2), ' % de los hogares al menos una persona integrante fue víctima de un delito.'  ))
[1] "Durante 2024 se estimaron 38.56 millones de hogares en México, de los cuales se estima que hubo 10.61 hogares víctima, lo que significa que en un 27.51 % de los hogares al menos una persona integrante fue víctima de un delito."

En la imagen se pueden contrastar los resultados.

Diapositiva de la presentación ejecutiva del INEGI