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.

Paso 1: Configuración del entorno y asignación de la ruta de trabajo

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)

Paso 2: Apertura y carga automática de la base de datos

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.

Paso 3: Limpieza y conversión de variables a formato numérico

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)

Paso 4: Revisión de frecuencias iniciales y cálculo de la primera media

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

Paso 5: Obtención de las medias generales del rango p1_1 a p1_7

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

Paso 6: Reestructuración de la tabla a formato ordenado vertical

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

Paso 7: Asignación de nombres legibles a las variables del reporte

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

Paso 8: Análisis comparativo de medias agrupado por Sexo

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