Link de la evidencia de markdown y app desplegada:
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), ]
Para este caso la variable de institución se hicieron alguno reemplazamientos:
# 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
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")
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")
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()
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.
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
Tambien se generó un gráfico que permite hacer comparación entre dos diferentes colegios o instituciones usando los filtros interactivos:
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
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
)
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: