| Campo | Información |
|---|---|
| Autor | Luis David Guanga Chavez |
| Título | Análisis de Rendimiento Académico en Colombia |
| Curso | Visualización para la Analítica de Datos |
| Código | 203238429 |
| Tutor | Sixyel Jeyson Castañeda Coronado |
| Institución | Universidad Nacional Abierta y a Distancia - UNAD |
| Fecha | Abril de 2026 |
Este proyecto analiza el rendimiento académico de estudiantes en instituciones educativas de Colombia, considerando calificaciones, asistencias y actividades realizadas, con el fin de identificar patrones de desempeño y apoyar la toma de decisiones educativas mediante dashboards interactivos.
Analizar el rendimiento académico de estudiantes en instituciones educativas de Colombia mediante técnicas de visualización de datos, construyendo dashboards interactivos que apoyen la toma de decisiones educativas.
datos <- read.csv("dataset.txt", header=TRUE, sep=",",
encoding="latin1", stringsAsFactors=FALSE)
cat("Dimensiones originales:", nrow(datos), "x", ncol(datos), "\n")## Dimensiones originales: 1200 x 7
## index id_estudiante institucion asignatura calificacion_final asistencias
## 1 0 1 Inst B Lenguaje 0.2 66
## 2 1 2 Institución D Ciencias 0.3 61
## 3 2 3 Instituto Ciencias 4.5 72
## 4 3 4 Institucion E Histori 0.7 65
## 5 4 5 Inst B Ciencias 2.7 52
## 6 5 6 Institución C Lenguaje 2.1 79
## numero_actividades
## 1 19
## 2 18
## 3 24
## 4 23
## 5 17
## 6 14
datos_limpios <- datos[!duplicated(datos), ]
datos_limpios <- na.omit(datos_limpios)
datos_limpios$asignatura <- trimws(datos_limpios$asignatura)
datos_limpios$institucion <- trimws(datos_limpios$institucion)
datos_limpios$asignatura <- gsub("Histori$", "Historia", datos_limpios$asignatura)
datos_limpios$asignatura <- gsub("Lenguage", "Lenguaje", datos_limpios$asignatura)
datos_limpios$asignatura <- gsub("Matematicas", "Matemáticas", datos_limpios$asignatura)
datos_limpios$institucion <- gsub("^A$", "Institución A", datos_limpios$institucion)
datos_limpios$institucion <- gsub("^Inst B$", "Institución B", datos_limpios$institucion)
datos_limpios$institucion <- gsub("^Institucion E$", "Institución E", datos_limpios$institucion)
datos_limpios$asignatura[datos_limpios$asignatura == ""] <- NA
datos_limpios$institucion[datos_limpios$institucion == ""] <- NA
datos_limpios <- na.omit(datos_limpios)
cat("Dataset limpio:", nrow(datos_limpios), "registros\n")## Dataset limpio: 964 registros
##
## Arte Ciencias Historia Lenguaje Matemáticas
## 112 222 210 213 207
##
## Institución A Institución B Institución C Institución D Institución E
## 259 227 127 101 132
## Instituto
## 118
## === CALIFICACIONES ===
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.300 2.500 2.516 3.725 10.000
##
## === ASISTENCIAS ===
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 50.00 62.00 74.00 74.64 88.00 99.00
##
## === PROMEDIO POR ASIGNATURA ===
## asignatura calificacion_final
## 1 Arte 2.454464
## 2 Ciencias 2.490991
## 3 Historia 2.498571
## 4 Lenguaje 2.601878
## 5 Matemáticas 2.504831
##
## === PROMEDIO POR INSTITUCIÓN ===
## institucion calificacion_final
## 1 Institución A 2.647876
## 2 Institución B 2.535683
## 3 Institución C 2.219685
## 4 Institución D 2.522772
## 5 Institución E 2.403030
## 6 Instituto 2.627119
df_asig <- datos_limpios %>%
group_by(asignatura) %>%
summarise(Promedio=round(mean(calificacion_final, na.rm=TRUE),2))
g1 <- ggplot(df_asig, aes(x=reorder(asignatura,-Promedio),
y=Promedio, fill=asignatura)) +
geom_bar(stat="identity") +
geom_text(aes(label=Promedio), vjust=-0.5, size=4) +
labs(title="Promedio de Calificación por Asignatura",
x="Asignatura", y="Promedio") +
theme_minimal() + theme(legend.position="none")
ggplotly(g1)df_inst <- datos_limpios %>%
group_by(institucion, asignatura) %>%
summarise(Promedio=mean(calificacion_final, na.rm=TRUE), .groups="drop")
g4 <- ggplot(df_inst, aes(x=asignatura, y=Promedio,
color=institucion, group=institucion)) +
geom_line(linewidth=1) + geom_point(size=2) +
labs(title="Tendencia por Institución y Asignatura",
x="Asignatura", y="Promedio") +
theme_minimal()
ggplotly(g4)df_radar <- datos_limpios %>%
group_by(asignatura) %>%
summarise(Promedio=round(mean(calificacion_final, na.rm=TRUE),2))
g6 <- ggplot(df_radar, aes(x=asignatura, y=Promedio, fill=asignatura)) +
geom_col(width=0.6) +
geom_text(aes(label=Promedio), vjust=-0.5, size=4) +
coord_polar() +
labs(title="Radar: Rendimiento por Asignatura", x="", y="") +
theme_minimal() + theme(legend.position="none",
axis.text.y=element_blank())
g6freq_asig <- as.data.frame(table(datos_limpios$asignatura))
colnames(freq_asig) <- c("Asignatura","Frecuencia")
freq_asig$x <- c(-0.5, 0.5, -0.8, 0.8, 0)
freq_asig$y <- c(0.5, 0.5, -0.3, -0.3, -0.8)
g7 <- ggplot(freq_asig, aes(x=x, y=y, label=Asignatura,
size=Frecuencia, color=Asignatura)) +
geom_text(fontface="bold") +
scale_size_continuous(range=c(5,12)) +
labs(title="Nube de Palabras: Frecuencia de Asignaturas") +
theme_void() + theme(legend.position="none")
g7df_inst2 <- datos_limpios %>%
group_by(institucion) %>%
summarise(Total=n())
g8 <- ggplot(df_inst2, aes(x=reorder(institucion,-Total),
y=Total, fill=institucion)) +
geom_bar(stat="identity") +
geom_text(aes(label=Total), hjust=-0.2, size=3) +
coord_flip() +
labs(title="Distribución de Estudiantes por Institución",
x="Institución", y="Total") +
theme_minimal() + theme(legend.position="none")
ggplotly(g8)coords <- data.frame(
institucion=c("Institución A","Institución B","Institución C",
"Institución D","Institución E","Instituto"),
ciudad=c("Bogotá","Medellín","Cali","Barranquilla","Cartagena","Bucaramanga"),
lat=c(4.7110,6.2442,3.4516,10.9685,10.3910,7.1193),
lon=c(-74.0721,-75.5812,-76.5320,-74.7813,-75.4794,-73.1227)
)
df_mapa <- datos_limpios %>%
group_by(institucion) %>%
summarise(Promedio=round(mean(calificacion_final, na.rm=TRUE),2)) %>%
merge(coords, by="institucion")
leaflet(df_mapa) %>%
addTiles() %>%
addCircleMarkers(lat=~lat, lng=~lon,
radius=~Promedio*5, color="#2e86c1", fillOpacity=0.8,
popup=~paste0("<b>",institucion,"</b><br>",
"Ciudad: ",ciudad,"<br>",
"Promedio: ",Promedio)) %>%
setView(lng=-74.0, lat=4.5, zoom=5)El dashboard interactivo fue desarrollado con Shiny y shinydashboard con las siguientes funcionalidades:
Enlace del dashboard: https://f9ae289aaf0c4fffa3e325f625c71bbc.app.posit.cloud/?view=shiny_foreground
Enlace del certificado: https://courses.cognitiveclass.ai/certificates/0b72b0749fef4ec2902d25a3020cc0c7
1. Rendimiento académico bajo y homogéneo: El análisis reveló que el promedio general de calificaciones es de 2.51 sobre 10, evidenciando un rendimiento académico preocupantemente bajo en todas las instituciones. Las calificaciones se distribuyen principalmente entre 0 y 5 puntos, lo que sugiere una problemática sistémica que trasciende a una sola institución o asignatura.
2. Asistencia no determina el rendimiento: A pesar de que la asistencia promedio es del 74.64%, el análisis de dispersión demostró que no existe correlación fuerte entre asistencia y calificación final. Factores pedagógicos, socioeconómicos y motivacionales tienen mayor influencia en el rendimiento estudiantil.
3. Diferencias significativas entre instituciones: La Institución A (Bogotá) presenta el mejor desempeño con promedio de 2.65, mientras que la Institución C (Cali) muestra el rendimiento más bajo con 2.22. Esta diferencia sugiere que las condiciones locales y estrategias pedagógicas impactan directamente los resultados académicos.
4. Lenguaje lidera el rendimiento por asignatura: Entre las cinco áreas analizadas, Lenguaje presenta el promedio más alto (2.60), mientras que Arte registra el más bajo (2.45). La diferencia mínima entre asignaturas indica que la problemática es transversal a todo el currículo.
5. Valor de las herramientas de visualización: Las visualizaciones desarrolladas con ggplot2, plotly, leaflet y Shiny demostraron ser instrumentos valiosos para el análisis educativo. El dashboard interactivo permite explorar datos dinámicamente y facilita la toma de decisiones basada en evidencia.
6. Recomendaciones: - Implementar programas de refuerzo académico en la Institución C. - Replicar las estrategias exitosas de la Institución A en otras instituciones. - Fortalecer la calidad de las actividades académicas por encima de la cantidad. - Invertir en recursos tecnológicos que mejoren la experiencia de aprendizaje.
# Gráfico resumen de conclusiones
df_resumen <- data.frame(
Institucion=c("Institución A","Institución B","Institución C",
"Institución D","Institución E","Instituto"),
Promedio=c(2.65, 2.62, 2.22, 2.45, 2.40, 2.63),
Ciudad=c("Bogotá","Medellín","Cali","Barranquilla","Cartagena","Bucaramanga")
)
g_resumen <- ggplot(df_resumen,
aes(x=reorder(Institucion,-Promedio),
y=Promedio, fill=Promedio)) +
geom_bar(stat="identity") +
geom_text(aes(label=paste0(Promedio,"\n(",Ciudad,")")),
vjust=-0.3, size=3) +
scale_fill_gradient(low="#e74c3c", high="#2ecc71") +
labs(title="Resumen: Promedio de Calificación por Institución",
subtitle="Verde = mejor rendimiento | Rojo = menor rendimiento",
x="Institución", y="Promedio de Calificación") +
theme_minimal() + theme(legend.position="none",
axis.text.x=element_text(angle=15, hjust=1))
ggplotly(g_resumen)Luis David Guanga Chavez | UNAD | Abril 2026