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.
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:
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)
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
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
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"
)
| 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 |
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_
}
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"
)
)
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"
)
| 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 |
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
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]]
)
)
}
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
)
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
)
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"
)
)
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"
)
| Nivel de riesgo | Estudiantes | Porcentaje |
|---|---|---|
| Bajo | 10 | 37.0 |
| Moderado | 15 | 55.6 |
| Alto | 2 | 7.4 |
| Muy alto | 0 | 0.0 |
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
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.
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)
}
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)
}
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)
}
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"
)
| 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 |
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
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
)
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"
)
| 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 |
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"
)
}
| 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 |
¿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?
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.
Esta clasificación tiene un carácter exploratorio y preventivo.
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.