1 1. Propósito del análisis

El presente análisis tiene como finalidad identificar factores asociados con el riesgo potencial de abandono escolar en estudiantes del CONALEP Plantel Lerma 199.

La clasificación obtenida tiene un propósito preventivo y exploratorio. Por tanto, no significa que un estudiante necesariamente abandonará sus estudios, sino que permite identificar condiciones que podrían justificar acciones de seguimiento, acompañamiento tutorial y atención institucional.

2 2. Variable de estudio

La variable dependiente es el riesgo potencial de abandono escolar, operacionalizado mediante:

  • puntaje_riesgo: suma de condiciones de riesgo identificadas.
  • nivel_riesgo: clasificación en Bajo, Moderado, Alto o Muy alto.

Las variables explicativas se organizan en cinco dimensiones:

  1. Académica.
  2. Escolar y vocacional.
  3. Socioeconómica y laboral.
  4. Familiar.
  5. Contextual y expectativas de futuro.

3 3. Carga de paquetes

paquetes <- c(
  "readxl",
  "dplyr",
  "janitor",
  "stringr",
  "ggplot2",
  "scales",
  "tidyr",
  "readr",
  "knitr"
)

faltantes <- paquetes[
  !paquetes %in% rownames(installed.packages())
]

if(length(faltantes) > 0){
  install.packages(faltantes)
}

library(readxl)
library(dplyr)
library(janitor)
library(stringr)
library(ggplot2)
library(scales)
library(tidyr)
library(readr)
library(knitr)

4 4. Localización automática del archivo Excel

El archivo Excel debe estar en la misma carpeta que este archivo .Rmd.

archivos_excel <- list.files(
  path = ".",
  pattern = "\\.xlsx$",
  full.names = TRUE
)

if(length(archivos_excel) == 0){
  stop(
    paste0(
      "\n\nERROR: No se encontró ningún archivo .xlsx en la carpeta actual.\n\n",
      "Guarda el archivo Excel en la misma carpeta que este R Markdown."
    )
  )
}

if(length(archivos_excel) > 1){

  cat("Se encontraron varios archivos Excel:\n\n")

  for(i in seq_along(archivos_excel)){
    cat(i, "-", archivos_excel[i], "\n")
  }

  cat(
    "\nSe utilizará automáticamente el primer archivo encontrado.\n"
  )
}

archivo <- archivos_excel[1]

cat(
  "Archivo Excel utilizado:\n",
  archivo,
  "\n"
)
## Archivo Excel utilizado:
##  ./Conociendo a Nuestra Comunidad Estudiantil – CONALEP Lerma 199, 2026 (Respuestas).xlsx

5 5. Importación de la base

datos <- read_excel(
  archivo
)

datos <- datos %>%
  clean_names()

cat(
  "Registros importados:",
  nrow(datos),
  "\n"
)
## Registros importados: 28
cat(
  "Variables importadas:",
  ncol(datos),
  "\n"
)
## Variables importadas: 115

6 6. Revisión de variables disponibles

tabla_variables <- data.frame(
  numero = seq_along(names(datos)),
  variable = names(datos)
)

knitr::kable(
  tabla_variables,
  col.names = c(
    "Número",
    "Nombre de variable"
  ),
  caption = "Variables detectadas en la base"
)
Variables detectadas en la base
Número Nombre de variable
1 marca_temporal
2 aceptas_participar
3 apellido_paterno_apellido_materno_nombre_s
4 matricula
5 plantel_al_que_perteneces
6 turno_al_que_perteneces
7 que_carrera_cursas
8 semestre
9 grupo
10 x1_genero
11 x2_edad
12 a_que_municipio_perteneces
13 si_no_eres_originario_del_estado_de_mexico_a_que_estado_o_pais_perteneces
14 x3_cual_es_tu_estado_civil
15 tienes_una_relacion_sentimental
16 tiempo_de_relacion_con_tu_pareja
17 x4_tienes_hijos
18 cuantos
19 alguien_depende_de_ti_economicamente
20 x5_sales_a_fiestas_o_reuniones_con_tus_amigas_os
21 en_reuniones_y_o_actividades_sociales_ingieres_bebidas_alcoholicas_y_o_tabaco
22 x7_nombre_de_la_institucion_donde_curso_la_secundaria
23 promedio_inmediato_anterior
24 te_expulsaron_y_o_suspendieron_en_alguna_ocasion
25 tuviste_problemas_con_algun_maestro_a_o_algun_companero_a
26 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_la_bibliografia_del_programa_de_estudio_de_la_licenciatura
27 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_bibliografia_que_busco_por_mi_cuenta
28 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_antologias
29 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_revistas_especializadas
30 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_enciclopedias
31 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_diccionarios
32 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_libros_de_texto
33 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_paginas_web
34 que_tipo_de_lecturas_acostumbras_a_utilizar_al_cursar_tus_estudios_redes_sociales
35 donde_obtienes_los_materiales_para_realizar_tus_actividades_academicas_biblioteca
36 donde_obtienes_los_materiales_para_realizar_tus_actividades_academicas_los_compro
37 donde_obtienes_los_materiales_para_realizar_tus_actividades_academicas_los_fotocopio
38 donde_obtienes_los_materiales_para_realizar_tus_actividades_academicas_los_pido_prestados
39 donde_obtienes_los_materiales_para_realizar_tus_actividades_academicas_via_internet
40 cuales_son_las_formas_de_estudio_y_o_realizacion_de_trabajos_escolares_que_empleas_regularmente_individual
41 cuales_son_las_formas_de_estudio_y_o_realizacion_de_trabajos_escolares_que_empleas_regularmente_grupal
42 en_promedio_cuantas_horas_a_la_semana_dedicas_para_el_desarrollo_de_actividades_extraclases_comprende_lecturas_trabajos_y_tareas
43 a_lo_largo_de_tu_trayectoria_en_conalep_que_opinion_tienes_sobre_los_trabajos_y_evidencias_que_te_piden_tus_docentes_marca_una_opcion_por_renglon_las_y_los_profesores_revisan_los_trabajos
44 a_lo_largo_de_tu_trayectoria_en_conalep_que_opinion_tienes_sobre_los_trabajos_y_evidencias_que_te_piden_tus_docentes_marca_una_opcion_por_renglon_las_y_los_profesores_regresan_los_trabajos
45 a_lo_largo_de_tu_trayectoria_en_conalep_que_opinion_tienes_sobre_los_trabajos_y_evidencias_que_te_piden_tus_docentes_marca_una_opcion_por_renglon_las_y_los_profesores_regresan_los_trabajos_con_correcciones_y_comentarios
46 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_presentacion
47 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_uso_de_bibliografia
48 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_ortografia
49 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_redaccion
50 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_extension
51 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_dominio_de_la_materia
52 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_ideas_originales
53 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_capacidad_de_analisis
54 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_capacidad_de_critica
55 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_capacidad_de_sintesis
56 que_aspectos_fueron_revisados_en_tus_trabajos_marca_una_opcion_por_cada_renglon_orden_y_coherencia
57 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_musica
58 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_exposiciones_artisticas
59 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_cine
60 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_presentacion_de_libros
61 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_danza
62 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_eventos_deportivos
63 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_teatro
64 con_que_frecuencia_asistes_a_los_siguientes_eventos_marca_una_opcion_por_renglon_museos
65 realizas_alguna_de_las_siguientes_actividades_socio_recreativas_a_deportiva
66 realizas_alguna_de_las_siguientes_actividades_socio_recreativas_b_culturales
67 hablas_algun_dialecto_o_lengua_indigena
68 tus_papas_o_tus_abuelos_as_son_indigenas
69 tus_papas_o_tus_abuelos_as_hablan_o_entienden_alguna_lengua_indigena
70 actualmente_vive_con
71 cual_es_tu_lugar_de_residencia_mientras_estudias_en_la_conalep
72 selecciona_los_servicios_con_los_que_cuenta_la_casa_donde_vives_servicios
73 que_lugar_ocupan_tus_estudios_dentro_de_las_prioridades_de_tu_familia
74 cuanto_tiempo_haces_diariamente_para_trasladarte_de_tu_lugar_de_residencia_a_la_escuela
75 tienes_alguna_discapacidad
76 padeces_o_padeciste_alguna_enfermedad
77 cual
78 algun_familiar_de_linea_directa_padece_alguna_enfermedad
79 menciona_el_parentesco_y_patologia
80 presentas_alguna_de_las_siguientes_condiciones_usas_lentes
81 presentas_alguna_de_las_siguientes_condiciones_estas_en_tratamiento_dental
82 presentas_alguna_de_las_siguientes_condiciones_tienes_alguna_discapacidad_auditiva
83 presentas_alguna_de_las_siguientes_condiciones_estas_en_algun_tratamiento_medico
84 presentas_alguna_de_las_siguientes_condiciones_tienes_algun_padecimiento_cronico
85 presentas_alguna_de_las_siguientes_condiciones_tienes_alguna_alergia
86 haz_llevado_algun_seguimiento_de_atencion_psicologica
87 actualmente_continuas_con_un_plan_de_atencion_psicologica
88 en_cual_de_las_siguientes_instituciones_de_salud_tienes_derecho_a_recibir_servicio_medico_senale_todas_las_opciones_que_aplica
89 la_carrera_que_estas_estudiando_fue_tu_primera_opcion
90 asistes_a_conalep_porque_crees_que_te_sera_de_utilidad
91 te_gusta_conalep
92 que_tanto_dominas_el_idioma_ingles
93 en_que_areas_considera_utilizar_el_idioma_ingles_areas
94 que_nivel_de_idioma_ingles_tienes
95 con_que_documento_probatorio_compruebas_tu_nivel_de_idioma_ingles
96 donde_obtuviste_dicho_documento
97 en_la_actualidad_en_cual_de_las_siguientes_situaciones_te_encuentras
98 que_esperas_obtener_de_la_educacion_en_conalep_en_un_futuro
99 cual_es_la_principal_razon_por_la_que_dejarias_de_estudiar
100 los_recursos_economicos_con_los_que_cuentas_para_desarrollar_tus_actividades_academicas_son
101 cual_es_el_medio_de_transporte_que_utilizas_regularmente_para_trasladarte_a_conalep_puedes_marcar_mas_de_una_opcion
102 a_cuanto_ascienden_tus_gastos_escolares_sepanles
103 quien_cubre_tus_gastos_escolares
104 cual_fue_la_escolaridad_maxima_alcanzada_por_tu_padre
105 cual_fue_la_escolaridad_maxima_alcanzada_por_tu_madre
106 recibes_alguna_beca_para_apoyar_tus_estudios
107 cual_beca_recibes
108 en_caso_de_tener_otra_beca_especifica
109 para_que_utilizas_principalmente_el_dinero_de_la_beca
110 como_te_sientes_en_relacion_a_tu_futuro
111 tienes_celular
112 tienes_computadora_personal
113 que_herramientas_digitales_dominas
114 principalmente_en_donde_usas_internet
115 de_las_siguientes_redes_sociales_selecciona_en_las_que_estas_registrado

7 7. Función para buscar columnas

buscar_columna <- function(datos, patrones){

  nombres <- names(datos)

  for(patron in patrones){

    encontrada <- nombres[
      str_detect(
        nombres,
        regex(
          patron,
          ignore_case = TRUE
        )
      )
    ]

    if(length(encontrada) > 0){
      return(
        encontrada[1]
      )
    }
  }

  NA_character_
}

8 8. Identificación automática de variables

col_consentimiento <- buscar_columna(
  datos,
  c(
    "aceptas_participar",
    "acepta.*participar",
    "consentimiento"
  )
)

col_promedio <- buscar_columna(
  datos,
  c(
    "promedio_inmediato_anterior",
    "promedio.*anterior",
    "promedio"
  )
)

col_suspension <- buscar_columna(
  datos,
  c(
    "expulsaron.*suspendieron",
    "suspendieron",
    "expulsaron"
  )
)

col_convivencia <- buscar_columna(
  datos,
  c(
    "problemas.*maestro",
    "problemas.*docente",
    "problemas.*companero"
  )
)

col_primera_opcion <- buscar_columna(
  datos,
  c(
    "carrera.*primera_opcion",
    "primera_opcion"
  )
)

col_utilidad <- buscar_columna(
  datos,
  c(
    "sera_de_utilidad",
    "utilidad"
  )
)

col_gusto <- buscar_columna(
  datos,
  c(
    "te_gusta_conalep",
    "gusta.*conalep"
  )
)

col_prioridad <- buscar_columna(
  datos,
  c(
    "prioridades.*familia",
    "prioridad.*familia"
  )
)

col_recursos <- buscar_columna(
  datos,
  c(
    "recursos_economicos",
    "recursos.*academicas"
  )
)

col_abandono <- buscar_columna(
  datos,
  c(
    "principal_razon.*dejarias",
    "razon.*dejar.*estudiar",
    "dejar.*estudiar"
  )
)

col_situacion <- buscar_columna(
  datos,
  c(
    "actualidad.*situaciones",
    "situacion.*encuentras"
  )
)

col_traslado <- buscar_columna(
  datos,
  c(
    "tiempo.*trasladarte",
    "residencia.*escuela",
    "traslado"
  )
)

col_futuro <- buscar_columna(
  datos,
  c(
    "sientes.*futuro",
    "relacion.*futuro"
  )
)

col_carrera <- buscar_columna(
  datos,
  c(
    "que_carrera_cursas",
    "carrera_cursas",
    "^carrera$"
  )
)

col_grupo <- buscar_columna(
  datos,
  c(
    "^grupo$",
    "grupo"
  )
)

col_genero <- buscar_columna(
  datos,
  c(
    "genero",
    "sexo"
  )
)

col_nombre <- buscar_columna(
  datos,
  c(
    "apellido_paterno.*apellido_materno",
    "nombre_s",
    "nombre_completo"
  )
)

col_matricula <- buscar_columna(
  datos,
  c(
    "matricula"
  )
)

9 9. Tabla de variables detectadas

variables_detectadas <- data.frame(

  Variable = c(
    "Consentimiento",
    "Promedio",
    "Suspensión o expulsión",
    "Problemas de convivencia",
    "Carrera primera opción",
    "Utilidad de CONALEP",
    "Gusto por CONALEP",
    "Prioridad familiar",
    "Recursos económicos",
    "Razón para dejar de estudiar",
    "Situación laboral",
    "Tiempo de traslado",
    "Percepción del futuro",
    "Carrera",
    "Grupo",
    "Género",
    "Nombre",
    "Matrícula"
  ),

  Columna = c(
    col_consentimiento,
    col_promedio,
    col_suspension,
    col_convivencia,
    col_primera_opcion,
    col_utilidad,
    col_gusto,
    col_prioridad,
    col_recursos,
    col_abandono,
    col_situacion,
    col_traslado,
    col_futuro,
    col_carrera,
    col_grupo,
    col_genero,
    col_nombre,
    col_matricula
  )
)

knitr::kable(
  variables_detectadas,
  caption = "Variables detectadas automáticamente"
)
Variables detectadas automáticamente
Variable Columna
Consentimiento aceptas_participar
Promedio promedio_inmediato_anterior
Suspensión o expulsión te_expulsaron_y_o_suspendieron_en_alguna_ocasion
Problemas de convivencia tuviste_problemas_con_algun_maestro_a_o_algun_companero_a
Carrera primera opción la_carrera_que_estas_estudiando_fue_tu_primera_opcion
Utilidad de CONALEP asistes_a_conalep_porque_crees_que_te_sera_de_utilidad
Gusto por CONALEP te_gusta_conalep
Prioridad familiar que_lugar_ocupan_tus_estudios_dentro_de_las_prioridades_de_tu_familia
Recursos económicos los_recursos_economicos_con_los_que_cuentas_para_desarrollar_tus_actividades_academicas_son
Razón para dejar de estudiar cual_es_la_principal_razon_por_la_que_dejarias_de_estudiar
Situación laboral en_la_actualidad_en_cual_de_las_siguientes_situaciones_te_encuentras
Tiempo de traslado cuanto_tiempo_haces_diariamente_para_trasladarte_de_tu_lugar_de_residencia_a_la_escuela
Percepción del futuro como_te_sientes_en_relacion_a_tu_futuro
Carrera que_carrera_cursas
Grupo grupo
Género x1_genero
Nombre apellido_paterno_apellido_materno_nombre_s
Matrícula matricula

10 10. Casos válidos

if(!is.na(col_consentimiento)){

  datos_validos <- datos %>%
    filter(
      str_detect(
        str_to_lower(
          as.character(
            .data[[col_consentimiento]]
          )
        ),
        "sí|si"
      )
    )

} else {

  datos_validos <- datos

  cat(
    "Advertencia: no se encontró una variable de consentimiento.\n"
  )
}

cat(
  "Casos válidos:",
  nrow(datos_validos),
  "\n"
)
## Casos válidos: 27

11 11. Funciones auxiliares

obtener_texto <- function(data, columna){

  if(is.na(columna)){
    return(
      rep(
        NA_character_,
        nrow(data)
      )
    )
  }

  as.character(
    data[[columna]]
  )
}


obtener_numero <- function(data, columna){

  if(is.na(columna)){
    return(
      rep(
        NA_real_,
        nrow(data)
      )
    )
  }

  parse_number(
    as.character(
      data[[columna]]
    )
  )
}

12 12. Construcción de factores de riesgo

Cada condición de riesgo suma 1 punto.

riesgo <- datos_validos

promedio_tmp <- obtener_numero(
  riesgo,
  col_promedio
)

riesgo$riesgo_promedio <- ifelse(
  !is.na(promedio_tmp) &
    promedio_tmp < 7,
  1L,
  0L
)


texto_suspension <- str_to_lower(
  obtener_texto(
    riesgo,
    col_suspension
  )
)

riesgo$riesgo_suspension <- ifelse(
  !is.na(texto_suspension) &
    !str_detect(
      texto_suspension,
      "^no$|nunca|ninguna"
    ),
  1L,
  0L
)


texto_convivencia <- str_to_lower(
  obtener_texto(
    riesgo,
    col_convivencia
  )
)

riesgo$riesgo_convivencia <- ifelse(
  !is.na(texto_convivencia) &
    !str_detect(
      texto_convivencia,
      "^no$|ninguno|ninguna|nunca"
    ),
  1L,
  0L
)


texto_primera <- str_to_lower(
  obtener_texto(
    riesgo,
    col_primera_opcion
  )
)

riesgo$riesgo_carrera <- ifelse(
  str_detect(
    texto_primera,
    "^no$"
  ),
  1L,
  0L
)


texto_utilidad <- str_to_lower(
  obtener_texto(
    riesgo,
    col_utilidad
  )
)

riesgo$riesgo_utilidad <- ifelse(
  str_detect(
    texto_utilidad,
    "^no$"
  ),
  1L,
  0L
)


texto_gusto <- str_to_lower(
  obtener_texto(
    riesgo,
    col_gusto
  )
)

riesgo$riesgo_gusto <- ifelse(
  str_detect(
    texto_gusto,
    "^no$"
  ),
  1L,
  0L
)


texto_prioridad <- str_to_lower(
  obtener_texto(
    riesgo,
    col_prioridad
  )
)

riesgo$riesgo_prioridad <- ifelse(
  str_detect(
    texto_prioridad,
    "muy bajo|bajo"
  ),
  1L,
  0L
)


texto_recursos <- str_to_lower(
  obtener_texto(
    riesgo,
    col_recursos
  )
)

riesgo$riesgo_recursos <- ifelse(
  str_detect(
    texto_recursos,
    "insuficiente"
  ),
  1L,
  0L
)


texto_abandono <- str_to_lower(
  obtener_texto(
    riesgo,
    col_abandono
  )
)

riesgo$riesgo_abandono_economico <- ifelse(
  str_detect(
    texto_abandono,
    "econ[oó]mic|dinero|trabaj"
  ),
  1L,
  0L
)


texto_situacion <- str_to_lower(
  obtener_texto(
    riesgo,
    col_situacion
  )
)

riesgo$riesgo_trabajo <- ifelse(
  str_detect(
    texto_situacion,
    "trabaj|empleo|pagado"
  ),
  1L,
  0L
)


texto_traslado <- str_to_lower(
  obtener_texto(
    riesgo,
    col_traslado
  )
)

riesgo$riesgo_traslado <- ifelse(
  str_detect(
    texto_traslado,
    "1 hr|1 hora|1 ½|1 1/2|1.5|2 hrs|2 horas|más de 2|mas de 2"
  ),
  1L,
  0L
)


riesgo$riesgo_intencion <- ifelse(

  is.na(texto_abandono),

  0L,

  ifelse(

    str_detect(
      texto_abandono,
      "no pienso dejar|no dejar[ií]a|no tengo pensado|ninguna"
    ),

    0L,

    1L
  )
)


texto_futuro <- str_to_lower(
  obtener_texto(
    riesgo,
    col_futuro
  )
)

riesgo$riesgo_futuro <- ifelse(
  str_detect(
    texto_futuro,
    "incertidumbre|miedo|temor|me da igual|preocup"
  ),
  1L,
  0L
)

13 13. Puntaje total

riesgo <- riesgo %>%
  mutate(

    puntaje_riesgo =
      riesgo_promedio +
      riesgo_suspension +
      riesgo_convivencia +
      riesgo_carrera +
      riesgo_utilidad +
      riesgo_gusto +
      riesgo_prioridad +
      riesgo_recursos +
      riesgo_abandono_economico +
      riesgo_trabajo +
      riesgo_traslado +
      riesgo_intencion +
      riesgo_futuro
  )

14 14. Clasificación del riesgo

riesgo <- riesgo %>%
  mutate(

    nivel_riesgo = case_when(

      puntaje_riesgo <= 2 ~ "Bajo",

      puntaje_riesgo >= 3 &
        puntaje_riesgo <= 5 ~ "Moderado",

      puntaje_riesgo >= 6 &
        puntaje_riesgo <= 10 ~ "Alto",

      puntaje_riesgo >= 11 ~ "Muy alto"
    )
  )

riesgo$nivel_riesgo <- factor(
  riesgo$nivel_riesgo,
  levels = c(
    "Bajo",
    "Moderado",
    "Alto",
    "Muy alto"
  )
)

15 15. Tabla general de riesgo

tabla_riesgo <- riesgo %>%
  count(
    nivel_riesgo,
    .drop = FALSE
  ) %>%
  mutate(
    porcentaje =
      round(
        n / sum(n) * 100,
        1
      )
  )

knitr::kable(
  tabla_riesgo,
  col.names = c(
    "Nivel de riesgo",
    "Estudiantes",
    "Porcentaje"
  ),
  caption =
    "Distribución del riesgo potencial de abandono escolar"
)
Distribución del riesgo potencial de abandono escolar
Nivel de riesgo Estudiantes Porcentaje
Bajo 10 37.0
Moderado 15 55.6
Alto 2 7.4
Muy alto 0 0.0

16 16. Semáforo general de riesgo

g1 <- ggplot(
  tabla_riesgo,
  aes(
    x = nivel_riesgo,
    y = n,
    fill = nivel_riesgo
  )
) +

  geom_col(
    width = 0.65
  ) +

  geom_text(
    aes(
      label =
        paste0(
          n,
          "\n(",
          porcentaje,
          "%)"
        )
    ),
    vjust = -0.4,
    fontface = "bold",
    size = 5
  ) +

  scale_fill_manual(
    values = c(
      "Bajo" = "#2E7D32",
      "Moderado" = "#FBC02D",
      "Alto" = "#F57C00",
      "Muy alto" = "#C62828"
    ),
    drop = FALSE
  ) +

  labs(
    title =
      "Riesgo potencial de abandono escolar",

    subtitle =
      "CONALEP Plantel Lerma 199, 2026",

    x =
      "Nivel de riesgo",

    y =
      "Número de estudiantes",

    caption =
      paste0(
        "n = ",
        nrow(riesgo)
      )
  ) +

  theme_minimal(
    base_size = 14
  ) +

  theme(
    legend.position = "none",
    plot.title =
      element_text(
        face = "bold",
        hjust = 0.5
      ),
    plot.subtitle =
      element_text(
        hjust = 0.5
      )
  )

g1

17 17. Interpretación general

obtener_nivel <- function(nivel){

  tmp <- tabla_riesgo %>%
    filter(
      nivel_riesgo == nivel
    )

  if(nrow(tmp) == 0){
    return(
      c(
        n = 0,
        porcentaje = 0
      )
    )
  }

  c(
    n = tmp$n[1],
    porcentaje = tmp$porcentaje[1]
  )
}

bajo <- obtener_nivel("Bajo")
moderado <- obtener_nivel("Moderado")
alto <- obtener_nivel("Alto")
muy_alto <- obtener_nivel("Muy alto")

cat(
  paste0(

    "De un total de ",
    nrow(riesgo),
    " estudiantes, ",

    bajo["n"],
    " (",
    bajo["porcentaje"],
    "%) presentan riesgo bajo; ",

    moderado["n"],
    " (",
    moderado["porcentaje"],
    "%) riesgo moderado; ",

    alto["n"],
    " (",
    alto["porcentaje"],
    "%) riesgo alto; y ",

    muy_alto["n"],
    " (",
    muy_alto["porcentaje"],
    "%) riesgo muy alto. ",

    "Estos resultados deben interpretarse como indicadores preventivos y no como una predicción definitiva de abandono escolar."
  )
)

De un total de 27 estudiantes, 10 (37%) presentan riesgo bajo; 15 (55.6%) riesgo moderado; 2 (7.4%) riesgo alto; y 0 (0%) riesgo muy alto. Estos resultados deben interpretarse como indicadores preventivos y no como una predicción definitiva de abandono escolar.

18 18. Riesgo por carrera

if(!is.na(col_carrera)){

  riesgo$carrera_grafica <- obtener_texto(
    riesgo,
    col_carrera
  )

  g2 <- ggplot(
    riesgo,
    aes(
      x = carrera_grafica,
      fill = nivel_riesgo
    )
  ) +

    geom_bar(
      position = "fill"
    ) +

    scale_fill_manual(
      values = c(
        "Bajo" = "#2E7D32",
        "Moderado" = "#FBC02D",
        "Alto" = "#F57C00",
        "Muy alto" = "#C62828"
      )
    ) +

    scale_y_continuous(
      labels = percent
    ) +

    coord_flip() +

    labs(
      title =
        "Riesgo potencial de abandono por carrera",
      x = "Carrera",
      y = "Porcentaje",
      fill = "Nivel de riesgo"
    ) +

    theme_minimal(
      base_size = 13
    )

  print(g2)
}

19 19. Riesgo por grupo

if(!is.na(col_grupo)){

  riesgo$grupo_grafica <- obtener_texto(
    riesgo,
    col_grupo
  )

  g3 <- ggplot(
    riesgo,
    aes(
      x = grupo_grafica,
      fill = nivel_riesgo
    )
  ) +

    geom_bar(
      position = "fill"
    ) +

    scale_fill_manual(
      values = c(
        "Bajo" = "#2E7D32",
        "Moderado" = "#FBC02D",
        "Alto" = "#F57C00",
        "Muy alto" = "#C62828"
      )
    ) +

    scale_y_continuous(
      labels = percent
    ) +

    labs(
      title =
        "Riesgo potencial de abandono por grupo",
      x = "Grupo",
      y = "Porcentaje",
      fill = "Nivel de riesgo"
    ) +

    theme_minimal(
      base_size = 13
    ) +

    theme(
      axis.text.x =
        element_text(
          angle = 45,
          hjust = 1
        )
    )

  print(g3)
}

20 20. Riesgo por género

if(!is.na(col_genero)){

  riesgo$genero_grafica <- obtener_texto(
    riesgo,
    col_genero
  )

  g4 <- ggplot(
    riesgo,
    aes(
      x = genero_grafica,
      fill = nivel_riesgo
    )
  ) +

    geom_bar(
      position = "fill"
    ) +

    scale_fill_manual(
      values = c(
        "Bajo" = "#2E7D32",
        "Moderado" = "#FBC02D",
        "Alto" = "#F57C00",
        "Muy alto" = "#C62828"
      )
    ) +

    scale_y_continuous(
      labels = percent
    ) +

    labs(
      title =
        "Riesgo potencial de abandono según género",
      x = "Género",
      y = "Porcentaje",
      fill = "Nivel de riesgo"
    ) +

    theme_minimal(
      base_size = 13
    )

  print(g4)
}

21 21. Factores de riesgo más frecuentes

factores <- riesgo %>%
  summarise(

    Promedio_bajo =
      sum(
        riesgo_promedio,
        na.rm = TRUE
      ),

    Suspension_expulsion =
      sum(
        riesgo_suspension,
        na.rm = TRUE
      ),

    Problemas_convivencia =
      sum(
        riesgo_convivencia,
        na.rm = TRUE
      ),

    Carrera_no_primera_opcion =
      sum(
        riesgo_carrera,
        na.rm = TRUE
      ),

    No_percibe_utilidad =
      sum(
        riesgo_utilidad,
        na.rm = TRUE
      ),

    No_gusta_CONALEP =
      sum(
        riesgo_gusto,
        na.rm = TRUE
      ),

    Baja_prioridad_familiar =
      sum(
        riesgo_prioridad,
        na.rm = TRUE
      ),

    Recursos_insuficientes =
      sum(
        riesgo_recursos,
        na.rm = TRUE
      ),

    Motivo_economico =
      sum(
        riesgo_abandono_economico,
        na.rm = TRUE
      ),

    Trabaja_y_estudia =
      sum(
        riesgo_trabajo,
        na.rm = TRUE
      ),

    Traslado_largo =
      sum(
        riesgo_traslado,
        na.rm = TRUE
      ),

    Motivo_para_abandonar =
      sum(
        riesgo_intencion,
        na.rm = TRUE
      ),

    Futuro_incierto =
      sum(
        riesgo_futuro,
        na.rm = TRUE
      )
  ) %>%

  pivot_longer(
    cols = everything(),
    names_to = "factor",
    values_to = "casos"
  ) %>%

  mutate(
    porcentaje =
      round(
        casos /
          nrow(riesgo) *
          100,
        1
      )
  ) %>%

  arrange(
    desc(casos)
  )

knitr::kable(
  factores,
  col.names = c(
    "Factor",
    "Casos",
    "Porcentaje"
  ),
  caption =
    "Factores asociados al riesgo potencial de abandono"
)
Factores asociados al riesgo potencial de abandono
Factor Casos Porcentaje
Traslado_largo 18 66.7
Carrera_no_primera_opcion 14 51.9
Motivo_para_abandonar 13 48.1
Trabaja_y_estudia 8 29.6
Suspension_expulsion 6 22.2
Problemas_convivencia 6 22.2
Futuro_incierto 6 22.2
No_percibe_utilidad 4 14.8
Motivo_economico 4 14.8
No_gusta_CONALEP 3 11.1
Promedio_bajo 1 3.7
Recursos_insuficientes 1 3.7
Baja_prioridad_familiar 0 0.0

22 22. Gráfica de factores de riesgo

g5 <- ggplot(
  factores,
  aes(
    x = reorder(
      factor,
      casos
    ),
    y = casos
  )
) +

  geom_col() +

  geom_text(
    aes(
      label =
        paste0(
          casos,
          " (",
          porcentaje,
          "%)"
        )
    ),
    hjust = -0.1,
    size = 3.8
  ) +

  coord_flip() +

  expand_limits(
    y =
      max(
        factores$casos,
        na.rm = TRUE
      ) * 1.3
  ) +

  labs(
    title =
      "Principales factores asociados al riesgo de abandono",

    subtitle =
      "CONALEP Plantel Lerma 199, 2026",

    x =
      "Factor",

    y =
      "Número de estudiantes"
  ) +

  theme_minimal(
    base_size = 13
  )

g5

23 23. Distribución del puntaje

ggplot(
  riesgo,
  aes(
    x = puntaje_riesgo
  )
) +

  geom_bar() +

  labs(
    title =
      "Distribución del puntaje de riesgo potencial",

    subtitle =
      "CONALEP Plantel Lerma 199, 2026",

    x =
      "Número de factores acumulados",

    y =
      "Número de estudiantes"
  ) +

  theme_minimal(
    base_size = 13
  )

24 24. Resultados individuales

resultado_individual <- data.frame(

  Nombre =
    obtener_texto(
      riesgo,
      col_nombre
    ),

  Matricula =
    obtener_texto(
      riesgo,
      col_matricula
    ),

  Grupo =
    obtener_texto(
      riesgo,
      col_grupo
    ),

  Carrera =
    obtener_texto(
      riesgo,
      col_carrera
    ),

  Promedio =
    obtener_numero(
      riesgo,
      col_promedio
    ),

  Puntaje =
    riesgo$puntaje_riesgo,

  Nivel =
    riesgo$nivel_riesgo
)

resultado_individual <- resultado_individual %>%
  arrange(
    desc(Puntaje)
  )

knitr::kable(
  head(
    resultado_individual,
    30
  ),
  caption =
    "Estudiantes ordenados por puntaje de riesgo"
)
Estudiantes ordenados por puntaje de riesgo
Nombre Matricula Grupo Carrera Promedio Puntaje Nivel
Rivera Campos Juan Pablo 261990469-7 114.0 Profesional Técnico Bachiller en Administración 7.8 6 Alto
González Lazcano Karla Ivanna 261990417-6 113.0 Profesional técnico Bachiller Quimico Industrial 9.9 6 Alto
Mejia Saldaña Naomi 251990392-2 307.0 Profesionl Técnico Bachiller en Control de Calidad 8.0 5 Moderado
Bravo Santiago Miriam 261990408_ 114.0 Profesional Técnico Bachiller en Administración 8.3 5 Moderado
Sousa Gutiérrez Esteban 251990422-7 307.0 Profesionl Técnico Bachiller en Control de Calidad 9.0 5 Moderado
Ramos Martinez Ximena Lizeth 261990445-7 114.0 Profesional Técnico Bachiller en Administración 8.1 5 Moderado
Acosta Navarro Omar 251990560-4 307.0 Profesionl Técnico Bachiller en Control de Calidad 9.4 4 Moderado
Luis Axel Rodríguez Medina 261990320-2 114.0 Profesional Técnico Bachiller en Administración 7.9 4 Moderado
Camila Cuadra García 261990471-3 114.0 Profesional Técnico Bachiller en Administración 7.8 4 Moderado
Fuentes Lorenzo Juan Pablo 261990346-7 110.0 Profesional Técnico Bachiller en Informatica 6.0 3 Moderado
De La Cruz Almeyda Lizeth 251990448-2 307.0 Profesionl Técnico Bachiller en Control de Calidad 8.5 3 Moderado
Ledezma Alcántara Angel Uriel 261990467-1 110.0 Profesional Técnico Bachiller en Informatica 7.8 3 Moderado
Lejarazo Valencia Abner Oswaldo 251990379-9 307.0 Profesionl Técnico Bachiller en Control de Calidad 8.0 3 Moderado
Hernández López Alison Jimena 261990454-9 114.0 Profesional Técnico Bachiller en Administración 9.5 3 Moderado
Heras Gonzalez Araceli 261990486-1 114.0 Profesional Técnico Bachiller en Administración 7.7 3 Moderado
Luis Hernández Danna Paola 261990493-7 114.0 Profesional Técnico Bachiller en Administración 7.3 3 Moderado
Ibarra González aram Isaías 251990363-3 307.0 Profesionl Técnico Bachiller en Control de Calidad 8.0 3 Moderado
Martínez Calixto Fátima Yeraldin 251990348-4 307.0 Profesionl Técnico Bachiller en Control de Calidad 9.0 2 Bajo
Bonifacio Conradis Oziel Isai 261990383-0 110.0 Profesional Técnico Bachiller en Informatica 8.0 2 Bajo
García Bustamante Alejandra Marisol 261990350-9 114.0 Profesional Técnico Bachiller en Administración 8.9 2 Bajo
Rubí Gómez Jennyfer Camila 261990341-8 114.0 Profesional Técnico Bachiller en Administración 8.2 2 Bajo
Ortiz Mejia Jorge Oscar 110.0 261990466-3 Profesional Técnico Bachiller en Informatica 7.2 2 Bajo
Peña Perez Dulce 261990327-7 114.0 Profesional Técnico Bachiller en Administración 9.8 2 Bajo
Navarro Rodriguez Daniel Alejandro 261990470-5 114.0 Profesional Técnico Bachiller en Administración 7.7 2 Bajo
Gonzalez Cuevas Estefania Aide 6.14735107E8 110.0 Profesional Técnico Bachiller en Informatica 7.1 1 Bajo
Ruiz González Casandra Natali 251990377-3 307.0 Profesionl Técnico Bachiller en Control de Calidad 9.4 1 Bajo
Peña de Jesús José Dylan 251990419-3 307.0 Profesionl Técnico Bachiller en Control de Calidad 9.0 0 Bajo

25 25. Casos prioritarios

resultado_prioritario <- resultado_individual %>%
  filter(
    Nivel %in%
      c(
        "Alto",
        "Muy alto"
      )
  )

cat(
  "Número de estudiantes de atención prioritaria:",
  nrow(resultado_prioritario),
  "\n"
)
## Número de estudiantes de atención prioritaria: 2
if(nrow(resultado_prioritario) > 0){

  knitr::kable(
    resultado_prioritario,
    caption =
      "Estudiantes con riesgo Alto o Muy alto"
  )
}
Estudiantes con riesgo Alto o Muy alto
Nombre Matricula Grupo Carrera Promedio Puntaje Nivel
Rivera Campos Juan Pablo 261990469-7 114.0 Profesional Técnico Bachiller en Administración 7.8 6 Alto
González Lazcano Karla Ivanna 261990417-6 113.0 Profesional técnico Bachiller Quimico Industrial 9.9 6 Alto

26 26. Pregunta de investigación

¿Qué factores académicos, escolares, familiares, socioeconómicos y contextuales se asocian con el riesgo potencial de abandono escolar en estudiantes del CONALEP Plantel Lerma 199 durante el ciclo escolar 2026-2027?

27 27. Objetivo general

Analizar los factores académicos, escolares, familiares, socioeconómicos y contextuales asociados con el riesgo potencial de abandono escolar en estudiantes del CONALEP Plantel Lerma 199, con la finalidad de identificar oportunamente necesidades de acompañamiento y fortalecer las estrategias preventivas del Programa Institucional de Tutorías para el Bienestar.

28 28. Interpretación de los niveles

  • Bajo: 0 a 2 factores de riesgo.
  • Moderado: 3 a 5 factores.
  • Alto: 6 a 10 factores.
  • Muy alto: 11 a 13 factores.

Esta clasificación tiene un carácter exploratorio y preventivo.

29 29. Conclusión

El análisis permite identificar estudiantes y grupos que acumulan condiciones académicas, escolares, familiares, socioeconómicas y contextuales potencialmente vinculadas con la interrupción de la trayectoria escolar.

Los resultados deben emplearse como una herramienta de detección temprana y acompañamiento, y no como una predicción determinista de abandono escolar.

Los casos con niveles Alto y Muy alto pueden priorizarse para revisión tutorial, orientación, seguimiento académico y, cuando corresponda, canalización institucional.