/proyectos · analítica de datos · R
Saber 11 (2015): del CSV sucio a un modelo que explica el puntaje
Tomé una base pública del ICFES con 977 filas sucias — duplicados, texto donde iban números, comas decimales — y la convertí en un análisis completo en R: limpieza reproducible, exploración, la brecha oficial/no-oficial medida en puntos, y una regresión que explica el 87 % del puntaje de matemáticas.
977 → 965
filas: crudas → limpias
+10.6 pts
brecha no-oficial en inglés
r = 0.93
lectura ↔ matemáticas
r² = 0.87
varianza explicada por el modelo
1 · El problema y la limpieza
La base pública del ICFES (Saber 11, 2015-1) llegó con 977 instituciones y de todo un poco: 6 duplicados exactos, municipios con espacios y minúsculas mezcladas, números guardados como texto («9.0», «nan», «-») y decimales con coma. Antes de opinar sobre educación, tocó arreglar la materia prima — y dejarlo reproducible, no a punta de Excel.

Pipeline en R con tidyverse: distinct() eliminó 6 duplicados exactos (más 6 registros retirados), los 28 NA de NATURALEZA pasaron a "DESCONOCIDO", y EVALUADOS/PROMINGLES se repararon — 94 valores rotos — con str_squish + parse_number (coma→punto, negativos→NA) e imputación por media de grupo. Las filas sin CALENDARIO se excluyen al modelar con na.omit().
2 · Exploración: la forma de los datos
El inglés promedia 54.3 puntos, pero la mediana está en 47.7: la distribución es asimétrica, con un grupo de colegios de alto puntaje jalando la media hacia arriba. La media ponderada por evaluados (58.2) confirma que los colegios grandes rinden por encima del colegio típico. Entre el percentil 10 (42.8) y el 90 (80.8) hay casi 38 puntos de distancia — el «promedio nacional» esconde realidades muy distintas.

3 · La brecha oficial / no-oficial
Segmentando por naturaleza (116 oficiales vs 849 no oficiales), la diferencia es sistemática: los no oficiales ganan en las cinco áreas. En matemáticas la brecha es de +8 puntos y en inglés llega a +10.6, la mayor del examen. No es una anécdota de un área: es un patrón transversal.

4 · Correlaciones: qué se mueve con qué
Las cinco áreas académicas están fuertemente correlacionadas entre sí (r entre 0.89 y 0.95): el rendimiento viaja en bloque. El contraste interesante es el número de evaluados, que apenas se relaciona con el puntaje — el tamaño del colegio, por sí solo, no explica el resultado.

5 · El modelo: lectura como palanca
La correlación lectura ↔ matemáticas (r = 0.93) da un modelo simple: p_mat = -8.4 + 1.17·p_lect con r² = 0.87. Cada punto adicional en lectura crítica se asocia con +1.17 puntos en matemáticas. La lectura conclusión-para-negocio: si una secretaría de educación quiere mover matemáticas, la palanca con más evidencia en estos datos es la comprensión lectora — y la brecha oficial/no-oficial marca dónde priorizar la inversión.

‹/› El código R (extractos reales)
Todo el análisis vive en scripts de R con tidyverse — reproducible de punta a punta. Estos son los tres momentos clave, tal como están en el proyecto:
limpieza · reparar EVALUADOS y PROMINGLES (dplyr + stringr + readr)
Data2 <- Data2 %>%
mutate(
EVALUADOS = str_squish(EVALUADOS), # quita espacios extra
EVALUADOS = na_if(EVALUADOS, ""), # "" -> NA
EVALUADOS = na_if(EVALUADOS, "-"), # "-" -> NA
EVALUADOS = na_if(EVALUADOS, "NA"), # "NA" -> NA
EVALUADOS = parse_number(EVALUADOS), # texto -> número
EVALUADOS = as.integer(round(EVALUADOS)),
EVALUADOS = if_else(EVALUADOS < 0L, NA_integer_, EVALUADOS)
)
Data2 <- Data2 %>%
group_by(CALENDARIO) %>%
mutate(PROMINGLES = if_else(is.na(PROMINGLES),
mean(PROMINGLES, na.rm = TRUE),
PROMINGLES)) %>%
ungroup()correlaciones · matriz de Pearson y segmentación por naturaleza
cor(Datos %>% select(p_lect, p_mat,
p_soc, p_cien,
p_ing, n_eval), method = "pearson")
# segmentado por naturaleza del colegio
Datos %>%
group_by(nat) %>%
group_map(~ cor(select(.x, p_lect, p_mat, p_soc,
p_cien, p_ing, n_eval),
method = "pearson"))modelo · dispersión + recta lm con facetas (ggplot2)
ggplot(Datos, aes(x = p_lect, y = p_mat)) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(method = "lm", se = TRUE) +
facet_grid(nat ~ jor) +
labs(title = "Lectura crítica vs matemáticas",
x = "Promedio lectura crítica",
y = "Promedio matemáticas")Conclusiones
- Una base pública sucia se volvió analizable con un pipeline reproducible en R: 977 → 965 filas útiles, cada decisión de limpieza documentada en el script.
- La brecha oficial / no-oficial es transversal: +8 puntos en matemáticas y +10.6 en inglés a favor de los colegios no oficiales.
- El rendimiento académico viaja en bloque (áreas correlacionadas entre 0.89 y 0.95); el tamaño del colegio casi no pesa.
- Lectura crítica es el mejor predictor de matemáticas entre las variables analizadas (r² = 0.87): invertir en comprensión lectora es la recomendación con más soporte.
Fuente: resultados agregados por institución, Saber 11 (ICFES), periodo 2015-1 · análisis propio en R.