#INTRODUCCIÓN Este informe se basa en el estudio “Using Data Mining to Predict Secondary School Student Performance”, el cual emplea técnicas de Minería de Datos para predecir el rendimiento académico de estudiantes de secundaria en Portugal. A partir de datos reales recopilados durante el año escolar 2005–2006, se analizaron variables demográficas, sociales y escolares, incluyendo calificaciones previas, hábitos de estudio, entorno familiar y consumo de alcohol. Estas variables, descritas en detalle en las siguientes secciones, fueron utilizadas en modelos de clasificación y regresión con el fin de identificar factores clave que inciden en el éxito o fracaso académico, demostrando que además del desempeño previo, otros elementos del contexto del estudiante también influyen significativamente en sus resultados.

# Librerías necesarias
knitr::opts_chunk$set(echo = TRUE)
library(lubridate)
## 
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(ggplot2)
library(readxl)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(stringr)
library(visdat)
library(naniar)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0     ✔ tibble  3.2.1
## ✔ purrr   1.0.4     ✔ tidyr   1.3.1
## ✔ readr   2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()          masks stats::filter()
## ✖ kableExtra::group_rows() masks dplyr::group_rows()
## ✖ dplyr::lag()             masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(gridExtra)
## 
## Adjuntando el paquete: 'gridExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
library(pander)

#Bases de datos que se trabajaran

D1: Notas de Matematicas D2: Notas de Portugues

d1=read.table("student-mat.csv",sep=";",header=TRUE)
d2=read.table("student-por.csv",sep=";",header=TRUE)
d3=merge(d1,d2,by=c("school","sex","age","address","famsize","Pstatus","Medu","Fedu","Mjob","Fjob","reason","nursery","internet"))
print(nrow(d3)) # 382 students
## [1] 382

1. Exploración de datos: Análisis descriptivo mediante gráficos y tablas.

Se hizo el filtrado de las variables numéricas que contiene el set de datos de matemáticas y portuguesm se dejan solo variables cuantitativas en un nuevo conjunto de datos que utiliza las calificaciones de los estudiantes seleccionando asi las siguientes variables: G1: Notas de Matematicas primer periodo G2: Notas de Matematicas segundo periodo G3: Notas de Matematicas segundo periodo failures: (Materias Reprobadas) número de materias reprobadas anteriormente (numérico: n si 1 ≤ n < 3, en otro caso 4) Ausencias Escolares: número de ausencias escolares (numérico: de 0 a 93)

Analisis Notas de Matematicas

datos = d1[,c(15,30:33)]
summarytools::descr(datos)
## Descriptive Statistics  
## datos  
## N: 395  
## 
##                     absences   failures       G1       G2       G3
## ----------------- ---------- ---------- -------- -------- --------
##              Mean       5.71       0.33    10.91    10.71    10.42
##           Std.Dev       8.00       0.74     3.32     3.76     4.58
##               Min       0.00       0.00     3.00     0.00     0.00
##                Q1       0.00       0.00     8.00     9.00     8.00
##            Median       4.00       0.00    11.00    11.00    11.00
##                Q3       8.00       0.00    13.00    13.00    14.00
##               Max      75.00       3.00    19.00    19.00    20.00
##               MAD       5.93       0.00     4.45     2.97     4.45
##               IQR       8.00       0.00     5.00     4.00     6.00
##                CV       1.40       2.23     0.30     0.35     0.44
##          Skewness       3.64       2.37     0.24    -0.43    -0.73
##       SE.Skewness       0.12       0.12     0.12     0.12     0.12
##          Kurtosis      21.31       4.89    -0.71     0.59     0.37
##           N.Valid     395.00     395.00   395.00   395.00   395.00
##         Pct.Valid     100.00     100.00   100.00   100.00   100.00

2 Analisis Notas de Portugues

datosP = d2[,c(15,30:33)]
summarytools::descr(datos)
## Descriptive Statistics  
## datos  
## N: 395  
## 
##                     absences   failures       G1       G2       G3
## ----------------- ---------- ---------- -------- -------- --------
##              Mean       5.71       0.33    10.91    10.71    10.42
##           Std.Dev       8.00       0.74     3.32     3.76     4.58
##               Min       0.00       0.00     3.00     0.00     0.00
##                Q1       0.00       0.00     8.00     9.00     8.00
##            Median       4.00       0.00    11.00    11.00    11.00
##                Q3       8.00       0.00    13.00    13.00    14.00
##               Max      75.00       3.00    19.00    19.00    20.00
##               MAD       5.93       0.00     4.45     2.97     4.45
##               IQR       8.00       0.00     5.00     4.00     6.00
##                CV       1.40       2.23     0.30     0.35     0.44
##          Skewness       3.64       2.37     0.24    -0.43    -0.73
##       SE.Skewness       0.12       0.12     0.12     0.12     0.12
##          Kurtosis      21.31       4.89    -0.71     0.59     0.37
##           N.Valid     395.00     395.00   395.00   395.00   395.00
##         Pct.Valid     100.00     100.00   100.00   100.00   100.00

3 Graficamos la base de datos incial de notas de matematicas

par(mfrow = c(2, 2))  # Organiza los gráficos en 2 filas y 2 columnas

# Histograma 1: Materias reprobadas
hist(datos$failures, 
     main = "Materias reprobadas", 
     xlab = "Numero de materias reprobadas", 
     ylab = "No. estudiantes")

# Histograma 2: Ausencias escolares
hist(datos$absences, 
     main = "Ausencias escolares", 
     xlab = "Numero de inasistencias", 
     ylab = "No. estudiantes")

# Histograma 3: Calificacion primer periodo
hist(datos$G1, 
     main = "Calificacion primer periodo", 
     xlab = "Puntaje (0 a 20)", 
     ylab = "Estudiantes calificados")

# Histograma 4: Calificacion segundo periodo
hist(datos$G2, 
     main = "Calificacion segundo periodo", 
     xlab = "Puntaje (0 a 20)", 
     ylab = "Estudiantes calificados")

# 4 Graficamos la base de datos incial de notas de matematicas

par(mfrow = c(2, 2))  # Organiza los gráficos en 2 filas y 2 columnas

# Histograma 1: Materias reprobadas
hist(datosP$failures, 
     main = "Materias reprobadas", 
     xlab = "Numero de materias reprobadas", 
     ylab = "No. estudiantes")

# Histograma 2: Ausencias escolares
hist(datosP$absences, 
     main = "Ausencias escolares", 
     xlab = "Numero de inasistencias", 
     ylab = "No. estudiantes")

# Histograma 3: Calificacion primer periodo
hist(datosP$G1, 
     main = "Calificacion primer periodo", 
     xlab = "Puntaje (0 a 20)", 
     ylab = "Estudiantes calificados")

# Histograma 4: Calificacion segundo periodo
hist(datosP$G2, 
     main = "Calificacion segundo periodo", 
     xlab = "Puntaje (0 a 20)", 
     ylab = "Estudiantes calificados")

# 5 CORRELACIONES

cor(datos)
##             failures    absences         G1         G2          G3
## failures  1.00000000  0.06372583 -0.3547176 -0.3558956 -0.36041494
## absences  0.06372583  1.00000000 -0.0310029 -0.0317767  0.03424732
## G1       -0.35471761 -0.03100290  1.0000000  0.8521181  0.80146793
## G2       -0.35589563 -0.03177670  0.8521181  1.0000000  0.90486799
## G3       -0.36041494  0.03424732  0.8014679  0.9048680  1.00000000
cor(datosP)
##            failures    absences         G1         G2          G3
## failures  1.0000000  0.12277884 -0.3842105 -0.3857822 -0.39331555
## absences  0.1227788  1.00000000 -0.1471492 -0.1247449 -0.09137906
## G1       -0.3842105 -0.14714924  1.0000000  0.8649816  0.82638712
## G2       -0.3857822 -0.12474493  0.8649816  1.0000000  0.91854800
## G3       -0.3933155 -0.09137906  0.8263871  0.9185480  1.00000000
par(mfrom=c(2,2))
## Warning in par(mfrom = c(2, 2)): "mfrom" es un parámetro gráfico inválido
plot(datos$failures, datos$G1)

plot(datos$absences, datos$G1)

plot(datos$failures, datos$G2)

plot(datos$absences, datos$G2)

plot(datos$G1, datos$G2)

plot(datos$G1, datos$G3)

par(mfrom=c(2,2))
## Warning in par(mfrom = c(2, 2)): "mfrom" es un parámetro gráfico inválido
plot(datosP$failures, datosP$G1)

plot(datosP$absences, datosP$G1)

plot(datosP$failures, datosP$G2)

plot(datosP$absences, datosP$G2)

plot(datosP$G1, datosP$G2)

plot(datosP$G1, datosP$G3)

6 Modelo de regresión lineal simple

# Cargar datos
d1 <- read.table("student-mat.csv", sep = ";", header = TRUE)
d2 <- read.table("student-por.csv", sep = ";", header = TRUE)

# Variables a usar
vars <- c("G1", "G2", "G3")

# Filtrar y eliminar filas con ceros
mat <- subset(d1[, vars], apply(d1[, vars], 1, function(x) all(x != 0)))
por <- subset(d2[, vars], apply(d2[, vars], 1, function(x) all(x != 0)))

# Función para ajustar modelos y aplicar pruebas
analisis_modelos <- function(data, nombre) {
  cat("\n---", nombre, "---\n")
  
  # Correlación de Pearson
  cat("\nCorrelación de Pearson:\n")
  print(cor(data, method = "pearson"))
  
  # Modelo 1: G3 ~ G1
  modelo1 <- lm(G3 ~ G1, data = data)
  r1 <- residuals(modelo1)
  cat("\nModelo 1: G3 ~ G1\n")
  print(summary(modelo1))
  cat("Shapiro-Wilk para residuos:\n")
  print(shapiro.test(r1))
  
  # Modelo 2: G3 ~ G2
  modelo2 <- lm(G3 ~ G2, data = data)
  r2 <- residuals(modelo2)
  cat("\nModelo 2: G3 ~ G2\n")
  print(summary(modelo2))
  cat("Shapiro-Wilk para residuos:\n")
  print(shapiro.test(r2))
  
  # Modelo 3: G3 ~ G1 + G2
  modelo3 <- lm(G3 ~ G1 + G2, data = data)
  r3 <- residuals(modelo3)
  cat("\nModelo 3: G3 ~ G1 + G2\n")
  print(summary(modelo3))
  cat("Shapiro-Wilk para residuos:\n")
  print(shapiro.test(r3))
  
  # Gráficos QQ
  par(mfrow = c(1, 3))
  qqnorm(r1, main = "QQ Plot Modelo 1"); qqline(r1, col = "red")
  qqnorm(r2, main = "QQ Plot Modelo 2"); qqline(r2, col = "red")
  qqnorm(r3, main = "QQ Plot Modelo 3"); qqline(r3, col = "red")
}

# Ejecutar para Matemáticas y Portugués
analisis_modelos(mat, "Matemáticas")
## 
## --- Matemáticas ---
## 
## Correlación de Pearson:
##           G1        G2        G3
## G1 1.0000000 0.9019397 0.8918050
## G2 0.9019397 1.0000000 0.9655825
## G3 0.8918050 0.9655825 1.0000000
## 
## Modelo 1: G3 ~ G1
## 
## Call:
## lm(formula = G3 ~ G1, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6200 -1.0616 -0.1733  1.0501  3.7151 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.51338    0.28042   5.397 1.24e-07 ***
## G1           0.88832    0.02392  37.140  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.462 on 355 degrees of freedom
## Multiple R-squared:  0.7953, Adjusted R-squared:  0.7947 
## F-statistic:  1379 on 1 and 355 DF,  p-value: < 2.2e-16
## 
## Shapiro-Wilk para residuos:
## 
##  Shapiro-Wilk normality test
## 
## data:  r1
## W = 0.99177, p-value = 0.04498
## 
## 
## Modelo 2: G3 ~ G2
## 
## Call:
## lm(formula = G3 ~ G2, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.2172 -0.1978 -0.1494  0.8119  2.8022 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.27529    0.16686    1.65   0.0999 .  
## G2           0.99031    0.01416   69.95   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8407 on 355 degrees of freedom
## Multiple R-squared:  0.9323, Adjusted R-squared:  0.9322 
## F-statistic:  4893 on 1 and 355 DF,  p-value: < 2.2e-16
## 
## Shapiro-Wilk para residuos:
## 
##  Shapiro-Wilk normality test
## 
## data:  r2
## W = 0.89793, p-value = 9.682e-15
## 
## 
## Modelo 3: G3 ~ G1 + G2
## 
## Call:
## lm(formula = G3 ~ G1 + G2, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.1845 -0.2927 -0.1673  0.7056  2.8190 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.19482    0.16572   1.176 0.240541    
## G1           0.11167    0.03133   3.564 0.000415 ***
## G2           0.88661    0.03226  27.486  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8272 on 354 degrees of freedom
## Multiple R-squared:  0.9347, Adjusted R-squared:  0.9343 
## F-statistic:  2533 on 2 and 354 DF,  p-value: < 2.2e-16
## 
## Shapiro-Wilk para residuos:
## 
##  Shapiro-Wilk normality test
## 
## data:  r3
## W = 0.96396, p-value = 1.047e-07

analisis_modelos(por, "Portugués")
## 
## --- Portugués ---
## 
## Correlación de Pearson:
##           G1        G2        G3
## G1 1.0000000 0.8919555 0.8761967
## G2 0.8919555 1.0000000 0.9337841
## G3 0.8761967 0.9337841 1.0000000
## 
## Modelo 1: G3 ~ G1
## 
## Call:
## lm(formula = G3 ~ G1, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.8330 -0.8330  0.0596  0.8112  5.1670 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.90673    0.23101   8.254 8.98e-16 ***
## G1           0.89263    0.01955  45.668  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.299 on 631 degrees of freedom
## Multiple R-squared:  0.7677, Adjusted R-squared:  0.7674 
## F-statistic:  2086 on 1 and 631 DF,  p-value: < 2.2e-16
## 
## Shapiro-Wilk para residuos:
## 
##  Shapiro-Wilk normality test
## 
## data:  r1
## W = 0.96426, p-value = 2.723e-11
## 
## 
## Modelo 2: G3 ~ G2
## 
## Call:
## lm(formula = G3 ~ G2, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.5114 -0.4675 -0.2484  0.5763  5.4886 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.94964    0.17570   5.405 9.21e-08 ***
## G2           0.95617    0.01459  65.550  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9646 on 631 degrees of freedom
## Multiple R-squared:  0.872,  Adjusted R-squared:  0.8717 
## F-statistic:  4297 on 1 and 631 DF,  p-value: < 2.2e-16
## 
## Shapiro-Wilk para residuos:
## 
##  Shapiro-Wilk normality test
## 
## data:  r2
## W = 0.8601, p-value < 2.2e-16
## 
## 
## Modelo 3: G3 ~ G1 + G2
## 
## Call:
## lm(formula = G3 ~ G1 + G2, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.5230 -0.5015 -0.0913  0.5415  5.4770 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.73795    0.17213   4.287 2.09e-05 ***
## G1           0.21581    0.03095   6.972 7.89e-12 ***
## G2           0.76269    0.03111  24.516  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9302 on 630 degrees of freedom
## Multiple R-squared:  0.8811, Adjusted R-squared:  0.8807 
## F-statistic:  2335 on 2 and 630 DF,  p-value: < 2.2e-16
## 
## Shapiro-Wilk para residuos:
## 
##  Shapiro-Wilk normality test
## 
## data:  r3
## W = 0.88733, p-value < 2.2e-16

# 8 Conclusiones: Hipótesis del Modelo de Regresión Lineal Múltiple 1. Hipótesis global del modelo (prueba F): Evalúa si al menos uno de los coeficientes del modelo es significativamente diferente de cero.

  1. Hipótesis individuales de los coeficientes (pruebas t): Evalúan si cada predictor tiene un efecto significativo sobre la variable dependiente (G3), controlando por la otra variable.

Se evalúa mediante el valor p de cada coeficiente en la tabla del modelo. Si el valor p es menor que 0.05, se considera significativo.

  1. Supuestos del modelo (evaluados gráficamente): Linealidad: la relación entre predictores y respuesta debe ser lineal.

Independencia: los residuos deben ser independientes entre sí.

Homoscedasticidad: la varianza de los errores debe ser constante.

Normalidad: los errores deben seguir una distribución normal, sin embargo dada la limitación de utilizar 1 variables como independiente el error no cumple el supuesto de normalidad.