Taller final: Modelo de regresión lineal múltiple

Para el desarrollo de este trabajo, analizamos los datos de una base de datos de código abierto, disponible en datos.gov.co, sobre los resultados de las pruebas Saber 11 en Colombia. El objetivo es construir un modelo de regresión lineal múltiple para predecir el puntaje global de los estudiantes en función de sus puntajes en las áreas de lectura crítica, matemáticas, ciencias naturales, ciencias sociales y ciudadanas, e inglés. A continuación, se presenta el análisis exploratorio de los datos, la construcción del modelo de regresión y la evaluación de su desempeño.

Como datos para analizar, tomamos los datos del departamento del Atlántico, dado que es el departamento donde residimos.

knitr::opts_chunk$set(echo = TRUE)
library(readxl)
Datos<- read_excel("Datos Modelo De Regresión Lineal Multiple.xlsx", 
     col_types = c("text", "date", "text", 
         "text", "numeric", "text", "text", 
         "text", "numeric", "numeric", "numeric", 
         "numeric", "numeric", "numeric", 
         "numeric", "numeric", "numeric", 
         "numeric", "numeric", "numeric", 
         "numeric", "numeric", "text", "numeric", 
         "numeric"))

head(Datos) 
## # A tibble: 6 × 25
##   ESTU_GENERO PERIODO             ESTU_TIENEETNIA ESTU_DEPTO_RESIDE
##   <chr>       <dttm>              <chr>           <chr>            
## 1 M           1955-04-15 00:00:00 No              ATLANTICO        
## 2 M           1955-04-15 00:00:00 No              ATLANTICO        
## 3 M           1955-04-15 00:00:00 No              ATLANTICO        
## 4 M           1955-04-15 00:00:00 No              ATLANTICO        
## 5 M           1955-04-15 00:00:00 No              ATLANTICO        
## 6 M           1955-04-15 00:00:00 No              ATLANTICO        
## # ℹ 21 more variables: ESTU_COD_RESIDE_DEPTO <dbl>, FAMI_ESTRATOVIVIENDA <chr>,
## #   COLE_NATURALEZA <chr>, COLE_CALENDARIO <chr>, PUNT_LECTURA_CRITICA <dbl>,
## #   PERCENTIL_LECTURA_CRITICA <dbl>, DESEMP_LECTURA_CRITICA <dbl>,
## #   PUNT_MATEMATICAS <dbl>, PERCENTIL_MATEMATICAS <dbl>,
## #   DESEMP_MATEMATICAS <dbl>, PUNT_C_NATURALES <dbl>,
## #   PERCENTIL_C_NATURALES <dbl>, DESEMP_C_NATURALES <dbl>,
## #   PUNT_SOCIALES_CIUDADANAS <dbl>, PERCENTIL_SOCIALES_CIUDADANAS <dbl>, …

Modelo de regresión

Para el desarrollo de este trabajo, tomamos como variable dependiente el puntaje global de los estudiantes (PUNT_GLOBAL) y como variables independientes los puntajes en las áreas de lectura crítica (PUNT_LECTURA_CRITICA), matemáticas (PUNT_MATEMÁTICAS), ciencias naturales (PUNT_C_NATURALES), ciencias sociales y ciudadanas (PUNT_SOCIALES_CIUDADANAS), e inglés (PUNT_INGLÉS). A continuación, se presenta el código en R para ajustar el modelo de regresión lineal múltiple y evaluar su desempeño.

library(dplyr)
d_int <- Datos %>% select_if(is.numeric)
matriz_correlacion <- cor(d_int, use = "complete.obs")
library(corrplot)

corrplot(matriz_correlacion, method = "circle", type = "full", 
         col = colorRampPalette(c("purple", "orange", "skyblue"))(100), 
         tl.col = "black", tl.cex = 0.5, 
         addCoef.col = "black", # Agregar coeficientes de correlación
         number.cex = 0.2) # Ajustar el tamaño de los coeficientes

rm <- lm(PUNT_GLOBAL ~ PUNT_LECTURA_CRITICA + PUNT_MATEMATICAS + PUNT_C_NATURALES + PUNT_SOCIALES_CIUDADANAS + PUNT_INGLES, data = d_int)
summary(rm)
## 
## Call:
## lm(formula = PUNT_GLOBAL ~ PUNT_LECTURA_CRITICA + PUNT_MATEMATICAS + 
##     PUNT_C_NATURALES + PUNT_SOCIALES_CIUDADANAS + PUNT_INGLES, 
##     data = d_int)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.52598 -0.22751 -0.00388  0.21044  0.56131 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              -0.286765   0.116632  -2.459   0.0154 *  
## PUNT_LECTURA_CRITICA      1.162650   0.004184 277.847   <2e-16 ***
## PUNT_MATEMATICAS          1.150110   0.003602 319.268   <2e-16 ***
## PUNT_C_NATURALES          1.154864   0.004288 269.298   <2e-16 ***
## PUNT_SOCIALES_CIUDADANAS  1.155940   0.003566 324.173   <2e-16 ***
## PUNT_INGLES               0.381713   0.002918 130.793   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2738 on 119 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 1.041e+06 on 5 and 119 DF,  p-value: < 2.2e-16

Conclusión del modelo de regresión

Podemos concluir que el modelo de regresión lineal múltiple ajustado explica aproximadamente el 90% de la variabilidad del puntaje global de los estudiantes en el departamento del Atlántico. Además, todas las variables independientes (PUNT_LECTURA_CRITICA, PUNT_MATEMÁTICAS, PUNT_C_NATURALES, PUNT_SOCIALES_CIUDADANAS y PUNT_INGLÉS) son significativas para predecir el puntaje global, ya que sus coeficientes estimados son diferentes de cero con un nivel de significancia del 5%. Por tanto, el modelo propuesto es adecuado para predecir el puntaje global de los estudiantes en función de sus puntajes en las áreas evaluadas.

Análisis de los resultados

En este apartado realizamos el análisis de significancia de las variables independientes. Para ello, utilizamos el test de hipótesis, donde la hipótesis nula es que el coeficiente de la variable independiente es igual a cero, y la hipótesis alternativa es que el coeficiente es diferente de cero. A continuación, se presenta el código en R para realizar el test de hipótesis y evaluar la significancia de las variables independientes.

d_int=step(rm, direction="both", trace=2)
## Start:  AIC=-318
## PUNT_GLOBAL ~ PUNT_LECTURA_CRITICA + PUNT_MATEMATICAS + PUNT_C_NATURALES + 
##     PUNT_SOCIALES_CIUDADANAS + PUNT_INGLES
## 
##                            Df Sum of Sq    RSS     AIC
## <none>                                     8.9 -318.00
## - PUNT_INGLES               1    1282.3 1291.2  301.88
## - PUNT_C_NATURALES          1    5436.1 5445.0  481.77
## - PUNT_LECTURA_CRITICA      1    5786.7 5795.7  489.57
## - PUNT_MATEMATICAS          1    7640.7 7649.6  524.26
## - PUNT_SOCIALES_CIUDADANAS  1    7877.2 7886.2  528.07

Conclusión del análisis de step

Podemos concluir que todas las variables consideradas (PUNT_LECTURA_CRITICA, PUNT_MATEMÁTICAS, PUNT_C_NATURALES, PUNT_SOCIALES_CIUDADANAS y PUNT_INGLÉS) son relevantes para explicar PUNT_GLOBAL. Por lo tanto, no se debería eliminar ninguna de ellas, ya que cada variable aporta significativamente al modelo.

Gráficos

Gráfico de dispersión

plot(rm$fitted.values, d_int$PUNT_GLOBAL,
     main = "Gráfico de dispersión: Puntaje global vs Puntaje de asignaturas",
     xlab = "Predicciones de PUNT_GLOBAL",
     ylab = "PUNT_GLOBAL observado",
     col = "blue", pch = 19)
abline(0, 1, col = "red", lwd = 2) # Línea de igualdad

# agregamos una leyenda afuera del gráfico 
legend("topleft", legend = "Línea de igualdad", col = "red", lwd = 2)
legend("bottomright", legend = "Puntos", col = "blue", pch = 19)

# agregamos un fondo de cuadricula para facilitar la lectura del gráfico
grid(col = "skyblue", lty = "dotted")

Conclusión

El gráfico de dispersión muestra que el modelo de regresión no ajusta bien los datos, ya que las predicciones no se agrupan alrededor de la línea de igualdad, lo que sugiere un bajo poder predictivo. Esto indica que las variables explicativas utilizadas (PUNT_LECTURA_CRITICA, PUNT_MATEMÁTICAS, PUNT_C_NATURALES, PUNT_SOCIALES_CIUDADANAS y PUNT_INGLÉS) no capturan adecuadamente la variabilidad del puntaje global. Además, el patrón disperso sugiere una posible falta de linealidad en las relaciones o la ausencia de variables importantes. Por tanto, sería necesario ajustar el modelo o incluir información adicional para mejorar su desempeño predictivo.

Gráfico de normalidad

qqnorm(resid(rm),
       main = "QQ-Plot: Residuos del Modelo",
       #agreamos las etiquetas para x y y
       xlab = "Predicciones de PUNT_GLOBAL",
       ylab = "PUNT_GLOBAL observado",
       col = "blue", pch = 19)
qqline(resid(rm), col = "red", lwd = 2)

# agregamos una leyenda afuera del gráfico
legend("topleft", legend = "Línea diagonal", col = "red", lwd = 2)
legend("bottomright", legend = "Residuos", col = "blue", pch = 19)

# agregamos un fondo de cuadricula para facilitar la lectura del gráfico
grid(col = "skyblue", lty = "dotted")

Conclusión:

El gráfico QQ-Plot muestra que los residuos del modelo siguen aproximadamente una distribución normal, ya que la mayoría de los puntos se alinean con la línea roja diagonal. Sin embargo, se observan algunas desviaciones en los extremos (colas), lo que sugiere la posible presencia de outliers o una ligera falta de normalidad en los datos extremos. En general, el modelo parece cumplir razonablemente con el supuesto de normalidad de los residuos, aunque podría ser necesario realizar un análisis adicional para evaluar el impacto de las desviaciones observadas.