1. Carga de Datos

En esta sección se importa la base de datos desde el archivo Excel y se verifican los nombres de las variables.

library(readxl)

estudio <- read_excel("C:/Users/bpena/OneDrive/Documentos/2026-1/machine learning/Taller_R.xlsx")

names(estudio)
## [1] "Horas de Estudio"                      
## [2] "Asistencia (días)"                     
## [3] "Actividades Extracurriculares (número)"
## [4] "Calificaciones en Matemáticas"         
## [5] "Calificaciones en Ciencias"

2. Modelos de Regresión para Matemáticas

Se ajustan tres modelos de regresión lineal simple donde la variable respuesta es Calificaciones en Matemáticas.

2.1 Matemáticas ~ Horas de Estudio

m1 <- lm(`Calificaciones en Matemáticas` ~ `Horas de Estudio`, data = estudio)
summary(m1)
## 
## Call:
## lm(formula = `Calificaciones en Matemáticas` ~ `Horas de Estudio`, 
##     data = estudio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.0738 -1.0646 -0.1103  0.8440  3.8897 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         53.4026     0.9039   59.08   <2e-16 ***
## `Horas de Estudio`   3.9635     0.1312   30.20   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.699 on 48 degrees of freedom
## Multiple R-squared:   0.95,  Adjusted R-squared:  0.949 
## F-statistic: 912.1 on 1 and 48 DF,  p-value: < 2.2e-16
summary(m1)$r.squared
## [1] 0.9500027

2.2 Matemáticas ~ Asistencia

m2 <- lm(`Calificaciones en Matemáticas` ~ `Asistencia (días)`, data = estudio)
summary(m2)
## 
## Call:
## lm(formula = `Calificaciones en Matemáticas` ~ `Asistencia (días)`, 
##     data = estudio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.2235 -2.1108 -0.3794  3.5055  6.6230 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          32.3865     4.2112   7.691 6.48e-10 ***
## `Asistencia (días)`   2.1535     0.1899  11.341 3.52e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.96 on 48 degrees of freedom
## Multiple R-squared:  0.7282, Adjusted R-squared:  0.7226 
## F-statistic: 128.6 on 1 and 48 DF,  p-value: 3.518e-15
summary(m2)$r.squared
## [1] 0.7282123

2.3 Matemáticas ~ Actividades Extracurriculares

m3 <- lm(`Calificaciones en Matemáticas` ~ 
           `Actividades Extracurriculares (número)`, data = estudio)
summary(m3)
## 
## Call:
## lm(formula = `Calificaciones en Matemáticas` ~ `Actividades Extracurriculares (número)`, 
##     data = estudio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.0172 -2.7779 -0.0279  1.9721  8.9828 
## 
## Coefficients:
##                                          Estimate Std. Error t value Pr(>|t|)
## (Intercept)                               66.0491     1.6618  39.744  < 2e-16
## `Actividades Extracurriculares (número)`   4.9894     0.5571   8.957 8.21e-12
##                                             
## (Intercept)                              ***
## `Actividades Extracurriculares (número)` ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.648 on 48 degrees of freedom
## Multiple R-squared:  0.6257, Adjusted R-squared:  0.6179 
## F-statistic: 80.22 on 1 and 48 DF,  p-value: 8.212e-12
summary(m3)$r.squared
## [1] 0.6256526

3. Modelos de Regresión para Ciencias

Ahora se analiza como variable respuesta las Calificaciones en Ciencias.

3.1 Ciencias ~ Horas de Estudio

m4 <- lm(`Calificaciones en Ciencias` ~ `Horas de Estudio`, data = estudio)
summary(m4)
## 
## Call:
## lm(formula = `Calificaciones en Ciencias` ~ `Horas de Estudio`, 
##     data = estudio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.2607 -0.9269 -0.1160  0.9563  4.0287 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         56.8596     1.0351   54.93   <2e-16 ***
## `Horas de Estudio`   3.8223     0.1503   25.43   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.945 on 48 degrees of freedom
## Multiple R-squared:  0.9309, Adjusted R-squared:  0.9295 
## F-statistic: 646.9 on 1 and 48 DF,  p-value: < 2.2e-16
summary(m4)$r.squared
## [1] 0.9309301

3.2 Ciencias ~ Asistencia

m5 <- lm(`Calificaciones en Ciencias` ~ `Asistencia (días)`, data = estudio)
summary(m5)
## 
## Call:
## lm(formula = `Calificaciones en Ciencias` ~ `Asistencia (días)`, 
##     data = estudio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.5388 -2.0032 -0.0675  3.5968  6.3755 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          36.3962     4.1663   8.736 1.74e-11 ***
## `Asistencia (días)`   2.0857     0.1879  11.102 7.40e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.918 on 48 degrees of freedom
## Multiple R-squared:  0.7197, Adjusted R-squared:  0.7139 
## F-statistic: 123.3 on 1 and 48 DF,  p-value: 7.401e-15
summary(m5)$r.squared
## [1] 0.7197218

3.3 Ciencias ~ Actividades Extracurriculares

m6 <- lm(`Calificaciones en Ciencias` ~ 
           `Actividades Extracurriculares (número)`, data = estudio)
summary(m6)
## 
## Call:
## lm(formula = `Calificaciones en Ciencias` ~ `Actividades Extracurriculares (número)`, 
##     data = estudio)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.4878  -2.6886  -0.5882   2.9108   9.3114 
## 
## Coefficients:
##                                          Estimate Std. Error t value Pr(>|t|)
## (Intercept)                                69.090      1.653  41.804  < 2e-16
## `Actividades Extracurriculares (número)`    4.799      0.554   8.663 2.23e-11
##                                             
## (Intercept)                              ***
## `Actividades Extracurriculares (número)` ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.622 on 48 degrees of freedom
## Multiple R-squared:  0.6099, Adjusted R-squared:  0.6018 
## F-statistic: 75.05 on 1 and 48 DF,  p-value: 2.235e-11
summary(m6)$r.squared
## [1] 0.6099026

4. Evaluación del Supuesto de Normalidad

Se analizan los residuos estandarizados mediante gráficos de dispersión y QQ-Plot.

Modelo m1

residuos <- rstandard(m1)
valores_ajustados <- fitted(m1)

plot(valores_ajustados, residuos,
     main="Residuos vs Ajustados (m1)")

qqnorm(residuos)
qqline(residuos)

Modelo m2

residuos <- rstandard(m2)
valores_ajustados <- fitted(m2)

plot(valores_ajustados, residuos,
     main="Residuos vs Ajustados (m2)")

qqnorm(residuos)
qqline(residuos)

Modelo m3

residuos <- rstandard(m3)
valores_ajustados <- fitted(m3)

plot(valores_ajustados, residuos,
     main="Residuos vs Ajustados (m3)")

qqnorm(residuos)
qqline(residuos)

Modelo m4

residuos <- rstandard(m4)
valores_ajustados <- fitted(m4)

plot(valores_ajustados, residuos,
     main="Residuos vs Ajustados (m4)")

qqnorm(residuos)
qqline(residuos)

Modelo m5

residuos <- rstandard(m5)
valores_ajustados <- fitted(m5)

plot(valores_ajustados, residuos,
     main="Residuos vs Ajustados (m5)")

qqnorm(residuos)
qqline(residuos)

Modelo m6

residuos <- rstandard(m6)
valores_ajustados <- fitted(m6)

plot(valores_ajustados, residuos,
     main="Residuos vs Ajustados (m6)")

qqnorm(residuos)
qqline(residuos)


5. Predicciones

Se realizan predicciones para valores entre 1 y 10 en cada variable explicativa.

# M1
nuevo_m1 <- data.frame("Horas de Estudio" = seq(1,10),
                       check.names = FALSE)
predict(m1, newdata = nuevo_m1)
##        1        2        3        4        5        6        7        8 
## 57.36605 61.32951 65.29298 69.25645 73.21991 77.18338 81.14685 85.11032 
##        9       10 
## 89.07378 93.03725
# M2
nuevo_m2 <- data.frame("Asistencia (días)" = seq(1,10),
                       check.names = FALSE)
predict(m2, newdata = nuevo_m2)
##        1        2        3        4        5        6        7        8 
## 34.54002 36.69350 38.84698 41.00046 43.15394 45.30742 47.46089 49.61437 
##        9       10 
## 51.76785 53.92133
# M3
nuevo_m3 <- data.frame("Actividades Extracurriculares (número)" = seq(1,10),
                       check.names = FALSE)
predict(m3, newdata = nuevo_m3)
##         1         2         3         4         5         6         7         8 
##  71.03849  76.02787  81.01724  86.00661  90.99598  95.98535 100.97472 105.96409 
##         9        10 
## 110.95346 115.94283
# M4
nuevo_m4 <- data.frame("Horas de Estudio" = seq(1,10),
                       check.names = FALSE)
predict(m4, newdata = nuevo_m4)
##        1        2        3        4        5        6        7        8 
## 60.68195 64.50430 68.32665 72.14900 75.97135 79.79370 83.61605 87.43840 
##        9       10 
## 91.26074 95.08309
# M5
nuevo_m5 <- data.frame("Asistencia (días)" = seq(1,10),
                       check.names = FALSE)
predict(m5, newdata = nuevo_m5)
##        1        2        3        4        5        6        7        8 
## 38.48191 40.56761 42.65332 44.73902 46.82473 48.91043 50.99614 53.08184 
##        9       10 
## 55.16755 57.25325
# M6
nuevo_m6 <- data.frame("Actividades Extracurriculares (número)" = seq(1,10),
                       check.names = FALSE)
predict(m6, newdata = nuevo_m6)
##         1         2         3         4         5         6         7         8 
##  73.88940  78.68860  83.48779  88.28699  93.08618  97.88538 102.68457 107.48377 
##         9        10 
## 112.28296 117.08216

6. Intervalos de Confianza

Se calculan intervalos de confianza al 95% y 90% para los coeficientes.

confint(m1); confint(m1, level = 0.90)
##                        2.5 %    97.5 %
## (Intercept)        51.585094 55.220064
## `Horas de Estudio`  3.699592  4.227342
##                          5 %      95 %
## (Intercept)        51.886476 54.918682
## `Horas de Estudio`  3.743349  4.183585
confint(m2); confint(m2, level = 0.90)
##                         2.5 %    97.5 %
## (Intercept)         23.919302 40.853791
## `Asistencia (días)`  1.771676  2.535281
##                           5 %      95 %
## (Intercept)         25.323370 39.449723
## `Asistencia (días)`  1.834987  2.471969
confint(m3); confint(m3, level = 0.90)
##                                              2.5 %    97.5 %
## (Intercept)                              62.707757 69.390490
## `Actividades Extracurriculares (número)`  3.869342  6.109399
##                                                5 %      95 %
## (Intercept)                              63.261835 68.836413
## `Actividades Extracurriculares (número)`  4.055069  5.923672
confint(m4); confint(m4, level = 0.90)
##                        2.5 %    97.5 %
## (Intercept)        54.778459 58.940739
## `Horas de Estudio`  3.520195  4.124504
##                          5 %     95 %
## (Intercept)        55.123561 58.59564
## `Horas de Estudio`  3.570299  4.07440
confint(m5); confint(m5, level = 0.90)
##                         2.5 %    97.5 %
## (Intercept)         28.019350 44.773054
## `Asistencia (días)`  1.707978  2.463432
##                           5 %      95 %
## (Intercept)         29.408429 43.383975
## `Asistencia (días)`  1.770614  2.400796
confint(m6); confint(m6, level = 0.90)
##                                              2.5 %    97.5 %
## (Intercept)                              65.767189 72.413219
## `Actividades Extracurriculares (número)`  3.685319  5.913073
##                                                5 %      95 %
## (Intercept)                              66.318223 71.862185
## `Actividades Extracurriculares (número)`  3.870026  5.728366

Conclusión

Se ajustaron seis modelos de regresión lineal simple para evaluar la relación entre variables académicas (horas de estudio, asistencia y actividades extracurriculares) y el rendimiento en Matemáticas y Ciencias.

Además, se verificaron los supuestos mediante el análisis gráfico de residuos, se realizaron predicciones y se calcularon intervalos de confianza para los parámetros estimados.