PORTADA

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

1 Introducción

1.1 Contextualización del problema

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.

1.2 Objetivo General

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.

1.3 Objetivos Específicos

  1. Realizar un análisis exploratorio del dataset identificando patrones en calificaciones y asistencias.
  2. Desarrollar visualizaciones interactivas comparando el desempeño entre instituciones y asignaturas.
  3. Construir un dashboard interactivo con filtros por ciudad, institución y asignatura para administradores educativos.

2 Metodología

2.1 Preparación del Dataset

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
head(datos)
##   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

2.2 Limpieza de Datos

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
table(datos_limpios$asignatura)
## 
##        Arte    Ciencias    Historia    Lenguaje Matemáticas 
##         112         222         210         213         207
table(datos_limpios$institucion)
## 
## Institución A Institución B Institución C Institución D Institución E 
##           259           227           127           101           132 
##     Instituto 
##           118

2.3 Herramientas Utilizadas

  • R / RStudio como entorno principal
  • ggplot2 para visualizaciones
  • plotly para gráficos interactivos
  • leaflet para mapa geográfico
  • shiny + shinydashboard para dashboard interactivo

3 Resultados y Conclusiones

3.1 Estadísticas Descriptivas

cat("=== CALIFICACIONES ===\n")
## === CALIFICACIONES ===
summary(datos_limpios$calificacion_final)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.300   2.500   2.516   3.725  10.000
cat("\n=== ASISTENCIAS ===\n")
## 
## === ASISTENCIAS ===
summary(datos_limpios$asistencias)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   50.00   62.00   74.00   74.64   88.00   99.00
cat("\n=== PROMEDIO POR ASIGNATURA ===\n")
## 
## === PROMEDIO POR ASIGNATURA ===
aggregate(calificacion_final ~ asignatura, data=datos_limpios, FUN=mean)
##    asignatura calificacion_final
## 1        Arte           2.454464
## 2    Ciencias           2.490991
## 3    Historia           2.498571
## 4    Lenguaje           2.601878
## 5 Matemáticas           2.504831
cat("\n=== PROMEDIO POR INSTITUCIÓN ===\n")
## 
## === PROMEDIO POR INSTITUCIÓN ===
aggregate(calificacion_final ~ institucion, data=datos_limpios, FUN=mean)
##     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

3.2 Gráfico 1 - Barras: Promedio por Asignatura

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)

3.3 Gráfico 2 - Histograma: Distribución de Calificaciones

g2 <- ggplot(datos_limpios, aes(x=calificacion_final)) +
  geom_histogram(bins=20, fill="#2e86c1", color="white") +
  labs(title="Distribución de Calificaciones Finales",
       x="Calificación Final", y="Frecuencia") +
  theme_minimal()
ggplotly(g2)

3.4 Gráfico 3 - Dispersión: Asistencia vs Calificación

g3 <- ggplot(datos_limpios, aes(x=asistencias, y=calificacion_final,
                                 color=asignatura)) +
  geom_point(alpha=0.6) +
  geom_smooth(method="lm", se=FALSE) +
  labs(title="Asistencia vs Calificación Final",
       x="Asistencias (%)", y="Calificación Final") +
  theme_minimal()
ggplotly(g3)

3.5 Gráfico 4 - Líneas: Tendencia por Institución

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)

3.6 Gráfico 5 - Box Plot: Distribución por Asignatura

g5 <- ggplot(datos_limpios, aes(x=asignatura, y=calificacion_final,
                                 fill=asignatura)) +
  geom_boxplot() +
  labs(title="Distribución de Calificaciones por Asignatura",
       x="Asignatura", y="Calificación Final") +
  theme_minimal() + theme(legend.position="none")
ggplotly(g5)

3.7 Gráfico 6 - Radar: Rendimiento por Asignatura

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())
g6

3.8 Gráfico 7 - Nube de Palabras: Asignaturas

freq_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")
g7

3.9 Gráfico 8 - Distribución por Institución

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

3.10 Gráfico 9 - Mapa: Instituciones en Colombia

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)

3.11 Dashboard Interactivo - Actividad 3

El dashboard interactivo fue desarrollado con Shiny y shinydashboard con las siguientes funcionalidades:

  • Filtro por ciudad, institución y asignatura
  • KPIs dinámicos actualizados en tiempo real
  • Mapa geográfico interactivo con leaflet
  • Gráficos de barras, histograma, box plot, líneas y dispersión

Enlace del dashboard: https://f9ae289aaf0c4fffa3e325f625c71bbc.app.posit.cloud/?view=shiny_foreground

3.12 Hallazgos Relevantes

  • Calificación promedio general: 2.51 / 10
  • Asignatura con mayor promedio: Lenguaje (2.60)
  • Asignatura con menor promedio: Arte (2.45)
  • Asistencia promedio: 74.64%
  • Institución con mejor rendimiento: Institución A - Bogotá (2.65)
  • Institución con menor rendimiento: Institución C - Cali (2.22)

3.13 Conclusiones

  1. El rendimiento académico es bajo y homogéneo entre instituciones, con calificaciones entre 2.45 y 2.60 sobre 10.
  2. La asistencia no determina directamente el resultado académico.
  3. La Institución C requiere atención prioritaria con promedio de 2.22.
  4. Las visualizaciones interactivas permiten identificar rápidamente áreas de mejora por institución y asignatura.

4 Anexos

4.1 Certificación IBM Cognitive - Data Visualization with R

Enlace del certificado: https://courses.cognitiveclass.ai/certificates/0b72b0749fef4ec2902d25a3020cc0c7

4.2 Conclusiones

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