ZEGEL IPAE
DESARROLLO DE SISTEMAS DE INFORMACION
Estadística Aplicada a la Computación
Informe Final
Autor: Benjamin Joseph Huaman Eusebio
2024
Los datos fueron obtenidos en una encuesta realizada a estudiantes de cursos de matemáticas y lengua portuguesa en la escuela secundaria. Contiene mucha información social, de género y de estudio interesante sobre los estudiantes.
El análisis propuesto comprende un caso específico relacionado con la educación en estas dos escuelas Gabriel Pereira y Mousinho de Silveira.
En este analisis se busca utilizar todo lo aprendido en este periodo academico y eso incluye:
La creación de tablas de frecuencia y la representación gráfica de datos. Se calcularán medidas estadísticas de tendencia y posición, y se abordará la presencia de datos faltantes y valores atípicos.
Se llevarán a cabo transformaciones y normalizaciones de variables para mejorar la calidad del análisis. Finalmente, se aplicarán modelos predictivos, incluyendo la regresión lineal y la regresión logística, con el objetivo de comprender relaciones entre las variables analizadas.
Zegel - Instituto de Negocios y Tecnología
Curso de Estadística Aplicada a la Computación
Evaluación de la Relación entre el Apoyo Educativo y Familiar con las Calificaciones Finales de Estudiantes
En este estudio, se busca comprender la relación entre el rendimiento académico de los estudiantes en los cursos de matemáticas y portugués y algunas variables específicas de la base de datos: el apoyo educativo adicional (schoolsup), el apoyo familiar (famsup), la participación en clases extra pagadas (paid), número de fracasos (failures) y el tiempo de estudio semanal (studytime).
Datos obtenidos de: https://www.kaggle.com/datasets/gevvahraf/alc-consumption-and-higher-education
Evaluar cómo el apoyo educativo adicional (schoolsup), el apoyo familiar (famsup), las clases extra pagadas (paid), número de fracasos (failures) y el tiempo de estudio semanal (studytime) se correlacionan con las calificaciones finales.
También se aplicará todo lo visto en el curso (según anexo).
Los estudiantes de secundaria de las escuelas Gabriel Pereira y Mousinho da Silveira.
Los estudiantes que participaron en la encuesta, de los cursos de matemáticas y portugués, y que se encuentran en la educación secundaria de las escuelas Gabriel Pereira y Mousinho da Silveira.
Un estudiante que participa en el curso de matemáticas y/o portugués en la secundaria.
Estas calificaciones están relacionadas con la materia del curso, Matemáticas o Portugués:
# Unimos los datos que usaremos de Los estudiantes.
# Estudiantes del curso de Lenguaje portugues
d1=read.csv("student-por.csv")
# Estudiantes del curso de Matematicas
d2=read.csv("student-mat.csv")
#Cantidad de filas en el primer conjunto de datos
nrow(d1)
## [1] 649
#Cantidad de filas en el segundo conjunto de datos
nrow(d2)
## [1] 395
#Nombres de todos los datos
names(d1)
## [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"
d3<-rbind(d1,d2)
#Mostramos los primeros datos
head(d3)
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason
## 1 GP F 18 U GT3 A 4 4 at_home teacher course
## 2 GP F 17 U GT3 T 1 1 at_home other course
## 3 GP F 15 U LE3 T 1 1 at_home other other
## 4 GP F 15 U GT3 T 4 2 health services home
## 5 GP F 16 U GT3 T 3 3 other other home
## 6 GP M 16 U LE3 T 4 3 services other reputation
## guardian traveltime studytime failures schoolsup famsup paid activities
## 1 mother 2 2 0 yes no no no
## 2 father 1 2 0 no yes no no
## 3 mother 1 2 0 yes no no no
## 4 mother 1 3 0 no yes no yes
## 5 father 1 2 0 no yes no no
## 6 mother 1 2 0 no yes no yes
## nursery higher internet romantic famrel freetime goout Dalc Walc health
## 1 yes yes no no 4 3 4 1 1 3
## 2 no yes yes no 5 3 3 1 1 3
## 3 yes yes yes no 4 3 2 2 3 3
## 4 yes yes yes yes 3 2 2 1 1 5
## 5 yes yes no no 4 3 2 1 2 5
## 6 yes yes yes no 5 4 2 1 2 5
## absences G1 G2 G3
## 1 4 0 11 11
## 2 2 9 11 11
## 3 6 12 13 12
## 4 0 14 14 14
## 5 0 11 13 13
## 6 6 12 12 13
#Verificamos la dimensión de lo datos
dim(d3)
## [1] 1044 33
#Verificamos la estructura de los datos
str(d3)
## 'data.frame': 1044 obs. of 33 variables:
## $ school : chr "GP" "GP" "GP" "GP" ...
## $ sex : chr "F" "F" "F" "F" ...
## $ age : int 18 17 15 15 16 16 16 17 15 15 ...
## $ address : chr "U" "U" "U" "U" ...
## $ famsize : chr "GT3" "GT3" "LE3" "GT3" ...
## $ Pstatus : chr "A" "T" "T" "T" ...
## $ Medu : int 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : int 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : chr "at_home" "at_home" "at_home" "health" ...
## $ Fjob : chr "teacher" "other" "other" "services" ...
## $ reason : chr "course" "course" "other" "home" ...
## $ guardian : chr "mother" "father" "mother" "mother" ...
## $ traveltime: int 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : int 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : int 0 0 0 0 0 0 0 0 0 0 ...
## $ schoolsup : chr "yes" "no" "yes" "no" ...
## $ famsup : chr "no" "yes" "no" "yes" ...
## $ paid : chr "no" "no" "no" "no" ...
## $ activities: chr "no" "no" "no" "yes" ...
## $ nursery : chr "yes" "no" "yes" "yes" ...
## $ higher : chr "yes" "yes" "yes" "yes" ...
## $ internet : chr "no" "yes" "yes" "yes" ...
## $ romantic : chr "no" "no" "no" "yes" ...
## $ famrel : int 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : int 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : int 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : int 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : int 1 1 3 1 2 2 1 1 1 1 ...
## $ health : int 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : int 4 2 6 0 0 6 0 2 0 0 ...
## $ G1 : int 0 9 12 14 11 12 13 10 15 12 ...
## $ G2 : int 11 11 13 14 13 12 12 13 16 12 ...
## $ G3 : int 11 11 12 14 13 13 13 13 17 13 ...
#Obtener las frecuencias absolutas (simples) (fi) de manera basica
fi <- table(d3$school)
fi
##
## GP MS
## 772 272
#Obtener las frecuencias Relativas (simples) (hi) de manera basica
#opcion 1
fi/(dim(d3)[1])
##
## GP MS
## 0.7394636 0.2605364
#opcion 2
hi = prop.table(fi)
hi
##
## GP MS
## 0.7394636 0.2605364
#Obtener las frecuencias Porcentuales
pi = hi*100
pi
##
## GP MS
## 73.94636 26.05364
#uniendo filas (rbind) o columnas (cbind) - si se agrega detro de un t() se invirte
rbind(fi, hi, pi)
## GP MS
## fi 772.0000000 272.0000000
## hi 0.7394636 0.2605364
## pi 73.9463602 26.0536398
cbind(fi, hi, pi)
## fi hi pi
## GP 772 0.7394636 73.94636
## MS 272 0.2605364 26.05364
# Librerias que utilizaremos para las variables cualitativas y cuatitativas discretas
library(summarytools)
library(epiDisplay)
freq(d3$sex, report.nas = FALSE)
## Frequencies
## d3$sex
## Type: Character
##
## Freq % % Cum.
## ----------- ------ -------- --------
## F 591 56.61 56.61
## M 453 43.39 100.00
## Total 1044 100.00 100.00
tab1(d3$address, graph =FALSE)
## d3$address :
## Frequency Percent Cum. percent
## R 285 27.3 27.3
## U 759 72.7 100.0
## Total 1044 100.0 100.0
Continuamos con las otras variables Cualitativas.
freq(d3$famsize, report.nas = FALSE)
## Frequencies
## d3$famsize
## Type: Character
##
## Freq % % Cum.
## ----------- ------ -------- --------
## GT3 738 70.69 70.69
## LE3 306 29.31 100.00
## Total 1044 100.00 100.00
freq(d3$Pstatus, report.nas = FALSE)
## Frequencies
## d3$Pstatus
## Type: Character
##
## Freq % % Cum.
## ----------- ------ -------- --------
## A 121 11.59 11.59
## T 923 88.41 100.00
## Total 1044 100.00 100.00
freq(d3$Mjob, report.nas = FALSE)
## Frequencies
## d3$Mjob
## Type: Character
##
## Freq % % Cum.
## -------------- ------ -------- --------
## at_home 194 18.58 18.58
## health 82 7.85 26.44
## other 399 38.22 64.66
## services 239 22.89 87.55
## teacher 130 12.45 100.00
## Total 1044 100.00 100.00
freq(d3$Fjob, report.nas = FALSE)
## Frequencies
## d3$Fjob
## Type: Character
##
## Freq % % Cum.
## -------------- ------ -------- --------
## at_home 62 5.94 5.94
## health 41 3.93 9.87
## other 584 55.94 65.80
## services 292 27.97 93.77
## teacher 65 6.23 100.00
## Total 1044 100.00 100.00
freq(d3$reason, report.nas = FALSE)
## Frequencies
## d3$reason
## Type: Character
##
## Freq % % Cum.
## ---------------- ------ -------- --------
## course 430 41.19 41.19
## home 258 24.71 65.90
## other 108 10.34 76.25
## reputation 248 23.75 100.00
## Total 1044 100.00 100.00
freq(d3$guardian, report.nas = FALSE)
## Frequencies
## d3$guardian
## Type: Character
##
## Freq % % Cum.
## ------------ ------ -------- --------
## father 243 23.28 23.28
## mother 728 69.73 93.01
## other 73 6.99 100.00
## Total 1044 100.00 100.00
freq(d3$schoolsup, report.nas = FALSE)
## Frequencies
## d3$schoolsup
## Type: Character
##
## Freq % % Cum.
## ----------- ------ -------- --------
## no 925 88.60 88.60
## yes 119 11.40 100.00
## Total 1044 100.00 100.00
tab1(d3$famsup, graph =FALSE)
## d3$famsup :
## Frequency Percent Cum. percent
## no 404 38.7 38.7
## yes 640 61.3 100.0
## Total 1044 100.0 100.0
tab1(d3$paid, graph =FALSE)
## d3$paid :
## Frequency Percent Cum. percent
## no 824 78.9 78.9
## yes 220 21.1 100.0
## Total 1044 100.0 100.0
tab1(d3$activities, graph =FALSE)
## d3$activities :
## Frequency Percent Cum. percent
## no 528 50.6 50.6
## yes 516 49.4 100.0
## Total 1044 100.0 100.0
tab1(d3$nursery, graph =FALSE)
## d3$nursery :
## Frequency Percent Cum. percent
## no 209 20 20
## yes 835 80 100
## Total 1044 100 100
tab1(d3$higher, graph =FALSE)
## d3$higher :
## Frequency Percent Cum. percent
## no 89 8.5 8.5
## yes 955 91.5 100.0
## Total 1044 100.0 100.0
tab1(d3$internet, graph =FALSE)
## d3$internet :
## Frequency Percent Cum. percent
## no 217 20.8 20.8
## yes 827 79.2 100.0
## Total 1044 100.0 100.0
tab1(d3$romantic, graph =FALSE)
## d3$romantic :
## Frequency Percent Cum. percent
## no 673 64.5 64.5
## yes 371 35.5 100.0
## Total 1044 100.0 100.0
# función freq permite generar la tabla de frecuencia
freq(d3$age, report.nas = FALSE)
## Frequencies
## d3$age
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 15 194 18.58 18.58
## 16 281 26.92 45.50
## 17 277 26.53 72.03
## 18 222 21.26 93.30
## 19 56 5.36 98.66
## 20 9 0.86 99.52
## 21 3 0.29 99.81
## 22 2 0.19 100.00
## Total 1044 100.00 100.00
# función tab1 permite generar la tabla de frecuencia
tab1(d3$Medu, graph =FALSE)
## d3$Medu :
## Frequency Percent Cum. percent
## 0 9 0.9 0.9
## 1 202 19.3 20.2
## 2 289 27.7 47.9
## 3 238 22.8 70.7
## 4 306 29.3 100.0
## Total 1044 100.0 100.0
Continuamos con las otras variables Cuantitivas discretas.
freq(d3$Fedu, report.nas = FALSE)
## Frequencies
## d3$Fedu
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 0 9 0.86 0.86
## 1 256 24.52 25.38
## 2 324 31.03 56.42
## 3 231 22.13 78.54
## 4 224 21.46 100.00
## Total 1044 100.00 100.00
freq(d3$traveltime, report.nas = FALSE)
## Frequencies
## d3$traveltime
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 1 623 59.67 59.67
## 2 320 30.65 90.33
## 3 77 7.38 97.70
## 4 24 2.30 100.00
## Total 1044 100.00 100.00
freq(d3$studytime, report.nas = FALSE)
## Frequencies
## d3$studytime
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 1 317 30.36 30.36
## 2 503 48.18 78.54
## 3 162 15.52 94.06
## 4 62 5.94 100.00
## Total 1044 100.00 100.00
freq(d3$failures, report.nas = FALSE)
## Frequencies
## d3$failures
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 0 861 82.47 82.47
## 1 120 11.49 93.97
## 2 33 3.16 97.13
## 3 30 2.87 100.00
## Total 1044 100.00 100.00
freq(d3$famrel, report.nas = FALSE)
## Frequencies
## d3$famrel
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 1 30 2.87 2.87
## 2 47 4.50 7.38
## 3 169 16.19 23.56
## 4 512 49.04 72.61
## 5 286 27.39 100.00
## Total 1044 100.00 100.00
freq(d3$freetime, report.nas = FALSE)
## Frequencies
## d3$freetime
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 1 64 6.13 6.13
## 2 171 16.38 22.51
## 3 408 39.08 61.59
## 4 293 28.07 89.66
## 5 108 10.34 100.00
## Total 1044 100.00 100.00
freq(d3$goout, report.nas = FALSE)
## Frequencies
## d3$goout
## Type: Integer
##
## Freq % % Cum.
## ----------- ------ -------- --------
## 1 71 6.80 6.80
## 2 248 23.75 30.56
## 3 335 32.09 62.64
## 4 227 21.74 84.39
## 5 163 15.61 100.00
## Total 1044 100.00 100.00
tab1(d3$Dalc, graph =FALSE)
## d3$Dalc :
## Frequency Percent Cum. percent
## 1 727 69.6 69.6
## 2 196 18.8 88.4
## 3 69 6.6 95.0
## 4 26 2.5 97.5
## 5 26 2.5 100.0
## Total 1044 100.0 100.0
tab1(d3$Walc, graph =FALSE)
## d3$Walc :
## Frequency Percent Cum. percent
## 1 398 38.1 38.1
## 2 235 22.5 60.6
## 3 200 19.2 79.8
## 4 138 13.2 93.0
## 5 73 7.0 100.0
## Total 1044 100.0 100.0
tab1(d3$health, graph =FALSE)
## d3$health :
## Frequency Percent Cum. percent
## 1 137 13.1 13.1
## 2 123 11.8 24.9
## 3 215 20.6 45.5
## 4 174 16.7 62.2
## 5 395 37.8 100.0
## Total 1044 100.0 100.0
tab1(d3$absences, graph =FALSE)
## d3$absences :
## Frequency Percent Cum. percent
## 0 359 34.4 34.4
## 1 15 1.4 35.8
## 2 175 16.8 52.6
## 3 15 1.4 54.0
## 4 146 14.0 68.0
## 5 17 1.6 69.6
## 6 80 7.7 77.3
## 7 10 1.0 78.3
## 8 64 6.1 84.4
## 9 10 1.0 85.3
## 10 38 3.6 89.0
## 11 8 0.8 89.8
## 12 24 2.3 92.0
## 13 4 0.4 92.4
## 14 20 1.9 94.3
## 15 5 0.5 94.8
## 16 17 1.6 96.5
## 17 1 0.1 96.6
## 18 8 0.8 97.3
## 19 1 0.1 97.4
## 20 4 0.4 97.8
## 21 3 0.3 98.1
## 22 5 0.5 98.6
## 23 1 0.1 98.7
## 24 2 0.2 98.9
## 25 1 0.1 98.9
## 26 2 0.2 99.1
## 28 1 0.1 99.2
## 30 2 0.2 99.4
## 32 1 0.1 99.5
## 38 1 0.1 99.6
## 40 1 0.1 99.7
## 54 1 0.1 99.8
## 56 1 0.1 99.9
## 75 1 0.1 100.0
## Total 1044 100.0 100.0
Cuando la representacion de la tabla tiene mas de 12 filas no se debe presentar una tabla clasica, lo mas conveniente es agrupar por intervalos.
La opción mas conocida es la regla de Sturges (k=1+3.322*log(n))
#Para ello usamos la libreria agricolae
library(agricolae)
(table.freq(hist(d3$G1, plot = FALSE, breaks = "Sturges")))
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 2 1 1 0.1 1 0.1
## 2 2 4 3 4 0.4 5 0.5
## 3 4 6 5 45 4.3 50 4.8
## 4 6 8 7 153 14.7 203 19.4
## 5 8 10 9 242 23.2 445 42.6
## 6 10 12 11 247 23.7 692 66.3
## 7 12 14 13 206 19.7 898 86.0
## 8 14 16 15 103 9.9 1001 95.9
## 9 16 18 17 39 3.7 1040 99.6
## 10 18 20 19 4 0.4 1044 100.0
(table.freq(hist(d3$G2, plot = FALSE, breaks = "Sturges")))
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 2 1 20 1.9 20 1.9
## 2 2 4 3 1 0.1 21 2.0
## 3 4 6 5 39 3.7 60 5.7
## 4 6 8 7 109 10.4 169 16.2
## 5 8 10 9 251 24.0 420 40.2
## 6 10 12 11 265 25.4 685 65.6
## 7 12 14 13 194 18.6 879 84.2
## 8 14 16 15 110 10.5 989 94.7
## 9 16 18 17 51 4.9 1040 99.6
## 10 18 20 19 4 0.4 1044 100.0
(table.freq(hist(d3$G3, plot = FALSE, breaks = "Sturges")))
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 2 1 54 5.2 54 5.2
## 2 2 4 3 1 0.1 55 5.3
## 3 4 6 5 26 2.5 81 7.8
## 4 6 8 7 86 8.2 167 16.0
## 5 8 10 9 216 20.7 383 36.7
## 6 10 12 11 254 24.3 637 61.0
## 7 12 14 13 203 19.4 840 80.5
## 8 14 16 15 134 12.8 974 93.3
## 9 16 18 17 62 5.9 1036 99.2
## 10 18 20 19 8 0.8 1044 100.0
Segun la descripción del caso por analizar se usaran las variables cualitativas nominales, donde se usaran los graficos de barras y circular(pastel):
Tambien se usaran las variables cuantitativas continuas, donde se usaran los graficos de cajas, histogramas y densidad:
Aclaracion: Los graficos para variables cualitativas ordinales tambien son los graficos de barras y circulares
#Cargar la libreria
library(ggplot2)
# Gráfico de barras para variables cualitativas nominales
ggplot(data = d3, aes(x=schoolsup))+
geom_bar(fill = "blue4", color = "black")+
labs(title = "Grafico de Barras de schoolsup (Apoyo educativo extra)")+
theme_classic()+
xlab("Apoyo educativo extra")+
ylab("cantidad")
#Grafico Circular
ggplot(d3, aes(x = "", y = "", fill = famsup)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y") +
labs(title = "Grafico Circular de famsup (Apoyo educativo familiar)") +
theme_void()
ggplot(d3, aes(x = paid)) +
geom_bar(fill = "lightcoral", color = "black") +
labs(title = "Gráfico de Barras para paid (Clases extra pagadas)") +
theme_classic()+
xlab("Clases extra pagadas")+
ylab("cantidad")
#Histograma
ggplot(d3, aes(x = G1))+
geom_histogram(binwidth = 1, fill = "skyblue", color = "black")+
labs(title = "Histograma de G1 (Calificación del primer período")+
theme_classic()+
xlab("Calificación del primer período")+
ylab("Cantidad")
#Diagrama de Caja
ggplot(d3, aes(x = G2))+
geom_boxplot(fill = "lightgreen")+
labs(title = "Diagrama de caja de G2 (Calificación del segundo período)")+
xlab("Calificación del segundo período")+
theme_classic()
#Grafico de Densidad
ggplot(d3, aes(x = G3))+
geom_density(fill = "orange2")+
labs(title = "Grafico de Densidad de G3 (Calificación final)")+
xlab("Calificación final")+
ylab("Densidad")+
theme_light()
La media aritmética (media o promedio) de un conjunto de valores de una variable es la suma de dichos valores dividida entre el número de valores. Se denota por \(\bar{x}\).
#opcion 1
promedio = sum(d3$G1)/length(d3$G1)
promedio
## [1] 11.2136
#opcion 2
mean(d3$G1)
## [1] 11.2136
mean(d3$G2)
## [1] 11.24617
mean(d3$G3)
## [1] 11.34195
Interpretacion 1: El promedio de calificación del primer período de los estudiantes es de 11.2136.
Interpretacion 2: El promedio de Calificación del segundo período de los estudiantes es de 11.24617
Interpretacion 3: El promedio de Calificación final de los estudiantes es de 11.34195
Representa el valor que, al ordenar todos los valores de menor a mayor, se encuentra al medio. En caso que el número de valores sea par, la mediana es el promedio de los dos valores de en medio. Cuando la variable es de tipo ordinal, la mediana es la mejor medida para representar la tendencia central.
median(d3$G1)
## [1] 11
median(d3$G2)
## [1] 11
median(d3$G3)
## [1] 11
El valor de la mediana es los 3 casos es de: 11
Interpretacion: El 50% de los estudiantes su calificación maxima es 11. El otro 50% (la mitad) su calificación minima es 11 .
La moda es el valor que tiene mayor frecuencia absoluta. Se representa por Mo. Se puede hallar la moda para variables cualitativas y cuantitativas.
#Opcion 1
table(d3$G3)
##
## 0 1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 53 1 1 8 18 19 67 63 153 151 103 113 90 82 52 35 27 7 1
#Opcion 2
library(modeest)
mfv(d3$G3)
## [1] 10
Ojo: se puede tener los siguientes resultados
Unimodal: Una sola moda Bimodal: Dos modas Multimodal: Más de Dos modas Amodal: No hay valor mas frecuente.
Interpretacion: La nota mas frecuente de la Calificación final es 10, por lo tanto tenemos una moda unimodal.
La medida de variabilidad más sencilla es el Rango, para calcular esta medida hay que restar el valor máximo de los datos menos el valor menor.
#Opcion 1
rango = max(d3$G3) - min(d3$G3)
rango
## [1] 20
#Opcion 2
range(d3$G3)
## [1] 0 20
#Se tiene que restar los valores, en esta situacion no es necesario ya que el valor menor es 0
Representa en cuanto difiere el valor de cada observación (\(x_i\)) de la media de los datos. A diferencia de las medidas anteriores, la varianza emplea todos los datos disponibles de la variable. Se recomienda su uso cuando se compara las variabilidades de dos o más variables.
\(s^2=\frac{\sum_{i=1}^n\left(x_i-\bar{x}\right)^2}{n-1}\)
var(d3$G3)
## [1] 14.93665
Llamada también desviación típica, es la medida de dispersión más importante y de mayor uso en trabajos estadísticos. Un valor relativamente grande, significa, que la generosidad de los datos está alejados de la media y así recíprocamente.
#Opcion 1
sqrt(var(d3$G3))
## [1] 3.864796
#Opcion 2
sd(d3$G3)
## [1] 3.864796
Interpretacion: La variabilidad promedio de los datos respecto a la media es de 14.93665. Interpretacion 2: Las notas de los estudiantes de la Calificacion final se alejan de la media 3.864796 en promedio.
El coeficiente de variación (CV) es una medida estadística que indica porcentualmente qué tan separados están los datos en relación con su promedio. Se obtiene al dividir la desviación estándar (S) entre el promedio (\(\bar{x}\))
\[ C V=\frac{S}{\bar{x}} \times 100 \]
• Si CV ≤ 30%, entonces la distribución es homogénea y la media es representativa. • Si CV > 30%, entonces la distribución no es homogénea y la media no es representativa. En este caso debemos tomar la mediana como medida representativa.
coeficiente_var = sd(d3$G3)/mean(d3$G3)*100
coeficiente_var
## [1] 34.07522
Interpretación: Como el coeficiente de variacion es 34.07522 > 30%, entonces la distribución de las notas no es homogenea, por lo tanto tomaremos la mediana como medida representaviva, La mediana es 11.
##Otras formas de obtenerlo es:
#Con la funcion summary
summary(d3$G3)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 10.00 11.00 11.34 14.00 20.00
#Con la funcion psych
library(psych)
describe(d3$G3)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 1044 11.34 3.86 11 11.66 2.97 0 20 20 -0.98 1.72 0.12
#Con la funcion pastecs
library(pastecs)
stat.desc(d3$G3)
## nbr.val nbr.null nbr.na min max range
## 1.044000e+03 5.300000e+01 0.000000e+00 0.000000e+00 2.000000e+01 2.000000e+01
## sum median mean SE.mean CI.mean.0.95 var
## 1.184100e+04 1.100000e+01 1.134195e+01 1.196124e-01 2.347084e-01 1.493665e+01
## std.dev coef.var
## 3.864796e+00 3.407522e-01
quantile(d3$G3)
## 0% 25% 50% 75% 100%
## 0 10 11 14 20
Segun los resultados:
El valor minimo de la calificacion final es 0
interpretacion es 10; El 25% de los estudiantes tuvieron de calificacion final como nota maxima un 10.
interpretacion es 11; El 50% de los estudiantes tuvieron de calificacion final como nota maxima un 11.
interpretacion es 14; El 75% de los estudiantes tuvieron de calificacion final como nota maxima un 14.
quantile(d3$G3, probs = seq(0 , 1 , 0.1))
## 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
## 0 8 9 10 11 11 12 13 14 16 20
quantile(d3$G3, probs = seq(0 , 1 , 0.01))
## 0% 1% 2% 3% 4% 5% 6% 7% 8% 9% 10% 11% 12%
## 0.00 0.00 0.00 0.00 0.00 0.15 5.58 6.00 7.00 7.00 8.00 8.00 8.00
## 13% 14% 15% 16% 17% 18% 19% 20% 21% 22% 23% 24% 25%
## 8.00 8.00 8.00 8.88 9.00 9.00 9.00 9.00 9.00 9.46 10.00 10.00 10.00
## 26% 27% 28% 29% 30% 31% 32% 33% 34% 35% 36% 37% 38%
## 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 11.00 11.00
## 39% 40% 41% 42% 43% 44% 45% 46% 47% 48% 49% 50% 51%
## 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00
## 52% 53% 54% 55% 56% 57% 58% 59% 60% 61% 62% 63% 64%
## 12.00 12.00 12.00 12.00 12.00 12.00 12.00 12.00 12.00 12.23 13.00 13.00 13.00
## 65% 66% 67% 68% 69% 70% 71% 72% 73% 74% 75% 76% 77%
## 13.00 13.00 13.00 13.00 13.00 13.00 13.00 14.00 14.00 14.00 14.00 14.00 14.00
## 78% 79% 80% 81% 82% 83% 84% 85% 86% 87% 88% 89% 90%
## 14.00 14.00 14.00 15.00 15.00 15.00 15.00 15.00 15.00 15.00 15.00 16.00 16.00
## 91% 92% 93% 94% 95% 96% 97% 98% 99% 100%
## 16.00 16.00 16.00 17.00 17.00 17.00 18.00 18.00 18.00 20.00
library(fBasics)
skewness(d3$G3)
## [1] -0.9831332
## attr(,"method")
## [1] "moment"
Resultado: -0.9831332, como el valor es negativo, entonces la distribucion de los datos es asimétrica negativa, esto quiere decir que los valores estan concentrados en los puntos mas grandes (la mayoria de los estudiantes tienen una nota buena)
ggplot(d3, aes(x = G3))+
geom_histogram(binwidth = 1, fill = "skyblue", color = "black")+
labs(title = "Histograma de G3 (Calificación Final)")+
theme_classic()+
xlab("Calificación Final")+
ylab("Cantidad")
kurtosis(d3$G3)
## [1] 1.721178
## attr(,"method")
## [1] "excess"
Resultado: 1.721178, el valor es menor que 3, por lo tanto la distribucion de los datos es platicúrtica, quiere decir que los valores de los datos están menos concentrados alrededor de la media y hay más valores atípicos.
#Cargamos una version con datos perdidos De la informacion obtenida en el curso de matematicas.
d4 <- read.csv("missing.csv", sep = ";" , stringsAsFactors = TRUE)
#Motramos los primeros datos
head(d4)
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason
## 1 GP F 18 U GT3 A 4 4 at_home teacher course
## 2 GP F 17 U GT3 T 1 1 at_home other course
## 3 GP F 15 U LE3 T 1 1 at_home other other
## 4 GP F 15 U GT3 T 4 2 health services home
## 5 GP F 16 U GT3 T 3 3 other other home
## 6 GP M 16 U LE3 T 4 3 services other reputation
## guardian traveltime studytime failures schoolsup famsup paid activities
## 1 mother 2 2 0 yes no no no
## 2 father 1 2 0 no yes no no
## 3 mother 1 2 3 yes no yes no
## 4 mother 1 3 0 no yes yes yes
## 5 father 1 2 0 no yes yes no
## 6 mother 1 2 0 no yes yes yes
## nursery higher internet romantic famrel freetime goout Dalc Walc health
## 1 yes yes no no 4 3 4 1 1 3
## 2 no yes yes no 5 3 3 1 1 3
## 3 yes yes yes no 4 3 2 2 3 3
## 4 yes yes yes yes 3 2 2 1 1 5
## 5 yes yes no no 4 3 2 1 2 5
## 6 yes yes yes no 5 4 2 1 2 5
## absences G1 G2 G3
## 1 6 5 6 6
## 2 4 5 5 6
## 3 10 7 8 10
## 4 2 15 14 15
## 5 4 6 10 10
## 6 10 15 15 15
#Verificar columnas con missing
which(colSums(is.na(d4))!=0)
## Walc health G1 G2 G3
## 28 29 31 32 33
#Verificamos las filas que tienen valores perdidos
a<-which(rowSums(is.na(d4))!=0)
length(a)*100/dim(d4)[1]
## [1] 2.025316
Realizar el analisis utilizando librerias
library(VIM)
library(mice)
resumen_missing = aggr(d4,numbers=T)
summary(resumen_missing)
##
## Missings per variable:
## Variable Count
## school 0
## sex 0
## age 0
## address 0
## famsize 0
## Pstatus 0
## Medu 0
## Fedu 0
## Mjob 0
## Fjob 0
## reason 0
## guardian 0
## traveltime 0
## studytime 0
## failures 0
## schoolsup 0
## famsup 0
## paid 0
## activities 0
## nursery 0
## higher 0
## internet 0
## romantic 0
## famrel 0
## freetime 0
## goout 0
## Dalc 0
## Walc 3
## health 1
## absences 0
## G1 3
## G2 1
## G3 1
##
## Missings in combinations of variables:
## Combinations Count
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 387
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1 1
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0 1
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0 2
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0 1
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0 2
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:1:0:0 1
## Percent
## 97.9746835
## 0.2531646
## 0.2531646
## 0.5063291
## 0.2531646
## 0.5063291
## 0.2531646
Para determinar mejor los patrones de comportamiento de missing se puede utilizar la siguiente función
matrixplot(d4)
Otra representación
#Con la libreria Mice
md.pattern(d4,rotate.names = T)
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason guardian
## 387 1 1 1 1 1 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0 0 0 0 0 0
## traveltime studytime failures schoolsup famsup paid activities nursery
## 387 1 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0 0
## higher internet romantic famrel freetime goout Dalc absences health G2 G3
## 387 1 1 1 1 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1 1 1 1 1 0
## 1 1 1 1 1 1 1 1 1 1 0 1
## 1 1 1 1 1 1 1 1 1 0 1 1
## 0 0 0 0 0 0 0 0 1 1 1
## Walc G1
## 387 1 1 0
## 2 1 0 1
## 2 0 1 1
## 1 0 0 2
## 1 1 1 1
## 1 1 1 1
## 1 1 1 1
## 3 3 9
La libreria visdat permite visualizar missing pero los ordena por tipo de dato
library(visdat)
vis_dat(d4)
Para obtener columnas con porcentajes de missing
vis_miss(d4)
solo para este ejemplo se va a eliminar filas:
d4_corregido1<- na.omit(d4)
str(d4_corregido1)
## 'data.frame': 387 obs. of 33 variables:
## $ school : Factor w/ 2 levels "GP","MS": 1 1 1 1 1 1 1 1 1 1 ...
## $ sex : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
## $ age : int 18 17 15 15 16 16 16 17 15 15 ...
## $ address : Factor w/ 2 levels "R","U": 2 2 2 2 2 2 2 2 2 2 ...
## $ famsize : Factor w/ 2 levels "GT3","LE3": 1 1 2 1 1 2 2 1 2 1 ...
## $ Pstatus : Factor w/ 2 levels "A","T": 1 2 2 2 2 2 2 1 1 2 ...
## $ Medu : int 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : int 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : Factor w/ 5 levels "at_home","health",..: 1 1 1 2 3 4 3 3 4 3 ...
## $ Fjob : Factor w/ 5 levels "at_home","health",..: 5 3 3 4 3 3 3 5 3 3 ...
## $ reason : Factor w/ 4 levels "course","home",..: 1 1 3 2 2 4 2 2 2 2 ...
## $ guardian : Factor w/ 3 levels "father","mother",..: 2 1 2 2 1 2 2 2 2 2 ...
## $ traveltime: int 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : int 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : int 0 0 3 0 0 0 0 0 0 0 ...
## $ schoolsup : Factor w/ 3 levels "","no","yes": 3 2 3 2 2 2 1 3 2 2 ...
## $ famsup : Factor w/ 3 levels "","no","yes": 2 3 2 3 3 3 2 3 3 3 ...
## $ paid : Factor w/ 3 levels "","no","yes": 2 2 3 3 3 3 2 2 3 3 ...
## $ activities: Factor w/ 3 levels "","no","yes": 2 2 2 3 2 3 2 2 2 3 ...
## $ nursery : Factor w/ 3 levels "","no","yes": 3 2 3 3 3 3 3 3 3 3 ...
## $ higher : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
## $ internet : Factor w/ 3 levels "","no","yes": 2 3 3 3 2 3 3 2 3 3 ...
## $ romantic : Factor w/ 3 levels "","no","yes": 2 2 2 3 2 2 2 2 2 2 ...
## $ famrel : int 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : int 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : int 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : int 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : int 1 1 3 1 2 2 1 1 1 1 ...
## $ health : int 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : int 6 4 10 2 4 10 0 6 0 0 ...
## $ G1 : int 5 5 7 15 6 15 12 6 16 14 ...
## $ G2 : int 6 5 8 14 10 15 12 5 18 15 ...
## $ G3 : int 6 6 10 15 10 15 11 6 19 15 ...
## - attr(*, "na.action")= 'omit' Named int [1:8] 67 68 78 90 98 103 109 111
## ..- attr(*, "names")= chr [1:8] "67" "68" "78" "90" ...
which(colSums(is.na(d4_corregido1))!=0)
## named integer(0)
Imputación por medidas de tendencia central
library(DMwR2)
d4_corregido2<-centralImputation(d4) #DMwR, mediana (númerico), moda(no númerico)
str(d4_corregido2)
## 'data.frame': 395 obs. of 33 variables:
## $ school : Factor w/ 2 levels "GP","MS": 1 1 1 1 1 1 1 1 1 1 ...
## $ sex : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
## $ age : int 18 17 15 15 16 16 16 17 15 15 ...
## $ address : Factor w/ 2 levels "R","U": 2 2 2 2 2 2 2 2 2 2 ...
## $ famsize : Factor w/ 2 levels "GT3","LE3": 1 1 2 1 1 2 2 1 2 1 ...
## $ Pstatus : Factor w/ 2 levels "A","T": 1 2 2 2 2 2 2 1 1 2 ...
## $ Medu : int 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : int 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : Factor w/ 5 levels "at_home","health",..: 1 1 1 2 3 4 3 3 4 3 ...
## $ Fjob : Factor w/ 5 levels "at_home","health",..: 5 3 3 4 3 3 3 5 3 3 ...
## $ reason : Factor w/ 4 levels "course","home",..: 1 1 3 2 2 4 2 2 2 2 ...
## $ guardian : Factor w/ 3 levels "father","mother",..: 2 1 2 2 1 2 2 2 2 2 ...
## $ traveltime: int 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : int 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : int 0 0 3 0 0 0 0 0 0 0 ...
## $ schoolsup : Factor w/ 3 levels "","no","yes": 3 2 3 2 2 2 1 3 2 2 ...
## $ famsup : Factor w/ 3 levels "","no","yes": 2 3 2 3 3 3 2 3 3 3 ...
## $ paid : Factor w/ 3 levels "","no","yes": 2 2 3 3 3 3 2 2 3 3 ...
## $ activities: Factor w/ 3 levels "","no","yes": 2 2 2 3 2 3 2 2 2 3 ...
## $ nursery : Factor w/ 3 levels "","no","yes": 3 2 3 3 3 3 3 3 3 3 ...
## $ higher : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
## $ internet : Factor w/ 3 levels "","no","yes": 2 3 3 3 2 3 3 2 3 3 ...
## $ romantic : Factor w/ 3 levels "","no","yes": 2 2 2 3 2 2 2 2 2 2 ...
## $ famrel : int 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : int 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : int 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : int 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : num 1 1 3 1 2 2 1 1 1 1 ...
## $ health : num 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : int 6 4 10 2 4 10 0 6 0 0 ...
## $ G1 : num 5 5 7 15 6 15 12 6 16 14 ...
## $ G2 : num 6 5 8 14 10 15 12 5 18 15 ...
## $ G3 : num 6 6 10 15 10 15 11 6 19 15 ...
# verificar columnas con missing
which(colSums(is.na(d4_corregido2))!=0)
## named integer(0)
Utilizamos otra libreria para imputar datos
library(VIM)
d4_corregido3<-initialise(d4,method="median") #media (continuos) mediana (discretos), moda(no númerico)
#Verificamos las dimensiones
dim(d4_corregido3)
## [1] 395 33
# verificar columnas con missing
which(colSums(is.na(d4_corregido3))!=0)
## named integer(0)
Imputación utilizando vecinos mas cercanos
d4_corregido4<-knnImputation(d4, k=10)
str(d4_corregido4)
## 'data.frame': 395 obs. of 33 variables:
## $ school : Factor w/ 2 levels "GP","MS": 1 1 1 1 1 1 1 1 1 1 ...
## $ sex : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
## $ age : int 18 17 15 15 16 16 16 17 15 15 ...
## $ address : Factor w/ 2 levels "R","U": 2 2 2 2 2 2 2 2 2 2 ...
## $ famsize : Factor w/ 2 levels "GT3","LE3": 1 1 2 1 1 2 2 1 2 1 ...
## $ Pstatus : Factor w/ 2 levels "A","T": 1 2 2 2 2 2 2 1 1 2 ...
## $ Medu : int 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : int 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : Factor w/ 5 levels "at_home","health",..: 1 1 1 2 3 4 3 3 4 3 ...
## $ Fjob : Factor w/ 5 levels "at_home","health",..: 5 3 3 4 3 3 3 5 3 3 ...
## $ reason : Factor w/ 4 levels "course","home",..: 1 1 3 2 2 4 2 2 2 2 ...
## $ guardian : Factor w/ 3 levels "father","mother",..: 2 1 2 2 1 2 2 2 2 2 ...
## $ traveltime: int 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : int 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : int 0 0 3 0 0 0 0 0 0 0 ...
## $ schoolsup : Factor w/ 3 levels "","no","yes": 3 2 3 2 2 2 1 3 2 2 ...
## $ famsup : Factor w/ 3 levels "","no","yes": 2 3 2 3 3 3 2 3 3 3 ...
## $ paid : Factor w/ 3 levels "","no","yes": 2 2 3 3 3 3 2 2 3 3 ...
## $ activities: Factor w/ 3 levels "","no","yes": 2 2 2 3 2 3 2 2 2 3 ...
## $ nursery : Factor w/ 3 levels "","no","yes": 3 2 3 3 3 3 3 3 3 3 ...
## $ higher : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
## $ internet : Factor w/ 3 levels "","no","yes": 2 3 3 3 2 3 3 2 3 3 ...
## $ romantic : Factor w/ 3 levels "","no","yes": 2 2 2 3 2 2 2 2 2 2 ...
## $ famrel : int 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : int 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : int 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : int 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : num 1 1 3 1 2 2 1 1 1 1 ...
## $ health : num 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : int 6 4 10 2 4 10 0 6 0 0 ...
## $ G1 : num 5 5 7 15 6 15 12 6 16 14 ...
## $ G2 : num 6 5 8 14 10 15 12 5 18 15 ...
## $ G3 : num 6 6 10 15 10 15 11 6 19 15 ...
# verificar columnas con missing
which(colSums(is.na(d4_corregido4))!=0)
## named integer(0)
El análisis solo se realiza para variable cuantitativas
Gráfico de cajas y bigotes
#Gráfico de cajas y bigotes
boxplot(d3$age)
Según los resultados, age (Edad) no tiene valores atípicos
boxplot(d3$studytime)
boxplot.default(d4)
boxplot(d3$failures)
Según los resultados, se identifica valores atípicos. Vamos a identificarlo y plantear estrategia de corrección
# Calcular el RIC (RIC = Q3 - Q1)
q1 <- quantile(d3$age, 0.25)
q3 <- quantile(d3$age, 0.75)
RIC <- q3-q1
RIC
## 75%
## 2
# Limites o bigotes (Superior e inferior)
bigote_inferior <- q1-1.5*RIC
bigote_inferior
## 25%
## 13
bigote_superior <- q3+1.5*RIC
bigote_superior
## 75%
## 21
# Identificar lo valores atípicos
outliers_det <- d3$age[d3$age < bigote_inferior | d3$age > bigote_superior]
outliers_det
## [1] 22 22
d3_sin_atipicos <- d3[!d3$age %in% outliers_det,]
head(d3_sin_atipicos, 10)
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob
## 1 GP F 18 U GT3 A 4 4 at_home teacher
## 2 GP F 17 U GT3 T 1 1 at_home other
## 3 GP F 15 U LE3 T 1 1 at_home other
## 4 GP F 15 U GT3 T 4 2 health services
## 5 GP F 16 U GT3 T 3 3 other other
## 6 GP M 16 U LE3 T 4 3 services other
## 7 GP M 16 U LE3 T 2 2 other other
## 8 GP F 17 U GT3 A 4 4 other teacher
## 9 GP M 15 U LE3 A 3 2 services other
## 10 GP M 15 U GT3 T 3 4 other other
## reason guardian traveltime studytime failures schoolsup famsup paid
## 1 course mother 2 2 0 yes no no
## 2 course father 1 2 0 no yes no
## 3 other mother 1 2 0 yes no no
## 4 home mother 1 3 0 no yes no
## 5 home father 1 2 0 no yes no
## 6 reputation mother 1 2 0 no yes no
## 7 home mother 1 2 0 no no no
## 8 home mother 2 2 0 yes yes no
## 9 home mother 1 2 0 no yes no
## 10 home mother 1 2 0 no yes no
## activities nursery higher internet romantic famrel freetime goout Dalc Walc
## 1 no yes yes no no 4 3 4 1 1
## 2 no no yes yes no 5 3 3 1 1
## 3 no yes yes yes no 4 3 2 2 3
## 4 yes yes yes yes yes 3 2 2 1 1
## 5 no yes yes no no 4 3 2 1 2
## 6 yes yes yes yes no 5 4 2 1 2
## 7 no yes yes yes no 4 4 4 1 1
## 8 no yes yes no no 4 1 4 1 1
## 9 no yes yes yes no 4 2 2 1 1
## 10 yes yes yes yes no 5 5 1 1 1
## health absences G1 G2 G3
## 1 3 4 0 11 11
## 2 3 2 9 11 11
## 3 3 6 12 13 12
## 4 5 0 14 14 14
## 5 5 0 11 13 13
## 6 5 6 12 12 13
## 7 3 0 13 12 13
## 8 1 2 10 13 13
## 9 1 0 15 16 17
## 10 5 0 12 12 13
Para confirmar vamos a realizar un gráfico de cajas con la nueva data
boxplot(d3_sin_atipicos$age)
La transformación de variables es una técnica utilizada en estadística y análisis de datos para modificar una variable con el objetivo de cumplir con ciertos supuestos o mejorar la interpretación de los datos. Esta transformación implica aplicar una función matemática a los valores de la variable original para obtener una nueva variable.
La transformación de variables implica aplicar una función matemática a los valores de una variable con el objetivo de modificar su distribución o relación con otras variables. Algunas transformaciones comunes incluyen la transformación logarítmica, la transformación exponencial y la transformación de raíz cuadrada. Estas transformaciones se utilizan principalmente cuando los datos presentan asimetría o heterocedasticidad. Por ejemplo, si se tiene una variable con una distribución sesgada hacia la derecha, se puede aplicar una transformación logarítmica para reducir la asimetría y hacer que los datos se aproximen más a una distribución normal (gráfica o distribución se asemeja a la campana de Gauss).
Existen diferentes tipos de transformaciones de variables que se utilizan según las características de los datos y los objetivos del análisis. Algunas de las transformaciones más comunes son:
Esta transformación se utiliza para reducir la dispersión de los datos cuando estos tienen una distribución con una varianza que aumenta con el nivel medio de la variable. También puede ayudar a reducir la asimetría.
# Original
hist(d3$age, 12)
Para sacar la raiz cuadrada, simplemente se puede utilizar la función sqrt
head(sqrt(d3$age), 10)
## [1] 4.242641 4.123106 3.872983 3.872983 4.000000 4.000000 4.000000 4.123106
## [9] 3.872983 3.872983
Graficamente
hist(sqrt(d3$age))
Se aplica cuando los datos tienen una distribución sesgada hacia la izquierda (asimetría negativa). La transformación exponencial puede ayudar a corregir la asimetría y hacer que los datos se aproximen más a una distribución simétrica.
en r para poder obtener esta transformación, se debe utilizar la función exp()
# Se muestras los primeros valors para una mejor lectura.
head(exp(d3$studytime))
## [1] 7.389056 7.389056 7.389056 20.085537 7.389056 7.389056
para poder observarlo graficamente se tiene:
hist(exp(d3$studytime))
Forma 2
studytime_exp<- exp(d3$studytime)
hist(studytime_exp)
Esta transformación se utiliza cuando los datos presentan una distribución sesgada hacia la derecha (asimetría positiva). La transformación logarítmica reduce la asimetría y puede facilitar la interpretación de los datos.
Para la transformación logaritmica, utilizar log (dentro de los argumentos se puede cambiar la base)
Uso de la variable Absences (Número de ausencias escolares)
# Solo se muestran los primeros datos
head(log(d3$absences))
## [1] 1.3862944 0.6931472 1.7917595 -Inf -Inf 1.7917595
graficamente
hist(log(d3$absences))
Cambiar la base 2
# Solo se muestran los primeros datos
head(log(d3$absences, base=2))
## [1] 2.000000 1.000000 2.584963 -Inf -Inf 2.584963
graficamente
hist(log(d3$absences, base=2))
#Obtener solo transformaciones
abs_sqrt <- sqrt(d3$absences)
abs_exp <- exp(d3$absences)
abs_ln <- log(d3$absences)
abs_log2 <- log(d3$absences, base=2)
abs_log5 <- log(d3$absences, base=5)
Ver graficamente cada una:
par(mfrow=c(3,2))
hist(d3$absences)
hist(abs_sqrt)
hist(abs_exp)
hist(abs_ln)
hist(abs_log2)
hist(abs_log5)
par(mfrow=c(1,1))
Este tipo de transformaciones, busca que los datos sean simétricos (distribución forma de campana) o que se cumpla un supuesto estadístico
La visualización de la distribución puede mejorarse con la gráfica de densidad
par(mfrow=c(3,2))
plot(density(d3$absences), main = "Distribución de ausencias escolares originales")
plot(density(abs_sqrt), main = "Distribución de ausencias escolares transformadas - sqrt")
plot(density(abs_exp), main = "Distribución de ausencias escolares transformadas - exp")
plot(density(abs_ln), main = "Distribución de ausencias escolares transformadas - ln")
plot(density(abs_log2), main = "Distribución de ausencias escolares transformadas - log2")
plot(density(abs_log5), main = "Distribución de ausencias escolares transformadas - log5")
par(mfrow=c(1,1))
Se puede realizar un análisis general de las variables originales y verificar su comportmiento, a partir de allí se puede aplicar la transformación más adecuado según objetivo.
gráfica general
library(PerformanceAnalytics)
chart.Correlation(cor(d3[,30:33]), histogram = TRUE)
La estandarización de variables, también conocida como normalización, implica transformar los valores de una variable para que tengan una media de cero y una desviación estándar de uno. Esto se logra restando la media de la variable a cada valor y dividiendo por la desviación estándar.
La estandarización es útil cuando se desea comparar variables que están en diferentes escalas o unidades. Al estandarizar las variables, se eliminan las diferencias en las escalas y se asegura que todas las variables tengan la misma escala relativa.
Por ejemplo, si tienes un conjunto de variables con diferentes unidades de medida, como peso en kilogramos y altura en metros, puedes estandarizar ambas variables para que sean comparables y no se vean afectadas por las diferencias en las unidades.
Desde el punto de vista estadistico la estandarización se aplica a la transformación Z: se debe restar cada dato con su media y dividir este resultado con la desviación estándar.
\[ Z = \frac{x_i-\mu}{\sigma} \]
Donde: - \(X_i\) representa cada dato dentro del caso - \(\mu\) Es la media poblacional (promedio) - \(\sigma\) Es la desviación estándar poblacional.
head(d3)
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason
## 1 GP F 18 U GT3 A 4 4 at_home teacher course
## 2 GP F 17 U GT3 T 1 1 at_home other course
## 3 GP F 15 U LE3 T 1 1 at_home other other
## 4 GP F 15 U GT3 T 4 2 health services home
## 5 GP F 16 U GT3 T 3 3 other other home
## 6 GP M 16 U LE3 T 4 3 services other reputation
## guardian traveltime studytime failures schoolsup famsup paid activities
## 1 mother 2 2 0 yes no no no
## 2 father 1 2 0 no yes no no
## 3 mother 1 2 0 yes no no no
## 4 mother 1 3 0 no yes no yes
## 5 father 1 2 0 no yes no no
## 6 mother 1 2 0 no yes no yes
## nursery higher internet romantic famrel freetime goout Dalc Walc health
## 1 yes yes no no 4 3 4 1 1 3
## 2 no yes yes no 5 3 3 1 1 3
## 3 yes yes yes no 4 3 2 2 3 3
## 4 yes yes yes yes 3 2 2 1 1 5
## 5 yes yes no no 4 3 2 1 2 5
## 6 yes yes yes no 5 4 2 1 2 5
## absences G1 G2 G3
## 1 4 0 11 11
## 2 2 9 11 11
## 3 6 12 13 12
## 4 0 14 14 14
## 5 0 11 13 13
## 6 6 12 12 13
Vamos a aplicar estandarización Z a la variable Monto de manera manual
Metodo 1: Por partes
media_G1 <- mean(d3$G1)
media_G1
## [1] 11.2136
desv_est <- sd(d3$G1)
desv_est
## [1] 2.983394
G1_estandar <- (d3$G1 - media_G1) / desv_est
head(G1_estandar, 10)
## [1] -3.75867277 -0.74197427 0.26359190 0.93396934 -0.07159682 0.26359190
## [7] 0.59878062 -0.40678555 1.26915806 0.26359190
Metodo 2: Directo
G1_estandar2 <- (d3$G1-mean(d3$G1))/sd(d3$G1)
head(G1_estandar2, 10)
## [1] -3.75867277 -0.74197427 0.26359190 0.93396934 -0.07159682 0.26359190
## [7] 0.59878062 -0.40678555 1.26915806 0.26359190
Metodo 3: Apoyarse en las funciones de R
R tiene multiples funciones para estandarizar, la clasica es la función scale
#Función Scale
G1_estandar3 <- scale(d3$G1)
head(G1_estandar3, 10)
## [,1]
## [1,] -3.75867277
## [2,] -0.74197427
## [3,] 0.26359190
## [4,] 0.93396934
## [5,] -0.07159682
## [6,] 0.26359190
## [7,] 0.59878062
## [8,] -0.40678555
## [9,] 1.26915806
## [10,] 0.26359190
La ventaja de la función de R es que se puede enviar todo el caso
d3_cuantita_scale <- scale(d3[ ,30:33])
head(d3_cuantita_scale, 10)
## absences G1 G2 G3
## [1,] -0.07002653 -3.75867277 -0.07493554 -0.0884792
## [2,] -0.39208686 -0.74197427 -0.07493554 -0.0884792
## [3,] 0.25203380 0.26359190 0.53387929 0.1702667
## [4,] -0.71414719 0.93396934 0.83828671 0.6877585
## [5,] -0.71414719 -0.07159682 0.53387929 0.4290126
## [6,] 0.25203380 0.26359190 0.22947188 0.4290126
## [7,] -0.71414719 0.59878062 0.22947188 0.4290126
## [8,] -0.39208686 -0.40678555 0.53387929 0.4290126
## [9,] -0.71414719 1.26915806 1.44710154 1.4639961
## [10,] -0.71414719 0.26359190 0.22947188 0.4290126
Recordar En una sesión anterior se realizo gráficos de cajas para verificar la presencia de outliers No se recomienda trabajar con valores originales para la siguiente gráfica
boxplot(d3[,30:33])
Lo mas recomendable es realizar el gráfico con los valores de las variables transformadas
boxplot(d3_cuantita_scale)
Estandarización min-max: Consiste en dividir o en restar cada dato con el valor minimo y a esta operación se le divide con la resta del valor máximo con el minimo. Esto permite que los resultados varien solo entre 0 y 1
\[ X_{norm}=\frac{\left(X_i-X_{\min }\right)}{X_{\max }-X_{\min }} \]
Método 1:
G2_normal <- (d3$G2 - min(d3$G2))/(max(d3$G2) - min(d3$G2))
head(G2_normal, 10)
## [1] 0.5789474 0.5789474 0.6842105 0.7368421 0.6842105 0.6315789 0.6315789
## [8] 0.6842105 0.8421053 0.6315789
Método 2:
library(scales)
##
## Attaching package: 'scales'
## The following objects are masked from 'package:psych':
##
## alpha, rescale
## The following object is masked from 'package:epiDisplay':
##
## alpha
res_G2 <- rescale(d3$G2)
head(res_G2, 10)
## [1] 0.5789474 0.5789474 0.6842105 0.7368421 0.6842105 0.6315789 0.6315789
## [8] 0.6842105 0.8421053 0.6315789
Aplicando a todo el caso (var cuantitativas) La función rescale solo permite aplicarse a vectores, no es posible directamente aplicar al data frame.
library(ggplot2)
library(caret)
pre_procesamiento <- preProcess(d3[,30:33]) # Asi por defecto muestra la estandarización Z
head(predict(pre_procesamiento, d3[,30:33]), 10)
## absences G1 G2 G3
## 1 -0.07002653 -3.75867277 -0.07493554 -0.0884792
## 2 -0.39208686 -0.74197427 -0.07493554 -0.0884792
## 3 0.25203380 0.26359190 0.53387929 0.1702667
## 4 -0.71414719 0.93396934 0.83828671 0.6877585
## 5 -0.71414719 -0.07159682 0.53387929 0.4290126
## 6 0.25203380 0.26359190 0.22947188 0.4290126
## 7 -0.71414719 0.59878062 0.22947188 0.4290126
## 8 -0.39208686 -0.40678555 0.53387929 0.4290126
## 9 -0.71414719 1.26915806 1.44710154 1.4639961
## 10 -0.71414719 0.26359190 0.22947188 0.4290126
pre_procesamiento <- preProcess(d3[,30:33], method = "range")
head(predict(pre_procesamiento, d3[,30:33]), 10)
## absences G1 G2 G3
## 1 0.05333333 0.0000000 0.5789474 0.55
## 2 0.02666667 0.4736842 0.5789474 0.55
## 3 0.08000000 0.6315789 0.6842105 0.60
## 4 0.00000000 0.7368421 0.7368421 0.70
## 5 0.00000000 0.5789474 0.6842105 0.65
## 6 0.08000000 0.6315789 0.6315789 0.65
## 7 0.00000000 0.6842105 0.6315789 0.65
## 8 0.02666667 0.5263158 0.6842105 0.65
## 9 0.00000000 0.7894737 0.8421053 0.85
## 10 0.00000000 0.6315789 0.6315789 0.65
Objetivo:
Probar que existe relación lineal entre el tiempo de estudio semanal, Número de fracasos en clases pasadas y las calificaciones finales, y Analizar/predecir como el tiempo de estudio, y el numero de fracasos, afectan en las calificaciones finales. Se identificaron las siguientes variables:
Se desea realizar un modelo de regresión, de tal manera que permita predecir eventos futuros
Pasos para construir un modelo de regresión:
Paso 1: Determinar las variables X,Y
Paso 2: Evaluar la relación entre variables (Correlación) graficamente, para ello se realiza:
Diagrama de dispersión de studytime(Tiempo de estudio) con G3(Calificacion Final)
# Gráfico con plot
plot(x=d3$studytime,y=d3$G3)
Interpretación 1: Según los resultados entre studytime y G3, Se observa que no hay correlación.
Diagrama de dispersión de failures(número de fracasos en clases pasadas) con G3(Calificacion Final)
# Gráfico con plot
plot(x=d3$failures,y=d3$G3)
# Gráfico con pairs
pairs(d3[, c("failures", "G3")])
Interpretación 2: Según los resultados, hay una correlación lineal negativa entre failures (número de fracasos) y G3 (Calificacion Final).
Coeficiente de correlación
# Mediante la función cor
## studytime y G3
cor(d3[, c("studytime", "G3")]) # Matriz de correlaciones
## studytime G3
## studytime 1.0000000 0.1616289
## G3 0.1616289 1.0000000
## failures y G3
cor(d3[, c("failures", "G3")]) # Matriz de correlaciones
## failures G3
## failures 1.0000000 -0.3831453
## G3 -0.3831453 1.0000000
Coeficiente de correlación:
r1 = 0.1616289
r2 = -0.3831453
Interpretación 1: Existe correlación positiva muy baja entre studytime y G3.
Interpretación 2: Existe correlación negativa baja entre failures y G3.
(Recordar: Si el r es menor que 0.35 para algunos autores, no es viable la regresión, para otros autores se debe probar hipótesis)
Como en el segundo caso el coeficiente de correlación es superior a 0.35, se realizara la regresión, ya que es mas viable.
Paso 3: Regresión
Modelo general
\(\hat{Y} = b_0 + b_1X\)
Modelo para el caso: \(\hat{G3} = b_0 + b_1
failures\)
Para obtener el modelo, se va a utilizar una función de R > lm
# lm, notación: Y ~ X, data=
modelo1 <- lm(G3 ~ failures, data=d3)
# Resumen de resultados
summary(modelo1)
##
## Call:
## lm(formula = G3 ~ failures, data = d3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.9386 -1.9386 0.0614 2.0614 8.3182
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11.9386 0.1192 100.17 <2e-16 ***
## failures -2.2568 0.1685 -13.39 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.572 on 1042 degrees of freedom
## Multiple R-squared: 0.1468, Adjusted R-squared: 0.146
## F-statistic: 179.3 on 1 and 1042 DF, p-value: < 2.2e-16
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11.9386 0.1192 100.17 <2e-16 ***
## failures -2.2568 0.1685 -13.39 <2e-16 ***
## ---
## Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##
## Residual standard error: 3.572 on 1042 degrees of freedom
## Multiple R-squared: 0.1468, Adjusted R-squared: 0.146
## F-statistic: 179.3 on 1 and 1042 DF, p-value: < 2.2e-16
Modelo final con los resultados:
Modelo general
\(\hat{Y} = 11.9386 -2.2568X\)
Modelo para el caso:
\(\hat{G3} = 11.9386 -2.2568
failures\)
Visualizamos la recta de ajuste
plot(d3$failures, d3$G3)
abline(modelo1,lwd=3,col="red")
Predicciones: Para predecir se utiliza el modelo ajustado y se
reemplaza x por el valor solicitado Por ejemplo, si las failures(numero
de fracasos) fuese de 2 ¿Cuánto seria la Calificación final en
promedio?
\(\hat{G3} = 11.9386 -2.2568
(2)\)
\(\hat{G3} = 7,425\)
El valor predicho para la Calificación final seria de 7,425.
Mostramos los gráficos de los resultados
par(mfrow=c(2,2))
plot(modelo1)
La regresión lineal múltiple generaliza el modelo de regresión lineal simple al permitir muchos regresores en una función media. Comenzamos agregando solo un regresor a la función media de regresión simple porque las ideas se generalizan al agregar muchos regresores.
El modelo de regresión lineal múltiple El modelo general de regresión lineal múltiple con respuesta \(Y\) y regresores \(X_1\); . . . ;\(X_p\) tendrá la forma:
\(\hat{Y} = β_o + β_1x_1 + β_2x_2 + ... +
β_px_p + ∈\)
Ajustamos el modelo de regresión
modelo2 <- lm(G3 ~ failures + studytime, data=d3)
modelo2
##
## Call:
## lm(formula = G3 ~ failures + studytime, data = d3)
##
## Coefficients:
## (Intercept) failures studytime
## 10.9477 -2.1620 0.4902
##Coefficients:
##(Intercept) failures studytime
## 10.9477 -2.1620 0.4902
Se muestran los coeficientes, por lo tanto, si el modelo fuera válido sería:
\(\hat{Y} = 10.9477 - 2.1620x_1 +
0.4902x_2\)
Significación global del modelo
La significancia se determinará utilizando el estadístico F
El valor podemos obtenerlo Mostranso un resumen del modelo (summary)
summary(modelo2)
##
## Call:
## lm(formula = G3 ~ failures + studytime, data = d3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.9085 -1.5150 0.0915 2.2340 8.7242
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10.9477 0.2944 37.191 < 2e-16 ***
## failures -2.1620 0.1695 -12.754 < 2e-16 ***
## studytime 0.4902 0.1333 3.677 0.000248 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.55 on 1041 degrees of freedom
## Multiple R-squared: 0.1577, Adjusted R-squared: 0.1561
## F-statistic: 97.48 on 2 and 1041 DF, p-value: < 2.2e-16
El valor del estadístico F es F-statistic: 97.48
Su p-value: < 2.2e-16 < 0.05 esto quiere decir que se rechaza ho
Modelo ajustado
El modelo ajustado aplicando el MMCO (Método de Mínimos Cuadrados Ordinarios) seria:
\(\hat{Y} = β_0 + β_1x_1 + β_2x_2 + ... +
β_px_p + ε\)
Donde:
\(Y\) es la variable dependiente.
\(X_0,X_1,...,X_p\) son las variables independientes.
\(β_0,β_1,...,β_p\) son los Coeficientes a estimar.
La regresión logística es un tipo de modelo de regresión utilizado para predecir la probabilidad de que una variable dependiente binaria tome uno de dos valores posibles (generalmente 0 o 1). La función logística se utiliza para transformar una combinación lineal de variables predictoras en una probabilidad entre 0 y 1.
Preparación de los datos:
Asegúrate de tener un conjunto de datos que incluya la variable dependiente binaria (por ejemplo, 0 o 1) y las variables predictoras (en nuestro caso seran failures y studytime).
#Agregamos la linea aprobacion en la database
#Si su Calificacion final es mayor a 10 estonces esta aprobado, y toma el valor de 1, de lo contrario toma el valor de 0 (desaprobado).
d3$aprobacion <- ifelse(d3$G3 >=10, 1, 0)
head(d3$aprobacion, 10)
## [1] 1 1 1 1 1 1 1 1 1 1
Ajuste de modelo:
Utilizamos la función glm para ajustar un modelo de regresión logística.
# Análisis de regresión logística
modelo_logistico <- glm(aprobacion ~ failures + studytime, data = d3, family = "binomial")
#Mostramos un resumen del modelo
summary(modelo_logistico)
##
## Call:
## glm(formula = aprobacion ~ failures + studytime, family = "binomial",
## data = d3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.2749 0.2158 5.909 3.45e-09 ***
## failures -1.1135 0.1184 -9.408 < 2e-16 ***
## studytime 0.1941 0.1018 1.908 0.0565 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1100.99 on 1043 degrees of freedom
## Residual deviance: 979.84 on 1041 degrees of freedom
## AIC: 985.84
##
## Number of Fisher Scoring iterations: 4
Coeficientes del Modelo:
Intercept: 1.2749 (p < 0.001)
failures: -1.1135 (p < 0.001)
studytime: 0.1941 (p = 0.0565)
Interpretación de Coeficientes:
El intercepto indica que cuando todas las variables predictoras son cero, las odds de aprobación son aproximadamente 3.57 veces mayores.
Por cada aumento en el número de fracasos (failures), las odds(posibilidades) de aprobación disminuyen en aproximadamente un 32.8%.
Aunque la relación no es estadísticamente significativa, un aumento en el tiempo de estudio semanal (studytime) tiende a asociarse con un aumento en las odds(posibilidades) de aprobación.
Estadísticas de Ajuste:
Devianza Nula: 1100.99 (grados de libertad: 1043)
Devianza Residual: 979.84 (grados de libertad: 1041)
AIC: 985.84
Resultados:
Número de Fracasos: Tener mucho fracasos hace que sea más difícil aprobar.
Tiempo de Estudio Semanal: alparecer en este estudio no tiene mucha importancia cuánto tiempo estudies; hay otros factores que son más importantes.
Basado en el análisis realizado, se extraen las siguientes conclusiones clave:
El análisis resalta la presencia significativa de apoyo educativo adicional (schoolsup), clases extra pagadas (paid) y apoyo educativo familiar(famsup), sugiriendo que los estudiantes de estas instituciones tienen recursos adicionales y oportunidades de aprendizaje más allá del plan de estudios estándar.
A pesar de la disponibilidad de recursos adicionales, es notable que las calificaciones finales de los estudiantes son consistentemente bajas, con una moda de 10 y una predicción promedio de 7.425. Este hallazgo plantea la necesidad de una exploración más profunda para comprender las posibles razones detrás de este fenómeno y tomar medidas correctivas.
La relación negativa entre el número de fracasos académicos (failures) y las calificaciones finales resalta mucho, ya que tener muchos fracasos hace que a los estudiantes les sea más difícil aprobar.
El tiempo de estudio semanal (studytime) no muestra una correlación estadísticamente significativa con las calificaciones finales. Esto sugiere que, aunque el estudio es fundamental, existen otros factores que también influyen en el rendimiento académico y merecen una atención más detallada.
Con base en las conclusiones anteriores, se formulan las siguientes recomendaciones:
Optimizar Utilización de Recursos:
Investigación Detallada sobre Bajas Calificaciones:
Establecer Estrategias de Acompañamiento: