Code
library(readxl) # Para la importación del archivo Excel
library(tidyverse) # Incluye dplyr (manipulación) y ggplot2 (visualización)
library(e1071) # Para el cálculo de asimetría y curtosis estadisticasCargar los paquetes necesarios para el análisis
library(readxl) # Para la importación del archivo Excel
library(tidyverse) # Incluye dplyr (manipulación) y ggplot2 (visualización)
library(e1071) # Para el cálculo de asimetría y curtosis estadisticasImportar la base de datos de los resultados de las pruebas saber Pro. La base de datos es una muestra aleatoria de solo 1500 registros que fue extraida de la base de datos general que contiene > 1M de observaciones.
datos_saber <- read_excel("saber_muestra_2.xlsx")
glimpse(datos_saber)Rows: 1,500
Columns: 57
$ PERIODO <dbl> 20195, 20225, 20225, 20222, 20195, 2022…
$ ESTU_CONSECUTIVO <chr> "EK201950163707", "EK202250193032", "EK…
$ ESTU_TIPODOCUMENTO <chr> "CC", "CC", "CC", "CC", "CC", "CC", "CC…
$ ESTU_PAIS_RESIDE <chr> "COLOMBIA", "COLOMBIA", "COLOMBIA", "CO…
$ ESTU_COD_RESIDE_DEPTO <chr> "20", "13", "73", "05", "11", "11", "05…
$ ESTU_DEPTO_RESIDE <chr> "CESAR", "BOLIVAR", "TOLIMA", "ANTIOQUI…
$ ESTU_COD_RESIDE_MCPIO <chr> "20001", "13780", "73124", "05030", "11…
$ ESTU_MCPIO_RESIDE <chr> "VALLEDUPAR", "TALAIGUA NUEVO", "CAJAMA…
$ ESTU_CODDANE_COLE_TERMINO <dbl> 120001000921, NA, 163001000302, NA, 311…
$ ESTU_COD_COLE_MCPIO_TERMINO <chr> "20001", NA, "63001", NA, "11001", NA, …
$ ESTU_COD_DEPTO_PRESENTACION <chr> "20", "11", "11", "11", "11", "11", "05…
$ INST_COD_INSTITUCION <dbl> 2832, 2104, 1207, 2732, 2829, 2829, 282…
$ INST_NOMBRE_INSTITUCION <chr> "UNIVERSIDAD DE SANTANDER - UDES-BUCARA…
$ INST_CARACTER_ACADEMICO <chr> "UNIVERSIDAD", "INSTITUCIÓN UNIVERSITAR…
$ ESTU_NUCLEO_PREGRADO <chr> "INGENIERÍA INDUSTRIAL Y AFINES", "ADMI…
$ ESTU_INST_DEPARTAMENTO <chr> "SANTANDER", "BOGOTÁ", "TOLIMA", "ANTIO…
$ ESTU_INST_CODMUNICIPIO <chr> "68001", "11001", "73001", "05686", "11…
$ ESTU_INST_MUNICIPIO <chr> "BUCARAMANGA", "BOGOTÁ D.C.", "IBAGUÉ",…
$ ESTU_PRGM_ACADEMICO <chr> "INGENIERIA INDUSTRIAL", "ADMINISTRACIO…
$ ESTU_PRGM_DEPARTAMENTO <chr> "CESAR", "BOLIVAR", "TOLIMA", "ANTIOQUI…
$ ESTU_PRGM_CODMUNICIPIO <chr> "20001", "13001", "73001", "05686", "11…
$ ESTU_PRGM_MUNICIPIO <chr> "VALLEDUPAR", "CARTAGENA DE INDIAS", "I…
$ ESTU_NIVEL_PRGM_ACADEMICO <chr> "UNIVERSITARIO", "UNIVERSITARIO", "UNIV…
$ ESTU_METODO_PRGM <chr> "PRESENCIAL", "DISTANCIA", "PRESENCIAL"…
$ ESTU_VALORMATRICULAUNIVERSIDAD <chr> "Entre 2.5 millones y menos de 4 millon…
$ ESTU_DEPTO_PRESENTACION <chr> "CESAR", "BOGOTÁ", "BOGOTÁ", "BOGOTÁ", …
$ ESTU_COD_MCPIO_PRESENTACION <chr> "20001", "11001", "11001", "11001", "11…
$ ESTU_MCPIO_PRESENTACION <chr> "VALLEDUPAR", "BOGOTÁ D.C.", "BOGOTÁ D.…
$ ESTU_PAGOMATRICULABECA <chr> "No", "Si", "No", "No", "Si", "No", "Si…
$ ESTU_PAGOMATRICULACREDITO <chr> "Si", "No", "No", "Si", "Si", "No", "No…
$ ESTU_HORASSEMANATRABAJA <chr> "0", "Entre 11 y 20 horas", "Entre 11 y…
$ ESTU_SNIES_PRGMACADEMICO <dbl> 19644, 1697, 803, 105232, 91334, 105578…
$ ESTU_PRIVADO_LIBERTAD <chr> "N", "N", "N", "N", "N", "N", "N", "N",…
$ ESTU_NACIONALIDAD <chr> "COLOMBIA", "COLOMBIA", "COLOMBIA", "CO…
$ ESTU_ESTUDIANTE <chr> "ESTUDIANTE", "ESTUDIANTE", "ESTUDIANTE…
$ ESTU_GENERO <chr> "M", "F", "F", "M", "F", "F", "F", "F",…
$ ESTU_COLE_TERMINO <chr> "1633", NA, "SANTA TERESA DE JESUS", NA…
$ ESTU_PAGOMATRICULAPADRES <chr> "Si", "No", "No", "No", "No", "No", "No…
$ ESTU_ESTADOINVESTIGACION <chr> "PUBLICAR", "PUBLICAR", "PUBLICAR", "PU…
$ ESTU_FECHANACIMIENTO <chr> "10/03/1995", "13/07/1985", "11/04/1995…
$ ESTU_PAGOMATRICULAPROPIO <chr> "No", "No", "Si", "Si", "No", "Si", "Si…
$ ESTU_TIPODOCUMENTOSB11 <chr> "TI", "TI", "TI", "TI", "CC", "TI", "TI…
$ FAMI_EDUCACIONPADRE <chr> "Educación profesional completa", "Educ…
$ FAMI_TIENEAUTOMOVIL <chr> "Si", "No", "No", "No", "No", "No", "No…
$ FAMI_TIENELAVADORA <chr> "No", "Si", "No", "Si", "Si", "Si", "Si…
$ FAMI_ESTRATOVIVIENDA <chr> "Estrato 2", "Estrato 2", "Estrato 3", …
$ FAMI_TIENECOMPUTADOR <chr> "Si", "Si", "Si", "No", "Si", "Si", "No…
$ FAMI_TIENEINTERNET <chr> "Si", "Si", "No", "Si", "Si", "Si", "No…
$ FAMI_EDUCACIONMADRE <chr> "Educación profesional completa", "Prim…
$ INST_ORIGEN <chr> "NO OFICIAL - CORPORACIÓN", "OFICIAL NA…
$ MOD_RAZONA_CUANTITAT_PUNT <dbl> 167, 85, 129, 138, 148, 146, 150, 78, 9…
$ MOD_COMUNI_ESCRITA_PUNT <dbl> 148, 139, 123, 143, 209, 128, 137, 168,…
$ MOD_COMUNI_ESCRITA_DESEM <dbl> 2, 2, 2, 2, 4, 2, 2, 3, 1, 3, 2, 1, 3, …
$ MOD_INGLES_DESEM <chr> "A1", "A1", "B1", "A1", "-A1", "A2", "A…
$ MOD_LECTURA_CRITICA_PUNT <dbl> 134, 148, 160, 137, 126, 169, 143, 148,…
$ MOD_INGLES_PUNT <dbl> 145, 105, 179, 109, 121, 162, 150, 164,…
$ MOD_COMPETEN_CIUDADA_PUNT <dbl> 123, 134, 171, 126, 122, 163, 185, 171,…
Temas: uso de count(), mutate(), tablas de frecuencia y gráficos de barras.
¿Existe paridad de género en el acceso a la educación superior evaluada?
Generar la tabla de frecuencias absolutas y relativas
tabla_genero <- datos_saber %>%
count(ESTU_GENERO, name = "Frecuencia_Absoluta") %>%
mutate(Frecuencia_Relativa = Frecuencia_Absoluta / sum(Frecuencia_Absoluta),
Porcentaje = Frecuencia_Relativa * 100)
print(tabla_genero)# A tibble: 2 × 4
ESTU_GENERO Frecuencia_Absoluta Frecuencia_Relativa Porcentaje
<chr> <int> <dbl> <dbl>
1 F 894 0.596 59.6
2 M 606 0.404 40.4
Diseñar el gráfico de barras descriptivo
ggplot(tabla_genero, aes(x = ESTU_GENERO, y = Porcentaje, fill = ESTU_GENERO)) +
geom_col(width = 0.6, show.legend = FALSE) +
scale_fill_manual(values = c("#882255", "#44AA99")) +
labs(
title = "Distribución porcentual por género de los evaluados",
subtitle = "Muestra nacional Saber Pro",
x = "Género",
y = "Porcentaje (%)",
caption = "Fuente: Cálculos propios basados en datos_saber"
) +
theme_minimal(base_size = 12)Interpretación:
La frecuencia relativa representa la proporción \(p_i = \frac{n_i}{N}\) de observaciones en cada categoría. Permite comparar la representación sin importar el tamaño muestral absoluto (\(N = 1500\)).
Analizar la distribución de género en la educación superior permite observar la feminización o masculinización de la matrícula. Históricamente, las mujeres han incrementado su participación, pero pueden persistir segregaciones horizontales por campos de conocimiento.
¿Muestra el examen una centralización geográfica en el territorio colombiano?
Obtener los 10 departamentos con mayor cantidad de estudiantes
top_departamentos <- datos_saber %>%
count(ESTU_DEPTO_RESIDE, name = "Frecuencia") %>%
mutate(Porcentaje = (Frecuencia / sum(Frecuencia)) * 100) %>%
arrange(desc(Frecuencia)) %>%
slice_head(n = 10)
print(top_departamentos)# A tibble: 10 × 3
ESTU_DEPTO_RESIDE Frecuencia Porcentaje
<chr> <int> <dbl>
1 BOGOTÁ 393 26.2
2 ANTIOQUIA 142 9.47
3 VALLE 118 7.87
4 CUNDINAMARCA 101 6.73
5 ATLANTICO 91 6.07
6 BOLIVAR 65 4.33
7 SANTANDER 61 4.07
8 RISARALDA 53 3.53
9 BOYACA 47 3.13
10 NARIÑO 42 2.8
Graficar los departamentos ordenados jerárquicamente
ggplot(top_departamentos, aes(x = reorder(ESTU_DEPTO_RESIDE, Porcentaje), y = Porcentaje)) +
geom_col(fill = "#2E5B88", width = 0.7) +
coord_flip() +
labs(
title = "Top 10 departamentos con mayor concentración de estudiantes",
subtitle = "Expresión del centralismo demográfico y educativo",
x = "Departamento de Residencia",
y = "Porcentaje (%)",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
¿Sinedo en mayor medida las madres quienes se ocupan de los hijos en Colombia, su nivel de escolaridad puede afectar los resultados de las pruebas de sus hijos?
Generar la tabla de frecuencias
tabla_madres <- datos_saber %>%
count(FAMI_EDUCACIONMADRE, name = "Frecuencia") %>%
mutate(
Porcentaje = (Frecuencia / sum(Frecuencia)) * 100
)
print(tabla_madres)# A tibble: 13 × 3
FAMI_EDUCACIONMADRE Frecuencia Porcentaje
<chr> <int> <dbl>
1 Educación profesional completa 192 12.8
2 Educación profesional incompleta 48 3.2
3 Ninguno 33 2.2
4 No Aplica 4 0.267
5 No sabe 7 0.467
6 Postgrado 112 7.47
7 Primaria completa 144 9.6
8 Primaria incompleta 201 13.4
9 Secundaria (Bachillerato) completa 316 21.1
10 Secundaria (Bachillerato) incompleta 159 10.6
11 Técnica o tecnológica completa 180 12
12 Técnica o tecnológica incompleta 54 3.6
13 <NA> 50 3.33
Graficar la educación de la madre excluyendo los valores no disponibles
datos_saber %>%
filter(!is.na(FAMI_EDUCACIONMADRE)) %>%
count(FAMI_EDUCACIONMADRE) %>%
mutate(Porcentaje = (n / sum(n)) * 100) %>%
ggplot(aes(x = reorder(FAMI_EDUCACIONMADRE, Porcentaje), y = Porcentaje)) +
geom_col(fill = "#661100", width = 0.6) +
coord_flip() +
labs(
title = "Nivel educativo alcanzado por la madre",
subtitle = "Distribución sobre casos válidos (excluyendo datos faltantes)",
x = "Educación de la Madre",
y = "Porcentaje (%)",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
¿Cómo se distribuye la brecha digital de acceso?
Generar tabla descriptiva del servicio de internet
tabla_internet <- datos_saber %>%
filter(!is.na(FAMI_TIENEINTERNET)) %>%
count(FAMI_TIENEINTERNET, name = "Frecuencia") %>%
mutate(Porcentaje = (Frecuencia / sum(Frecuencia)) * 100)
print(tabla_internet)# A tibble: 2 × 3
FAMI_TIENEINTERNET Frecuencia Porcentaje
<chr> <int> <dbl>
1 No 162 11.2
2 Si 1279 88.8
Graficar mediante un diagrama de barras simple
ggplot(tabla_internet, aes(x = FAMI_TIENEINTERNET, y = Porcentaje, fill = FAMI_TIENEINTERNET)) +
geom_col(width = 0.5, show.legend = FALSE) +
scale_fill_manual(values = c("#CC6677", "#44AA99")) +
labs(
title = "Acceso a conectividad de internet en el hogar",
x = "¿Tiene Internet?",
y = "Porcentaje de Estudiantes (%)",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
Utilizar dplyr para generar la tabla de frecuencia absoluta y relativa de la variable ‘FAMI_TIENECOMPUTADOR’.
Construir un gráfico de barras horizontales que muestre la distribución de la variable ‘FAMI_ESTRATOVIVIENDA’.
Temas: summarise, mean, median, quantiles, percentiles, boxplot básico.
¿Cómo se comportan estas dos medidas?
Calcular medidas de tendencia central
medidas_centrales <- datos_saber %>%
summarise(
Media = mean(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Mediana = median(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Casos_Validos = sum(!is.na(MOD_RAZONA_CUANTITAT_PUNT))
)
print(medidas_centrales)# A tibble: 1 × 3
Media Mediana Casos_Validos
<dbl> <dbl> <int>
1 146. 145 1500
Graficar la densidad de los puntajes con líneas para la media y la mediana
ggplot(datos_saber, aes(x = MOD_RAZONA_CUANTITAT_PUNT)) +
geom_density(fill = "#DDCC77", alpha = 0.4) +
geom_vline(aes(xintercept = mean(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE)),
color = "red", linetype = "dashed", linewidth = 1) +
geom_vline(aes(xintercept = median(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE)),
color = "blue", linetype = "dotted", linewidth = 1) +
labs(
title = "Distribución y tendencia central en Razonamiento Cuantitativo",
subtitle = "Línea roja discontinua = Media | Línea azul punteada = Mediana",
x = "Puntaje de Razonamiento Cuantitativo",
y = "Densidad",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
La media aritmética se calcula como \(\bar{x} = \frac{\sum_{i=1}^n x_i}{n}\). Es sensible a valores atípicos. La mediana representa el percentil 50 (\(P_{50}\)), valor que divide a la población en dos partes exactamente iguales. Si \(\bar{x} \approx Mediana\), la distribución es simétrica.
El rendimiento general en razonamiento matemático sirve como indicador para evaluar el desarrollo cognitivo-analítico promovido por el sistema nacional de educación superior.
Calcular percentiles claves de posición (Cuartiles: Q1, Q2, Q3 y Deciles D1, D9)
percentiles <- datos_saber %>%
summarise(
Q1_P25 = quantile(MOD_RAZONA_CUANTITAT_PUNT, probs = 0.25, na.rm = TRUE),
Mediana_P50 = quantile(MOD_RAZONA_CUANTITAT_PUNT, probs = 0.50, na.rm = TRUE),
Q3_P75 = quantile(MOD_RAZONA_CUANTITAT_PUNT, probs = 0.75, na.rm = TRUE),
D1_P10 = quantile(MOD_RAZONA_CUANTITAT_PUNT, probs = 0.10, na.rm = TRUE),
D9_P90 = quantile(MOD_RAZONA_CUANTITAT_PUNT, probs = 0.90, na.rm = TRUE)
)
print(percentiles)# A tibble: 1 × 5
Q1_P25 Mediana_P50 Q3_P75 D1_P10 D9_P90
<dbl> <dbl> <dbl> <dbl> <dbl>
1 123 145 168 104 188
Crear un boxplot anotado para evidenciar gráficamente estos umbrales
ggplot(datos_saber, aes(y = MOD_RAZONA_CUANTITAT_PUNT, x = "")) +
geom_boxplot(fill = "#117733", width = 0.4, alpha = 0.7) +
geom_jitter(width = 0.01, alpha = 0.2)+
labs(
title = "Identificación de cuartiles en Razonamiento Cuantitativo",
y = "Puntaje Obtenido",
x = "",
caption = "Fuente: datos_saber"
) +
theme_minimal()interpretación:
Los percentiles son estadísticos de posición no centrales. El percentil \(k\) es el valor por debajo del cual se encuentra el \(k\%\) de las observaciones. El rango intercuartílico (\(IQR = Q_3 - Q_1\)) describe el núcleo del 50% central de la muestra.
Permite jerarquizar e identificar los grupos extremos. El decil 10 (\(P_{90}\)) concentra la élite intelectual académica, mientras el decil 1 (\(P_{10}\)) define las alarmantes brechas de exclusión académica.
Agrupar los datos y obtener medias y medianas diferenciadas
brecha_genero <- datos_saber %>%
filter(!is.na(ESTU_GENERO)) %>%
group_by(ESTU_GENERO) %>%
summarise(
Media = mean(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Mediana = median(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Desviacion_Estandar = sd(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Muestra = n()
)
print(brecha_genero)# A tibble: 2 × 5
ESTU_GENERO Media Mediana Desviacion_Estandar Muestra
<chr> <dbl> <dbl> <dbl> <int>
1 F 140. 138 29.8 894
2 M 155. 156. 33.9 606
Generar un boxplot comparativo por categorías de género
ggplot(datos_saber %>% filter(!is.na(ESTU_GENERO)),
aes(x = ESTU_GENERO, y = MOD_RAZONA_CUANTITAT_PUNT, fill = ESTU_GENERO)) +
geom_boxplot(alpha = 0.7, show.legend = FALSE) +
scale_fill_manual(values = c("#882255", "#44AA99")) +
labs(
title = "Rendimiento en Razonamiento Cuantitativo por Género",
subtitle = "Análisis descriptivo de brechas en campos STEM",
x = "Género",
y = "Puntaje obtenido",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
Se comparan las medias grupales \(\bar{x}_{masculino}\) vs \(\bar{x}_{femenino}\) y su variabilidad interna.
Refleja las persistentes desigualdades de género asociadas a los roles sociales tradicionales. Las diferencias sistemáticas no expresan capacidades biológicas divergentes, sino procesos de socialización diferenciada y sesgos de género en la formación escolar básica y media en STEM.
Calcular la media, mediana y percentiles (10, 50, 90) de la variable de puntaje ‘MOD_LECTURA_CRITICA_PUNT’.
Utilizar ‘group_by’ y ‘summarise’ para comparar la media del puntaje de inglés (‘MOD_INGLES_PUNT’) según si el estudiante tiene internet o no (‘FAMI_TIENEINTERNET’).
Temas: varianza, desviación estándar, rango, asimetría, curtosis, histogramas.
Calcular métricas de dispersión sobre Lectura Crítica
dispersion_lectura <- datos_saber %>%
summarise(
Rango_Min = min(MOD_LECTURA_CRITICA_PUNT, na.rm = TRUE),
Rango_Max = max(MOD_LECTURA_CRITICA_PUNT, na.rm = TRUE),
Varianza = var(MOD_LECTURA_CRITICA_PUNT, na.rm = TRUE),
Desviacion_Std = sd(MOD_LECTURA_CRITICA_PUNT, na.rm = TRUE),
Coeficiente_Variacion = (Desviacion_Std / mean(MOD_LECTURA_CRITICA_PUNT, na.rm = TRUE)) * 100
)
print(dispersion_lectura)# A tibble: 1 × 5
Rango_Min Rango_Max Varianza Desviacion_Std Coeficiente_Variacion
<dbl> <dbl> <dbl> <dbl> <dbl>
1 0 300 958. 30.9 20.6
Graficar un histograma con curva de densidad ajustada
ggplot(datos_saber, aes(x = MOD_LECTURA_CRITICA_PUNT)) +
geom_histogram(aes(y = after_stat(density)), binwidth = 10, fill = "#332288", alpha = 0.6, color = "black") +
geom_density(color = "#117733", size = 1) +
labs(
title = "Dispersión y forma de los puntajes en Lectura Crítica",
subtitle = "Histograma ajustado con estimación de densidad kernel",
x = "Puntaje de Lectura Crítica",
y = "Densidad",
caption = "Fuente: datos_saber"
) +
theme_minimal()Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
Interpretación:
La desviación estándar muestral representa la distancia promedio de cada observación respecto a la media: \[s = \sqrt{\frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n-1}}\] El coeficiente de variación (\(CV\)) es una medida adimensional útil para contrastar variabilidad entre variables de distinta escala. Un \(CV > 30\%\) indica alta heterogeneidad.
Una baja varianza escolar denotaría un sistema educativo uniforme (equitativo o igualmente deficiente). Una dispersión elevada revela profundas brechas y trayectorias formativas fragmentadas y asimétricas.
¿Qué implicaciones tiene la forma para entender el aprendizaje de lenguas?
Calcular la asimetría y curtosis de la distribución de Inglés
forma_ingles <- datos_saber %>%
summarise(
Media = mean(MOD_INGLES_PUNT, na.rm = TRUE),
Mediana = median(MOD_INGLES_PUNT, na.rm = TRUE),
Asimetria = skewness(MOD_INGLES_PUNT, na.rm = TRUE),
Curtosis = kurtosis(MOD_INGLES_PUNT, na.rm = TRUE)
)
print(forma_ingles)# A tibble: 1 × 4
Media Mediana Asimetria Curtosis
<dbl> <dbl> <dbl> <dbl>
1 153. 151 0.189 2.75
Graficar el histograma detallado de la variable
ggplot(datos_saber, aes(x = MOD_INGLES_PUNT)) +
geom_histogram(fill = "#88CCEE", color = "white", binwidth = 10, alpha = 0.8) +
geom_vline(aes(xintercept = mean(MOD_INGLES_PUNT, na.rm = TRUE)), color = "darkred", size = 1.1) +
geom_vline(aes(xintercept = median(MOD_INGLES_PUNT, na.rm = TRUE)), color = "darkblue", linetype = "dashed", size = 1.1) +
labs(
title = "Forma e indicadores de asimetría en los puntajes de Inglés",
subtitle = "Media (Roja continua) vs Mediana (Azul discontinua)",
x = "Puntaje de Inglés",
y = "Número de Estudiantes",
caption = "Fuente: datos_saber"
) +
theme_minimal()EXPLICACIÓN DEL CÓDIGO:
skewness() (asimetría) y kurtosis() (curtosis) provienen de la librería ‘e1071’.Interpretación:
Asimetría (\(Skewness\)): Si es igual a 0, la distribución es perfectamente simétrica. Un valor positivo (\(Skew > 0\)) indica un sesgo hacia la derecha (concentración de datos a la izquierda). Un valor negativo (\(Skew < 0\)) indica sesgo hacia la izquierda.
Curtosis: Mide el grado de apuntalamiento de la distribución. Si \(Curtosis > 0\), es leptocúrtica (concentrada); si es \(< 0\), es platicúrtica (aplanada).
En las sociedades periféricas, la distribución de una segunda lengua (inglés) suele presentar un marcado sesgo positivo (\(Skew > 0\)). La mayoría se amontona en puntajes bajos y básicos, y solo una minoría privilegiada con educación bilingüe privada alcanza los rangos superiores de la prueba.
Analizar la variabilidad de Competencia Ciudadana por estrato residencial
dispersion_ciudadana_estrato <- datos_saber %>%
filter(!is.na(FAMI_ESTRATOVIVIENDA)) %>%
group_by(FAMI_ESTRATOVIVIENDA) %>%
summarise(
Media = mean(MOD_COMPETEN_CIUDADA_PUNT, na.rm = TRUE),
Desviacion_Std = sd(MOD_COMPETEN_CIUDADA_PUNT, na.rm = TRUE),
IQR = IQR(MOD_COMPETEN_CIUDADA_PUNT, na.rm = TRUE),
Muestra = n()
) %>%
arrange(FAMI_ESTRATOVIVIENDA)
print(dispersion_ciudadana_estrato)# A tibble: 7 × 5
FAMI_ESTRATOVIVIENDA Media Desviacion_Std IQR Muestra
<chr> <dbl> <dbl> <dbl> <int>
1 Estrato 1 135. 31.7 47.8 254
2 Estrato 2 144. 31.1 44 530
3 Estrato 3 150. 31.8 47 432
4 Estrato 4 156. 33.5 48 133
5 Estrato 5 158. 39.3 61 43
6 Estrato 6 165. 33.6 49.2 32
7 Sin Estrato 129. 35.3 50 11
Visualizar la dispersión utilizando diagramas de caja y bigotes facetados por estrato
ggplot(datos_saber %>% filter(!is.na(FAMI_ESTRATOVIVIENDA)),
aes(x = FAMI_ESTRATOVIVIENDA, y = MOD_COMPETEN_CIUDADA_PUNT, fill = FAMI_ESTRATOVIVIENDA)) +
geom_boxplot(alpha = 0.6, show.legend = FALSE) +
labs(
title = "Distribución y variabilidad en competencias ciudadanas según estrato",
x = "Estrato de Vivienda",
y = "Puntaje obtenido",
caption = "Fuente: datos_saber"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Interpretación:
Estudiar la desviación estándar al interior de subgrupos permite constatar si la desigualdad en el desempeño aumenta o se atenúa a medida que ascendemos en la pirámide social.
Las competencias ciudadanas miden no solo conocimientos constitucionales, sino perspectivas de empatía y tolerancia social. Comparar la dispersión nos permite entender si los estratos más vulnerables presentan mayor fragmentación e inestabilidad en este ámbito educativo clave.
Estimar la asimetría y curtosis de la variable ‘MOD_RAZONA_CUANTITAT_PUNT’ y determinar la dirección de su sesgo.
Generar un histograma de ‘MOD_COMUNI_ESCRITA_PUNT’ diferenciado (usando face_wrap) por el género (‘ESTU_GENERO’).
Temas: tablas cruzadas, proporciones de filas y de columnas, gráficos de barras agrupadas.
Generar la tabla cruzada de frecuencias absolutas y porcentajes de columna
tabla_cruzada_compu <- datos_saber %>%
filter(!is.na(FAMI_ESTRATOVIVIENDA), !is.na(FAMI_TIENECOMPUTADOR)) %>%
count(FAMI_ESTRATOVIVIENDA, FAMI_TIENECOMPUTADOR) %>%
group_by(FAMI_ESTRATOVIVIENDA) %>%
mutate(Porcentaje_Fila = (n / sum(n)) * 100)
print(tabla_cruzada_compu)# A tibble: 13 × 4
# Groups: FAMI_ESTRATOVIVIENDA [7]
FAMI_ESTRATOVIVIENDA FAMI_TIENECOMPUTADOR n Porcentaje_Fila
<chr> <chr> <int> <dbl>
1 Estrato 1 No 67 26.7
2 Estrato 1 Si 184 73.3
3 Estrato 2 No 42 8.03
4 Estrato 2 Si 481 92.0
5 Estrato 3 No 19 4.43
6 Estrato 3 Si 410 95.6
7 Estrato 4 No 1 0.769
8 Estrato 4 Si 129 99.2
9 Estrato 5 No 1 2.33
10 Estrato 5 Si 42 97.7
11 Estrato 6 Si 32 100
12 Sin Estrato No 6 54.5
13 Sin Estrato Si 5 45.5
Diseñar un gráfico de barras apiladas al 100% (proporcional)
ggplot(datos_saber %>% filter(!is.na(FAMI_ESTRATOVIVIENDA), !is.na(FAMI_TIENECOMPUTADOR)),
aes(x = FAMI_ESTRATOVIVIENDA, fill = FAMI_TIENECOMPUTADOR)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("#AA4499", "#117733")) +
labs(
title = "Disponibilidad de computador en el hogar por Estrato Social",
subtitle = "Expresión gráfica de la estratificación digital de la tecnología",
x = "Estrato Socioeconómico",
y = "Proporción Acumulada (%)",
fill = "¿Tiene Computador?",
caption = "Fuente: datos_saber"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Interpretación:
Una tabla de contingencia bivariada permite observar la covariación empírica entre atributos nominales.
El gráfico de barras proporcionales al 100% ilustra de forma contundente la exclusión digital: en estratos bajos, el computador sigue siendo un bien escaso, mientras que en estratos altos la cobertura es casi universal.
Filtrar, limpiar categorías, cruzar variables y estimar porcentajes de perfil
asociacion_trabajo <- datos_saber %>%
filter(!is.na(FAMI_EDUCACIONPADRE), !is.na(ESTU_HORASSEMANATRABAJA)) %>%
count(FAMI_EDUCACIONPADRE, ESTU_HORASSEMANATRABAJA) %>%
group_by(FAMI_EDUCACIONPADRE) %>%
mutate(Porcentaje = (n / sum(n)) * 100)
print(asociacion_trabajo)# A tibble: 60 × 4
# Groups: FAMI_EDUCACIONPADRE [12]
FAMI_EDUCACIONPADRE ESTU_HORASSEMANATRABAJA n Porcentaje
<chr> <chr> <int> <dbl>
1 Educación profesional completa 0 51 28.3
2 Educación profesional completa Entre 11 y 20 horas 35 19.4
3 Educación profesional completa Entre 21 y 30 horas 24 13.3
4 Educación profesional completa Menos de 10 horas 21 11.7
5 Educación profesional completa Más de 30 horas 49 27.2
6 Educación profesional incompleta 0 12 15.2
7 Educación profesional incompleta Entre 11 y 20 horas 15 19.0
8 Educación profesional incompleta Entre 21 y 30 horas 19 24.1
9 Educación profesional incompleta Menos de 10 horas 9 11.4
10 Educación profesional incompleta Más de 30 horas 24 30.4
# ℹ 50 more rows
Graficar el cruce mediante barras agrupadas contiguas (side-by-side)
ggplot(datos_saber %>% filter(!is.na(FAMI_EDUCACIONPADRE), !is.na(ESTU_HORASSEMANATRABAJA)),
aes(x = FAMI_EDUCACIONPADRE, fill = ESTU_HORASSEMANATRABAJA)) +
geom_bar(position = "dodge") +
labs(
title = "Intensidad horaria laboral por nivel educativo paterno",
subtitle = "Análisis del rol del capital familiar en la dedicación estudiantil",
x = "Educación del Padre",
y = "Frecuencia Absoluta",
fill = "Horas que trabaja",
caption = "Fuente: datos_saber"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Interpretación:
Permite evaluar la existencia de patrones asociativos no aleatorios entre variables ordinales.
Encontramos aquí indicios de la estructura de reproducción de clase. Los estudiantes cuyos padres poseen niveles educativos básicos se ven obligados a compatibilizar sus estudios con jornadas laborales intensas (más de 30 horas), limitando su tiempo disponible para el ocio académico e intelectual.
Construir tabla cruzada de becados por estrato
asociacion_becas <- datos_saber %>%
filter(!is.na(FAMI_ESTRATOVIVIENDA), !is.na(ESTU_PAGOMATRICULABECA)) %>%
count(FAMI_ESTRATOVIVIENDA, ESTU_PAGOMATRICULABECA) %>%
group_by(FAMI_ESTRATOVIVIENDA) %>%
mutate(Porcentaje = (n / sum(n)) * 100)
print(asociacion_becas)# A tibble: 14 × 4
# Groups: FAMI_ESTRATOVIVIENDA [7]
FAMI_ESTRATOVIVIENDA ESTU_PAGOMATRICULABECA n Porcentaje
<chr> <chr> <int> <dbl>
1 Estrato 1 No 179 70.5
2 Estrato 1 Si 75 29.5
3 Estrato 2 No 405 76.6
4 Estrato 2 Si 124 23.4
5 Estrato 3 No 363 84.4
6 Estrato 3 Si 67 15.6
7 Estrato 4 No 110 84.6
8 Estrato 4 Si 20 15.4
9 Estrato 5 No 35 81.4
10 Estrato 5 Si 8 18.6
11 Estrato 6 No 29 90.6
12 Estrato 6 Si 3 9.38
13 Sin Estrato No 8 72.7
14 Sin Estrato Si 3 27.3
Graficar en barras apiladas relativas
ggplot(datos_saber %>% filter(!is.na(FAMI_ESTRATOVIVIENDA), !is.na(ESTU_PAGOMATRICULABECA)),
aes(x = FAMI_ESTRATOVIVIENDA, fill = ESTU_PAGOMATRICULABECA)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("#999999", "#332288")) +
labs(
title = "Adjudicación de Beca Universitaria por Estrato",
subtitle = "Porcentaje de asignación como herramienta de equidad",
x = "Estrato Socioeconómico",
y = "Porcentaje (%)",
fill = "¿Cuenta con Beca?",
caption = "Fuente: datos_saber"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Interpretación:
Representación bivariada estandarizada mediante frecuencia relativa condicionada.
Permite analizar la focalización y eficiencia de los programas de subsidio del Estado o las universidades. Un sistema redistributivo eficaz debería reflejar una mayor concentración relativa de becados en los estratos más bajos y vulnerables (Estratos 1 y 2).
Elaborar una tabla cruzada y un gráfico de barras apiladas al 100% entre ‘FAMI_TIENEINTERNET’ y ‘FAMI_TIENECOMPUTADOR’.
Analizar el cruce entre la variable ‘ESTU_PAGOMATRICULAPADRES’ (¿El papá paga la matrícula?) y ‘ESTU_GENERO’. ¿Hay diferencias por género?
Temas: group_by robusto, segmentación demográfica, boxplot facetados, comparaciones de medias.
Analizar descriptivamente el puntaje según las horas de dedicación al trabajo
impacto_trabajo_rendimiento <- datos_saber %>%
filter(!is.na(ESTU_HORASSEMANATRABAJA)) %>%
group_by(ESTU_HORASSEMANATRABAJA) %>%
summarise(
Media_Puntaje = mean(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Mediana_Puntaje = median(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Desviacion = sd(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
N_Casos = n()
) %>%
arrange(desc(Media_Puntaje))
print(impacto_trabajo_rendimiento)# A tibble: 5 × 5
ESTU_HORASSEMANATRABAJA Media_Puntaje Mediana_Puntaje Desviacion N_Casos
<chr> <dbl> <dbl> <dbl> <int>
1 0 151. 151 33.9 243
2 Más de 30 horas 146. 146 28.9 546
3 Entre 11 y 20 horas 146. 140 35.0 249
4 Entre 21 y 30 horas 144. 143 31.5 197
5 Menos de 10 horas 141. 138. 36.3 198
Generar un gráfico boxplot comparativo
ggplot(datos_saber %>% filter(!is.na(ESTU_HORASSEMANATRABAJA)),
aes(x = reorder(ESTU_HORASSEMANATRABAJA, MOD_RAZONA_CUANTITAT_PUNT, FUN = median),
y = MOD_RAZONA_CUANTITAT_PUNT, fill = ESTU_HORASSEMANATRABAJA)) +
geom_boxplot(alpha = 0.6, show.legend = FALSE) +
coord_flip() +
labs(
title = "Rendimiento en Razonamiento Cuantitativo por dedicación laboral",
subtitle = "Evidencia sobre la doble presencia: estudiar y trabajar",
x = "Horas semanales de trabajo",
y = "Puntaje de Razonamiento Cuantitativo",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
Análisis de comparación de la distribución de una variable cuantitativa continua en función de las categorías de una variable cualitativa ordinal.
Denota la problemática de los “estudiantes con dedicación parcial obligada”. Tener que trabajar más de 30 horas semanales reduce drásticamente el tiempo de estudio activo, generando una penalización sistemática en el rendimiento cognitivo de los estudiantes de bajos recursos.
Agrupar por el origen de la institución y resumir estadísticas descriptivas
rendimiento_origen <- datos_saber %>%
filter(!is.na(INST_ORIGEN)) %>%
group_by(INST_ORIGEN) %>%
summarise(
Media_Ingles = mean(MOD_INGLES_PUNT, na.rm = TRUE),
Mediana_Ingles = median(MOD_INGLES_PUNT, na.rm = TRUE),
Desviacion = sd(MOD_INGLES_PUNT, na.rm = TRUE),
Casos = n()
)
print(rendimiento_origen)# A tibble: 6 × 5
INST_ORIGEN Media_Ingles Mediana_Ingles Desviacion Casos
<chr> <dbl> <dbl> <dbl> <int>
1 NO OFICIAL - CORPORACIÓN 150. 145 29.6 535
2 NO OFICIAL - FUNDACIÓN 161. 161 34.1 460
3 OFICIAL DEPARTAMENTAL 149. 146 35.7 244
4 OFICIAL MUNICIPAL 161. 164. 25.9 26
5 OFICIAL NACIONAL 151. 146 35.5 233
6 REGIMEN ESPECIAL 158 158 36.8 2
Visualizar mediante histogramas superpuestos y segmentados con facetas
ggplot(datos_saber %>% filter(!is.na(INST_ORIGEN)), aes(x = MOD_INGLES_PUNT, fill = INST_ORIGEN)) +
geom_histogram(binwidth = 10, alpha = 0.6, color = "black", show.legend = FALSE) +
facet_wrap(~INST_ORIGEN, ncol = 2) +
labs(
title = "Distribución del Puntaje de Inglés por Origen Institucional",
x = "Puntaje de Inglés",
y = "Frecuencia",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
Comparación de distribuciones de forma simultánea. Permite observar si el sesgo, la tendencia central o la dispersión cambian de forma estructural entre las subpoblaciones analizadas.
Permite evidenciar el nivel de segmentación del sistema educativo superior. Instituciones no oficiales de élite suelen mostrar un mejor rendimiento en lenguas extranjeras en comparación con las instituciones oficiales, reflejando desigualdades en el acceso a la internacionalización y al capital lingüístico.
Analizar la comunicación escrita agrupada por la variable materna
comunicacion_madre <- datos_saber %>%
filter(!is.na(FAMI_EDUCACIONMADRE)) %>%
group_by(FAMI_EDUCACIONMADRE) %>%
summarise(
Media_Comuni = mean(MOD_COMUNI_ESCRITA_PUNT, na.rm = TRUE),
Mediana_Comuni = median(MOD_COMUNI_ESCRITA_PUNT, na.rm = TRUE),
Desviacion = sd(MOD_COMUNI_ESCRITA_PUNT, na.rm = TRUE),
Casos = n()
) %>%
arrange(desc(Media_Comuni))
print(comunicacion_madre)# A tibble: 12 × 5
FAMI_EDUCACIONMADRE Media_Comuni Mediana_Comuni Desviacion Casos
<chr> <dbl> <dbl> <dbl> <int>
1 No sabe 163. 136 70.0 7
2 Postgrado 146. 145 48.6 112
3 Educación profesional completa 144. 145 44.3 192
4 Técnica o tecnológica incompleta 142. 150. 38.9 54
5 Educación profesional incompleta 140. 136 45.8 48
6 Técnica o tecnológica completa 138. 140 45.4 180
7 Secundaria (Bachillerato) incom… 138. 138 37.2 159
8 Secundaria (Bachillerato) compl… 137. 138 44.4 316
9 Primaria incompleta 134. 137 37.7 201
10 Primaria completa 130. 133 45.8 144
11 Ninguno 129. 131 46.0 33
12 No Aplica 95.5 120 65.5 4
Graficar un diagrama de cajas ordenado por medias
ggplot(datos_saber %>% filter(!is.na(FAMI_EDUCACIONMADRE)),
aes(x = reorder(FAMI_EDUCACIONMADRE, MOD_COMUNI_ESCRITA_PUNT, FUN = mean),
y = MOD_COMUNI_ESCRITA_PUNT, fill = FAMI_EDUCACIONMADRE)) +
geom_boxplot(alpha = 0.5, show.legend = FALSE) +
coord_flip() +
labs(
title = "Desempeño en Comunicación Escrita y nivel educativo materno",
subtitle = "Influencia intergeneracional del capital escolar acumulado en el hogar",
x = "Educación de la Madre",
y = "Puntaje de Comunicación Escrita",
caption = "Fuente: datos_saber"
) +
theme_minimal()Warning: Removed 8 rows containing non-finite outside the scale range
(`stat_boxplot()`).
Interpretación:
Asociación cuantitativa-cualitativa donde se evalúa si el promedio de la variable dependiente aumenta de forma monótona con los niveles de la variable explicativa.
Las habilidades de redacción formal y comunicación compleja dependen fuertemente del nivel educativo de la madre. La transmisión informal de capital de lectura y expresión escrita en el entorno familiar influye fuertemente en el rendimiento académico de los hijos.
Comparar la media y la desviación estándar de ‘MOD_LECTURA_CRITICA_PUNT’ según el tipo de origen de la institución (‘INST_ORIGEN’).
Generar un gráfico de cajas que compare el rendimiento en ‘MOD_RAZONA_CUANTITAT_PUNT’ según el estrato socioeconómico de vivienda (‘FAMI_ESTRATOVIVIENDA’).
Temas: group_by con múltiples variables, filtros compuestos, case_when, gráficos facetados bivariados.
Estimar las medias agrupando simultáneamente por género y estrato
interseccion_genero_estrato <- datos_saber %>%
filter(!is.na(ESTU_GENERO), !is.na(FAMI_ESTRATOVIVIENDA)) %>%
group_by(ESTU_GENERO, FAMI_ESTRATOVIVIENDA) %>%
summarise(
Media_Matematicas = mean(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Muestra = n()
) %>%
arrange(FAMI_ESTRATOVIVIENDA, ESTU_GENERO)`summarise()` has regrouped the output.
ℹ Summaries were computed grouped by ESTU_GENERO and FAMI_ESTRATOVIVIENDA.
ℹ Output is grouped by ESTU_GENERO.
ℹ Use `summarise(.groups = "drop_last")` to silence this message.
ℹ Use `summarise(.by = c(ESTU_GENERO, FAMI_ESTRATOVIVIENDA))` for per-operation
grouping (`?dplyr::dplyr_by`) instead.
print(interseccion_genero_estrato)# A tibble: 14 × 4
# Groups: ESTU_GENERO [2]
ESTU_GENERO FAMI_ESTRATOVIVIENDA Media_Matematicas Muestra
<chr> <chr> <dbl> <int>
1 F Estrato 1 127. 156
2 M Estrato 1 147. 98
3 F Estrato 2 139. 329
4 M Estrato 2 152. 201
5 F Estrato 3 141. 254
6 M Estrato 3 155. 178
7 F Estrato 4 152. 72
8 M Estrato 4 166. 61
9 F Estrato 5 161. 17
10 M Estrato 5 176. 26
11 F Estrato 6 155. 21
12 M Estrato 6 195. 11
13 F Sin Estrato 125 8
14 M Sin Estrato 130. 3
Visualizar esta interacción mediante un gráfico de líneas de medias
ggplot(interseccion_genero_estrato,
aes(x = FAMI_ESTRATOVIVIENDA, y = Media_Matematicas, color = ESTU_GENERO, group = ESTU_GENERO)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
scale_color_manual(values = c("#882255", "#44AA99")) +
labs(
title = "Intersección de Género y Estrato Socioeconómico",
subtitle = "Trayectoria del puntaje promedio de Razonamiento Cuantitativo",
x = "Estrato Socioeconómico",
y = "Media Razonamiento Cuantitativo",
color = "Género",
caption = "Fuente: datos_saber"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Interpretación:
Permite evaluar descriptivamente la presencia de interacciones. Si las líneas de tendencia fuesen paralelas, no habría efecto de interacción. Al cruzarse o variar su distancia, se sugiere un efecto interseccional.
Analiza cómo las desigualdades de género se entrelazan con las desigualdades socioeconómicas. En la base de la pirámide social, la brecha de género puede amplificarse, revelando una acumulación de desventajas para las mujeres de sectores vulnerables.
Filtrar subgrupos específicos y comparar su rendimiento promedio
perfil_becados_vs_propios <- datos_saber %>%
filter(!is.na(ESTU_PAGOMATRICULABECA), !is.na(ESTU_PAGOMATRICULAPROPIO)) %>%
mutate(
Tipo_Financiacion = case_when(
ESTU_PAGOMATRICULABECA == "Si" & ESTU_PAGOMATRICULAPROPIO == "No" ~ "Beca Completa",
ESTU_PAGOMATRICULABECA == "No" & ESTU_PAGOMATRICULAPROPIO == "Si" ~ "Autofinanciado Puro",
TRUE ~ "Mixto/Otro"
)
) %>%
filter(Tipo_Financiacion != "Mixto/Otro") %>%
group_by(Tipo_Financiacion) %>%
summarise(
Media_Lectura = mean(MOD_LECTURA_CRITICA_PUNT, na.rm = TRUE),
Media_Matematicas = mean(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Media_Ingles = mean(MOD_INGLES_PUNT, na.rm = TRUE),
Casos = n()
)
print(perfil_becados_vs_propios)# A tibble: 2 × 5
Tipo_Financiacion Media_Lectura Media_Matematicas Media_Ingles Casos
<chr> <dbl> <dbl> <dbl> <int>
1 Autofinanciado Puro 143. 141. 145. 530
2 Beca Completa 159. 151. 162. 195
Interpretación:
Filtros booleanos condicionales aplicados a variables concurrentes para redefinir el espacio muestral.
Compara el rendimiento de los beneficiarios de becas (generalmente asociadas al mérito académico y vulnerabilidad socioeconómica) frente a los que autofinancian sus estudios. Permite evaluar si las políticas de financiamiento estudiantil logran equiparar el desempeño académico de estos grupos.
Filtrar departamentos altamente representados y estimar su rendimiento promedio
deptos_representativos <- datos_saber %>%
filter(!is.na(ESTU_DEPTO_RESIDE)) %>%
group_by(ESTU_DEPTO_RESIDE) %>%
mutate(Total_Depto = n()) %>%
filter(Total_Depto >= 50) %>%
summarise(
Media_Lectura = mean(MOD_LECTURA_CRITICA_PUNT, na.rm = TRUE),
Casos = first(Total_Depto)
) %>%
arrange(desc(Media_Lectura))
print(deptos_representativos)# A tibble: 8 × 3
ESTU_DEPTO_RESIDE Media_Lectura Casos
<chr> <dbl> <int>
1 BOGOTÁ 157. 393
2 ANTIOQUIA 155. 142
3 RISARALDA 153. 53
4 SANTANDER 152. 61
5 VALLE 152. 118
6 ATLANTICO 151. 91
7 CUNDINAMARCA 149. 101
8 BOLIVAR 147. 65
Graficar los resultados del rendimiento promedio por departamento
ggplot(deptos_representativos, aes(x = reorder(ESTU_DEPTO_RESIDE, Media_Lectura), y = Media_Lectura)) +
geom_col(fill = "#117733", width = 0.6) +
coord_flip() +
labs(
title = "Rendimiento promedio en Lectura Crítica por Departamento",
subtitle = "Departamentos con representación muestral mínima de 50 estudiantes",
x = "Departamento de Residencia",
y = "Puntaje Promedio",
caption = "Fuente: datos_saber"
) +
theme_minimal()Interpretación:
Se implementa un filtro de tamaño muestral mínimo (\(n \ge 50\)) para evitar sesgos por volatilidad estadística en departamentos con baja representación.
Refleja las disparidades territoriales e institucionales del desarrollo educativo en el país. Departamentos con mayor infraestructura y desarrollo económico suelen mostrar ventajas acumuladas sobre las regiones periféricas.
Construir tipologías extremas de contraste sociodemográfico y de financiamiento
comparativa_interseccional_compleja <- datos_saber %>%
filter(!is.na(FAMI_ESTRATOVIVIENDA), !is.na(ESTU_PAGOMATRICULABECA)) %>%
mutate(
Tipologia_Social = case_when(
FAMI_ESTRATOVIVIENDA %in% c("Estrato 4", "Estrato 5", "Estrato 6") & ESTU_PAGOMATRICULABECA == "Si" ~ "Estrato Alto / Con Beca",
FAMI_ESTRATOVIVIENDA %in% c("Estrato 1", "Estrato 2") & ESTU_PAGOMATRICULABECA == "No" ~ "Estrato Bajo / Sin Beca",
TRUE ~ "Otros Perfiles"
)
) %>%
filter(Tipologia_Social != "Otros Perfiles")Estimar las diferencias estadísticas detalladas de esta tipología
resumen_tipologias <- comparativa_interseccional_compleja %>%
group_by(Tipologia_Social) %>%
summarise(
Media = mean(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Mediana = median(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Desviacion = sd(MOD_RAZONA_CUANTITAT_PUNT, na.rm = TRUE),
Casos = n()
)
print(resumen_tipologias)# A tibble: 2 × 5
Tipologia_Social Media Mediana Desviacion Casos
<chr> <dbl> <dbl> <dbl> <int>
1 Estrato Alto / Con Beca 171. 170 34.6 31
2 Estrato Bajo / Sin Beca 140. 139 30.2 584
Visualizar el contraste mediante diagramas de cajas de alto nivel estético
ggplot(comparativa_interseccional_compleja,
aes(x = Tipologia_Social, y = MOD_RAZONA_CUANTITAT_PUNT, fill = Tipologia_Social)) +
geom_boxplot(alpha = 0.7, show.legend = FALSE, outlier.colour = "red") +
labs(
title = "Contraste interseccional extremo: Origen y Financiamiento",
subtitle = "Comparación del puntaje obtenido en Razonamiento Cuantitativo",
x = "Tipología del Estudiante",
y = "Puntaje obtenido",
caption = "Fuente: datos_saber"
) +
scale_fill_manual(values = c("#AA4499", "#332288")) +
theme_minimal()Interpretación:
Análisis de comparación de grupos polares de contraste social estructurado.
Este análisis muestra el funcionamiento conjunto del origen social y el apoyo institucional. Permite evaluar si los estudiantes de sectores populares que no cuentan con apoyos financieros enfrentan obstáculos acumulados sustantivos en comparación con los perfiles altamente favorecidos y becados.
Utilizar ‘group_by’ con ‘FAMI_ESTRATOVIVIENDA’ y ‘FAMI_TIENEINTERNET’ para estimar el promedio de ‘MOD_INGLES_PUNT’ de cada perfil.
Utilizar ‘case_when’ para clasificar a los estudiantes según si trabajan más de 20 horas (‘ESTU_HORASSEMANATRABAJA’) y la procedencia de su institución (‘INST_ORIGEN’), evaluando luego su puntaje promedio en ‘MOD_COMPETEN_CIUDADA_PUNT’.