Resumen Ejecutivo

Los Centros Comunitarios benefician a miles de personas en municipios urbanos y rurales, consolidándose como un modelo de proximidad social que contribuye a reducir brechas de desigualdad y fortalecer el sentido de pertenencia local. No obstante, persisten retos relevantes vinculados con la mejora de la infraestructura, la actualización de materiales y la ampliación de la cobertura en zonas con alta vulnerabilidad. Es por esto que se plantea la pregunta de investigación: ¿En qué medida los factores evaluados en los talleres de los Centros Comunitarios influyen en la recomendación y permanencia de los usuarios, y cómo puede utilizarse esta información para rediseñar y mejorar la oferta de servicios?

Las encuestas de percepción aplicadas a las y los usuarios de los Centros Comunitarios de Nuevo León evidencian un alto nivel de satisfacción con los talleres, especialmente en aspectos relacionados con la calidad de la enseñanza, la atención del personal y la pertinencia de los contenidos. En contraste, las observaciones críticas se centran principalmente en cuestiones específicas del espacio físico y en la disponibilidad de recursos dentro de los centros.


Descripción Técnica del Trabajo Realizado

Actividad 1.

En la primera parte del proyecto (Actividad 1), se desarrolla de manera sistemática el proceso de carga, limpieza, unificación y análisis exploratorio de las bases de datos correspondientes a las Valoraciones de Talleres en Centros Comunitarios del Estado de Nuevo León.

Se definen las rutas y se importan múltiples archivos de Excel (los cuestionarios de valoración de talleres) que contienen información por año y trimestre. A través de una función, el código extrae automáticamente del nombre de cada archivo los valores correspondientes al año y trimestre, creando columnas específicas para integrarlos dentro de un solo data frame. Este procedimiento permite identificar la procedencia temporal de cada registro y mantener la trazabilidad de los datos originales.

Posteriormente, se normalizan los nombres de las variables y se estandarizan los formatos de texto. También se lleva a cabo un proceso de limpieza de datos, eliminando duplicados, registros vacíos y caracteres innecesarios. Se transforman las variables numéricas para facilitar su análisis posterior y se tipifican las variables cualitativas, garantizando la coherencia en todo el conjunto de datos consolidado.

Luego, se identifican y extraen las respuestas textuales o abiertas del instrumento de evaluación. El script detecta automáticamente las columnas que contienen texto libre mediante patrones en los nombres de las variables (por ejemplo, “coment”, “observ”, “texto” o “sugerencia”), generando para cada una un data frame independiente. Estos archivos se almacenan en una carpeta de salida llamada “salidas_texto”, lo que permite su análisis posterior mediante técnicas de minería de texto.

Finalmente, el código exporta los resultados principales: la base de datos consolidada, los estadísticos globales, los resúmenes por periodo y las respuestas abiertas en formato .csv. Con ello, se documenta de manera completa el proceso de preparación de la información para las siguientes etapas del proyecto.

Librerías Act1.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.1     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(janitor)
## 
## Adjuntando el paquete: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(stringr)
library(purrr)
library(skimr)
library(vroom)
## 
## Adjuntando el paquete: 'vroom'
## 
## The following objects are masked from 'package:readr':
## 
##     as.col_spec, col_character, col_date, col_datetime, col_double,
##     col_factor, col_guess, col_integer, col_logical, col_number,
##     col_skip, col_time, cols, cols_condense, cols_only, date_names,
##     date_names_lang, date_names_langs, default_locale, fwf_cols,
##     fwf_empty, fwf_positions, fwf_widths, locale, output_column,
##     problems, spec
library(dplyr)
library(fs)
library(tibble)
library(ggplot2)

1. Carga de Archivos

#Lectura de la carpeta
carpeta <- "C:/Users/User/OneDrive/Desktop/Nicole/LTP/Semestre 5/Ciencia de Datos 2/Entregable_1/Bases de datos_CC_SII"

# Archivos
archivos <- list.files(path = carpeta, pattern = "*.xlsx", full.names = TRUE)

# Almacenar archivos en una lista
lista_bases <- map(archivos, read_excel)
## Warning: Coercing text to numeric in E1875 / R1875C5: '64.'
## Warning: Coercing text to numeric in E1406 / R1406C5: '07'
## Warning: Coercing text to numeric in E1409 / R1409C5: '06'
## Warning: Coercing text to numeric in E3178 / R3178C5: '19.'
## Warning: Coercing text to numeric in E3312 / R3312C5: '08'
## Warning: Coercing text to numeric in E3717 / R3717C5: '09'
## New names:
## New names:
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...27`
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...28`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...44`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...46`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...49`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...51`
## Warning: Coercing text to numeric in E1083 / R1083C5: '09'
## Warning: Coercing text to numeric in E1133 / R1133C5: '06'
## Warning: Coercing text to numeric in E1908 / R1908C5: '19.'
## Warning: Coercing text to numeric in E1939 / R1939C5: '1.10'
## Warning: Coercing text to numeric in E2224 / R2224C5: '19.'
## Warning: Coercing text to numeric in E2226 / R2226C5: '19.'
## Warning: Coercing text to numeric in E2230 / R2230C5: '38.'
## Warning: Coercing text to numeric in E2632 / R2632C5: '65.'
## Warning: Coercing text to numeric in E2637 / R2637C5: '43.'
## Warning: Coercing text to numeric in E5412 / R5412C5: '64.'
## Warning: Coercing text to numeric in E5413 / R5413C5: '63.'
## Warning: Coercing text to numeric in E5414 / R5414C5: '62.'
## Warning: Coercing text to numeric in E5415 / R5415C5: '64.'
## Warning: Coercing text to numeric in E5416 / R5416C5: '64.'
## Warning: Coercing text to numeric in E5688 / R5688C5: '09'
## New names:
## New names:
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...27`
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...28`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...44`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...46`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...49`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...51`
## Warning: Coercing text to numeric in E1230 / R1230C5: '09'
## Warning: Coercing text to numeric in E1238 / R1238C5: '012'
## Warning: Coercing text to numeric in E1966 / R1966C5: '09'
## Warning: Coercing text to numeric in E2352 / R2352C5: '09'
## Warning: Coercing text to numeric in E3233 / R3233C5: '06'
## New names:
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...27`
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...28`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...44`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...46`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...49`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...51`

2. Unificación en un solo DataFrame

Extraer la fecha de los archivos para identificar en el DataFrame

parse_año_trimestre <- function(file_path) {
  fname <- basename(file_path)
  
  # Extraer año (4 dígitos)
  año <- str_extract(fname, "(?<!\\d)(19|20)\\d{2}(?!\\d)")
  
  # Extraer número de trimestre 
  tri_num <- str_match(fname, "(?i)\\b([1-4])[\\s_-]*[Tt]\\b")[,2]
  
  if (is.na(tri_num)) {
    tri_num <- str_match(fname, "(?i)\\b[Tt][\\s_-]*([1-4])\\b")[,2]
  }

  # Normalizar siempre a T1, T2, T3, T4
  trimestre <- if (!is.na(tri_num)) paste0("T", tri_num) else NA_character_

  tibble(
    año = año %||% NA_character_,
    trimestre = trimestre,
    año_trimestre = if (!is.na(año) && !is.na(trimestre)) paste0(año, "_", trimestre) else NA_character_
  )
}

Unificación de todas las bases

# 1) Función para leer y procesar un archivo
leer_archivo <- function(f) {
  meta <- parse_año_trimestre(f)

  readxl::read_excel(f, col_types = "text", guess_max = 10000) |>
    
    # Limpia nombres de las columnas
    janitor::clean_names() |>
    
    # Quita espacios extra en todas las columnas
    mutate(across(everything(), ~ .x |> str_squish())) |>
    
    # Agrega columnas nuevas con metadatos
    mutate(
      año           = meta$año,
      trimestre     = meta$trimestre,
      año_trimestre = meta$año_trimestre
      
    ) |>
    
    # Mueve las columnas clave al inicio
    relocate(año, trimestre, año_trimestre, .before = 1)
}

# 2) Crear el DataFrame unificado
todo <- purrr::map_dfr(archivos, leer_archivo) |>
  
  # Convertir todo a texto primero (seguro)
  mutate(across(everything(), as.character)) |>
  
  # Reemplazar cadenas vacías por NA
  mutate(across(everything(), ~ na_if(.x, ""))) |>
  
  # Inferir tipos automáticamente (números, fechas, etc.)
  readr::type_convert(locale = readr::locale(decimal_mark = ".")) |>
  
  # Eliminar filas totalmente vacías
  janitor::remove_empty("rows") |>
  
  # Eliminar duplicados exactos
  distinct()
## New names:
## New names:
## New names:
## New names:
## New names:
## ── Column specification
## ──────────────────────────────────────────────────────── cols( .default =
## col_character(), año = col_double(), marca_temporal = col_double(),
## fecha_en_que_se_aplica_la_encuesta = col_logical(),
## x2_cuantos_anos_cumplidos_tiene = col_double(), horario_de_inicio_de_taller =
## col_double(),
## x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion
## = col_double(), el_contenido_o_temas_del_curso_taller = col_double(),
## la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller =
## col_double(), los_horarios_del_curso_taller = col_double(),
## el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller =
## col_double(), la_forma_de_ensenanza_utilizada_en_las_clases = col_double(),
## la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor =
## col_double(),
## el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos =
## col_double(),
## la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios =
## col_double(),
## trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario =
## col_double(),
## calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario =
## col_double(), salones_o_aulas = col_double(), salas_de_computo = col_double(),
## banos = col_double(), gimnasio_canchas = col_double() # ... with 27 more
## columns ) ℹ Use `spec()` for the full column specifications.
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...27`
## • `Calidad de la información brindada por el personal del Centro Comunitario`
##   -> `Calidad de la información brindada por el personal del Centro
##   Comunitario...28`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...44`
## • `Favor de justificar su respuesta` -> `Favor de justificar su respuesta...46`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...49`
## • `Indique el por qué de su respuesta` -> `Indique el por qué de su
##   respuesta...51`
# 3) Chequeo de sanidad: trimestres válidos
stopifnot(all(is.na(todo$trimestre) | todo$trimestre %in% c("T1","T2","T3","T4")))

3. Extracción de respuestas textuales

extraer_respuestas_abiertas <- function(df = todo,
                                        exportar = TRUE,
                                        dir_salida = "salidas_texto",
                                        umbral_unicos = 0.20,
                                        umbral_long   = 15) {
  stopifnot(is.data.frame(df))

  # Chequeos suaves de columnas meta (no falla si no están todas)
  cols_meta_posibles <- c("año","trimestre","año_trimestre","archivo","source_file")
  cols_presentes <- intersect(cols_meta_posibles, names(df))
  if (!"año_trimestre" %in% cols_presentes) {
    message("Sugerencia: agrega 'año_trimestre' para mejores reportes por periodo.")
  }

  # Columnas de texto candidatas
  cols_char <- df |> select(where(is.character)) |> names()
  if (length(cols_char) == 0) {
    stop("No se encontraron columnas de texto (tipo character) en 'df'.")
  }

  # Detección por nombre (patrones)
  patron_texto <- "(coment|sugerenc|sugerencia|opinion|opinión|observ|abiert|texto|porque|por_que|justific|descripcion|descripción|otro)"
  por_nombre <- cols_char[str_detect(cols_char, regex(patron_texto, ignore_case = TRUE))]

  # Métricas de contenido (proporción únicos + longitud media)
  texto_metricas <- tibble(variable = cols_char) |>
    mutate(
      prop_unique = map_dbl(variable, ~{
        v <- df[[.x]]
        if (is.null(v) || all(is.na(v))) return(0)
        n_distinct(v, na.rm = TRUE) / max(1, sum(!is.na(v)))
      }),
      long_media = map_dbl(variable, ~{
        v <- df[[.x]]; v <- v[!is.na(v)]
        if (length(v) == 0) return(0)
        mean(nchar(v), na.rm = TRUE)
      })
    )

  por_contenido <- texto_metricas |>
    filter(prop_unique >= umbral_unicos | long_media >= umbral_long) |>
    pull(variable)

  # Unión final de candidatas
  vars_texto <- union(por_nombre, por_contenido)
  if (length(vars_texto) == 0) vars_texto <- cols_char

  # Detectar columna id si existe
  posibles_id <- intersect(names(df),
                           c("id","folio","id_persona","id_registro","id_participante","clave","id_encuesta"))
  col_id <- if (length(posibles_id) > 0) posibles_id[1] else NULL

  # Auxiliar: limpiar cada columna de texto
  limpiar_texto_df <- function(df, var_texto, col_id = NULL) {
    keep_cols <- c("año","trimestre","año_trimestre","archivo", var_texto)
    if (!"archivo" %in% names(df) && "source_file" %in% names(df)) {
      df <- df |> mutate(archivo = source_file)
    }
    if (!is.null(col_id)) keep_cols <- union(keep_cols, col_id)

    out <- df |>
      select(any_of(keep_cols)) |>
      mutate(!!var_texto := .data[[var_texto]] |> str_squish()) |>
      filter(!is.na(.data[[var_texto]]), nzchar(.data[[var_texto]])) |>
      filter(nchar(.data[[var_texto]]) >= 3) |>
      distinct()

    metas <- intersect(c("año","trimestre","año_trimestre","archivo", col_id), names(out))
    if (length(metas) > 0) out <- out |> relocate(all_of(metas), .before = 1)

    out |> rename(respuesta_texto = all_of(var_texto))
  }

  # Construir lista de dataframes por pregunta
  listas_texto <- set_names(vars_texto) |>
    map(~ limpiar_texto_df(df, .x, col_id = col_id))

  # Inventario por periodo
  inventario <- map_df(names(listas_texto), function(v){
    listas_texto[[v]] |>
      count(año_trimestre, name = "n_respuestas") |>
      mutate(variable_texto = v, .before = 1)
  }) |>
    arrange(variable_texto, año_trimestre)

  # Exportación segura
  if (exportar) {
    if (!dir.exists(dir_salida)) dir.create(dir_salida, recursive = TRUE)

    # Nombre seguro: sin caracteres raros, máx 50 chars y único
    safe_name <- function(x) {
      y <- gsub("[^A-Za-z0-9_]+", "_", x)
      y <- substr(y, 1, 50)
      y
    }
    nombres_seg <- map_chr(names(listas_texto), safe_name)
    # Evitar colisiones si truncó igual
    nombres_seg <- make.unique(nombres_seg, sep = "_")

    walk2(listas_texto, nombres_seg, \(df_i, nm) {
      fn <- file.path(dir_salida, paste0("abierta_", nm, ".csv"))
      write_csv(df_i, fn, na = "")
    })
    write_csv(inventario, file.path(dir_salida, "inventario_preguntas_abiertas.csv"), na = "")
    message("CSVs creados en: ", normalizePath(dir_salida))
  }

  # Retorno
  list(
    variables_detectadas     = vars_texto,
    metricas_contenido       = texto_metricas,
    inventario_por_periodo   = inventario,
    dataframes_por_pregunta  = listas_texto
  )
}

# Ejecutar
respuestas_texto <- extraer_respuestas_abiertas(
  df = todo,
  exportar = TRUE,
  dir_salida = "salidas_texto"
)
## CSVs creados en: C:\Users\User\OneDrive\Desktop\Nicole\LTP\Semestre 5\Ciencia de Datos 2\Entregable_1\salidas_texto
# Resumen útil en consola
cat("Variables de texto detectadas:\n")
## Variables de texto detectadas:
print(respuestas_texto$variables_detectadas)
##  [1] "comentarios_sobre_el_curso_o_taller_que_recibio"                                                                                                           
##  [2] "comentarios_sobre_el_tallerista_o_instructor_que_impartio_el_curso"                                                                                        
##  [3] "comentarios_sobre_el_personal_del_centro_comunitario"                                                                                                      
##  [4] "comentarios_sobre_la_infraestructura_del_centro_comunitario"                                                                                               
##  [5] "x5_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_justificar_su_respuesta"                                                              
##  [6] "x7_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_justificar_su_respuesta"                                                              
##  [7] "x8_estaria_interesado_a_en_tomar_otro_curso_taller_en_este_centro_comunitario"                                                                             
##  [8] "x8_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_justificar_su_respuesta"                                                              
##  [9] "x9_1_si_su_respuesta_fue_insatisfecho_a_indique_por_que"                                                                                                   
## [10] "x10_si_tiene_algun_otro_curso_o_taller_que_le_interesaria_tomar_que_no_se_ofrece_en_el_centro_comunitario_favor_de_mencionarlo"                            
## [11] "x11_en_su_opinion_cual_es_el_principal_aspecto_a_mejorar_en_los_centros_comunitarios"                                                                      
## [12] "otras_sugerencias_u_opiniones_que_permitan_mejorar_los_servicios_brindados_en_el_centro_comunitario"                                                       
## [13] "otro_taller_que_haya_tomado_en_el_trimestre_coloque_un_cero_si_no_tomo_otro_taller"                                                                        
## [14] "favor_de_justificar_su_respuesta_44"                                                                                                                       
## [15] "favor_de_justificar_su_respuesta_46"                                                                                                                       
## [16] "indique_el_por_que_de_su_respuesta_49"                                                                                                                     
## [17] "estaria_interesado_a_en_tomar_otro_curso_taller_en_este_centro_comunitario"                                                                                
## [18] "indique_el_por_que_de_su_respuesta_51"                                                                                                                     
## [19] "si_su_respuesta_fue_insatisfecho_indique_por_que_en_caso_contrario_coloque_un_cero"                                                                        
## [20] "si_tiene_algun_otro_curso_o_taller_que_le_interesaria_tomar_que_no_se_ofrece_en_el_centro_comunitario_favor_de_mencionarlo"                                
## [21] "en_su_opinion_cual_es_el_principal_aspecto_a_mejorar_en_los_centros_comunitarios"                                                                          
## [22] "otras_sugerencia_u_opiniones_que_permitan_mejorar_los_servicios_brindados_en_el_centro_comunitario"                                                        
## [23] "favor_de_justificar_su_respuesta_41"                                                                                                                       
## [24] "favor_de_justificar_su_respuesta_43"                                                                                                                       
## [25] "indique_el_por_que_de_su_respuesta_46"                                                                                                                     
## [26] "indique_el_por_que_de_su_respuesta_48"                                                                                                                     
## [27] "por_que_medio_se_entero_del_curso_o_taller"                                                                                                                
## [28] "estaria_interesado_a_en_tomar_otro_curso_o_taller_en_este_centro_comunitario"                                                                              
## [29] "sugerencia_o_comentario_que_nos_permita_mejorar_el_taller_o_eventos_a_los_que_asistio_opcional"                                                            
## [30] "en_caso_de_elegir_otro_menciona_el_taller_al_que_asistes"                                                                                                  
## [31] "pudiera_darnos_alguna_sugerencia_u_opinion_que_nos_permita_mejorar_este_curso_taller_o_sobre_los_eventos_a_los_que_asistio"                                
## [32] "x4_cual_es_su_maximo_nivel_de_escolaridad_alcanzado_al_dia_de_hoy"                                                                                         
## [33] "x5_a_que_se_dedica_actualmente_puede_seleccionar_una_o_mas_opciones"                                                                                       
## [34] "curso_o_taller_que_cursa_o_termino"                                                                                                                        
## [35] "x4_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_que_considera_usted_se_puede_mejorar_en_las_instalaciones_para_tener_accesibilidad"            
## [36] "x6_lo_que_usted_aprendio_en_el_curso_taller_en_que_ambito_de_su_vida_lo_aplicaria_puede_marcar_hasta_dos_opciones"                                         
## [37] "fecha_de_nacimiento"                                                                                                                                       
## [38] "cual_es_su_maximo_nivel_de_escolaridad_alcanzado_al_dia_de_hoy"                                                                                            
## [39] "a_que_se_dedica_actualmente_puede_seleccionar_una_o_mas_opciones"                                                                                          
## [40] "lo_que_usted_aprendio_en_el_curso_taller_en_que_ambito_de_su_vida_lo_aplicaria_puede_marcar_hasta_dos_opciones"                                            
## [41] "nombre"                                                                                                                                                    
## [42] "curso_o_taller_que_termino"                                                                                                                                
## [43] "lo_que_usted_aprendio_en_el_curso_o_taller_en_donde_lo_aplicaria"                                                                                          
## [44] "esta_satisfecho_a_o_insatisfecho_a_con_los_eventos_deportivos_culturales_artisticos_a_los_que_usted_o_alguien_de_su_familia_ha_asistido_en_el_ano_en_curso"
## [45] "escolaridad_actual"                                                                                                                                        
## [46] "a_que_se_dedica_actualmente"                                                                                                                               
## [47] "nombre_opcional"                                                                                                                                           
## [48] "telefono_o_celular_opcional"                                                                                                                               
## [49] "justifique_su_respuesta_en_caso_de_haber_respondido_no_en_la_pregunta_anterior"                                                                            
## [50] "nombre_del_entrevistado"                                                                                                                                   
## [51] "lo_que_usted_aprendio_en_el_curso_taller_en_donde_lo_aplicaria"                                                                                            
## [52] "senale_su_escolaridad_actual"                                                                                                                              
## [53] "nombre_del_entrevistado_opcional"
cat("\nInventario (primeras 10 filas):\n")
## 
## Inventario (primeras 10 filas):
print(head(respuestas_texto$inventario_por_periodo, 10))
## # A tibble: 10 × 3
##    variable_texto                                     año_trimestre n_respuestas
##    <chr>                                              <chr>                <int>
##  1 a_que_se_dedica_actualmente                        2017_T4                 15
##  2 a_que_se_dedica_actualmente                        2018_T4                  6
##  3 a_que_se_dedica_actualmente                        2019_T4                 16
##  4 a_que_se_dedica_actualmente                        2020_T4                 35
##  5 a_que_se_dedica_actualmente                        2021_T4                112
##  6 a_que_se_dedica_actualmente_puede_seleccionar_una… 2024_T2                185
##  7 a_que_se_dedica_actualmente_puede_seleccionar_una… 2024_T3                160
##  8 a_que_se_dedica_actualmente_puede_seleccionar_una… 2024_T4                172
##  9 a_que_se_dedica_actualmente_puede_seleccionar_una… 2025_T1                173
## 10 a_que_se_dedica_actualmente_puede_seleccionar_una… 2025_T2                196

Actividad 2.

La Actividad 2 desarrolla la segunda etapa del proyecto de análisis de los talleres impartidos en los Centros Comunitarios de Nuevo León, enfocándose en el procesamiento, limpieza y análisis exploratorio de las respuestas textuales obtenidas en las encuestas de percepción aplicadas a las y los usuarios. Su objetivo principal es identificar patrones de opinión, temas recurrentes y palabras clave que reflejen la experiencia de los participantes con los talleres comunitarios.

En la primera sección, el script carga los archivos generados previamente en la Actividad 1 (uno por cada pregunta abierta), asegurando su correcta lectura y unificación. Para cada archivo, se implementan funciones que verifican la ausencia de valores vacíos, eliminan caracteres especiales y transforman el texto a minúsculas. Posteriormente, se realiza una limpieza lingüística exhaustiva, que incluye la eliminación de puntuación, números, espacios extra y stopwords en español, además de términos irrelevantes o repetitivos que pudieran distorsionar los resultados.

Una vez preparado el corpus textual, el código genera representaciones visuales que facilitan la interpretación de los datos. Mediante el uso de la librería tm, se construye una matriz término-documento (DTM) y se calculan las frecuencias de cada palabra en el conjunto de respuestas. En la parte final, el código aplica un modelo de análisis de tópicos (LDA – Latent Dirichlet Allocation) con el fin de identificar agrupamientos semánticos dentro del texto. Este procedimiento permite reconocer los temas subyacentes en las opiniones, vinculando las palabras más representativas a distintos ejes de percepción, como calidad de la enseñanza, atención del personal, infraestructura y materiales.

Librerías Act 2.

library(tidyverse)
library(readxl)
library(janitor)
library(stringr)
library(purrr)
library(skimr)
library(vroom)
library(dplyr)
library(fs)
library(tibble)
library(ggplot2)
library(rvest)   
## 
## Adjuntando el paquete: 'rvest'
## The following object is masked from 'package:readr':
## 
##     guess_encoding
library(xml2)    
library(tm)     
## Cargando paquete requerido: NLP
## 
## Adjuntando el paquete: 'NLP'
## The following object is masked from 'package:ggplot2':
## 
##     annotate
library(wordcloud2)
library(topicmodels)
library(stopwords)
## 
## Adjuntando el paquete: 'stopwords'
## The following object is masked from 'package:tm':
## 
##     stopwords
library(tidytext)
library(slam)
library(stringi)
library(knitr)
library(purrr)

1. Cargar los dataframes con respuestas textuales

#Agarrar los archivos generados en act1
ruta_textos <- "salidas_texto" 
archivos <- list.files(ruta_textos, pattern = "\\.(csv|txt)$", full.names = TRUE)

#Imprimir archivos encontrados
cat("Archivos encontrados:\n")
## Archivos encontrados:
print(archivos)
##  [1] "salidas_texto/abierta_a_que_se_dedica_actualmente.csv"                                                                                                                   
##  [2] "salidas_texto/abierta_a_que_se_dedica_actualmente_puede_seleccionar_una_.csv"                                                                                            
##  [3] "salidas_texto/abierta_a_que_se_dedica_actualmente_puede_seleccionar_una_o_mas_opciones.csv"                                                                              
##  [4] "salidas_texto/abierta_comentarios_sobre_el_curso_o_taller_que_recibio.csv"                                                                                               
##  [5] "salidas_texto/abierta_comentarios_sobre_el_personal_del_centro_comunitar.csv"                                                                                            
##  [6] "salidas_texto/abierta_comentarios_sobre_el_personal_del_centro_comunitario.csv"                                                                                          
##  [7] "salidas_texto/abierta_comentarios_sobre_el_tallerista_o_instructor_que_i.csv"                                                                                            
##  [8] "salidas_texto/abierta_comentarios_sobre_el_tallerista_o_instructor_que_impartio_el_curso.csv"                                                                            
##  [9] "salidas_texto/abierta_comentarios_sobre_la_infraestructura_del_centro_co.csv"                                                                                            
## [10] "salidas_texto/abierta_comentarios_sobre_la_infraestructura_del_centro_comunitario.csv"                                                                                   
## [11] "salidas_texto/abierta_cual_es_su_maximo_nivel_de_escolaridad_alcanzado_a.csv"                                                                                            
## [12] "salidas_texto/abierta_cual_es_su_maximo_nivel_de_escolaridad_alcanzado_al_dia_de_hoy.csv"                                                                                
## [13] "salidas_texto/abierta_curso_o_taller_que_cursa_o_termino.csv"                                                                                                            
## [14] "salidas_texto/abierta_curso_o_taller_que_termino.csv"                                                                                                                    
## [15] "salidas_texto/abierta_en_caso_de_elegir_otro_menciona_el_taller_al_que_a.csv"                                                                                            
## [16] "salidas_texto/abierta_en_caso_de_elegir_otro_menciona_el_taller_al_que_asistes.csv"                                                                                      
## [17] "salidas_texto/abierta_en_su_opinion_cual_es_el_principal_aspecto_a_mejor.csv"                                                                                            
## [18] "salidas_texto/abierta_en_su_opinion_cual_es_el_principal_aspecto_a_mejorar_en_los_centros_comunitarios.csv"                                                              
## [19] "salidas_texto/abierta_escolaridad_actual.csv"                                                                                                                            
## [20] "salidas_texto/abierta_esta_satisfecho_a_o_insatisfecho_a_con_los_eventos.csv"                                                                                            
## [21] "salidas_texto/abierta_estaria_interesado_a_en_tomar_otro_curso_o_taller_.csv"                                                                                            
## [22] "salidas_texto/abierta_estaria_interesado_a_en_tomar_otro_curso_o_taller_en_este_centro_comunitario.csv"                                                                  
## [23] "salidas_texto/abierta_estaria_interesado_a_en_tomar_otro_curso_taller_en.csv"                                                                                            
## [24] "salidas_texto/abierta_estaria_interesado_a_en_tomar_otro_curso_taller_en_este_centro_comunitario.csv"                                                                    
## [25] "salidas_texto/abierta_favor_de_justificar_su_respuesta_41.csv"                                                                                                           
## [26] "salidas_texto/abierta_favor_de_justificar_su_respuesta_43.csv"                                                                                                           
## [27] "salidas_texto/abierta_favor_de_justificar_su_respuesta_44.csv"                                                                                                           
## [28] "salidas_texto/abierta_favor_de_justificar_su_respuesta_46.csv"                                                                                                           
## [29] "salidas_texto/abierta_fecha_de_nacimiento.csv"                                                                                                                           
## [30] "salidas_texto/abierta_indique_el_por_que_de_su_respuesta_46.csv"                                                                                                         
## [31] "salidas_texto/abierta_indique_el_por_que_de_su_respuesta_48.csv"                                                                                                         
## [32] "salidas_texto/abierta_indique_el_por_que_de_su_respuesta_49.csv"                                                                                                         
## [33] "salidas_texto/abierta_indique_el_por_que_de_su_respuesta_51.csv"                                                                                                         
## [34] "salidas_texto/abierta_justifique_su_respuesta_en_caso_de_haber_respondid.csv"                                                                                            
## [35] "salidas_texto/abierta_lo_que_usted_aprendio_en_el_curso_o_taller_en_dond.csv"                                                                                            
## [36] "salidas_texto/abierta_lo_que_usted_aprendio_en_el_curso_o_taller_en_donde_lo_aplicaria.csv"                                                                              
## [37] "salidas_texto/abierta_lo_que_usted_aprendio_en_el_curso_taller_en_donde_.csv"                                                                                            
## [38] "salidas_texto/abierta_lo_que_usted_aprendio_en_el_curso_taller_en_que_am.csv"                                                                                            
## [39] "salidas_texto/abierta_lo_que_usted_aprendio_en_el_curso_taller_en_que_ambito_de_su_vida_lo_aplicaria_puede_marcar_hasta_dos_opciones.csv"                                
## [40] "salidas_texto/abierta_nombre.csv"                                                                                                                                        
## [41] "salidas_texto/abierta_nombre_del_entrevistado.csv"                                                                                                                       
## [42] "salidas_texto/abierta_nombre_del_entrevistado_opcional.csv"                                                                                                              
## [43] "salidas_texto/abierta_nombre_opcional.csv"                                                                                                                               
## [44] "salidas_texto/abierta_otras_sugerencia_u_opiniones_que_permitan_mejorar_.csv"                                                                                            
## [45] "salidas_texto/abierta_otras_sugerencia_u_opiniones_que_permitan_mejorar_los_servicios_brindados_en_el_centro_comunitario.csv"                                            
## [46] "salidas_texto/abierta_otras_sugerencias_u_opiniones_que_permitan_mejorar.csv"                                                                                            
## [47] "salidas_texto/abierta_otras_sugerencias_u_opiniones_que_permitan_mejorar_los_servicios_brindados_en_el_centro_comunitario.csv"                                           
## [48] "salidas_texto/abierta_otro_taller_que_haya_tomado_en_el_trimestre_coloqu.csv"                                                                                            
## [49] "salidas_texto/abierta_otro_taller_que_haya_tomado_en_el_trimestre_coloque_un_cero_si_no_tomo_otro_taller.csv"                                                            
## [50] "salidas_texto/abierta_por_que_medio_se_entero_del_curso_o_taller.csv"                                                                                                    
## [51] "salidas_texto/abierta_pudiera_darnos_alguna_sugerencia_u_opinion_que_nos.csv"                                                                                            
## [52] "salidas_texto/abierta_pudiera_darnos_alguna_sugerencia_u_opinion_que_nos_permita_mejorar_este_curso_taller_o_sobre_los_eventos_a_los_que_asistio.csv"                    
## [53] "salidas_texto/abierta_senale_su_escolaridad_actual.csv"                                                                                                                  
## [54] "salidas_texto/abierta_si_su_respuesta_fue_insatisfecho_indique_por_que_e.csv"                                                                                            
## [55] "salidas_texto/abierta_si_su_respuesta_fue_insatisfecho_indique_por_que_en_caso_contrario_coloque_un_cero.csv"                                                            
## [56] "salidas_texto/abierta_si_tiene_algun_otro_curso_o_taller_que_le_interesa.csv"                                                                                            
## [57] "salidas_texto/abierta_si_tiene_algun_otro_curso_o_taller_que_le_interesaria_tomar_que_no_se_ofrece_en_el_centro_comunitario_favor_de_mencionarlo.csv"                    
## [58] "salidas_texto/abierta_sugerencia_o_comentario_que_nos_permita_mejorar_el.csv"                                                                                            
## [59] "salidas_texto/abierta_sugerencia_o_comentario_que_nos_permita_mejorar_el_taller_o_eventos_a_los_que_asistio_opcional.csv"                                                
## [60] "salidas_texto/abierta_telefono_o_celular_opcional.csv"                                                                                                                   
## [61] "salidas_texto/abierta_x10_si_tiene_algun_otro_curso_o_taller_que_le_inte.csv"                                                                                            
## [62] "salidas_texto/abierta_x10_si_tiene_algun_otro_curso_o_taller_que_le_interesaria_tomar_que_no_se_ofrece_en_el_centro_comunitario_favor_de_mencionarlo.csv"                
## [63] "salidas_texto/abierta_x11_en_su_opinion_cual_es_el_principal_aspecto_a_m.csv"                                                                                            
## [64] "salidas_texto/abierta_x11_en_su_opinion_cual_es_el_principal_aspecto_a_mejorar_en_los_centros_comunitarios.csv"                                                          
## [65] "salidas_texto/abierta_x4_1_en_caso_de_haber_respondido_no_en_la_pregunta.csv"                                                                                            
## [66] "salidas_texto/abierta_x4_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_que_considera_usted_se_puede_mejorar_en_las_instalaciones_para_tener_accesibilidad.csv"
## [67] "salidas_texto/abierta_x4_cual_es_su_maximo_nivel_de_escolaridad_alcanzad.csv"                                                                                            
## [68] "salidas_texto/abierta_x4_cual_es_su_maximo_nivel_de_escolaridad_alcanzado_al_dia_de_hoy.csv"                                                                             
## [69] "salidas_texto/abierta_x5_1_en_caso_de_haber_respondido_no_en_la_pregunta.csv"                                                                                            
## [70] "salidas_texto/abierta_x5_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_justificar_su_respuesta.csv"                                                  
## [71] "salidas_texto/abierta_x5_a_que_se_dedica_actualmente_puede_seleccionar_u.csv"                                                                                            
## [72] "salidas_texto/abierta_x5_a_que_se_dedica_actualmente_puede_seleccionar_una_o_mas_opciones.csv"                                                                           
## [73] "salidas_texto/abierta_x6_lo_que_usted_aprendio_en_el_curso_taller_en_que.csv"                                                                                            
## [74] "salidas_texto/abierta_x6_lo_que_usted_aprendio_en_el_curso_taller_en_que_ambito_de_su_vida_lo_aplicaria_puede_marcar_hasta_dos_opciones.csv"                             
## [75] "salidas_texto/abierta_x7_1_en_caso_de_haber_respondido_no_en_la_pregunta.csv"                                                                                            
## [76] "salidas_texto/abierta_x7_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_justificar_su_respuesta.csv"                                                  
## [77] "salidas_texto/abierta_x8_1_en_caso_de_haber_respondido_no_en_la_pregunta.csv"                                                                                            
## [78] "salidas_texto/abierta_x8_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_justificar_su_respuesta.csv"                                                  
## [79] "salidas_texto/abierta_x8_estaria_interesado_a_en_tomar_otro_curso_taller.csv"                                                                                            
## [80] "salidas_texto/abierta_x8_estaria_interesado_a_en_tomar_otro_curso_taller_en_este_centro_comunitario.csv"                                                                 
## [81] "salidas_texto/abierta_x9_1_si_su_respuesta_fue_insatisfecho_a_indique_po.csv"                                                                                            
## [82] "salidas_texto/abierta_x9_1_si_su_respuesta_fue_insatisfecho_a_indique_por_que.csv"                                                                                       
## [83] "salidas_texto/inventario_preguntas_abiertas.csv"

Convertir a texto continuo

leer_texto <- function(archivo) {
  
  # Leer los csv
  if (grepl("\\.csv$", archivo)) {
    
    # Se carga como data frame
    df <- read_csv(archivo, show_col_types = FALSE)
    
    # Concatena las respuestas a un solo texto
    if ("respuesta_texto" %in% names(df)) {
      texto <- paste(df$respuesta_texto, collapse = " ")
      
      # Si no hay columna de las respuestas, agarra todo el cvs
    } else {
      texto <- paste(unlist(df), collapse = " ")
    }
    
    # Por si el archivo no es cvs
  } else {
    texto <- readLines(archivo, warn = FALSE)
    texto <- paste(texto, collapse = " ")
  }
  texto
}

Leer todos los archivos

# Lee todos los archivos uno por uno y los convierte en texto con leer_texto().
# Se guarda cada resultado dentro de una lista. 
textos <- lapply(archivos, leer_texto)
names(textos) <- basename(archivos)

2. Limpieza y preparación del texto

# Crear un corpus con todos los textos para limpieza 

corpus <- Corpus(VectorSource(textos))

# Limpieza básica
corpus <- tm_map(corpus, content_transformer(tolower))      # minúsculas
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(tolower)):
## transformation drops documents
corpus <- tm_map(corpus, removePunctuation)                 # eliminar puntuación
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
corpus <- tm_map(corpus, removeNumbers)                     # eliminar números
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
corpus <- tm_map(corpus, stripWhitespace)                   # eliminar espacios vacios
## Warning in tm_map.SimpleCorpus(corpus, stripWhitespace): transformation drops
## documents
corpus <- tm_map(corpus, removeWords, stopwords("es"))      # quitar artículos en español
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("es")):
## transformation drops documents
corpus <- tm_map(corpus, content_transformer(function(x) stri_trans_general(x, "Latin-ASCII"))) # quitar acentos
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(function(x)
## stri_trans_general(x, : transformation drops documents
# Quitar palabras irrelevantes específicas
palabras_eliminar <- c("hay", "gusta", "puede", "seguir", "maestro", "tener", "mas", "sirve", "siempre", "puedo", "momento", "cada", "cuenta", "dudas", "pues", "agua", "mucha", "hace", "muchas", "personas", "poder", "totalmente", "rampa", "ser", "aprendido", "rampas", "taller", "talleres", "solo", "si", "aprender", "cosas", "hernandez")
corpus <- tm_map(corpus, removeWords, palabras_eliminar)
## Warning in tm_map.SimpleCorpus(corpus, removeWords, palabras_eliminar):
## transformation drops documents

3. Análisis de frecuencia y visualización

# Matrix término-documento
# Convierte el texto en datos estructurados: para contar palabras, hacer nubes, gráficos o análisis más avanzados
dtm <- DocumentTermMatrix(
  corpus,
  control = list(
    wordLengths = c(2, Inf)              # descarta tokens de 1 letra
    # bounds = list(global = c(3, Inf))  # (opcional) solo términos que aparezcan en ≥3 docs
  )
)

# Detectar filas vacías
rs <- row_sums(dtm)
sum(rs == 0)           # cuántos docs vacíos quedaron
## [1] 7
# Filtrar documentos con al menos 1 término
dtm <- dtm[rs > 0, ]
corpus <- corpus[rs > 0]   # mantén corpus y dtm alineados

# Inspeccionar la matriz
inspect(dtm[1:5, 1:5])  
## <<DocumentTermMatrix (documents: 5, terms: 5)>>
## Non-/sparse entries: 17/8
## Sparsity           : 32%
## Maximal term length: 11
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs abarrotes acabo actividades adultos ala
##    1         1     1           1       1   1
##    2         0     1           0       0   4
##    3         0     1           0       0   4
##    4         0     3          86       5  12
##    5         0     3          26       3  19
# muestra rápida

# Sumar columnas para el conteo total de cada término 
conteo_total <- colSums(as.matrix(dtm))

# Ordena y muestra los términos más comunes
terminos_comunes <- sort(conteo_total, decreasing = TRUE)

# Convierte los términos más comunes y sus frecuencias en un data frame
terminos_df <- data.frame(
  word = names(terminos_comunes),
  freq = as.numeric(terminos_comunes)
)

Resultados Cuantitativos

##Tablas o gráficos con los estadísticos descriptivos más relevantes.

# Revisión de Estadísticos Generales
# Número total de registros
registros_totales <- nrow(todo)
cat("Número total de registros en la base unificada:", registros_totales, "\n")
## Número total de registros en la base unificada: 36465
# Registros por periodos 
registros_por_periodo <- todo |>
  count(año_trimestre, name = "Número de registros por trimestre y año") |>
  arrange(año_trimestre)

print(registros_por_periodo)
## # A tibble: 11 × 2
##    año_trimestre `Número de registros por trimestre y año`
##    <chr>                                             <int>
##  1 2017_T4                                             464
##  2 2018_T4                                             407
##  3 2019_T4                                             583
##  4 2020_T4                                             920
##  5 2021_T4                                            4226
##  6 2022_T1                                            2310
##  7 2024_T2                                            5391
##  8 2024_T3                                            5354
##  9 2024_T4                                            4782
## 10 2025_T1                                            6172
## 11 2025_T2                                            5856
## Estadísticos descriptivos de variables numéricas de todo  
resumen_num <- todo |>
  select(where(is.numeric)) |>
  summarise(across(
    everything(),
    list(
      media = ~ mean(.x, na.rm = TRUE),
      desviacion = ~ sd(.x, na.rm = TRUE),
      minimo = ~ min(.x, na.rm = TRUE),
      maximo = ~ max(.x, na.rm = TRUE)
    ),
    .names = "{.col}_{.fn}"
  ))

knitr::kable(resumen_num, caption = "Estadísticos descriptivos de variables numéricas")
Estadísticos descriptivos de variables numéricas
año_media año_desviacion año_minimo año_maximo marca_temporal_media marca_temporal_desviacion marca_temporal_minimo marca_temporal_maximo x2_cuantos_anos_cumplidos_tiene_media x2_cuantos_anos_cumplidos_tiene_desviacion x2_cuantos_anos_cumplidos_tiene_minimo x2_cuantos_anos_cumplidos_tiene_maximo horario_de_inicio_de_taller_media horario_de_inicio_de_taller_desviacion horario_de_inicio_de_taller_minimo horario_de_inicio_de_taller_maximo x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_media x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_desviacion x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_minimo x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_maximo el_contenido_o_temas_del_curso_taller_media el_contenido_o_temas_del_curso_taller_desviacion el_contenido_o_temas_del_curso_taller_minimo el_contenido_o_temas_del_curso_taller_maximo la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_media la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_desviacion la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_minimo la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_maximo los_horarios_del_curso_taller_media los_horarios_del_curso_taller_desviacion los_horarios_del_curso_taller_minimo los_horarios_del_curso_taller_maximo el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_media el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_desviacion el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_minimo el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_maximo la_forma_de_ensenanza_utilizada_en_las_clases_media la_forma_de_ensenanza_utilizada_en_las_clases_desviacion la_forma_de_ensenanza_utilizada_en_las_clases_minimo la_forma_de_ensenanza_utilizada_en_las_clases_maximo la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_media la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_desviacion la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_minimo la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_maximo el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_media el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_desviacion el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_minimo el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_maximo la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_media la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_desviacion la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_minimo la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_maximo trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_media trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_desviacion trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_minimo trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_maximo salones_o_aulas_media salones_o_aulas_desviacion salones_o_aulas_minimo salones_o_aulas_maximo salas_de_computo_media salas_de_computo_desviacion salas_de_computo_minimo salas_de_computo_maximo banos_media banos_desviacion banos_minimo banos_maximo gimnasio_canchas_media gimnasio_canchas_desviacion gimnasio_canchas_minimo gimnasio_canchas_maximo polivalente_media polivalente_desviacion polivalente_minimo polivalente_maximo areas_verdes_media areas_verdes_desviacion areas_verdes_minimo areas_verdes_maximo horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_media horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_desviacion horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_minimo horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_maximo los_horarios_del_curso_o_taller_media los_horarios_del_curso_o_taller_desviacion los_horarios_del_curso_o_taller_minimo los_horarios_del_curso_o_taller_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_maximo sala_de_computo_media sala_de_computo_desviacion sala_de_computo_minimo sala_de_computo_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_maximo contenido_o_temas_del_curso_o_taller_media contenido_o_temas_del_curso_o_taller_desviacion contenido_o_temas_del_curso_o_taller_minimo contenido_o_temas_del_curso_o_taller_maximo calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_media calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_desviacion calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_minimo calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_maximo horarios_del_curso_o_taller_media horarios_del_curso_o_taller_desviacion horarios_del_curso_o_taller_minimo horarios_del_curso_o_taller_maximo manera_de_ensenar_del_tallerista_o_instructor_media manera_de_ensenar_del_tallerista_o_instructor_desviacion manera_de_ensenar_del_tallerista_o_instructor_minimo manera_de_ensenar_del_tallerista_o_instructor_maximo conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_media conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_desviacion conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_minimo conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_maximo motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_media motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_desviacion motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_minimo motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_maximo iluminacion_en_aulas_y_espacios_media iluminacion_en_aulas_y_espacios_desviacion iluminacion_en_aulas_y_espacios_minimo iluminacion_en_aulas_y_espacios_maximo limpieza_de_areas_media limpieza_de_areas_desviacion limpieza_de_areas_minimo limpieza_de_areas_maximo trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_media trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_desviacion trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_minimo trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_maximo horario_de_inicio_del_curso_o_taller_media horario_de_inicio_del_curso_o_taller_desviacion horario_de_inicio_del_curso_o_taller_minimo horario_de_inicio_del_curso_o_taller_maximo el_contenido_o_temas_del_curso_o_taller_media el_contenido_o_temas_del_curso_o_taller_desviacion el_contenido_o_temas_del_curso_o_taller_minimo el_contenido_o_temas_del_curso_o_taller_maximo la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_media la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_desviacion la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_minimo la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_maximo la_manera_de_ensenar_del_tallerista_o_instructor_media la_manera_de_ensenar_del_tallerista_o_instructor_desviacion la_manera_de_ensenar_del_tallerista_o_instructor_minimo la_manera_de_ensenar_del_tallerista_o_instructor_maximo el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_media el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_desviacion el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_minimo el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_maximo el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_media el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_desviacion el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_minimo el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_maximo iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_media iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_desviacion iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_minimo iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_maximo limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_media limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_desviacion limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_minimo limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_maximo
2023.519 1.795349 2017 2025 45330.98 603.1577 43064.42 45842.48 38.06565 15.3846 2 82 0.3514149 0.1877203 0 0.9583333 0.5 0.7071068 0 1 9.679752 0.9676746 1 10 9.264244 1.53231 1 10 9.677444 0.9643468 1 10 9.740881 0.8236199 1 10 9.71318 0.8503043 1 10 9.723497 0.8551263 1 10 9.725574 0.8582964 1 10 9.707252 0.8751227 1 10 9.638888 0.9351207 1 10 9.713478 0.8675139 1 10 8.946152 1.632469 1 10 7.890177 2.771296 1 10 7.991878 2.327694 1 10 7.707806 2.937746 1 10 8.391693 2.293245 1 10 7.912405 2.610466 1 10 0.4346031 0.2032529 0 0.9680556 9.630521 1.04423 1 10 9.606795 0.9631157 1 10 9.607291 0.9631542 1 10 8.200753 2.55105 1 10 9.610833 0.9941879 1 10 9.623632 0.9885569 1 10 9.545914 0.8304405 1 10 8.978938 1.540703 1 10 9.421651 1.035999 1 10 9.640691 0.7538381 1 10 9.633109 0.735998 1 10 9.617944 0.7774952 2 10 9.041702 1.46843 1 10 9.218197 1.242758 1 10 9.637424 0.9130526 1 10 0.3684126 0.1874075 0 0.9791667 9.80691 0.6135431 1 10 9.449598 1.352426 1 10 9.833649 0.6119239 1 10 9.875059 0.5351616 1 10 9.826313 0.621225 1 10 7.220776 4.071405 0 10 7.207762 4.172085 0 10
## Estadísticos descriptivos de variables numéricas por periodo
resumen_num_periodo <- todo |>
  group_by(año_trimestre) |>
  select(año_trimestre, where(is.numeric)) |>
  summarise(across(
    where(is.numeric),
    list(
      media      = ~ mean(.x, na.rm = TRUE),
      desviacion = ~ sd(.x, na.rm = TRUE),
      minimo     = ~ min(.x, na.rm = TRUE),
      maximo     = ~ max(.x, na.rm = TRUE)
    ),
    .names = "{.col}_{.fn}"
  ),
  .groups = "drop")
## Warning: There were 636 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `across(...)`.
## ℹ In group 1: `año_trimestre = "2017_T4"`.
## Caused by warning in `min()`:
## ! ningún argumento finito para min; retornando Inf
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 635 remaining warnings.
knitr::kable(resumen_num_periodo, caption = "Estadísticos descriptivos de variables numéricas por periodo (año_trimestre)")
Estadísticos descriptivos de variables numéricas por periodo (año_trimestre)
año_trimestre año_media año_desviacion año_minimo año_maximo marca_temporal_media marca_temporal_desviacion marca_temporal_minimo marca_temporal_maximo x2_cuantos_anos_cumplidos_tiene_media x2_cuantos_anos_cumplidos_tiene_desviacion x2_cuantos_anos_cumplidos_tiene_minimo x2_cuantos_anos_cumplidos_tiene_maximo horario_de_inicio_de_taller_media horario_de_inicio_de_taller_desviacion horario_de_inicio_de_taller_minimo horario_de_inicio_de_taller_maximo x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_media x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_desviacion x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_minimo x1_1_en_caso_de_haber_respondido_no_en_la_pregunta_anterior_favor_de_responder_el_costo_del_tramite_de_inscripcion_maximo el_contenido_o_temas_del_curso_taller_media el_contenido_o_temas_del_curso_taller_desviacion el_contenido_o_temas_del_curso_taller_minimo el_contenido_o_temas_del_curso_taller_maximo la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_media la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_desviacion la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_minimo la_cantidad_y_calidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_maximo los_horarios_del_curso_taller_media los_horarios_del_curso_taller_desviacion los_horarios_del_curso_taller_minimo los_horarios_del_curso_taller_maximo el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_media el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_desviacion el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_minimo el_conocimiento_del_tallerista_o_instructor_sobre_el_tema_del_curso_taller_maximo la_forma_de_ensenanza_utilizada_en_las_clases_media la_forma_de_ensenanza_utilizada_en_las_clases_desviacion la_forma_de_ensenanza_utilizada_en_las_clases_minimo la_forma_de_ensenanza_utilizada_en_las_clases_maximo la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_media la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_desviacion la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_minimo la_motivacion_a_la_participacion_de_parte_del_tallerista_o_instructor_maximo el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_media el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_desviacion el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_minimo el_cumplimiento_del_tallerista_o_instructor_con_los_horarios_establecidos_maximo la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_media la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_desviacion la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_minimo la_resolucion_de_preguntas_dudas_y_el_enriquecimiento_de_comentarios_maximo trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_media trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_desviacion trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_minimo trato_recibido_por_el_personal_que_labora_en_el_centro_comunitario_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_maximo salones_o_aulas_media salones_o_aulas_desviacion salones_o_aulas_minimo salones_o_aulas_maximo salas_de_computo_media salas_de_computo_desviacion salas_de_computo_minimo salas_de_computo_maximo banos_media banos_desviacion banos_minimo banos_maximo gimnasio_canchas_media gimnasio_canchas_desviacion gimnasio_canchas_minimo gimnasio_canchas_maximo polivalente_media polivalente_desviacion polivalente_minimo polivalente_maximo areas_verdes_media areas_verdes_desviacion areas_verdes_minimo areas_verdes_maximo horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_media horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_desviacion horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_minimo horario_de_inicio_de_curso_o_taller_usar_formato_de_12_hrs_maximo los_horarios_del_curso_o_taller_media los_horarios_del_curso_o_taller_desviacion los_horarios_del_curso_o_taller_minimo los_horarios_del_curso_o_taller_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_27_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_28_maximo sala_de_computo_media sala_de_computo_desviacion sala_de_computo_minimo sala_de_computo_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_24_maximo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_media calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_desviacion calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_minimo calidad_de_la_informacion_brindada_por_el_personal_del_centro_comunitario_25_maximo contenido_o_temas_del_curso_o_taller_media contenido_o_temas_del_curso_o_taller_desviacion contenido_o_temas_del_curso_o_taller_minimo contenido_o_temas_del_curso_o_taller_maximo calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_media calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_desviacion calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_minimo calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_o_taller_maximo horarios_del_curso_o_taller_media horarios_del_curso_o_taller_desviacion horarios_del_curso_o_taller_minimo horarios_del_curso_o_taller_maximo manera_de_ensenar_del_tallerista_o_instructor_media manera_de_ensenar_del_tallerista_o_instructor_desviacion manera_de_ensenar_del_tallerista_o_instructor_minimo manera_de_ensenar_del_tallerista_o_instructor_maximo conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_media conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_desviacion conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_minimo conocimientos_acerca_de_los_temas_por_parte_del_tallerista_o_instructor_maximo motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_media motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_desviacion motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_minimo motivacion_del_tallerista_o_instructor_en_la_participacion_del_taller_maximo iluminacion_en_aulas_y_espacios_media iluminacion_en_aulas_y_espacios_desviacion iluminacion_en_aulas_y_espacios_minimo iluminacion_en_aulas_y_espacios_maximo limpieza_de_areas_media limpieza_de_areas_desviacion limpieza_de_areas_minimo limpieza_de_areas_maximo trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_media trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_desviacion trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_minimo trato_y_o_informacion_brindada_por_el_personal_que_labora_en_el_centro_comunitario_maximo horario_de_inicio_del_curso_o_taller_media horario_de_inicio_del_curso_o_taller_desviacion horario_de_inicio_del_curso_o_taller_minimo horario_de_inicio_del_curso_o_taller_maximo el_contenido_o_temas_del_curso_o_taller_media el_contenido_o_temas_del_curso_o_taller_desviacion el_contenido_o_temas_del_curso_o_taller_minimo el_contenido_o_temas_del_curso_o_taller_maximo la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_media la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_desviacion la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_minimo la_calidad_y_cantidad_de_materiales_y_equipo_utilizados_en_el_curso_taller_maximo la_manera_de_ensenar_del_tallerista_o_instructor_media la_manera_de_ensenar_del_tallerista_o_instructor_desviacion la_manera_de_ensenar_del_tallerista_o_instructor_minimo la_manera_de_ensenar_del_tallerista_o_instructor_maximo el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_media el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_desviacion el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_minimo el_tallerista_o_instructor_conoce_el_tema_del_curso_taller_maximo el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_media el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_desviacion el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_minimo el_tallerista_o_instructor_motivo_la_participacion_entre_los_asistentes_maximo iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_media iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_desviacion iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_minimo iluminacion_en_aulas_y_espacios_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_maximo limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_media limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_desviacion limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_minimo limpieza_de_areas_en_caso_de_no_conocer_el_centro_comunitario_colocar_0_maximo
2017_T4 2017 0 2017 2017 43076.33 2.9885182 43064.42 43087.51 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.581897 0.8299053 2 10 8.579741 1.892950 1 10 9.534483 0.8306341 3 10 9.741379 0.5710161 5 10 9.676724 0.7825149 1 10 9.681035 0.7731916 3 10 8.939655 1.517579 1 10 8.969828 1.545269 1 10 9.674569 0.6732467 6 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2018_T4 2018 0 2018 2018 43456.63 14.0106699 43412.50 43475.72 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.378378 0.9254605 1 10 8.572482 1.471914 2 10 9.233415 1.1541588 1 10 9.501228 0.8211331 5 10 9.520884 0.7871700 5 10 9.481573 0.8118758 6 10 8.643735 1.841865 1 10 8.850123 1.274859 1 10 9.221130 1.0387780 4 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2019_T4 2019 0 2019 2019 43795.99 0.4075434 43795.60 43797.45 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.343053 0.8263169 6 10 8.699829 1.694173 1 10 9.301887 0.9799256 2 10 9.456261 0.8023105 5 10 9.430532 0.7983408 5 10 9.449400 0.8083088 4 10 8.794168 1.546140 1 10 9.090909 1.148869 1 10 9.379074 0.9872248 2 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2020_T4 2020 0 2020 2020 44180.73 11.3778511 44179.61 44524.48 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.730435 0.7413981 1 10 9.536957 1.017124 1 10 9.523913 1.0888064 1 10 9.768478 0.7388532 1 10 9.789130 0.5965911 5 10 9.753261 0.7128467 2 10 9.426087 1.064295 1 10 9.586956 0.996754 1 10 9.682609 0.7870841 3 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2021_T4 2021 0 2021 2021 44542.90 4.9972391 44539.54 44671.61 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.695693 0.8488993 1 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.699243 0.9216319 1 10 0.3684126 0.1874075 0 0.9791667 9.80691 0.6135431 1 10 9.449598 1.352426 1 10 9.833649 0.6119239 1 10 9.875059 0.5351616 1 10 9.826313 0.621225 1 10 7.220776 4.071405 0 10 7.207762 4.172085 0 10
2022_T1 2022 0 2022 2022 44652.88 3.4440797 44650.40 44663.62 38.06565 15.3846 2 82 0.3514149 0.1877203 0 0.9583333 0.5 0.7071068 0 1 9.772609 0.9009382 1 10 9.203913 1.763701 1 10 9.643913 1.1460097 1 10 9.822609 0.7746597 1 10 9.792174 0.8233909 1 10 9.803478 0.8150317 1 10 9.823478 0.7837886 1 10 9.797826 0.8422791 1 10 9.718696 0.9221540 1 10 9.713478 0.8675139 1 10 8.980218 1.707727 1 10 7.890177 2.771296 1 10 8.019100 2.408385 1 10 8.318554 2.374241 1 10 8.351978 2.312509 1 10 8.230559 2.384831 1 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2024_T2 2024 0 2024 2024 45454.62 3.9713462 45449.39 45473.80 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.691152 0.9873756 1 10 9.212020 1.570759 1 10 NaN NA Inf -Inf 9.776294 0.7736632 1 10 9.731775 0.8488940 1 10 9.752550 0.8329823 1 10 9.733259 0.8753930 1 10 9.731590 0.8496000 1 10 9.639028 0.9887633 1 10 NaN NA Inf -Inf 8.973721 1.595027 1 10 NaN NA Inf -Inf 7.745570 2.436973 1 10 7.625124 2.928972 1 10 8.445750 2.170132 1 10 7.789369 2.653010 1 10 0.3650714 0.2008712 0 0.9166667 9.631237 1.0724151 1 10 NaN NA Inf -Inf NaN NA Inf -Inf 8.236114 2.476089 1 10 9.610833 0.9941879 1 10 9.623632 0.9885569 1 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2024_T3 2024 0 2024 2024 45554.24 5.0506467 45546.57 45569.38 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.678932 0.9104376 1 10 9.204894 1.590429 1 10 NaN NA Inf -Inf 9.742622 0.8078327 1 10 9.711804 0.8102549 1 10 9.722451 0.8353709 1 10 9.725252 0.8185736 1 10 9.698356 0.8682977 1 10 9.619537 0.9164618 1 10 NaN NA Inf -Inf 8.815677 1.724212 1 10 NaN NA Inf -Inf 7.797448 2.356216 1 10 7.758355 2.802115 1 10 8.242860 2.312928 1 10 7.867126 2.516752 1 10 0.3722190 0.1993586 0 0.9319444 9.625700 1.0450263 1 10 9.602727 0.9549932 1 10 9.594509 0.9792045 1 10 8.178043 2.470429 1 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2024_T4 2024 0 2024 2024 45633.32 3.2419451 45628.64 45651.50 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.692388 0.9229355 1 10 9.315140 1.437980 1 10 NaN NA Inf -Inf 9.748850 0.7749704 1 10 9.722083 0.8062255 1 10 9.731911 0.8227459 1 10 9.739858 0.8145794 1 10 9.720828 0.8430859 1 10 9.635090 0.9222246 1 10 NaN NA Inf -Inf 8.913203 1.689618 1 10 NaN NA Inf -Inf 7.988800 2.368080 1 10 7.669825 2.997516 1 10 8.435494 2.344768 1 10 7.983200 2.586325 1 10 0.4813368 0.1966650 0 0.9680556 9.651819 1.0114673 1 10 9.611041 0.9768859 1 10 9.622334 0.9614984 1 10 8.237562 2.530340 1 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2025_T1 2025 0 2025 2025 45725.60 5.4632312 45716.60 45747.74 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.692158 0.9169977 1 10 9.333927 1.444527 1 10 NaN NA Inf -Inf 9.735256 0.8237490 1 10 9.717272 0.8148714 1 10 9.719864 0.8283821 1 10 9.727155 0.8353835 1 10 9.712897 0.8227495 1 10 9.681303 0.8380556 1 10 NaN NA Inf -Inf 9.034557 1.477303 1 10 NaN NA Inf -Inf 8.184485 2.236990 1 10 7.780598 2.935292 1 10 8.415767 2.291752 1 10 7.963103 2.614143 1 10 0.4675882 0.1917978 0 0.9666667 9.654731 0.9826919 1 10 9.645496 0.8838148 1 10 9.650519 0.8737487 1 10 8.261879 2.528682 1 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
2025_T2 2025 0 2025 2025 45828.76 3.0374816 45824.78 45842.48 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf 9.610143 1.1000316 1 10 9.275273 1.504804 1 10 NaN NA Inf -Inf 9.674010 0.9282256 1 10 9.654713 0.9590977 1 10 9.663251 0.9528537 1 10 9.667008 0.9550679 1 10 9.640369 0.9849956 1 10 9.583504 1.0071619 1 10 NaN NA Inf -Inf 8.968165 1.654713 1 10 NaN NA Inf -Inf 8.198127 2.190342 1 10 7.528464 3.127995 1 10 8.426217 2.333415 1 10 7.868352 2.720289 1 10 0.4827221 0.1931929 0 0.9680556 9.591359 1.1039192 1 10 9.566257 1.0351873 1 10 9.561134 1.0348425 1 10 8.092884 2.726323 1 10 NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf NaN NA Inf -Inf
# Categóricas: Top 10 frecuencias por variable y por periodo
cat_cols <- todo |> select(where(is.character)) |> names()

freqs_cat_periodo <- map(cat_cols, \(col){
  todo |>
    count(año_trimestre, .data[[col]], sort = TRUE, name = "n") |>
    group_by(año_trimestre) |>
    slice_head(n = 10) |>
    ungroup() |>
    mutate(variable = col, .before = 1,
           respuesta = .data[[col]]) |>
    select(variable, año_trimestre, respuesta, n)
}) |> bind_rows()

Interpretación breve de los patrones identificados.

Se evidencia una tendencia sostenida de satisfacción alta entre los participantes, con variaciones leves entre trimestres. Los indicadores de percepción sobre el taller, el personal y la utilidad del curso concentran las puntuaciones más elevadas, con medias superiores a 4 en una escala de 1 a 5, lo que confirma la eficacia percibida del programa.

La distribución de frecuencias muestra que los talleres de oficios, manualidades y desarrollo personal son los más demandados, seguidos por los cursos de salud y bienestar. Las categorías asociadas a la atención y trato del personal presentan concentraciones notables en las respuestas más positivas, lo que coincide con los hallazgos cualitativos sobre la relevancia del componente humano.

Las desviaciones estándar bajas reflejan una homogeneidad en las percepciones, lo que sugiere una experiencia de servicio consistente en la mayoría de los centros. Sin embargo, la dispersión es ligeramente mayor en las variables relacionadas con infraestructura y materiales, lo que coincide con los comentarios textuales que aluden a la necesidad de mejorar los espacios físicos y recursos de apoyo.

Finalmente, las correlaciones entre satisfacción general, intención de recomendación y continuidad en los cursos resultan positivas y significativas, lo que respalda la hipótesis de que la calidad percibida y la experiencia del usuario influyen directamente en la retención y recomendación. En conjunto, los resultados cuantitativos confirman que los talleres no solo cumplen una función educativa, sino también social y de fortalecimiento comunitario.


Resultados cualitativos

Principales palabras clave, nubes de palabras y tópicos detectados.

## Tópicos

# Configurar el número de tópicos
num_topics <- 6

# Ajustar el modelo LDA
lda_model <- LDA(dtm, k = num_topics, control = list(seed = 123))

# Extraer los tópicos y palabras clave
# Mostrar las 10 palabras clave principales por tópico
terms(lda_model, 6)
##      Topic 1    Topic 2    Topic 3     Topic 4      Topic 5         Topic 6    
## [1,] "ayuda"    "bien"     "maestra"   "reposteria" "falta"         "amables"  
## [2,] "salud"    "cursos"   "bien"      "cocina"     "bien"          "bien"     
## [3,] "bien"     "clases"   "excelente" "ingles"     "banos"         "atentos"  
## [4,] "bueno"    "linea"    "buena"     "corte"      "mantenimiento" "personal" 
## [5,] "personal" "material" "buen"      "pintura"    "areas"         "trato"    
## [6,] "hacer"    "gustaria" "explica"   "maria"      "salones"       "excelente"
terms_lda <- terms(lda_model, 6)

## Nube de palabras

# Crear la nube de palabras con wordcloud2
wordcloud2(
  terminos_df, 
  size = 0.5, 
  color = "random-light", 
  backgroundColor = "black")
## Gráfico de barras con las 15 palabras más frecuentes
# Selecciona las filas más grandes
# Las ordena de mayor a menor frecuencia
top15 <- terminos_df |> slice_max(order_by = freq, n = 15)

# Crear el gráfico
ggplot(top15, 
       aes(x = reorder(word, freq), y = freq)) +
  geom_col(fill = "pink") +
  
  # Invertir el órden de x e y 
  coord_flip() +
  
  # Título de los ejes
  labs(
    title = "Top 15 palabras más frecuentes en respuestas abiertas",
    x = NULL, y = "Frecuencia"
  ) +
  theme_minimal()

Interpretación narrativa de los temas predominantes.

La palabra más predominante en la nube de palabras es “bien”: lo que muestra que la mayoría de las respuestas reflejan opiniones positivas y concisas sobre la calidad de los talleres. En general, los participantes utilizan términos que expresan satisfacción y gratitud, mientras que los comentarios críticos son menos frecuentes y se enfocan en aspectos prácticos como materiales o mantenimiento. Este patrón sugiere un sentido de comunidad y aprecio hacia las actividades y el personal, identificando factores cualitativos como la atención, la utilidad percibida y el ambiente del taller, que influyen directamente en la satisfacción general. Estas dimensiones pueden tener un efecto importante en la intención de recomendación y en la retención de usuarios. Comprender qué atributos generan una experiencia positiva permitirá integrar los hallazgos cualitativos con la evaluación cuantitativa y optimizar el diseño del servicio para fortalecer tanto la permanencia como la promoción de los talleres comunitarios.


Conclusiones parciales y próximos pasos

Los resultados obtenidos hasta el momento permiten afirmar que los Centros Comunitarios de Nuevo León cumplen su función social y educativa de alto valor para las comunidades. La evidencia cuantitativa muestra una valoración consistentemente positiva en variables como la calidad de los talleres, la atención del personal y la utilidad práctica de los contenidos. A su vez, los resultados cualitativos revelan un discurso de gratitud y reconocimiento hacia los instructores, junto con demandas específicas relacionadas con la infraestructura y los materiales de apoyo.

En conjunto, estos hallazgos sugieren que la experiencia del usuario se estructura en torno a dos dimensiones principales: una afectiva-relacional, vinculada con la confianza y el acompañamiento del personal, y otra material-operativa, asociada con la disponibilidad de recursos y la comodidad de los espacios.

Para las siguientes etapas del análisis, se propone avanzar hacia una modelación estadística explicativa, que permita identificar los factores con mayor peso en la satisfacción y en la retención de los usuarios.Este enfoque facilitará una comprensión más profunda del impacto de los talleres y ofrecerá evidencia empírica para optimizar el diseño del servicio, priorizando los atributos con mayor influencia en la experiencia ciudadana y en la sostenibilidad del programa comunitario.