#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
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)
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
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
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)
# 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.
Hipótesis nula (H₀): β₁ = β₂ = 0 (ninguna de las variables predictoras G1 ni G2 explica significativamente G3).
Hipótesis alternativa (H₁): al menos uno de los coeficientes β ≠ 0 (al menos una variable explicativa contribuye significativamente al modelo).
Criterio: Si el valor p del estadístico F es menor a un nivel de significancia (por ejemplo, 0.05), se rechaza H₀, lo que indica que el modelo es útil para explicar G3.
Hipótesis nula (H₀): βᵢ = 0 (el predictor G1 o G2 no tiene efecto sobre G3).
Hipótesis alternativa (H₁): βᵢ ≠ 0 (el predictor tiene efecto significativo).
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.
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.