El siguiente trabajo se centra en analizar un conjunto de datos que recopila información sobre estudiantes matriculados en cursos de matemáticas y portugués en dos escuelas diferentes. Los datos comprenden una amplia gama de variables, incluidas características demográficas, familiares, académicas y de comportamiento de los estudiantes. Explorar las relaciones entre estas variables y las calificaciones finales de los estudiantes en ambas materias. Para lograr esto, se realizará un análisis estadístico que incluirá métodos de regresión para determinar qué factores influyen significativamente en el rendimiento académico de los estudiantes.
Durante este análisis, se examinarán las características de las variables proporcionadas, su distribución y posibles relaciones entre ellas. Se utilizarán gráficos descriptivos, como histogramas, diagramas de dispersión y boxplots, para visualizar la distribución de los datos y detectar posibles patrones o anomalías y se realizarán interpretaciones detalladas de los hallazgos obtenidos.
Se llevará a cabo un análisis de normalidad de las variables G1, G2 y G3 para determinar si siguen una distribución normal. Esto se realizará mediante pruebas estadísticas como la prueba de normalidad de Shapiro-Wilk o la prueba de Kolmogorov-Smirnov. La normalidad de los datos es fundamental para aplicar ciertos métodos estadísticos y modelos predictivos.
Se examinará el rendimiento académico de los estudiantes a lo largo de los tres períodos (G1, G2 y G3) y se evaluará estadísticamente si existen factores influyentes en el rendimiento académico. Para ello, se emplearán técnicas de análisis de regresión y correlación para identificar las variables que tienen una relación significativa con las calificaciones finales. Se justificará estadísticamente si estos factores influyen en el rendimiento académico.
Finalmente, se realizará una estimación del comportamiento futuro de la variable en estudio (calificación final, G3) utilizando métodos de pronóstico como modelos de regresión. Se justificará la elección del método de pronóstico utilizado y se proporcionarán conclusiones sobre las posibles tendencias del rendimiento académico a corto plazo.
Presentamos el conjunto de datos correspondiente a los estudiantes inscritos en el curso de matemáticas. A continuación, detallaremos las variables que componen este conjunto, proporcionando una descripción clara de cada una.
1. Escuela: Indica la escuela del estudiante, siendo “GP” para Gabriel Pereira y “MS” para Mousinho da Silveira.
2. Sexo: Describe el sexo del estudiante, utilizando “F” para femenino y “M” para masculino.
3. Edad: Representa la edad del estudiante, con valores numéricos entre 15 y 22 años.
4. Dirección: Define el tipo de dirección del estudiante, siendo “U” para urbana y “R” para rural.
5. Tamaño de la Familia: Indica el tamaño de la familia del estudiante, clasificado como “LE3” para menor o igual a 3 y “GT3” para mayor que 3.
6. Estado de Convivencia de los Padres: Refleja el estado de convivencia de los padres del estudiante, siendo “T” para viviendo juntos y “A” para separados.
7. Educación de la Madre (Medu): Representa el nivel educativo de la madre del estudiante, con valores numéricos del 0 al 4.
8. Educación del Padre (Fedu): Indica el nivel educativo del padre del estudiante, con valores numéricos del 0 al 4.
9. Trabajo de la Madre (Mjob): Describe el trabajo de la madre del estudiante, con categorías como “maestra”, “salud”, “servicios”, “en casa” u “otros”.
10. Trabajo del Padre (Fjob): Representa el trabajo del padre del estudiante, con categorías como “maestro”, “salud”, “servicios”, “en casa” u “otros”.
11. Motivo de Elección de la Escuela: Indica el motivo por el cual se eligió la escuela, con opciones como “casa”, “reputación”, “curso” u “otro”.
12. Tutor: Describe quién es el tutor del estudiante, con opciones como “madre”, “padre” u “otro”.
13. Tiempo de Viaje: Representa el tiempo de viaje de casa a la escuela, con valores numéricos del 1 al 4, indicando diferentes intervalos de tiempo.
14. Tiempo de Estudio: Indica el tiempo de estudio semanal del estudiante, con valores numéricos del 1 al 4, representando diferentes intervalos de tiempo.
15. Reprobados: Número de clases anteriores en las que el estudiante ha reprobado, con valores numéricos del 1 al 4.
16. Apoyo Educativo Adicional (schoolsup): Indica si el estudiante recibe apoyo educativo adicional, con opciones binarias de “sí” o “no”.
17. Apoyo Educativo Familiar (famsup): Describe si el estudiante recibe apoyo educativo familiar, con opciones binarias de “sí” o “no”.
18. Clases Pagadas: Indica si el estudiante recibe clases extra pagadas dentro del curso de Matemáticas o Portugués, con opciones binarias de “sí” o “no”.
19. Actividades Extraescolares: Refleja si el estudiante participa en actividades extraescolares, con opciones binarias de “sí” o “no”.
20. Asistencia: Indica si el estudiante asistió, con opciones binarias de “sí” o “no”.
21. Deseo de Cursar Estudios Superiores: Describe si el estudiante tiene el deseo de cursar estudios superiores, con opciones binarias de “sí” o “no”.
22. Acceso a Internet en Casa: Indica si el estudiante tiene acceso a Internet en casa, con opciones binarias de “sí” o “no”.
23. Relación Romántica: Refleja si el estudiante está en una relación romántica, con opciones binarias de “sí” o “no”.
24. Calidad de las Relaciones Familiares (famrel): Describe la calidad de las relaciones familiares del estudiante, con valores numéricos del 1 al 5, representando desde “muy malo” hasta “excelente”.
25. Tiempo Libre: Indica el tiempo libre después de la escuela del estudiante, con valores numéricos del 1 al 5, representando desde “muy bajo” hasta “muy alto”.
26. Salir con Amigos (goout): Describe la frecuencia con la que el estudiante sale con amigos, con valores numéricos del 1 al 5, representando desde “muy bajo” hasta “muy alto”.
27. Consumo de Alcohol en Jornada Laboral (Dalc): Indica el nivel de consumo de alcohol durante la jornada laboral del estudiante, con valores numéricos del 1 al 5, representando desde “muy bajo” hasta “muy alto”.
28. Consumo de Alcohol en Fin de Semana (Walc): Describe el nivel de consumo de alcohol durante el fin de semana del estudiante, con valores numéricos del 1 al 5, representando desde “muy bajo” hasta “muy alto”.
29. Estado de Salud: Representa el estado de salud actual del estudiante, con valores numéricos del 1 al 5, representando desde “muy malo” hasta “muy bueno”.
30. Ausencias: Indica el número de ausencias escolares del estudiante, con valores numéricos de 0 a 93.
31. Calificación del Primer Período (G1): Representa la calificación del primer período del estudiante en la materia de Matemáticas o Portugués, con valores numéricos de 0 a 20.
32. Calificación del Segundo Período (G2): Indica la calificación del segundo período del estudiante en la materia de Matemáticas o Portugués, con valores numéricos de 0 a 20.
33. Calificación Final (G3): Describe la calificación final del estudiante en la materia de Matemáticas o Portugués, con valores numéricos de 0 a 20, siendo el objetivo final.
# file.choose()
library(readxl)
data <- read_xlsx("C:\\Users\\PC\\Downloads\\std.xlsx")
# str(data) # Estructura de la base de datos
# Nombre de las variables
names(data)
## [1] "school" "sex" "age" "address" "famsize"
## [6] "Pstatus" "Medu" "Fedu" "Mjob" "Fjob"
## [11] "reason" "guardian" "traveltime" "studytime" "failures"
## [16] "schoolsup" "famsup" "paid" "activities" "nursery"
## [21] "higher" "internet" "romantic" "famrel" "freetime"
## [26] "goout" "Dalc" "Walc" "health" "absences"
## [31] "G1" "G2" "G3"
# Comprobar el tipo de clase de cada variable
clases <- sapply(data, class)
clases
## school sex age address famsize Pstatus
## "character" "character" "numeric" "character" "character" "character"
## Medu Fedu Mjob Fjob reason guardian
## "numeric" "numeric" "character" "character" "character" "character"
## traveltime studytime failures schoolsup famsup paid
## "numeric" "numeric" "numeric" "character" "character" "character"
## activities nursery higher internet romantic famrel
## "character" "character" "character" "character" "character" "numeric"
## freetime goout Dalc Walc health absences
## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
## G1 G2 G3
## "numeric" "numeric" "numeric"
cat_cols <- names(data)[sapply(data, is.character)]; cat_cols
## [1] "school" "sex" "address" "famsize" "Pstatus"
## [6] "Mjob" "Fjob" "reason" "guardian" "schoolsup"
## [11] "famsup" "paid" "activities" "nursery" "higher"
## [16] "internet" "romantic"
num_cols <- names(data)[sapply(data, is.numeric)]; num_cols
## [1] "age" "Medu" "Fedu" "traveltime" "studytime"
## [6] "failures" "famrel" "freetime" "goout" "Dalc"
## [11] "Walc" "health" "absences" "G1" "G2"
## [16] "G3"
colSums(is.na(data))
## school sex age address famsize Pstatus Medu
## 0 0 0 0 0 0 0
## Fedu Mjob Fjob reason guardian traveltime studytime
## 0 0 0 0 0 0 0
## failures schoolsup famsup paid activities nursery higher
## 0 0 0 0 0 0 0
## internet romantic famrel freetime goout Dalc Walc
## 0 0 0 0 0 0 0
## health absences G1 G2 G3
## 0 0 0 0 0
Se observa que la base de datos no presenta ningun valor faltante.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data1<- select_if(data, is.numeric) # base de datos numéricos
summary(data1)
## age Medu Fedu traveltime studytime
## Min. :15.0 Min. :0.000 Min. :0.000 Min. :1.000 Min. :1.000
## 1st Qu.:16.0 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:1.000
## Median :17.0 Median :3.000 Median :2.000 Median :1.000 Median :2.000
## Mean :16.7 Mean :2.749 Mean :2.522 Mean :1.448 Mean :2.035
## 3rd Qu.:18.0 3rd Qu.:4.000 3rd Qu.:3.000 3rd Qu.:2.000 3rd Qu.:2.000
## Max. :22.0 Max. :4.000 Max. :4.000 Max. :4.000 Max. :4.000
## failures famrel freetime goout
## Min. :0.0000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:4.000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :3.000 Median :3.000
## Mean :0.3342 Mean :3.944 Mean :3.235 Mean :3.109
## 3rd Qu.:0.0000 3rd Qu.:5.000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :3.0000 Max. :5.000 Max. :5.000 Max. :5.000
## Dalc Walc health absences
## Min. :1.000 Min. :1.000 Min. :1.000 Min. : 0.000
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:3.000 1st Qu.: 0.000
## Median :1.000 Median :2.000 Median :4.000 Median : 4.000
## Mean :1.481 Mean :2.291 Mean :3.554 Mean : 5.709
## 3rd Qu.:2.000 3rd Qu.:3.000 3rd Qu.:5.000 3rd Qu.: 8.000
## Max. :5.000 Max. :5.000 Max. :5.000 Max. :75.000
## G1 G2 G3
## Min. : 3.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 8.00 1st Qu.: 9.00 1st Qu.: 8.00
## Median :11.00 Median :11.00 Median :11.00
## Mean :10.91 Mean :10.71 Mean :10.42
## 3rd Qu.:13.00 3rd Qu.:13.00 3rd Qu.:14.00
## Max. :19.00 Max. :19.00 Max. :20.00
Interpretación
La edad de los estudiantes varía entre 15 y 22 años, con una media de aproximadamente 16.7 años, donde la mayoría de los estudiantes tienen entre 16 y 18 años.
La educación de la Madre (Medu) y del Padre (Fedu): La educación de la madre y del padre varía de 0 a 4, con una media cercana a 3, los valores intercuartílicos indican que la mayoría de los padres tienen entre 2 y 4 años de educación.
El tiempo de Viaje a la Escuela (traveltime) y Tiempo de Estudio (studytime): El tiempo medio de viaje a la escuela es de aproximadamente 1.45 unidades, mientras que el tiempo medio de estudio semanal es de alrededor de 2.04 unidades.
Número de Reprobados Anteriores (failures): La mayoría de los estudiantes no han reprobado ninguna clase anteriormente.
Calidad de las Relaciones Familiares (famrel): La calidad de las relaciones familiares tiende a ser alta, con un promedio cercano a 4 y de 5.
Tiempo Libre (freetime) y Salir con Amigos (goout): Los estudiantes tienden a tener un tiempo libre moderado y salen con amigos ocasionalmente, como indican las medianas de 3.
Consumo de Alcohol (Dalc y Walc): El consumo de alcohol durante la semana (Dalc) y los fines de semana (Walc) tiende a ser bajo a moderado, con valores medios de alrededor de 1.48 y 2.29 respectivamente.
Estado de Salud (health): El estado de salud medio de los estudiantes es moderado, con una mediana de 4.
Número de Ausencias (absences): El número medio de ausencias escolares es de aproximadamente 5.71, con una mediana de 4.
Calificaciones (G1, G2, G3): Las calificaciones medias de los estudiantes en los tres períodos (G1, G2 y G3) están alrededor de 10.91, 10.71 y 10.42 respectivamente, con medianas similares, esto indica una distribución más o menos simétrica de las calificaciones.
library(corrplot)
## corrplot 0.92 loaded
correlation_matrix <- cor(data1)
corrplot(correlation_matrix)
Interpretación
Edad (age) muestra una correlación negativa débil con la educación de los padres (Medu y Fedu), lo que indica que a medida que la edad aumenta, la educación de los padres tiende a disminuir ligeramente.
La educación de los padres (Medu y Fedu) está moderadamente correlacionada entre sí, lo que sugiere que los niveles educativos de la madre y el padre tienden a estar relacionados.
El tiempo de viaje a la escuela (traveltime) muestra una correlación débil con la mayoría de las variables, excepto con el consumo de alcohol en jornada laboral (Dalc), donde la correlación es moderada positiva.
El tiempo de estudio (studytime) está moderadamente correlacionado positivamente con la educación de los padres y la calidad de las relaciones familiares, lo que sugiere que los estudiantes con padres más educados y relaciones familiares más fuertes tienden a dedicar más tiempo al estudio.
El número de reprobados anteriores (failures) muestra una correlación moderada negativa con las calificaciones (G1, G2, G3), lo que indica que los estudiantes que han reprobado más veces tienden a obtener calificaciones más bajas.
El consumo de alcohol durante la semana (Dalc) y los fines de semana (Walc)** están fuertemente correlacionados entre sí, lo que sugiere que los estudiantes que consumen más alcohol durante la semana también tienden a hacerlo más los fines de semana.
Las calificaciones (G1, G2, G3) muestran una correlación positiva fuerte entre sí, lo que indica una consistencia en el rendimiento académico de los estudiantes a lo largo de los tres períodos.
Estas correlaciones son valiosas sobre como pueden estar relacionadas las variables entre sí y cómo podrían influir en el rendimiento académico de los estudiantes.
Las variables cuantitativas ausencias y edad se representaron como histogramas, se muestran en la figura a continuación:
library(ggplot2)
ggplot(data, aes(x = age)) +
geom_histogram(fill = "lightblue", color = "black", bins = 30) +
labs(x = "Edad", y = "Frecuencia", title = "Histograma de edad") +
theme_minimal()
ggsave("age.png", width = 6, height = 4)
Según el gráfico nos indica que la edad de los estudiantes esta entre los 16, 17 y los 18 años.
ggplot(data, aes(x = absences)) +
geom_histogram(fill = "green", color = "black", bins = 30) +
labs(x = "Ausencias", y = "Frecuencia", title = "Histograma de ausencia") +
theme_minimal()
ggsave("absence.png", width = 6, height = 4)
El número de ausencias es el número de lecciones que el estudiante ha perdido. La mayoría de los estudiantes tienen un número bajo de ausencias, pero también hay algunos valores atípicos con un número muy alto de ausencias. La mayoría de los estudiantes tenían entre 15 y 18 años (principalmente estudiantes de secundaria pero con algunos repetidores de 19 a 22 años).
boxplot(data[, c("G1", "G2", "G3")],
main = "Boxplot of G1, G2, y G3",
names = c("G1", "G2", "G3"),
col = c("lightblue", "lightgreen", "lightpink"),
border = "black")
Las variables de calificaciones se representan como diagramas de caja. Las calificaciones para los períodos 2 y 3 (calificaciones finales) incluyen calificaciones cero, mientras que las calificaciones para el período 1 no. Una posible explicación puede ser que los estudiantes con altas ausencias o estudiantes que no rindieron un examen importante. La mediana de las calificaciones de los tres semestres no parece diferir mucho. La variación es mayor para el grado final (tercer grado).
cols_numerical <- names(data)[sapply(data, is.numeric)]
cols_string <- names(data)[sapply(data, function(x) is.character(x) | is.factor(x))]
print(paste("NUMERICAL:", paste(cols_numerical, collapse = ", ")))
## [1] "NUMERICAL: age, Medu, Fedu, traveltime, studytime, failures, famrel, freetime, goout, Dalc, Walc, health, absences, G1, G2, G3"
print(paste("CATEGORICAL:", paste(cols_string, collapse = ", ")))
## [1] "CATEGORICAL: school, sex, address, famsize, Pstatus, Mjob, Fjob, reason, guardian, schoolsup, famsup, paid, activities, nursery, higher, internet, romantic"
Se separa las variables numéricas y categóricas para realizar los gráfcios necesarios.
library(ggplot2)
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
cols_numerical <- c("age", "Medu", "Fedu", "traveltime", "studytime", "failures",
"famrel", "freetime", "goout", "Dalc", "Walc", "health",
"absences", "G1", "G2", "G3")
cols_por_pagina <- 4
grupos <- split(cols_numerical, ceiling(seq_along(cols_numerical) / cols_por_pagina))
for (grupo in grupos) {
plots <- list()
for (col in grupo) {
hist <- ggplot(data, aes(x = .data[[col]])) +
geom_histogram(bins = 80, fill = "green", color = "black") +
scale_y_log10() +
labs(x = col, y = "Frecuencia") +
theme_minimal()
plots[[length(plots) + 1]] <- hist
}
grid.arrange(grobs = plots, ncol = 2)
}
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 72 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 76 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Removed 76 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 76 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 75 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 46 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 63 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 63 rows containing missing values (`geom_bar()`).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 62 rows containing missing values (`geom_bar()`).
Se presenta la gráfica de los histogramas de todos los datos numéricos.
Las primeras 4 gráfcias nos presenta las variables Edad, Educación de la madre, Educación del padre y Tiempo de viaje.
Nos indica las distribución de edad de los estudiantes en un intervalo de 15 hasta los 22, la mayor de parte de estudiantes son entre los 16 hasta los 18, al pasar esa edad promedio no hay muchos estudiantes.
La educacion de las madres se puede decir que hay un porcentaje de estudios realizados por las madres.
La educación de los padres es mejor que al de las madres ya que hay más porcentaje de estudios en ellos.
El tiempo de viaje de los estudiantes se puede decir que es baja, no hay muchos alumnos que realizan muchos viajes.
El tiempo de estudio realizados por los estudiantes es mucho mejor ya que si se preocupan por su educación.
Los reprobados se puede decir que hay un porcentaje moderado hay alumnos que si repiten materias.
Calidad de relaciones familiares es bastante alta se puede decir que si tienen buena relación y motivación.
Tiempo libre se observa que es moderado ya que se puede decir que hay estudiantes que ayudan a sus padres o otro que si tienen tiempo para jugar o pasar con sus amigos.
Salir con amigos la mayoria si de estudiantes si salen por divertirse.
Consumo de alcohol en jornada laboral se puede que la mayoria de estudiantes no lo hacen y respetan sus valores, hay un porcentaje bajo de que si lo hacen puede ser por problemas personales o familiares.
Consumo de alcohol durante el fin de semana en este caso si lo hacen ya que en la gran mayoria.
Estado de salud de los estudiantes esta en un porcentaje adecuado algunos de los estuadiantes pueden tener problemas por el alcohol y otras situaciones.
Las ausencias de los estudiantes no estan tan altas ya que si asisten a clases.
Calificación del primer período y de segundo período las notas estan altas eso demuestra que los estudiantes si ponen enmpeño y dedicación.
Calificación final demuestra que si los estudiantes aprovaron o no, por lo general si aprovaron las mayoría.
library(ggplot2)
library(gridExtra)
cols_numerical <- c("age", "Medu", "Fedu", "traveltime", "studytime", "failures",
"famrel", "freetime", "goout", "Dalc", "Walc", "health",
"absences", "G1", "G2", "G3")
cols_por_pagina <- 4
grupos <- split(cols_numerical, ceiling(seq_along(cols_numerical) / cols_por_pagina))
for (grupo in grupos) {
plots <- list()
for (col in grupo) {
density_plot <- ggplot(data, aes(x = .data[[col]])) +
geom_density(fill = "skyblue", color = "red") +
labs(x = col, y = "Densidad") +
theme_minimal()
plots[[length(plots) + 1]] <- density_plot
}
grid.arrange(grobs = plots, ncol = 2)
}
Se presenta los gráfcios de densidad de todas la variables numéricas, ya que son una forma visual de representar la distribución de un conjunto de datos, nos permiten ver la forma, el centro y la dispersión de los datos de una manera más intuitiva que solo con los valores numéricos. Ya que nos indican las mismas interpretaciones de los histogramas.
library(ggplot2)
library(gridExtra)
cols_numerical <- c("age", "Medu", "Fedu", "traveltime", "studytime", "failures",
"famrel", "freetime", "goout", "Dalc", "Walc", "health",
"absences", "G1", "G2", "G3")
cols_por_pagina <- 4
grupos <- split(cols_numerical, ceiling(seq_along(cols_numerical) / cols_por_pagina))
for (grupo in grupos) {
plots <- list()
for (col in grupo) {
boxplot <- ggplot(data, aes(y = .data[[col]])) +
geom_boxplot(fill = "skyblue", color = "blue") +
labs(y = col) +
theme_minimal()
plots[[length(plots) + 1]] <- boxplot
}
grid.arrange(grobs = plots, ncol = 2)
}
Se presenta las gráficas de caja de todas las varibles numéricas.
Nos da la posición de la caja que indica la tendencia central de los datos, el tamaño de la caja lo cual refleja la dispersión o variabilidad de los datos (cuanto mayor, más dispersión), la simetría donde si la caja está centrada, los datos tienen una distribución simétrica y finalmente la presencia de outliers que son los puntos fuera de los bigotes señalan valores atípicos.
ggplot(data, aes(x = G1, y = G2)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
labs(x = "G1", y = "G2", title = "Diagrama de dispersión con línea de regresión G1 y G2") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Se observa la relación de las calificaciones de primer parcial y segundo parcial, estan parejas ya que no difiere mucho las calificaciones de los alumnos y van a una escala igual. Observando que los puntos o datos estan cerca de la línea de tendencia.
ggplot(data, aes(x = G2, y = G3)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "G2", y = "G3", title = "Diagrama de dispersión con línea de regresión G2 y G3") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Se observa la relación de las calificaciones de segundo parcial y el parcial final, las notas se definen de manera buena por que siguen la tendencia de línea.
ggplot(data, aes(x = G1, y = G3)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "green") +
labs(x = "G1", y = "G3", title = "Diagrama de dispersión con línea de regresión G1 y G3") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Se observa la relación de las calificaciones de primer parcial y parcial final, estan parejas ya que no difiere mucho su nota final ya que tienen notas bastante buena.
ggplot(data, aes(x = Dalc, y = Walc)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
labs(x = "Laboral", y = "Fin de semana", title = "Diagrama de dispersión del consumo de alcohol en jornada laboral y fin de semana") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Se observa que el consumo de alcohol en jornada laboral y fin de semana estan relacionadas entre si.
data$salud <- (0.5 * data$Dalc + 0.5 * data$Walc + 2 * data$health + data$famrel) / 4
Es la relación general del consumo de alcohol que se calcula para ver su salud general.
ggplot(data, aes(x = salud, y = G3)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "green") +
labs(x = "salud", y = "G3", title = "Salud vs Calificación G3") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
En general, un mejor valor de salud general corresponde a una nota final más baja.
Por el contrario, un valor de salud general más bajo generalmente corresponde a una calificación final más alta.
La pendiente de la línea de mejor ajuste está a una pequeña distancia de cero, por lo que la correlación entre Salud general y G3 es baja.
ggplot(data, aes(x = absences, y = G3)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "Ausencia", y = "G3", title = "Ausencia vs G3") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Parece no haber correlación entre Ausencias y G3 se necesita identificar la causa potencial de este fenómeno y debemos examinar más relaciones en Ausencias para determinar la causa.
p1 <- ggplot(data, aes(x = absences, y = G2)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
labs(x = "Ausencia", y = "G2", title = "Ausencia vs G2") +
theme_minimal()
p2 <- ggplot(data, aes(x = absences, y = G1)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "Ausencia", y = "G1", title = "Ausencia vs G1") +
theme_minimal()
library(gridExtra)
grid.arrange(p1, p2, ncol=2)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Esta baja correlación se debe a que los estudiantes ausentes (generalmente) repiten la materia perdida, lo que efectivamente explica su ausencia.
Para una explicación más detallada, necesitamos trazar la matriz de correlación para validar nuestra hipótesis.
correlation_matrix <- cor(data[c("absences", "G1", "G2", "G3")])
library(ggplot2)
ggplot(data = reshape2::melt(correlation_matrix), aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "green", high = "skyblue", mid = "white", midpoint = 0, limit = c(-1,1)) +
geom_text(aes(label = round(value, 2)), vjust = 1) +
labs(title = "Matriz de correlación de ausencias", x = "", y = "") +
theme_minimal()
La cantidad de ausencias que tiene un estudiante no necesariamente resulta en una calificación general más baja, ya que los estudiantes ausentes generalmente recuperan la materia que perdieron, lo que efectivamente explica su ausencia.
ggplot(data, aes(x = age)) +
geom_histogram(aes(y = ..density..), fill = "green", color = "black", bins = 30) +
geom_density(color = "blue") +
labs(x = "Edad", y = "Densidad", title = "Histograma de edad y grado") +
theme_minimal()
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Se muestra el gráfico de densidad y línea de la variable edad vs calificación(grado).
library(knitr)
age_grade <- aggregate(cbind(G1, G2, G3) ~ age, data = data, FUN = mean)
kable(age_grade)
| age | G1 | G2 | G3 |
|---|---|---|---|
| 15 | 11.23171 | 11.36585 | 11.256098 |
| 16 | 10.94231 | 11.18269 | 11.028846 |
| 17 | 10.89796 | 10.47959 | 10.275510 |
| 18 | 10.71951 | 10.13415 | 9.548780 |
| 19 | 10.25000 | 9.25000 | 8.208333 |
| 20 | 13.66667 | 13.66667 | 14.000000 |
| 21 | 10.00000 | 8.00000 | 7.000000 |
| 22 | 6.00000 | 8.00000 | 8.000000 |
Existe una relación inversa entre la edad y los graduados.
for (grade in c('G1', 'G2', 'G3')) {
barplot <- ggplot(age_grade, aes(x = age, y = .data[[grade]], fill = age)) +
geom_bar(stat = "identity") +
labs(x = "Edad", y = grade, title = paste("Edad vs.", grade)) +
theme_minimal()
print(barplot)
}
Cuanto mayor es una persona, más bajas son las calificaciones que recibe, sin embargo los jóvenes de veinte años exhiben un desempeño sobresaliente, lideran por al menos 2 puntos completos en una escala de 19 puntos.
Por el momento no podemos afirmar con fundamento por qué se produce un aumento tan drástico.
data$Tiempo_Productivo <- 0.5 * data$traveltime + 2 * data$studytime
library(ggplot2)
ggplot(data, aes(x = Tiempo_Productivo, y = G3)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
labs(x = "Tiempo de productividad", y = "G3", title = "Tiempo de productividad vs. G3") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Como se esperaba, los estudiantes con mayor productividad horaria obtienen mejores calificaciones.
library(ggplot2)
ggplot(data, aes(x = studytime, y = G3)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "Tiempo de estudio", y = "G3", title = "tiempo de estudio vs. G3") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Los estudiantes que estudian más obtienen mejores calificaciones en exámenes y cuestionarios.
library(ggplot2)
ggplot(data, aes(x = traveltime, y = G3)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "green") +
labs(x = "Tiempo de viaje", y = "G3", title = "Tiempo de viaje vs. G3") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Por el contrario, los estudiantes que viajan más obtienen peores resultados en exámenes y cuestionarios.
En general:
Los estudiantes que estudian más obtienen mejores calificaciones mientras que los estudiantes que viajan más o estudian menos obtienen calificaciones más bajas.
MotherJop_Edu <- aggregate(Medu ~ Mjob, data = data, FUN = mean)
MotherJop_Edu <- MotherJop_Edu[order(-MotherJop_Edu$Medu), ]
rownames(MotherJop_Edu) <- NULL
kable(MotherJop_Edu)
| Mjob | Medu |
|---|---|
| teacher | 3.948276 |
| health | 3.647059 |
| services | 2.844660 |
| other | 2.404255 |
| at_home | 1.711864 |
ggplot(MotherJop_Edu, aes(x = Mjob, y = Medu, fill = Mjob)) +
geom_bar(stat = "identity") +
labs(x = "trabajo", y = "Educación", title = "Trabajo vs. Educación (Madre)") +
theme_minimal()
Los profesores y profesionales deben tener un alto nivel educativo para poder conseguir un trabajo en la industria o empresas, lo cual no es lo mismo para las amas de casa.
FatherJop_Edu <- aggregate(Fedu ~ Fjob, data = data, FUN = mean)
FatherJop_Edu <- FatherJop_Edu[order(-FatherJop_Edu$Fedu), ]
rownames(FatherJop_Edu) <- NULL
kable(FatherJop_Edu)
| Fjob | Fedu |
|---|---|
| teacher | 3.862069 |
| health | 3.333333 |
| services | 2.558559 |
| at_home | 2.350000 |
| other | 2.271889 |
library(ggplot2)
ggplot(FatherJop_Edu, aes(x = Fjob, y = Fedu, fill = Fjob)) +
geom_bar(stat = "identity") +
labs(x = "Trabajo", y = "Educación", title = "Trabajo vs Educación (Padre)") +
theme_minimal()
La gráfica del padre arroja aproximadamente los mismos resultados que la gráfica de la madre. Sin embargo, hay un hallazgo interesante: los padres que se quedan en casa tienen un nivel educativo más alto que las madres que se quedan en casa.
1. Trabajo de las madres
MotherJop_Grade <- aggregate(G3 ~ Mjob, data = data, FUN = mean)
MotherJop_Grade <- MotherJop_Grade[order(-MotherJop_Grade$G3), ]
rownames(MotherJop_Grade) <- NULL
kable(MotherJop_Grade)
| Mjob | G3 |
|---|---|
| health | 12.147059 |
| teacher | 11.051724 |
| services | 11.019417 |
| other | 9.822695 |
| at_home | 9.152542 |
library(ggplot2)
ggplot(MotherJop_Grade, aes(x = Mjob, y = G3, fill = Mjob)) +
geom_bar(stat = "identity") +
labs(x = "Trabajo", y = "G3", title = "Trabajo vs (Madre)") +
theme_minimal()
Sorprendentemente, los estudiantes cuyas madres son profesionales reciben en promedio una calificación más alta. Se Esperaba que los estudiantes con madres que eran maestras obtuvieran la puntuación más altas.
2. El trabajo de los padres
library(knitr)
FatherJop_Grade <- aggregate(G3 ~ Fjob, data = data, FUN = mean)
FatherJop_Grade <- FatherJop_Grade[order(-FatherJop_Grade$G3), ]
kable(FatherJop_Grade)
| Fjob | G3 | |
|---|---|---|
| 5 | teacher | 11.96552 |
| 2 | health | 11.61111 |
| 4 | services | 10.29730 |
| 3 | other | 10.19355 |
| 1 | at_home | 10.15000 |
library(ggplot2)
ggplot(FatherJop_Grade, aes(x = Fjob, y = G3, fill = Fjob)) +
geom_bar(stat = "identity") +
labs(x = "trabajo", y = "calificación G3", title = "trabajo vs calificación (Padre)") +
theme_minimal()
Estos resultados son más razonables que el conjunto anterior. Se observa que el orden de estos resultados corresponde con el orden del nivel educativo del padre.
En otras palabras, los padres con niveles educativos más altos tienden a aumentar el desempeño de sus hijos más que los padres con niveles educativos más bajos. El padre transmite directamente sus conocimientos, cultivando así los conocimientos del alumno.
Conclusión
Esta exploración descubrió la relación ligeramente sorprendente entre el trabajo de la madre y la calificación del estudiante. Descubrimos que las madres que trabajan en la industria de la salud tienen hijos que reciben puntuaciones más altas en promedio que las madres que trabajan en otros campos.
En cambio, en el caso de los padres, observamos una relación que cabría esperar. Los padres con niveles educativos más altos transmitieron directamente ese conocimiento al estudiante, mejorando eventualmente los puntajes generales de las pruebas del estudiante.
Family_size_grade <- aggregate(cbind(G1, G2, G3) ~ famsize, data = data, FUN = mean)
kable(Family_size_grade)
| famsize | G1 | G2 | G3 |
|---|---|---|---|
| GT3 | 10.75801 | 10.51957 | 10.17794 |
| LE3 | 11.28070 | 11.19298 | 11.00000 |
library(ggplot2)
grades <- c("G1", "G2", "G3")
for (grade in grades) {
p <- ggplot(Family_size_grade, aes(x = famsize, y = .data[[grade]], fill = famsize)) +
geom_bar(stat = "identity") +
labs(x = "Tamaño de la familia", y = grade, title = paste("Tamaño de la familia vs.", grade)) +
theme_minimal() +
theme(legend.position = "none")
print(p)
}
Como muestran los gráficos de barras, los estudiantes que no tienen hermanos tienden a obtener puntuaciones ligeramente superiores (de hecho, muy ligeramente) que los estudiantes con hermanos.
Esta sección explora la relación entre la cantidad de interacción social que experimenta una persona y cómo dicha persona obtiene calificaciones en un examen.
act_gr <- aggregate(cbind(G1, G2, G3) ~ activities, data = data, FUN = mean)
colnames(act_gr) <- c("activities", "G1", "G2", "G3")
kable(act_gr)
| activities | G1 | G2 | G3 |
|---|---|---|---|
| no | 10.71649 | 10.52062 | 10.34021 |
| yes | 11.09453 | 10.90050 | 10.48756 |
library(ggplot2)
grades <- c("G1", "G2", "G3")
for (grade in grades) {
p <- ggplot(act_gr, aes(x = activities, y = .data[[grade]], fill = activities)) +
geom_bar(stat = "identity") +
labs(x = "Actividad", y = grade, title = paste("Actividad vs calificación", grade)) +
theme_minimal() +
theme(legend.position = "none")
print(p)
}
Las personas con actividades reciben en promedio calificaciones marginalmente más altas.
out_gr <- aggregate(cbind(G1, G2, G3) ~ goout, data = data, FUN = mean)
colnames(out_gr) <- c("goout", "G1", "G2", "G3")
kable(out_gr)
| goout | G1 | G2 | G3 |
|---|---|---|---|
| 1 | 11.130435 | 10.782609 | 9.869565 |
| 2 | 11.368932 | 11.456311 | 11.194175 |
| 3 | 11.276923 | 11.053846 | 10.961538 |
| 4 | 10.430233 | 10.058139 | 9.651163 |
| 5 | 9.792453 | 9.471698 | 9.037736 |
library(ggplot2)
grades <- c("G1", "G2", "G3")
for (grade in grades) {
p <- ggplot(out_gr, aes(x = as.factor(goout), y = .data[[grade]], fill = as.factor(goout))) +
geom_bar(stat = "identity") +
labs(x = "salir", y = grade, title = paste("salir vs.", grade)) +
theme_minimal() +
theme(legend.position = "none")
print(p)
}
En general, salir más a la calle resulta en una fuerte disminución en los puntajes de las pruebas.
CONCLUSIÓN
Esta sección retrató una relación sorprendente entre la frecuencia con la que un estudiante participa en actividades sociales. Los estudiantes con actividad social, en general, obtuvieron mejores calificaciones que los estudiantes sin socialización.
Por el contrario, los estudiantes que salían con más frecuencia tendían a obtener puntuaciones relativamente baja; la calificación perfecta fue 2, ya que resultó en la puntuación promedio más alta para todas las métricas de calificación.
# Calcular el promedio
data$Grado <- (data$G1 + data$G2 + data$G3) / 3
par(mfrow = c(4, 1), mar = c(4, 4, 2, 1))
hist(data$G1, main = "Histograma de G1", xlab = "G1", col = "lightblue", border = "black")
hist(data$G2, main = "Histograma de G2", xlab = "G2", col = "green", border = "black")
hist(data$G3, main = "Histograma de G3", xlab = "G3", col = "blue", border = "black")
hist(data$Grado, main = "Histograma de Grado", xlab = "Grado", col = "red", border = "black")
Se observa las calificaciones de los 3 parciales y la nota de grado se puede decir que los estudiantes obtuvieron unas calificaciones similares durante los 3 parciales y tambien lo refleja la nota de grado que es identico.
# Prueba de normalidad para la variable G1
shapiro.test(data$G1)
##
## Shapiro-Wilk normality test
##
## data: data$G1
## W = 0.97491, p-value = 2.454e-06
# Prueba de normalidad para la variable G2
shapiro.test(data$G2)
##
## Shapiro-Wilk normality test
##
## data: data$G2
## W = 0.96914, p-value = 2.084e-07
# Prueba de normalidad para la variable G3
shapiro.test(data$G3)
##
## Shapiro-Wilk normality test
##
## data: data$G3
## W = 0.92873, p-value = 8.836e-13
Interpretación
Las pruebas de normalidad de Shapiro-Wilk para las variables G1, G2 y G3 son:
Para la variable G1, el valor de W es 0.97491 y el p-valor es aproximadamente 2.454e-06. Dado que el p-valor es menor que el nivel de significancia de 0.05, rechazamos la hipótesis nula de normalidad. Esto sugiere que los datos de la variable G1 no siguen una distribución normal.
Para la variable G2, el valor de W es 0.96914 y el p-valor es aproximadamente 2.084e-07. Al igual que en el caso anterior, el p-valor es menor que 0.05, lo que indica que los datos de la variable G2 no se distribuyen normalmente.
Para la variable G3, el valor de W es 0.92873 y el p-valor es aproximadamente 8.836e-13. Una vez más, el p-valor es significativamente menor que 0.05, lo que sugiere que los datos de la variable G3 no siguen una distribución normal.
Según las pruebas de normalidad de Shapiro-Wilk, ninguno de los conjuntos de datos de las variables G1, G2 y G3 se distribuyen normalmente.
Gráficas
Al realizar pruebas de normalidad de Shapiro-Wilk se visualizara la distribución de las variables G1, G2 y G3 mediante histogramas y gráficos Q-Q. Si los p-values de la prueba de Shapiro-Wilk son mayores que el nivel de significancia (usualmente 0.05), se asume que los datos se distribuyen normalmente.
# Histograma y gráfico Q-Q para la variable G1
par(mfrow = c(1, 2))
hist(data$G1)
qqnorm(data$G1); qqline(data$G1, col = 2)
# Histograma y gráfico Q-Q para la variable G2
par(mfrow = c(1, 2))
hist(data$G2)
qqnorm(data$G2); qqline(data$G2, col = 2)
# Histograma y gráfico Q-Q para la variable G3
par(mfrow = c(1, 2))
hist(data$G3)
qqnorm(data$G3); qqline(data$G3, col = 2)
Preprocesamiento de datos
Asignar valores numéricos a datos categóricos
Manejo de valores faltantes
Normalizar las características para que las características en pequeñas escalas no dominen al ajustar un modelo a los datos.
Encuentrar las características más predictivas de los datos y fíltrarlas para mejorar el poder predictivo del modelo analítico.
DATOS NUMÉRICOS
dataa <- data[, 1:33] # SELECCIÓN DE DATOS
dataa$school <- factor(dataa$school)
levels(dataa$school) <- c("GP", "MS")
class(dataa$school)
## [1] "factor"
dataa$sex <- factor(dataa$sex)
levels(dataa$sex) <- c("F", "M")
class(dataa$sex)
## [1] "factor"
dataa$address <- factor(dataa$address)
levels(dataa$address) <- c("U", "R")
class(dataa$address)
## [1] "factor"
dataa$famsize <- factor(dataa$famsize)
levels(dataa$famsize) <- c("GT3", "LT3")
class(dataa$famsize)
## [1] "factor"
data$Pstatus <- factor(data$Pstatus)
levels(data$Pstatus) <- c("A", "T")
class(data$Pstatus)
## [1] "factor"
data$Mjob <- factor(dataa$Mjob)
levels(dataa$Mjob) <- c("at_home", "health", "other", "services", "teacher")
class(dataa$Mjob)
## [1] "character"
dataa$Fjob <- factor(dataa$Fjob)
levels(data$Fjob) <- c("teacher ", "other", "services", "health", "at_home")
class(dataa$Fjob)
## [1] "factor"
dataa$reason <- factor(dataa$reason)
levels(dataa$reason) <- c("course", "other", "home", "reputation")
class(dataa$reason)
## [1] "factor"
dataa$guardian <- factor(data$guardian )
levels(data$guardian ) <- c("mother", "father", "other")
class(data$guardian )
## [1] "character"
dataa$schoolsup <- factor(dataa$schoolsup)
levels(dataa$schoolsup) <- c("no", "yes")
class(dataa$schoolsup)
## [1] "factor"
dataa$famsup <- factor(dataa$famsup )
levels(dataa$famsup ) <- c("no", "yes")
class(dataa$famsup )
## [1] "factor"
dataa$paid <- factor(dataa$paid )
levels(dataa$paid ) <- c("no", "yes")
class(dataa$paid )
## [1] "factor"
dataa$activities <- factor(dataa$activities )
levels(dataa$activities ) <- c("no", "yes")
class(dataa$activities )
## [1] "factor"
dataa$nursery <- factor(dataa$nursery )
levels(dataa$nursery ) <- c("no", "yes")
class(dataa$nursery )
## [1] "factor"
dataa$higher <- factor(dataa$higher)
levels(dataa$higher) <- c("no", "yes")
class(dataa$higher)
## [1] "factor"
dataa$internet <- factor(dataa$internet)
levels(dataa$internet) <- c("no", "yes")
class(dataa$internet )
## [1] "factor"
dataa$romantic <- factor(dataa$romantic )
levels(dataa$romantic ) <- c("no", "yes")
class(dataa$romantic )
## [1] "factor"
TIPO DE DATOS
classes <- sapply(dataa, class)
for (i in 1:ncol(dataa))
if(classes[i]== "integer")
cancer[[i]] =as.numeric(data[[i]])
classes = sapply(dataa, class)
classes
## school sex age address famsize Pstatus
## "factor" "factor" "numeric" "factor" "factor" "character"
## Medu Fedu Mjob Fjob reason guardian
## "numeric" "numeric" "character" "factor" "factor" "factor"
## traveltime studytime failures schoolsup famsup paid
## "numeric" "numeric" "numeric" "factor" "factor" "factor"
## activities nursery higher internet romantic famrel
## "factor" "factor" "factor" "factor" "factor" "numeric"
## freetime goout Dalc Walc health absences
## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
## G1 G2 G3
## "numeric" "numeric" "numeric"
En este caso hay variables númericas y dos categoricas po lo cual se procede a realizar o tranformar a variables ficticias, por lo cual se da paso para realizar, predicciones y por ende se divide la base.
VARIABLES INFLUYENTES A BINARIAS
# Escalamiento de númericas
numerico <- sapply(dataa, is.numeric)
dataa[, numerico] <- scale(dataa[, numerico])
Mi variable predictor sera HIGHER (Deseo de Cursar Estudios Superiores, y las demás variables seran independientes ya qeu todas las variables son de suma importancia para la predicción ya que la variable predictora nos describe si el estudiante tiene el deseo de cursar estudios superiores.
x=model.matrix(dataa$higher~., data=dataa)
head(x)
## (Intercept) schoolMS sexM age addressR famsizeLT3 PstatusT Medu
## 1 1 0 0 1.0217506 1 0 0 1.1424068
## 2 1 0 0 0.2380778 1 0 1 -1.5979820
## 3 1 0 0 -1.3292678 1 1 1 -1.5979820
## 4 1 0 0 -1.3292678 1 0 1 1.1424068
## 5 1 0 0 -0.5455950 1 0 1 0.2289439
## 6 1 0 1 -0.5455950 1 1 1 1.1424068
## Fedu Mjobhealth Mjobother Mjobservices Mjobteacher Fjobhealth Fjobother
## 1 1.3586476 0 0 0 0 0 0
## 2 -1.3981972 0 0 0 0 0 1
## 3 -1.3981972 0 0 0 0 0 1
## 4 -0.4792490 1 0 0 0 0 0
## 5 0.4396993 0 1 0 0 0 1
## 6 0.4396993 0 0 1 0 0 1
## Fjobservices Fjobteacher reasonother reasonhome reasonreputation
## 1 0 1 0 0 0
## 2 0 0 0 0 0
## 3 0 0 0 1 0
## 4 1 0 1 0 0
## 5 0 0 1 0 0
## 6 0 0 0 0 1
## guardianmother guardianother traveltime studytime failures schoolsupyes
## 1 1 0 0.7912473 -0.04223229 -0.4493737 1
## 2 0 0 -0.6424347 -0.04223229 -0.4493737 0
## 3 1 0 -0.6424347 -0.04223229 3.5847768 1
## 4 1 0 -0.6424347 1.14932149 -0.4493737 0
## 5 0 0 -0.6424347 -0.04223229 -0.4493737 0
## 6 1 0 -0.6424347 -0.04223229 -0.4493737 0
## famsupyes paidyes activitiesyes nurseryyes internetyes romanticyes
## 1 0 0 0 1 0 0
## 2 1 0 0 0 1 0
## 3 0 1 0 1 1 0
## 4 1 1 1 1 1 1
## 5 1 1 0 1 0 0
## 6 1 1 1 1 1 0
## famrel freetime goout Dalc Walc health
## 1 0.06211528 -0.2357113 0.80046413 -0.5400138 -1.0025178 -0.3987837
## 2 1.17736694 -0.2357113 -0.09778397 -0.5400138 -1.0025178 -0.3987837
## 3 0.06211528 -0.2357113 -0.99603207 0.5826465 0.5504019 -0.3987837
## 4 -1.05313638 -1.2368505 -0.99603207 -0.5400138 -1.0025178 1.0397512
## 5 0.06211528 -0.2357113 -0.99603207 -0.5400138 -0.2260579 1.0397512
## 6 1.17736694 0.7654280 -0.99603207 -0.5400138 -0.2260579 1.0397512
## absences G1 G2 G3
## 1 0.03637833 -1.780209 -1.2532017 -0.96371171
## 2 -0.21352497 -1.780209 -1.5190528 -0.96371171
## 3 0.53618492 -1.177653 -0.7214996 -0.09062427
## 4 -0.46342827 1.232570 0.8736068 1.00073503
## 5 -0.21352497 -1.478931 -0.1897975 -0.09062427
## 6 0.53618492 1.232570 1.1394578 1.00073503
Por lo tanto, la separación estándar de 3/4 para entrenamiento y 1/4 para pruebas equivale al 75% para entrenamiento y al 25% para pruebas.
tr <- round(nrow(dataa) * 0.75) # 75% para entrenamiento
set.seed(123)
muestra <- sample.int(nrow(dataa), tr)
Train <- dataa[muestra,]
val <- dataa[-muestra,]
Regresión Logística
mod1 <- glm(higher~., data=dataa, family=binomial)# Modelo 2
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(mod1)
##
## Call:
## glm(formula = higher ~ ., family = binomial, data = dataa)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 9.32686 5.43711 1.715 0.08627 .
## schoolMS 6.44943 2.84756 2.265 0.02352 *
## sexM -6.12919 2.48026 -2.471 0.01347 *
## age -2.54990 0.95114 -2.681 0.00734 **
## addressR -0.29735 1.32971 -0.224 0.82305
## famsizeLT3 1.35714 1.51487 0.896 0.37032
## PstatusT -0.95888 2.77238 -0.346 0.72944
## Medu 1.98270 1.06449 1.863 0.06252 .
## Fedu 1.31033 0.85462 1.533 0.12522
## Mjobhealth 20.86436 1944.93513 0.011 0.99144
## Mjobother 4.08094 1.75593 2.324 0.02012 *
## Mjobservices 4.95731 2.26075 2.193 0.02832 *
## Mjobteacher 2.28348 2.83344 0.806 0.42030
## Fjobhealth 7.85496 2958.66310 0.003 0.99788
## Fjobother -3.28627 4.29602 -0.765 0.44430
## Fjobservices -3.48456 4.28205 -0.814 0.41578
## Fjobteacher -6.69608 5.00532 -1.338 0.18096
## reasonother 3.51101 2.21287 1.587 0.11260
## reasonhome -3.42084 1.91836 -1.783 0.07455 .
## reasonreputation 1.80901 1.82682 0.990 0.32205
## guardianmother 1.67633 1.42347 1.178 0.23894
## guardianother 9.99368 4.00863 2.493 0.01267 *
## traveltime -0.66574 0.41920 -1.588 0.11226
## studytime 0.67176 0.72645 0.925 0.35511
## failures -0.86225 0.55240 -1.561 0.11855
## schoolsupyes 1.25063 2.10652 0.594 0.55271
## famsupyes 1.01847 1.43018 0.712 0.47639
## paidyes 3.93574 2.08813 1.885 0.05946 .
## activitiesyes 2.33847 1.32184 1.769 0.07688 .
## nurseryyes -0.07745 1.25997 -0.061 0.95099
## internetyes -0.53601 1.38395 -0.387 0.69853
## romanticyes -2.76464 1.45267 -1.903 0.05702 .
## famrel 1.32010 0.77138 1.711 0.08702 .
## freetime -1.45639 0.75887 -1.919 0.05497 .
## goout -0.83721 0.73952 -1.132 0.25760
## Dalc -0.26055 0.64627 -0.403 0.68683
## Walc 1.82516 1.03632 1.761 0.07821 .
## health 1.00698 0.69484 1.449 0.14728
## absences -1.62123 0.61519 -2.635 0.00841 **
## G1 1.04323 1.00095 1.042 0.29730
## G2 -0.28040 1.33809 -0.210 0.83401
## G3 0.13996 1.15634 0.121 0.90366
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 158.296 on 394 degrees of freedom
## Residual deviance: 51.642 on 353 degrees of freedom
## AIC: 135.64
##
## Number of Fisher Scoring iterations: 19
El análisis de regresión logística nos ayuda a buscar, modelar la probabilidad de que los estudiantes elijan educación superior (higher):
El intercepto, 9.32686, indica la estimación del logaritmo de odds de que un estudiante elija educación superior.
Las variables categóricas binarias, por ejemplo, schoolMS (escuela), sexM (género), addressR (dirección), famsizeLT3 (tamaño de la familia), PstatusT (estado de convivencia de los padres), entre otras.
La significancia de estas variables se evalúa con el valor p, como schoolMS tiene un valor p de 0.02352, lo que sugiere que la escuela tiene un efecto significativo en la elección de educación superior.
Las variables numéricas: Tales como age (edad), Medu (nivel educativo de la madre), Fedu (nivel educativo del padre), entre otras.
La edad, por ejemplo, tiene un coeficiente negativo, lo que sugiere que a medida que la edad aumenta, la probabilidad de elegir educación superior disminuye.
Variables de comportamiento y académicas: Como absences (ausencias), G1, G2, G3 (notas en diferentes momentos del año escolar). Por ejemplo, el coeficiente de absences es negativo, lo que indica que a medida que aumentan las ausencias, la probabilidad de elegir educación superior disminuye.
La devianza nula y la devianza residual se utilizan para evaluar el ajuste del modelo, en este caso, la devianza residual es significativamente menor que la devianza nula, lo que sugiere que el modelo proporciona un mejor ajuste que un modelo sin variables predictoras.
mod0 <- glm(higher~1, data = dataa, family = binomial)# Modelo 1
anova(mod0, mod1, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: higher ~ 1
## Model 2: higher ~ school + sex + age + address + famsize + Pstatus + Medu +
## Fedu + Mjob + Fjob + reason + guardian + traveltime + studytime +
## failures + schoolsup + famsup + paid + activities + nursery +
## internet + romantic + famrel + freetime + goout + Dalc +
## Walc + health + absences + G1 + G2 + G3
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 394 158.296
## 2 353 51.642 41 106.65 9.416e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se va comparar dos modelos: uno más simple (Modelo 1) que incluye solo el intercepto y otro más complejo (Modelo 2) que incluye todas las variables predictoras.
Modelo 1: Tiene solo el intercepto. La devianza residual es 158.296.
Modelo 2: Incluye todas las variables predictoras mencionadas anteriormente. La devianza residual es 51.642.
Esto significa que este modelo tiene una devianza residual considerablemente menor que el Modelo 1.
La prueba de Chi-cuadrado se utiliza para determinar si la mejora en el ajuste del Modelo 2 con respecto al Modelo 1 es significativa. El valor p asociado con esta prueba es extremadamente pequeño (9.416e-08), lo que indica que la diferencia entre los dos modelos es estadísticamente significativa. Esto sugiere que el Modelo 2 proporciona un mejor ajuste a los datos que el Modelo 1, lo que significa que las variables predictoras incluidas en el Modelo 2 son importantes para predecir la variable de respuesta (elección de educación superior en este caso).
anova(mod1, test = "Chisq")
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: higher
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 394 158.296
## school 1 0.2145 393 158.081 0.643270
## sex 1 9.5442 392 148.537 0.002006 **
## age 1 16.5101 391 132.027 4.839e-05 ***
## address 1 0.2702 390 131.757 0.603228
## famsize 1 0.0001 389 131.757 0.993470
## Pstatus 1 1.2407 388 130.516 0.265332
## Medu 1 9.8883 387 120.628 0.001663 **
## Fedu 1 2.0777 386 118.550 0.149468
## Mjob 4 6.5226 382 112.028 0.163375
## Fjob 4 6.4554 378 105.572 0.167624
## reason 3 3.3029 375 102.269 0.347245
## guardian 2 4.2603 373 98.009 0.118822
## traveltime 1 0.4606 372 97.549 0.497342
## studytime 1 6.3727 371 91.176 0.011589 *
## failures 1 5.3687 370 85.807 0.020501 *
## schoolsup 1 1.1136 369 84.694 0.291291
## famsup 1 0.0035 368 84.690 0.952592
## paid 1 7.2299 367 77.460 0.007170 **
## activities 1 3.1212 366 74.339 0.077278 .
## nursery 1 0.0932 365 74.246 0.760210
## internet 1 1.4363 364 72.809 0.230737
## romantic 1 5.1519 363 67.658 0.023221 *
## famrel 1 1.3050 362 66.353 0.253303
## freetime 1 0.1205 361 66.232 0.728521
## goout 1 0.4967 360 65.735 0.480937
## Dalc 1 0.1646 359 65.571 0.684918
## Walc 1 1.6065 358 63.964 0.204986
## health 1 0.3640 357 63.600 0.546288
## absences 1 8.9320 356 54.668 0.002802 **
## G1 1 2.9812 355 51.687 0.084237 .
## G2 1 0.0306 354 51.656 0.861085
## G3 1 0.0146 353 51.642 0.903859
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La devianza mide el ajuste del modelo. En cada fila, representa la cantidad de desviación no explicada después de agregar la variable correspondiente al modelo. Cuanto menor sea la devianza, mejor será el ajuste del modelo.
Pr(>Chi): Valores pequeños indican que la variable es significativa para predecir la variable de respuesta (en este caso, la elección de educación superior).
Signif. codes: Indican el nivel de significancia. “” significa altamente significativo (p < 0.001), “” significa significativo (p < 0.01), “” significa significativo (p < 0.05), “.” significa significativo (p < 0.1), y no hay código significa no significativo (p ≥ 0.1).
Por ejemplo, la variable “sex” tiene un valor de Pr(>Chi) muy pequeño (0.002006), lo que indica que es altamente significativa para predecir la elección de educación superior. Por otro lado, la variable “nursery” tiene un valor de Pr(>Chi) grande (0.760210), lo que sugiere que no es significativa para predecir la elección de educación superior.
mod2 <- glm(higher~., data =Train, family = binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
cbind(mod1$coefficients, mod2$coefficients)
## [,1] [,2]
## (Intercept) 9.32686307 68.1764486
## schoolMS 6.44942528 59.8542049
## sexM -6.12919320 -58.0627031
## age -2.54990376 -29.0456366
## addressR -0.29735428 3.9809874
## famsizeLT3 1.35713964 -22.6046214
## PstatusT -0.95887680 -56.5730077
## Medu 1.98269674 -1.7491098
## Fedu 1.31033320 0.5037608
## Mjobhealth 20.86435786 41.1593550
## Mjobother 4.08093860 75.6677588
## Mjobservices 4.95731108 39.2847457
## Mjobteacher 2.28348208 76.3126935
## Fjobhealth 7.85496157 5.5190768
## Fjobother -3.28626844 -10.3516965
## Fjobservices -3.48455700 -22.0467706
## Fjobteacher -6.69607510 -44.4780934
## reasonother 3.51100720 7.0734979
## reasonhome -3.42084435 -26.5740827
## reasonreputation 1.80901023 20.4050928
## guardianmother 1.67632762 15.3327944
## guardianother 9.99368436 76.6288544
## traveltime -0.66574004 -5.3174626
## studytime 0.67176085 -6.1360028
## failures -0.86224736 -12.0118413
## schoolsupyes 1.25063355 7.7441809
## famsupyes 1.01846584 26.8666373
## paidyes 3.93573718 26.4315687
## activitiesyes 2.33846783 30.1888821
## nurseryyes -0.07744551 19.3871977
## internetyes -0.53600582 -3.1277373
## romanticyes -2.76463991 -0.1307771
## famrel 1.32009605 2.8543522
## freetime -1.45638867 -21.0829688
## goout -0.83720581 2.1721149
## Dalc -0.26055102 14.4033019
## Walc 1.82516018 -2.8763535
## health 1.00697510 11.4467362
## absences -1.62122965 -21.4136597
## G1 1.04322671 22.0947748
## G2 -0.28040407 -21.0114176
## G3 0.13996089 7.3378258
La estimación indica la relación entre cada variable predictora y la probabilidad de que un estudiante elija educación superior. Por ejemplo, para “schoolMS”, un valor positivo indica que pertenecer a la escuela “MS” aumenta la probabilidad de elegir educación superior en comparación con la escuela de MS. Por otro lado, para “sexM”, un valor negativo indica que ser de género masculino disminuye la probabilidad de elegir educación superior en comparación con el género femenino.
El error estándar mide la precisión de la estimación del coeficiente. Cuanto menor sea el error estándar, más precisa será la estimación del coeficiente. Por ejemplo, los coeficientes con errores estándar grandes pueden indicar que la estimación del coeficiente no es muy confiable debido a la variabilidad en los datos. Estos coeficientes se utilizan en el cálculo de las probabilidades logarítmicas de que un estudiante elija educación superior dadas las variables predictoras. Los coeficientes más grandes (en valor absoluto) indican una mayor influencia en la variable de respuesta.
library(lattice)
library(caret)
p <- predict(mod2, val, type = "response")
Predmod = as.factor(p>0.5)
levels(Predmod)=c("no", "yes")
matrizLogis <- confusionMatrix(val$higher, Predmod)
matrizLogis
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 1 6
## yes 3 89
##
## Accuracy : 0.9091
## 95% CI : (0.8344, 0.9576)
## No Information Rate : 0.9596
## P-Value [Acc > NIR] : 0.9932
##
## Kappa : 0.1375
##
## Mcnemar's Test P-Value : 0.5050
##
## Sensitivity : 0.25000
## Specificity : 0.93684
## Pos Pred Value : 0.14286
## Neg Pred Value : 0.96739
## Prevalence : 0.04040
## Detection Rate : 0.01010
## Detection Prevalence : 0.07071
## Balanced Accuracy : 0.59342
##
## 'Positive' Class : no
##
La precisión general del modelo es del 90.91%, lo que indica que clasifica correctamente el 90.91% de los casos. Sin embargo, el valor de Kappa, que ajusta la precisión para tener en cuenta el azar, es bastante bajo (0.1375), lo que sugiere que el modelo podría estar mejorando solo marginalmente el rendimiento en comparación con una clasificación aleatoria.
La sensibilidad, que es la capacidad del modelo para identificar verdaderos positivos, es del 25%. Esto sugiere que el modelo no es muy bueno para identificar correctamente los casos positivos. Por otro lado, la especificidad, que es la capacidad del modelo para identificar verdaderos negativos, es alta (93.68%), lo que sugiere que el modelo es bastante bueno para evitar falsos positivos.
El valor predictivo positivo es del 14.28%, lo que significa que cuando el modelo predice que un estudiante no tendrá éxito, solo el 14.28% de las veces tiene razón. El valor predictivo negativo es alto (96.73%), lo que sugiere que cuando el modelo predice que un estudiante tendrá éxito, suele ser correcto en el 96.73% de los casos.
La prevalencia de casos negativos (estudiantes que no tienen éxito) es del 4.04%, mientras que la prevalencia de casos positivos (estudiantes que tienen éxito) es del 95.96%. La tasa de detección, que es la proporción de casos que el modelo detecta correctamente, es del 1.01% para casos negativos y del 10.10% para casos positivos.
En resumen el modelo es bueno para predecir.
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
test_prob <- predict(mod2, newdata = val, type = "response")
test_roc <- roc(val$higher ~ test_prob, plot = TRUE, print.auc = TRUE)
## Setting levels: control = no, case = yes
## Setting direction: controls < cases
La sensibilidad como el comportamiento de los valores positivos y el AUC es de 0.61 que significa que es moderada y el modelo de predición logística de predicción es bueno.
Los resultados del modelo indican la probabilidad de éxito académico en función de las variables consideradas en el análisis. Predice una baja probabilidad de éxito académico para un estudiante en particular, eso no significa que no puedan o no deban estudiar educación superior. Simplemente indica que, según las variables consideradas en el análisis, hay factores que podrían afectar negativamente su rendimiento académico.
Es fundamental considerar estos resultados como una herramienta adicional al tomar decisiones sobre la educación superior.
Los estudiantes deben evaluar sus propias habilidades, intereses, motivación y circunstancias personales, y para mejorar sus posibilidades de éxito, como buscar apoyo adicional, establecer metas claras y trabajar en el desarrollo de habilidades académicas y personales.