Introducción

El rendimiento académico de los estudiantes ha sido objeto de múltiples investigaciones dentro del ámbito educativo, ya que representa un indicador clave del proceso de aprendizaje y la efectividad de las estrategias pedagógicas. Comprender los factores que inciden en los resultados académicos permite diseñar intervenciones más efectivas y tomar decisiones informadas en contextos educativos.

A través de un modelo de regresión lineal multiple, este estudio busca identificar relaciones significativas que puedan ayudar a explicar el comportamiento del desempeño estudiantil. La metodología empleada permite cuantificar la influencia de distintos elementos sobre una medida de rendimiento y evaluar la solidez del modelo predictivo propuesto.

En este análisis se trabajará con un modelo de regresión lineal múltiple, por lo que es necesario distinguir entre las variables independientes (predictoras) y la variable dependiente (respuesta).

Variable dependiente (Y)

Promedio_final: representa la calificación final del estudiante. Esta variable es el resultado que se desea predecir a partir de otros factores.

Varibles independientes (X)

Horas_estudio: número de horas semanales que el estudiante dedica al estudio

Asistencia(%): porcentaje de clases asistidas durante el periodo académico.

library(readxl)
datos <- read_excel("C:/Users/ANDERSON/Desktop/proyecto/datos_estudiantes_ampliado.xlsx")
head(datos)
## # A tibble: 6 × 4
##      ID Horas_estudio `Asistencia (%)` Promedio_final
##   <dbl>         <dbl>            <dbl>          <dbl>
## 1     1             7               52           2.55
## 2     2             4               86           3.27
## 3     3             8              100           4.46
## 4     4             5               56           2.7 
## 5     5             7               70           3.45
## 6     6            10               58           4.1

Análisis Exploratorio

Antes de ajustar el modelo de regresión, es fundamental realizar un análisis exploratorio de los datos. Este paso permite identificar patrones, relaciones entre variables y posibles valores atípicos que podrían afectar la validez del modelo.

Se exploró la distribución de las variables y su relación con la variable dependiente mediante estadísticas descriptivas y verificación de la calidad de los datos:

dim(datos)          # Dimensiones del conjunto de datos
## [1] 30  4
str(datos)          # Estructura del data frame
## tibble [30 × 4] (S3: tbl_df/tbl/data.frame)
##  $ ID            : num [1:30] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Horas_estudio : num [1:30] 7 4 8 5 7 10 3 7 8 5 ...
##  $ Asistencia (%): num [1:30] 52 86 100 56 70 58 88 67 53 74 ...
##  $ Promedio_final: num [1:30] 2.55 3.27 4.46 2.7 3.45 4.1 3.45 3.36 2.92 3.58 ...
summary(datos)      # Estadísticas descriptivas
##        ID        Horas_estudio    Asistencia (%)   Promedio_final 
##  Min.   : 1.00   Min.   : 1.000   Min.   : 51.00   Min.   :2.260  
##  1st Qu.: 8.25   1st Qu.: 4.000   1st Qu.: 57.25   1st Qu.:2.882  
##  Median :15.50   Median : 6.000   Median : 69.50   Median :3.230  
##  Mean   :15.50   Mean   : 5.733   Mean   : 72.80   Mean   :3.355  
##  3rd Qu.:22.75   3rd Qu.: 8.000   3rd Qu.: 87.50   3rd Qu.:3.547  
##  Max.   :30.00   Max.   :10.000   Max.   :100.00   Max.   :5.000
head(datos)         # Primeras filas del conjunto
## # A tibble: 6 × 4
##      ID Horas_estudio `Asistencia (%)` Promedio_final
##   <dbl>         <dbl>            <dbl>          <dbl>
## 1     1             7               52           2.55
## 2     2             4               86           3.27
## 3     3             8              100           4.46
## 4     4             5               56           2.7 
## 5     5             7               70           3.45
## 6     6            10               58           4.1
sapply(datos, function(x)(sum(is.na(x))))  # Valores nulos por variable
##             ID  Horas_estudio Asistencia (%) Promedio_final 
##              0              0              0              0
# Diagramas de dispersión
ggplot(datos, aes(x = `Horas_estudio`, y = Promedio_final)) +
  geom_point(color = "steelblue") +
  geom_smooth(method = "lm", se = FALSE, color = "darkred") +
  labs(title = "Relación entre Horas de Estudio y Promedio Final")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(datos, aes(x = `Asistencia (%)`, y = Promedio_final)) +
  geom_point(color = "seagreen") +
  geom_smooth(method = "lm", se = FALSE, color = "darkred") +
  labs(title = "Relación entre Asistencia (%) y Promedio Final")
## `geom_smooth()` using formula = 'y ~ x'

# Diagrama de caja y bigotes para Horas de Estudio
ggplot(datos, aes(y = `Horas_estudio`)) +
  geom_boxplot(fill = "lightblue", outlier.colour = "red", outlier.shape = 16, outlier.size = 2) +
  labs(title = "Diagrama de Caja y Bigotes: Horas de Estudio", y = "Horas de Estudio")

# Diagrama de caja y bigotes para Asistencia
ggplot(datos, aes(y = `Asistencia (%)`)) +
  geom_boxplot(fill = "lightgreen", outlier.colour = "red", outlier.shape = 16, outlier.size = 2) +
  labs(title = "Diagrama de Caja y Bigotes: Asistencia (%)", y = "Asistencia (%)")

# Diagrama de caja y bigotes para Promedio Final
ggplot(datos, aes(y = `Promedio_final`)) +
  geom_boxplot(fill = "salmon", outlier.colour = "red", outlier.shape = 16, outlier.size = 2) +
  labs(title = "Diagrama de Caja y Bigotes: Promedio Final", y = "Promedio Final")

Correlación entre Variables

Para complementar el análisis exploratorio, se calcula la matriz de correlación entre las variables cuantitativas del estudio. Esto permite identificar relaciones lineales y posibles problemas de multicolinealidad entre las variables predictoras.

# Seleccionar solo columnas numéricas
variables_numericas <- datos %>% select_if(is.numeric)

# Calcular matriz de correlación
correlacion <- cor(variables_numericas)

# Mostrar la matriz
correlacion
##                         ID Horas_estudio Asistencia (%) Promedio_final
## ID              1.00000000    -0.1418235     0.07488959    -0.03763958
## Horas_estudio  -0.14182352     1.0000000    -0.15288853     0.61483555
## Asistencia (%)  0.07488959    -0.1528885     1.00000000     0.60681726
## Promedio_final -0.03763958     0.6148355     0.60681726     1.00000000

Interpretación de la Matriz de Correlación

La matriz de correlación refleja el grado de asociación lineal entre las variables numéricas del estudio:

Horas de Estudio y Promedio Final: presentan una correlación positiva moderada (r ≈ 0.61), lo que indica que a mayor cantidad de horas dedicadas al estudio, tiende a aumentar el promedio final del estudiante.

Asistencia (%) y Promedio Final: también muestra una correlación positiva moderada (r ≈ 0.61), lo que sugiere que una mayor asistencia a clases se asocia con un mejor desempeño académico.

Horas de Estudio y Asistencia (%): existe una correlación negativa débil (r ≈ -0.15), lo que indica que no hay una relación fuerte entre estas dos variables predictoras, lo cual es favorable para evitar multicolinealidad en el modelo.

Correlaciones con la variable ID: las relaciones con esta variable son muy bajas, como se esperaba, ya que el ID es solo un identificador y no guarda relación con el rendimiento académico.

Modelo de Regresión Lineal Múltiple

A continuación, se ajusta un modelo de regresión lineal múltiple que tiene como objetivo predecir el rendimiento académico (Promedio_final) a partir de dos variables independientes: Horas_estudio y Asistencia (%). Se evalúa la significancia de los coeficientes y la capacidad explicativa del modelo.

# Ajustar el modelo
modelo <- lm(Promedio_final ~ Horas_estudio + `Asistencia (%)`, data = datos)

# Resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = Promedio_final ~ Horas_estudio + `Asistencia (%)`, 
##     data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.50688 -0.18291  0.00897  0.16985  0.46342 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      -0.055867   0.255816  -0.218    0.829    
## Horas_estudio     0.200061   0.018555  10.782 2.76e-11 ***
## `Asistencia (%)`  0.031097   0.002912  10.679 3.41e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2618 on 27 degrees of freedom
## Multiple R-squared:  0.8809, Adjusted R-squared:  0.8721 
## F-statistic: 99.87 on 2 and 27 DF,  p-value: 3.339e-13

Interpretación del Modelo

Del resumen del modelo ajustado se obtienen los siguientes resultados clave:

El intercepto es -0.0559, aunque no es significativo (valor p = 0.829), lo cual indica que no es relevante desde el punto de vista estadístico interpretar el promedio final cuando las variables independientes son cero.

El coeficiente de Horas_estudio es 0.2001, con un valor p < 0.001, lo cual indica que existe una relación positiva y estadísticamente significativa entre las horas dedicadas al estudio y el promedio final. Es decir, por cada hora adicional de estudio semanal, el promedio final del estudiante aumenta, en promedio, 0.20 puntos, manteniendo constante la asistencia.

El coeficiente de Asistencia (%) es 0.0311, también con un valor p < 0.001, lo que sugiere una relación positiva y significativa entre el porcentaje de asistencia y el promedio final. Por cada punto porcentual adicional en la asistencia, el promedio final incrementa en 0.0311 puntos, manteniendo constantes las horas de estudio.

El R² (coeficiente de determinación) es 0.8809, lo cual indica que aproximadamente el 88.09% de la variabilidad del promedio final puede explicarse por el modelo ajustado con las variables Horas_estudio y Asistencia (%). Esto sugiere que el modelo tiene un excelente ajuste a los datos.

El estadístico F del modelo es 99.87 con un valor p < 0.001, lo que indica que, en conjunto, el modelo es altamente significativo.

Análisis de Varianza (ANOVA)

El análisis de varianza (ANOVA) permite evaluar si el modelo de regresión en su conjunto es significativo, es decir, si al menos una de las variables independientes tiene un efecto significativo sobre la variable dependiente. Se basa en comparar la variabilidad explicada por el modelo con la variabilidad residual

anova(modelo)
## Analysis of Variance Table
## 
## Response: Promedio_final
##                  Df Sum Sq Mean Sq F value    Pr(>F)    
## Horas_estudio     1 5.8757  5.8757  85.716 7.223e-10 ***
## `Asistencia (%)`  1 7.8167  7.8167 114.032 3.408e-11 ***
## Residuals        27 1.8508  0.0685                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretación

Los resultados muestran que ambas variables independientes, Horas_estudio y Asistencia (%), tienen un efecto significativo sobre la variable dependiente Promedio_final, ya que los valores p asociados a sus efectos son muy pequeños (menores a 0.001).

Además, los altos valores de los estadísticos F refuerzan esta evidencia, indicando que la variabilidad explicada por cada variable independiente es considerablemente mayor que la variabilidad no explicada (residual).

Precisión de la predicción y Tasas de error

Para evaluar qué tan bien predice el modelo, se comparan los valores reales del promedio final con los valores estimados por el modelo. Además, se calculan métricas de error como el RMSE y el MAE.

# Ajustar el modelo
modelo <- lm(Promedio_final ~ Horas_estudio + `Asistencia (%)`, data = datos)

# Generar predicciones
predicciones <- predict(modelo)


if (!require(Metrics)) install.packages("Metrics")
## Cargando paquete requerido: Metrics
library(Metrics)

# Calcular métricas de error
mae_valor <- mae(datos$Promedio_final, predicciones)
rmse_valor <- rmse(datos$Promedio_final, predicciones)

# Mostrar métricas
mae_valor
## [1] 0.2018605
rmse_valor
## [1] 0.2483818

Interpretación

El valor de MAE fue r round(mae_valor, 3)`, lo que significa que, en promedio, las predicciones del modelo se desvían en 0.202 puntos del valor real.

El RMSE fue r round(rmse_valor, 3), indicando que las desviaciones tienden a tener una magnitud cercana a 0.248. Valores bajos de estas métricas indican un buen ajuste del modelo.

Graficas real vs interpretación

Se realiza una comparación gráfica entre las calificaciones reales y las predichas por el modelo para observar visualmente la precisión del ajuste.

# Crear dataframe de comparación
comparacion <- data.frame(Real = datos$Promedio_final, Predicho = predicciones)

# Graficar
ggplot(comparacion, aes(x = Real, y = Predicho)) +
  geom_point(color = "darkorange", size = 2) +
  geom_abline(intercept = 0, slope = 1, color = "steelblue", linetype = "dashed") +
  labs(title = "Comparación: Valores Reales vs Predichos",
       x = "Promedio Final Real",
       y = "Promedio Final Predicho") +
  theme_minimal()

actuals_preds <- data.frame(
  actuals = datos$Promedio_final,
  predicteds = predict(modelo)
)

min_max_accuracy <- mean(apply(actuals_preds, 1, min) / apply(actuals_preds, 1, max))
min_max_accuracy * 100
## [1] 94.11293
mape <- mean(abs((actuals_preds$predicteds - actuals_preds$actuals) / actuals_preds$actuals))
mape * 100
## [1] 6.245862

Diagnóstico de regresión lineal multiple

Residuals vs Fitted: Muestra si hay relación no lineal, varianza desigual o valores atípicos. Una nube aleatoria alrededor de cero indica buen ajuste.

Normal Q-Q: Verifica si los residuos siguen una distribución normal. Si los puntos caen sobre la línea diagonal, se cumple la normalidad.

Scale-Location: Evalúa la homocedasticidad (igual varianza). Una línea horizontal indica que los residuos tienen varianza constante.

Residuals vs Leverage: Identifica puntos influyentes. Valores extremos con alto apalancamiento pueden afectar significativamente el modelo.

mean(modelo$residuals)
## [1] 2.150244e-17
# Gráficos de diagnóstico del modelo
par(mfrow = c(2, 2))  
plot(modelo)

par(mfrow = c(1, 1))  

Interpretación

Los gráficos de diagnóstico del modelo de regresión lineal múltiple permiten verificar si se cumplen los supuestos fundamentales para la validez del modelo. A continuación se interpretan brevemente los cuatro gráficos generados:

Residuals vs fitted: Este gráfico no muestra un patrón definido, lo cual indica que se cumple el supuesto de homocedasticidad (varianza constante de los errores). La dispersión aleatoria alrededor de la línea horizontal sugiere que los errores no presentan tendencia sistemática.

Gráfico Q-Q: Los residuos se alinean de manera bastante cercana a la línea diagonal, lo que sugiere que siguen una distribución aproximadamente normal, cumpliendo así el supuesto de normalidad de los errores.

Escale-location: Se observa una dispersión relativamente uniforme de los residuos estandarizados a lo largo del eje horizontal, lo cual refuerza la idea de homocedasticidad en el modelo.

Residuos vs Leverage: No se identifican observaciones con alto apalancamiento o con residuos estandarizados extremos, lo que indica que no hay puntos altamente influyentes que puedan distorsionar los resultados del modelo.

# Prueba de heterocedasticidad - Breusch-Pagan
lmtest::bptest(modelo)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo
## BP = 0.58785, df = 2, p-value = 0.7453
# Prueba NCV
car::ncvTest(modelo)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 0.3186213, Df = 1, p = 0.57244
# Prueba de autocorrelación - Durbin-Watson
lmtest::dwtest(modelo)
## 
##  Durbin-Watson test
## 
## data:  modelo
## DW = 1.4393, p-value = 0.07134
## alternative hypothesis: true autocorrelation is greater than 0
# Evaluación global de supuestos con gvlma
gvlma::gvlma(modelo)
## 
## Call:
## lm(formula = Promedio_final ~ Horas_estudio + `Asistencia (%)`, 
##     data = datos)
## 
## Coefficients:
##      (Intercept)     Horas_estudio  `Asistencia (%)`  
##         -0.05587           0.20006           0.03110  
## 
## 
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance =  0.05 
## 
## Call:
##  gvlma::gvlma(x = modelo) 
## 
##                      Value p-value                Decision
## Global Stat        0.96107  0.9156 Assumptions acceptable.
## Skewness           0.21452  0.6432 Assumptions acceptable.
## Kurtosis           0.49496  0.4817 Assumptions acceptable.
## Link Function      0.02559  0.8729 Assumptions acceptable.
## Heteroscedasticity 0.22599  0.6345 Assumptions acceptable.

Conclusiones del modelo

El modelo de regresión múltiple cumple con todos los supuestos clásicos de la regresión lineal: linealidad, normalidad, homocedasticidad, y no autocorrelación de residuos, por lo tanto, es estadísticamente válido para interpretar y predecir el desempeño académico de los estudiantes a partir de las variables Horas de estudio y Asistencia.

CONCLUSIÓN

El análisis realizado mediante regresión lineal múltiple permitió evaluar la influencia de variables como las horas de estudio y el porcentaje de asistencia sobre el promedio final de los estudiantes. A través del análisis exploratorio, la estimación del modelo y el diagnóstico gráfico, se comprobó que el modelo se ajusta de forma adecuada a los datos.

Los indicadores de precisión (MAE, RMSE, MAPE y exactitud) reflejan un buen desempeño predictivo, mientras que los gráficos de diagnóstico confirman que se cumplen los supuestos de normalidad, linealidad, homocedasticidad y ausencia de valores atípicos influyentes.

En conclusión, el modelo construido es estadísticamente válido y puede utilizarse para explicar y predecir el desempeño académico de los estudiantes en función de sus hábitos de estudio y asistencia a clase. Estos resultados pueden servir como base para futuras estrategias de mejora educativa.