Fundamentación y Justificación del Trabajo

Este trabajo tiene como objetivo analizar el desempeño académico de los estudiantes de diversos países latinoamericanos (Paraguay, Uruguay, Argentina, Brasil, Chile y Colombia) a partir de los datos obtenidos de la prueba PISA. A través de técnicas de Machine Learning, se buscará generar modelos predictivos que contribuyan a mejorar la toma de decisiones en el ámbito educativo, brindando herramientas para predecir el rendimiento en áreas clave como matemáticas, lectura y ciencias.

Contexto

El Programa para la Evaluación Internacional de Estudiantes (PISA) evalúa el rendimiento académico de los estudiantes en tres áreas principales: matemáticas, lectura y ciencias. Este estudio se centra en los datos proporcionados por PISA para los países de América Latina mencionados, con el fin de analizar el desempeño en estas áreas y comprender mejor los factores que afectan los resultados académicos en la región.

Objetivo General

Desarrollar modelos de Machine Learning que permitan predecir el rendimiento de los estudiantes en matemáticas, así como clasificar a los estudiantes según su aprobación en dicha materia.

Objetivos Específicos

  1. Analizar la relación entre el rendimiento en matemáticas, lectura y ciencias.
  2. Implementar modelos de regresión para predecir las puntuaciones en matemáticas.
  3. Implementar modelos de clasificación para predecir la aprobación en matemáticas.
  4. Evaluar la precisión y el desempeño de los modelos.

Preguntas de Investigación

• ¿Existe una correlación significativa entre las habilidades en lectura y ciencias con el desempeño en matemáticas? • ¿Qué tan precisos son los modelos predictivos de Machine Learning aplicados a estos datos? • ¿Cuál es la mejor estrategia para clasificar a los estudiantes en “Aprobados” o “No aprobados” en matemáticas?

Metodología

Para llevar a cabo este estudio, se utilizó el dataset de PISA provisto por el paquete learningtower en R. Los datos fueron filtrados para incluir únicamente los países latinoamericanos de interés, y se seleccionaron las variables correspondientes a matemáticas (math), lectura (read) y ciencias (science). Posteriormente, el dataset fue dividido en conjuntos de entrenamiento (80%) y prueba (20%).

Objetivo del Machine Learning

  1. Regresión: Predecir la puntuación en matemáticas utilizando modelos de árboles de decisión (rpart).
  2. Clasificación: Determinar si un estudiante aprueba matemáticas (≥500 puntos) utilizando Random Forest.

Modelos Utilizados

• Regresión con árboles de decisión (rpart): Se entrenó un modelo para predecir la variable “math” utilizando como predictores las variables “read” y “science”. • Clasificación con Random Forest (randomForest): Se empleó un modelo de bosque aleatorio para clasificar a los estudiantes en “Aprobado” o “No aprobado” en función de su puntuación en matemáticas.

Justificación de la Metodología

• Árboles de decisión: Ofrecen interpretabilidad en la regresión, lo que permite comprender cómo influyen las variables predictoras en el resultado. • Random Forest: Es un modelo robusto que reduce el sobreajuste en la clasificación, mejorando la precisión y estabilidad de las predicciones. • Se evaluaron ambos modelos utilizando métricas de rendimiento como el Error Absoluto Medio (MAE), la Raíz del Error Cuadrático Medio (RMSE) y la matriz de confusión.

Resultados Esperados

• Validar la existencia de una correlación significativa entre las habilidades en lectura y ciencias con el desempeño en matemáticas. • Obtener modelos predictivos precisos que permitan identificar a los estudiantes con mayor probabilidad de no aprobar matemáticas, facilitando la intervención temprana.

Procesamieto.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(caret)
## Cargando paquete requerido: lattice
## 
## Adjuntando el paquete: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(rpart)
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Adjuntando el paquete: 'randomForest'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
## 
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(ggplot2)
library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Adjuntando el paquete: 'pROC'
## 
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
library(data.table)
## 
## Adjuntando el paquete: 'data.table'
## 
## The following objects are masked from 'package:lubridate':
## 
##     hour, isoweek, mday, minute, month, quarter, second, wday, week,
##     yday, year
## 
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
## 
## The following object is masked from 'package:purrr':
## 
##     transpose
library(gt)
library(learningtower)
## The learningtower package (version 1.1.0) provides data from OECD PISA database between 2000 - 2022. For package size reasons, only a small subset is provided in the package. Use the function `load_student()` to access the full data.
library(sf)
## Linking to GEOS 3.12.2, GDAL 3.9.3, PROJ 9.4.1; sf_use_s2() is TRUE
library(ggmap)
## ℹ Google's Terms of Service: <https://mapsplatform.google.com>
##   Stadia Maps' Terms of Service: <https://stadiamaps.com/terms-of-service/>
##   OpenStreetMap's Tile Usage Policy: <https://operations.osmfoundation.org/policies/tiles/>
## ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
library(osmdata)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(lubridate)
library(leaflet)
library(tidygeocoder)
## 
## Adjuntando el paquete: 'tidygeocoder'
## 
## The following object is masked from 'package:ggmap':
## 
##     geocode
library(osrm)
## Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright
## Routing: OSRM - http://project-osrm.org/
library(dplyr)
library(readxl)

Cargar Data Set.

student_data_2018 <- load_student(2018)
## Downloading year 2018...
student_data_2012_2018 <- load_student(c(2012, 2018))
## Downloading year 2012...
## 
## Downloading year 2018...
student_data_2000_2012_2018 <- load_student(c(2000, 2012, 2018))
## Downloading year 2000...
## Downloading year 2012...
## Downloading year 2018...
student_data_all <- load_student("all")
## Downloading year 2000...
## Downloading year 2003...
## Downloading year 2006...
## Downloading year 2009...
## Downloading year 2012...
## Downloading year 2015...
## Downloading year 2018...
## Downloading year 2022...

Filtrar solo los países de interés y seleccionar variables relevantes

paises_latam <- c("ARG", "BRA", "CHL", "URY", "PRY", "COL")
datos_filtrados <- student_data_all %>% filter(country %in% paises_latam)

datos_modelo <- datos_filtrados %>% 
  select(country, math, read, science) %>% 
  drop_na()

set.seed(123)
trainIndex <- createDataPartition(datos_modelo$math, p = 0.8, list = FALSE)
datos_train <- datos_modelo[trainIndex, ]
datos_test <- datos_modelo[-trainIndex, ]
nrow(datos_modelo)
## [1] 272353

Modelo de Regresion

library(rpart)
modelo_rpart <- rpart(math ~ read + science, data = datos_train)
predicciones_rpart <- predict(modelo_rpart, datos_test)

mae_rf <- mean(abs(predicciones_rpart - datos_test$math))
rmse_rf <- sqrt(mean((predicciones_rpart - datos_test$math)^2))
cat("MAE Random Forest:", mae_rf, "\n")
## MAE Random Forest: 39.53984
cat("RMSE Random Forest:", rmse_rf, "\n")
## RMSE Random Forest: 50.80548

Prediccion del modelo de regresión

predicciones_rpart <- predict(modelo_rpart, datos_test, type = "vector")

mae_rpart <- mean(abs(predicciones_rpart - datos_test$math))
rmse_rpart <- sqrt(mean((predicciones_rpart - datos_test$math)^2))
cat("MAE Rpart:", mae_rpart, "\n")
## MAE Rpart: 39.53984
cat("RMSE Rpart:", rmse_rpart, "\n")
## RMSE Rpart: 50.80548

Gráfico de valores reales vs predichos

plot(datos_test$math, predicciones_rpart, 
     xlab = "Valores Reales", ylab = "Valores Predichos", 
     main = "Regresión con Árbol de Decisión (rpart)")
abline(0,1, col="red")

datos_modelo$Aprobado <- ifelse(datos_modelo$math >= 500, "Sí", "No")
datos_modelo$Aprobado <- as.factor(datos_modelo$Aprobado)

set.seed(123)
trainIndex_clas <- createDataPartition(datos_modelo$Aprobado, p = 0.8, list = FALSE)
datos_train_clas <- datos_modelo[trainIndex_clas, ]
datos_test_clas <- datos_modelo[-trainIndex_clas, ]

modelo_clas <- randomForest(Aprobado ~ read + science, data = datos_train_clas, ntree = 100)
predicciones_clas <- predict(modelo_clas, datos_test_clas)

Evaluación de clasificación

conf_matrix <- confusionMatrix(predicciones_clas, datos_test_clas$Aprobado)
cat("Accuracy:", conf_matrix$overall["Accuracy"], "\n")
## Accuracy: 0.9147421
print(conf_matrix$table)
##           Reference
## Prediction    No    Sí
##         No 46176  2872
##         Sí  1772  3650

Curva ROC

roc_curve <- roc(as.numeric(datos_test_clas$Aprobado) - 1, as.numeric(predicciones_clas) - 1)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_curve, main = "Curva ROC - Clasificación con Random Forest")

Discusión y Conclusiones

Los modelos de Machine Learning aplicados a los datos de PISA pueden proporcionar herramientas valiosas para la mejora del sistema educativo. Los resultados obtenidos indicaron buenos niveles de predicción, con un RMSE de 50.8 en el modelo de regresión y una exactitud del 91.47% en la clasificación. La implementación de estos modelos podría ser una estrategia efectiva para identificar a los estudiantes en riesgo de bajo rendimiento, permitiendo intervenciones oportunas para mejorar sus resultados académicos.

Fuente

• OECD PISA Database • Documentación del paquete learningtower en R