:

Tarea 3
Visualización para la Analítica de Datos
(maestría)
Jose Andrade Alzate Rojas.
Universidad Nacional Abierta y a Distancia
Visualización para la Analítica de Datos
Código: 203238429A2034
Tutor:
Sixyel Jeyson Castañeda Coronado
Bogotá dc, 21 de octubre de 2025

Link de la evidencia de markdown y app desplegada:

https://8lvwwe-jose-alzate.shinyapps.io/Documents/

https://rpubs.com/JALZATER/1357886

1. Preparación del Dataset y Análisis Exploratorio de Datos

Tras hacer un resumen del dataset una ves se han indicado que las variables asignatura e institución son tipo factor (es decir variables cualitativa) se notaron etiquetas erróneas. para la variable calificación final había un valor negativo y dos valores faltantes; se decide inmputar la media que em ambos casos correponde a la categoria “other” la cual se asigna como etiqueta “vació”.

# Definir ruta del dataset
#ruta <- "C:/Users/USUARIO/Downloads/dataset fase 3.txt"

# Leer el archivo de texto con codificación UTF-8
df <- read.csv("C:/Users/USUARIO/Downloads/dataset fase 3.txt", encoding="latin1")

# Ver las primeras filas
head(df)
##   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
df$institucion <- as.factor(df$institucion)
df$asignatura <- as.factor(df$asignatura)
df$institucion <- trimws(df$institucion)  # eliminar espacios al inicio y final
df$institucion[df$institucion == "" | is.na(df$institucion)] <- "Vacio"
df <- df %>%
  mutate(institucion = case_when(
    institucion == "Inst B" ~ "Institución B",
    institucion == "A" ~ "Institución A",
    institucion == "" ~ NA_character_,
    TRUE ~ institucion
  ))

#limpieza columna asignatura:
df$asignatura <- trimws(df$asignatura)  # eliminar espacios al inicio y final
df$asignatura[df$asignatura == "" | is.na(df$asignatura)] <- "Vacio"

df$asignatura[df$asignatura == "Ciencias "] <- "Ciencias"
df$asignatura[df$asignatura == "Histori"] <- "Historia"
df$asignatura[df$asignatura == "Lenguage"] <- "Lenguaje"
df$asignatura[df$asignatura == "Matematicas"] <- "Matemáticas"

df$institucion <- as.factor(df$institucion)
df$asignatura <- as.factor(df$asignatura)
df <- df[df$calificacion_final >= 0 & !is.na(df$calificacion_final), ]

1.1. Exploración inicial del datset

Para este caso la variable de institución se hicieron alguno reemplazamientos:

  • institucion == “Inst B” ~ “Institución B”,
  • institucion == “A” ~ “Institución A”,
  • institucion == “” ~ NA_character_,
  • TRUE ~ institucion
# Resumen general
summary(df)
##      index      id_estudiante         institucion        asignatura 
##  Min.   :   0   Min.   :   1   Institución A:280   Arte       :126  
##  1st Qu.: 299   1st Qu.: 300   Institución B:251   Ciencias   :247  
##  Median : 598   Median : 599   Institución C:144   Historia   :238  
##  Mean   : 598   Mean   : 599   Institución D:118   Lenguaje   :232  
##  3rd Qu.: 897   3rd Qu.: 898   Institucion E:142   Matemáticas:234  
##  Max.   :1197   Max.   :1198   Instituto    :134   Vacio      :120  
##                                Vacio        :128                    
##  calificacion_final  asistencias    numero_actividades
##  Min.   : 0.000     Min.   :50.00   Min.   : 5.00     
##  1st Qu.: 1.300     1st Qu.:62.00   1st Qu.:11.00     
##  Median : 2.500     Median :74.00   Median :18.00     
##  Mean   : 2.512     Mean   :74.74   Mean   :17.49     
##  3rd Qu.: 3.800     3rd Qu.:87.00   3rd Qu.:24.00     
##  Max.   :10.000     Max.   :99.00   Max.   :29.00     
## 
# Contar estudiantes únicos
n_estudiantes <- n_distinct(df$id_estudiante)
n_estudiantes
## [1] 1197
# Verificar valores faltantes
colSums(is.na(df))
##              index      id_estudiante        institucion         asignatura 
##                  0                  0                  0                  0 
## calificacion_final        asistencias numero_actividades 
##                  0                  0                  0

2. Visualización de Datos con ggplot2

📊 Histograma de Calificación Final y Algunos graficos de wafle.


📦 Boxplot de Calificación por Asignatura

El gráfico de boxplot indica que el rendimiento de los estudiante no es bueno dado que la mediana de las calificaciones de todas las asignaturas esta alrrededor de 2.5,

ggplot(df, 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")


🏫 Boxplot de Calificación por Institución

ggplot(df, aes(x = institucion, y = calificacion_final, fill = institucion)) +
  geom_boxplot() +
  labs(
    title = "Distribución de Calificaciones por Institución",
    x = "Institución",
    y = "Calificación Final"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")


🔵 Relación entre Asistencia y Calificación Final

ggplot(df, aes(x = asistencias, y = calificacion_final, color = asignatura)) +
  geom_point(alpha = 0.7, size = 3) +
  labs(
    title = "Relación entre Asistencias y Calificación Final",
    x = "Porcentaje de Asistencias",
    y = "Calificación Final"
  ) +
  theme_minimal()

2.2 Algunos grafico interactivos gráfico interactivo

El siguiente gráfico permite ver que no hay una relación lineal entre la calificación final y la asistencia, por lo cual no se puede esperar que una asistencia perfecta garantice una buena calificación en alguna asignatura.


📈 Promedio de Actividades por Asignatura

df %>%
  group_by(asignatura) %>%
  summarise(promedio_actividades = mean(numero_actividades, na.rm = TRUE)) %>%
  ggplot(aes(x = reorder(asignatura, promedio_actividades),
             y = promedio_actividades, fill = asignatura)) +
  geom_col() +
  coord_flip() +
  labs(
    title = "Promedio de Actividades por Asignatura",
    x = "Asignatura",
    y = "Promedio de Actividades"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

### boxplot con filtros dinámicos El siguiente gráfico iteractivo permite visualizar los boxplot de las calificaciones usando filtros que permiten extraer información mas detalla al aplicar filtro para institución y asignatura. Con el

Grafico para comparar 2 instituciones

Tambien se generó un gráfico que permite hacer comparación entre dos diferentes colegios o instituciones usando los filtros interactivos:

Filtros Institución A


Filtros Institución B

Radar chart por institución

Este tipo de gráfico permite ver un resumen de los promedio de las asignaturas en cada institucion y tener una comparacion de solo la media

3 Mapas usando leaflet

este es un mapa el cual se obtuvo asignando coordenadas de una ciudad a cada institución, con el fin de generar una visualizacion usando la libreria “leaflet”

#mapa
library(leaflet)
# Diccionario de ciudades colombianas con coordenadas reales
ciudades <- tibble::tribble(
  ~ciudad, ~lat, ~lon,
  "Bogotá",        4.7110,  -74.0721,
  "Medellín",      6.2518,  -75.5636,
  "Cali",          3.4516,  -76.5320,
  "Barranquilla", 10.9685,  -74.7813,
  "Cartagena",    10.3910,  -75.4794,
  "Bucaramanga",   7.1193,  -73.1227,
  "Manizales",     5.0703,  -75.5138,
  "Pereira",       4.8143,  -75.6946,
  "Cúcuta",        7.8891,  -72.4967,
  "Santa Marta",  11.2408,  -74.1990,
  "Pasto",         1.2136,  -77.2811,
  "Ibagué",        4.4389,  -75.2322,
  "Villavicencio", 4.1420,  -73.6266,
  "Neiva",         2.9350,  -75.2819,
  "Tunja",         5.5353,  -73.3678,
  "Popayán",       2.4448,  -76.6147
)

# Asignar una ciudad aleatoria a cada fila del dataset
set.seed(123)
df <- df %>%
  mutate(ciudad = sample(ciudades$ciudad, nrow(df), replace = TRUE)) %>%
  left_join(ciudades, by = "ciudad")

# Paleta de colores por institución
pal <- colorFactor(topo.colors(length(unique(df$institucion))), df$institucion)

# Mapa interactivo leaflet
leaflet(df) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    lng = ~lon, lat = ~lat,
    color = ~pal(institucion),
    label = ~paste("Institución:", institucion, "<br>Ciudad:", ciudad, "<br>Asignatura:", asignatura),
    radius = 6, fillOpacity = 0.8, stroke = FALSE
  ) %>%
  addLegend(
    "bottomright",
    pal = pal, values = ~institucion,
    title = "Institución",
    opacity = 1
  )

4. Conclusiones

  • Las calificaciones muestran una amplia variabilidad entre asignaturas.
  • Las instituciones presentan diferencias visibles en el rendimiento promedio.
  • NO Existe alguna relación lineal entre la asistencia y la calificación final, esto sucede para todas las asignaturas, indicando que el rendimiento de un estudiante no esta determinado por su asistencia.
  • En Algunas asignaturas hay una mayor carga de actividades que otras como lo son “lenguaje” e “historia”. sin embargo hay poca variabilidad, pues todas las asignaturas tiendes a tener entre 16 y 18 actividades.
  • El gráfico de radar permite ver que la institución E tiene mejor promedio en artes, la institución A sobresale en las asignaturas de lenguaje historia y ciencias y la institución C sobresale en matemáticas.

💡 Cómo usar este archivo.

Este es un R markdown, en este caso se elaboró desde R y se genera un Html, en caso de contar con el archivo RMD para ejecutar en entorno R local se debe tener en cuenta los siguientes pasos:

  1. Abrir el archivo r markdown desde Rstudio (.Rmd)
  2. una vez abierto en RStudio buscar el boton Knit
  3. Clic en Knit → Knit to HTML o Knit to PDF
  4. Se abrirá una ventana donde se visualiza el reporte en HTML