Aplicación práctica del análisis descriptivo con la base de datos Saber Pro

Author

Doctor Jhonathan Pazmiño

Cargar los paquetes necesarios para el análisis

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 estadisticas

Importar 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.

Code
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,…

1- Manipulación básica de datos y tablas de frecuencia.

Temas: uso de count(), mutate(), tablas de frecuencia y gráficos de barras.

Pregunta 1: ¿Cómo se distribuye los registros de los estudiantes según su género?

¿Existe paridad de género en el acceso a la educación superior evaluada?

Generar la tabla de frecuencias absolutas y relativas

Code
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

Code
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.

Pregunta 2: ¿En qué departamentos de residencia se concentran los estudiantes?

¿Muestra el examen una centralización geográfica en el territorio colombiano?

Obtener los 10 departamentos con mayor cantidad de estudiantes

Code
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

Code
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:

  • Evidencia la desigualdad y centralización territorial en Colombia.

Pregunta 3: ¿Cuál es el perfil de escolaridad de las madres de los estudiantes?

¿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

Code
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

Code
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:

  • La educación materna es un indicador clásico del capital cultural institucionalizado (Bourdieu). Su distribución permite evaluar la profundidad de los estratos educativos de origen de la población universitaria.

Pregunta 4: ¿Qué proporción de estudiantes cuenta con acceso a internet en su hogar?

¿Cómo se distribuye la brecha digital de acceso?

Generar tabla descriptiva del servicio de internet

Code
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

Code
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:

  • El internet dejó de ser un consumo suntuario para convertirse en un bien social indispensable para el aprendizaje. La brecha digital de acceso se asocia de forma directa con la exclusión educativa.

EJERCICIOS AUTÓNOMOS - BLOQUE 1

  1. Utilizar dplyr para generar la tabla de frecuencia absoluta y relativa de la variable ‘FAMI_TIENECOMPUTADOR’.

  2. Construir un gráfico de barras horizontales que muestre la distribución de la variable ‘FAMI_ESTRATOVIVIENDA’.

2- Estadísticos descriptivos de tendencia central y posición

Temas: summarise, mean, median, quantiles, percentiles, boxplot básico.

Pregunta 5: ¿Cuál es el promedio y la mediana del rendimiento en Razonamiento Cuantitativo a nivel general?

¿Cómo se comportan estas dos medidas?

Calcular medidas de tendencia central

Code
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

Code
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.

Pregunta 6: ¿Cuáles son los puntajes umbrales que definen los cuartiles y deciles de rendimiento en la prueba de Razonamiento Cuantitativo?

Calcular percentiles claves de posición (Cuartiles: Q1, Q2, Q3 y Deciles D1, D9)

Code
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

Code
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.

Pregunta 7: ¿Existen diferencias significativas en el rendimiento promedio de Razonamiento Cuantitativo según el género declarado del estudiante?

Agrupar los datos y obtener medias y medianas diferenciadas

Code
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

Code
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.

EJERCICIOS AUTÓNOMOS - BLOQUE 2

  1. Calcular la media, mediana y percentiles (10, 50, 90) de la variable de puntaje ‘MOD_LECTURA_CRITICA_PUNT’.

  2. 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’).

3- Dispersión, distribución y parámetros de forma

Temas: varianza, desviación estándar, rango, asimetría, curtosis, histogramas.

Pregunta 8: ¿Qué tan homogéneos o heterogéneos son los resultados de los estudiantes en la prueba de Lectura Crítica a nivel de dispersión estadística?

Calcular métricas de dispersión sobre Lectura Crítica

Code
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

Code
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.

Pregunta 9: ¿La distribución del puntaje en Inglés es simétrica o presenta sesgo?

¿Qué implicaciones tiene la forma para entender el aprendizaje de lenguas?

Calcular la asimetría y curtosis de la distribución de Inglés

Code
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

Code
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:

  • Las funciones 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.

Pregunta 10: ¿Cómo varía la dispersión de los puntajes de competencia ciudadana según el estrato socioeconómico residencial del estudiante?

Analizar la variabilidad de Competencia Ciudadana por estrato residencial

Code
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

Code
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.

EJERCICIOS AUTÓNOMOS - BLOQUE 3

  1. Estimar la asimetría y curtosis de la variable ‘MOD_RAZONA_CUANTITAT_PUNT’ y determinar la dirección de su sesgo.

  2. Generar un histograma de ‘MOD_COMUNI_ESCRITA_PUNT’ diferenciado (usando face_wrap) por el género (‘ESTU_GENERO’).

4- Análisis bivariado asociativo

Temas: tablas cruzadas, proporciones de filas y de columnas, gráficos de barras agrupadas.

Pregunta 11: ¿Se asocia el estrato residencial de los estudiantes con el acceso efectivo a computador en su entorno del hogar?

Generar la tabla cruzada de frecuencias absolutas y porcentajes de columna

Code
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)

Code
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.

Pregunta 12: ¿Se vincula el nivel de escolaridad del padre con la intensidad horaria de la jornada laboral que reporta el estudiante?

Filtrar, limpiar categorías, cruzar variables y estimar porcentajes de perfil

Code
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)

Code
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.

Pregunta 13: ¿La adjudicación de becas universitarias está vinculada al estrato socioeconómico residencial del estudiante?

Construir tabla cruzada de becados por estrato

Code
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

Code
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).

EJERCICIOS AUTÓNOMOS - BLOQUE 4

  1. Elaborar una tabla cruzada y un gráfico de barras apiladas al 100% entre ‘FAMI_TIENEINTERNET’ y ‘FAMI_TIENECOMPUTADOR’.

  2. Analizar el cruce entre la variable ‘ESTU_PAGOMATRICULAPADRES’ (¿El papá paga la matrícula?) y ‘ESTU_GENERO’. ¿Hay diferencias por género?

5- Análisis agrupado avanzado y comparativo

Temas: group_by robusto, segmentación demográfica, boxplot facetados, comparaciones de medias.

Pregunta 14: ¿De qué manera incide el número de horas de trabajo semanal declaradas en el puntaje de Razonamiento Cuantitativo de los estudiantes?

Analizar descriptivamente el puntaje según las horas de dedicación al trabajo

Code
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

Code
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.

Pregunta 15: ¿Existen brechas en el desempeño en Inglés según el origen administrativo de la universidad del estudiante (pública vs. privada)?

Agrupar por el origen de la institución y resumir estadísticas descriptivas

Code
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

Code
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.

Pregunta 16: ¿Cómo varía el rendimiento en Comunicación Escrita en función de la educación de la madre del estudiante?

Analizar la comunicación escrita agrupada por la variable materna

Code
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

Code
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.

EJERCICIOS AUTÓNOMOS - BLOQUE 5

  1. 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’).

  2. 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’).

6- Sociología multivariable e interseccionalidad avanzada

Temas: group_by con múltiples variables, filtros compuestos, case_when, gráficos facetados bivariados.

Pregunta 17: ¿Cómo interactúan de forma conjunta el género y el estrato residencial sobre el rendimiento promedio en Razonamiento Cuantitativo?

Estimar las medias agrupando simultáneamente por género y estrato

Code
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.
Code
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

Code
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.

Pregunta 18: ¿Cuál es el perfil de rendimiento y origen de los estudiantes becados en comparación con los estudiantes que autofinancian su matrícula?

Filtrar subgrupos específicos y comparar su rendimiento promedio

Code
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.

Pregunta 19: ¿Cómo varía el desempeño en Lectura Crítica según la distribución regional en departamentos que registran una representación muestral superior a 50 estudiantes?

Filtrar departamentos altamente representados y estimar su rendimiento promedio

Code
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

Code
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.

Pregunta 20: ¿Existe una brecha de rendimiento en Razonamiento Cuantitativo entre estudiantes de estratos altos con beca versus estudiantes de estratos bajos sin beca?

Construir tipologías extremas de contraste sociodemográfico y de financiamiento

Code
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

Code
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

Code
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.

EJERCICIOS AUTÓNOMOS - BLOQUE 6

  1. Utilizar ‘group_by’ con ‘FAMI_ESTRATOVIVIENDA’ y ‘FAMI_TIENEINTERNET’ para estimar el promedio de ‘MOD_INGLES_PUNT’ de cada perfil.

  2. 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’.