INTRODUCCIÓN
El Módulo sobre Eventos Culturales Seleccionados (MODECULT) genera información estadística sobre la asistencia a eventos culturales y la participación en actividades artísticas de la población en México. Lo anterior, a fin de proporcionar datos clave para contribuir al diseño de políticas públicas. Desde 2016 y hasta mayo de 2024, el módulo se levantó como parte de la Encuesta Nacional sobre Confianza del Consumidor (ENCO). A partir de 2025 el programa tiene una actualización conceptual y metodológica y se levanta con un operativo y muestra de viviendas independientes a la ENCO.
USANDO UNA BASE DE ESTE MÓDULO, CON LAS VARIABLES DE LAS PREGUNTAS p1_1 a p1_7 LOGRAMOS CONFIGURAR NUESTRO ENTORNO Y PROCESAR LOS DATOS.
En este primer paso, le indicamos a R en qué carpeta de nuestra
computadora se encuentra guardado el archivo del INEGI para que pueda
localizarlo correctamente. Asimismo, verificamos que los paquetes
readr, dplyr y tidyr estén
instalados en el sistema y los cargamos a nuestra sesión de trabajo para
habilitar las herramientas de manipulación de datos.
setwd("~/Conjunto de datos")
if(!require(readr)) install.packages("readr")
if(!require(dplyr)) install.packages("dplyr")
if(!require(tidyr)) install.packages("tidyr")
library(readr)
library(dplyr)
Para no tener que escribir manualmente el nombre largo y técnico del archivo que descarga de la página del INEGI, utilizamos una función que busca cualquier archivo que inicie con el nombre del módulo en nuestro directorio de trabajo y lo importa automáticamente a un objeto llamado base.
archivo_csv <- list.files(pattern = "^conjunto_de_datos_tmodecult")
base <- read_csv(archivo_csv)
## Rows: 4240 Columns: 76
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (17): llaveviv, p1_1, p1_2, p1_3, p1_4, p1_5, p1_6, p1_7, p1_7_esp, p1_...
## dbl (58): p2_1, p2_2, p2_3, p2_4, p2_5, p2_6, p3_1, p3_2, p3_3, f_s2_5, p4_...
## dttm (1): llavemod
##
## ℹ 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.
Por defecto, al importar un archivo CSV, R puede interpretar las respuestas de las preguntas como caracteres de texto. Debido a que es imposible calcular un promedio matemático sobre letras, aplicamos una transformación forzada para convertir todo el rango de variables desde la p1_1 hasta la p1_7 a un formato estrictamente numérico.
base <- base %>%
dplyr::mutate(dplyr::across(p1_1:p1_7, \(x) as.numeric(as.character(x))))
library(tidyr)
Con el propósito de validar que la conversión de datos fue exitosa, generamos un análisis de frecuencias absolutas para la primera variable del cuestionario (p1_1). Adicionalmente, calculamos su media aritmética de forma aislada utilizando el comando na.rm = TRUE para ignorar los valores vacíos, y exploramos las frecuencias de las preguntas finales del bloque.
table(base$p1_1)
##
## 0 1 2 3 4 5 6 7 8 10 12 15 20 24 30
## 3688 260 169 68 20 15 5 1 2 4 3 1 2 1 1
MEDIA_p1_1 <- mean(base$p1_1, na.rm = TRUE)
print(paste("Media de p1_1:", MEDIA_p1_1))
## [1] "Media de p1_1: 0.281839622641509"
table(base$p1_7)
##
## 0 1 2 3 4 5 20 40
## 4186 29 12 6 1 4 1 1
table(base$p1_7_esp)
##
## CABALGATA CABALGATAS
## 1 1
## CARRERA DE CABALLOS CARRERAS DE CABALLOS
## 3 1
## CORRIDA DE CABALLOS CORRIDA DE TOROS
## 1 3
## CULTURAL CULTURAL FOLCL?RICO Y TALLER
## 1 1
## EVENTO DE PAYASOS GALLOS
## 1 2
## GANADERA JARIPEO
## 1 19
## JARIPEOS LUCHA LIBRE
## 1 6
## PALENQUE PLAZA DE TOROS
## 2 1
## RODEO ROMERIA
## 2 2
## TOROS VAQUER?AS DE MUNICIPIOS
## 4 1
Una vez validados los datos individuales, visualizamos de forma rápida la estructura interna de las variables seleccionadas y procedemos a calcular simultáneamente el promedio de asistencia para cada una de las siete actividades del módulo, obteniendo un resumen estadístico general de manera horizontal.
glimpse(base %>% select(p1_1:p1_7))
## Rows: 4,240
## Columns: 7
## $ p1_1 <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ p1_2 <dbl> 0, 0, 0, 0, 1, 1, 0, 0, 2, 0, 5, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ p1_3 <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ p1_4 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ p1_5 <dbl> 1, 0, 0, 0, 15, 6, 2, 0, 1, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0…
## $ p1_6 <dbl> 0, 0, 0, 2, 0, 0, 0, 0, 2, 1, 3, 4, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,…
## $ p1_7 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
medias <- base %>%
summarise(across(p1_1:p1_7, \(x) mean(x, na.rm = TRUE)))
print(medias)
## # A tibble: 1 × 7
## p1_1 p1_2 p1_3 p1_4 p1_5 p1_6 p1_7
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.282 0.759 0.391 0.312 1.80 0.872 0.0366
Los resultados del paso anterior se presentan de forma horizontal, lo cual dificulta la lectura masiva de datos. En esta etapa, transformamos la estructura de la tabla de un formato ancho a uno largo mediante un pivoteo, permitiendo que los identificadores de las variables se acomoden en una columna vertical al lado de sus respectivas medias estadísticas.
tabla_medias <- medias %>%
pivot_longer(
cols = everything(),
names_to = "Variable",
values_to = "Media"
)
print(tabla_medias)
## # A tibble: 7 × 2
## Variable Media
## <chr> <dbl>
## 1 p1_1 0.282
## 2 p1_2 0.759
## 3 p1_3 0.391
## 4 p1_4 0.312
## 5 p1_5 1.80
## 6 p1_6 0.872
## 7 p1_7 0.0366
Para que el reporte final posea un carácter profesional y entendible para cualquier lector, calculamos de nueva cuenta los promedios estadísticos pero sustituimos las etiquetas técnicas originales (p1_1, p1_2, etc.) por los nombres reales de las actividades culturales evaluadas por el INEGI, tales como Teatro, Danza o Cine.
medias_nombradas <- dplyr::summarise(base, dplyr::across(p1_1:p1_7, \(x) mean(x, na.rm = TRUE)))
colnames(medias_nombradas) <- c(
"Teatro",
"Concierto o Música",
"Danza",
"Exposición o Museo",
"Cine o Películas",
"Ferias o Muestras",
"Otro Cultural"
)
tabla_medias_final <- tidyr::pivot_longer(
medias_nombradas,
cols = dplyr::everything(),
names_to = "Actividad_Cultural",
values_to = "Media_Asistencia"
)
print(tabla_medias_final)
## # A tibble: 7 × 2
## Actividad_Cultural Media_Asistencia
## <chr> <dbl>
## 1 Teatro 0.282
## 2 Concierto o Música 0.759
## 3 Danza 0.391
## 4 Exposición o Museo 0.312
## 5 Cine o Películas 1.80
## 6 Ferias o Muestras 0.872
## 7 Otro Cultural 0.0366
Finalmente, segmentamos la muestra para identificar posibles diferencias de participación cultural según el género de los encuestados. Agrupamos los registros originales de la base por la variable sexo, calculamos sus promedios específicos, estructuramos la información verticalmente y transformamos los códigos numéricos de captura de la encuesta (1 y 2) en las etiquetas descriptivas “Hombre” y “Mujer”.
medias_por_sexo <- dplyr::group_by(base, sexo)
medias_por_sexo <- dplyr::summarise(medias_por_sexo, dplyr::across(p1_1:p1_7, \(x) mean(x, na.rm = TRUE)))
colnames(medias_por_sexo) <- c(
"Sexo",
"Teatro",
"Concierto o Música",
"Danza",
"Exposición o Museo",
"Cine o Películas",
"Ferias o Muestras",
"Otro Cultural"
)
tabla_sexo <- tidyr::pivot_longer(
medias_por_sexo,
cols = -Sexo,
names_to = "Actividad_Cultural",
values_to = "Media_Asistencia"
)
tabla_sexo <- dplyr::mutate(tabla_sexo, Sexo = dplyr::case_when(
Sexo == 1 ~ "Hombre",
Sexo == 2 ~ "Mujer",
TRUE ~ as.character(Sexo)
))
print(tabla_sexo)
## # A tibble: 14 × 3
## Sexo Actividad_Cultural Media_Asistencia
## <chr> <chr> <dbl>
## 1 Hombre Teatro 0.273
## 2 Hombre Concierto o Música 0.847
## 3 Hombre Danza 0.347
## 4 Hombre Exposición o Museo 0.348
## 5 Hombre Cine o Películas 2.00
## 6 Hombre Ferias o Muestras 0.890
## 7 Hombre Otro Cultural 0.0395
## 8 Mujer Teatro 0.289
## 9 Mujer Concierto o Música 0.684
## 10 Mujer Danza 0.429
## 11 Mujer Exposición o Museo 0.281
## 12 Mujer Cine o Películas 1.62
## 13 Mujer Ferias o Muestras 0.856
## 14 Mujer Otro Cultural 0.0340