Inicialmente se cargan los datos
library(readr)
datos <- read_csv("student-mat.csv", show_col_types = FALSE)
RESUMEN ESTADISTICO
summary(datos)
## school sex age address
## Length:395 Length:395 Min. :15.0 Length:395
## Class :character Class :character 1st Qu.:16.0 Class :character
## Mode :character Mode :character Median :17.0 Mode :character
## Mean :16.7
## 3rd Qu.:18.0
## Max. :22.0
## famsize Pstatus Medu Fedu
## Length:395 Length:395 Min. :0.000 Min. :0.000
## Class :character Class :character 1st Qu.:2.000 1st Qu.:2.000
## Mode :character Mode :character Median :3.000 Median :2.000
## Mean :2.749 Mean :2.522
## 3rd Qu.:4.000 3rd Qu.:3.000
## Max. :4.000 Max. :4.000
## Mjob Fjob reason guardian
## Length:395 Length:395 Length:395 Length:395
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## traveltime studytime failures schoolsup
## Min. :1.000 Min. :1.000 Min. :0.0000 Length:395
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:0.0000 Class :character
## Median :1.000 Median :2.000 Median :0.0000 Mode :character
## Mean :1.448 Mean :2.035 Mean :0.3342
## 3rd Qu.:2.000 3rd Qu.:2.000 3rd Qu.:0.0000
## Max. :4.000 Max. :4.000 Max. :3.0000
## famsup paid activities nursery
## Length:395 Length:395 Length:395 Length:395
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## higher internet romantic famrel
## Length:395 Length:395 Length:395 Min. :1.000
## Class :character Class :character Class :character 1st Qu.:4.000
## Mode :character Mode :character Mode :character Median :4.000
## Mean :3.944
## 3rd Qu.:5.000
## Max. :5.000
## freetime goout Dalc Walc
## Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:3.000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:1.000
## Median :3.000 Median :3.000 Median :1.000 Median :2.000
## Mean :3.235 Mean :3.109 Mean :1.481 Mean :2.291
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:2.000 3rd Qu.:3.000
## Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
## health absences G1 G2
## Min. :1.000 Min. : 0.000 Min. : 3.00 Min. : 0.00
## 1st Qu.:3.000 1st Qu.: 0.000 1st Qu.: 8.00 1st Qu.: 9.00
## Median :4.000 Median : 4.000 Median :11.00 Median :11.00
## Mean :3.554 Mean : 5.709 Mean :10.91 Mean :10.71
## 3rd Qu.:5.000 3rd Qu.: 8.000 3rd Qu.:13.00 3rd Qu.:13.00
## Max. :5.000 Max. :75.000 Max. :19.00 Max. :19.00
## G3
## Min. : 0.00
## 1st Qu.: 8.00
## Median :11.00
## Mean :10.42
## 3rd Qu.:14.00
## Max. :20.00
La función anterior proporciona un resumen estadístico de las variables en mi conjunto de datos, incluyendo medidas como el mínimo, el primer cuartil, la mediana, la media, el tercer cuartil y el máximo para mis variables numéricas. Al analizar el resumen estadistico nos damos cuenta que hay 395 datos con 33 variables, de las cuales 17 son de tipo categoricas y 16 son numericas,a su vez se dice que para G3 (nota final) la media (10.42) y la mediana (11) están cerca una de la otra y más allá del punto medio de la escala de calificación (que sería 10 en una escala de 0 a 20). Esto sugiere que, en promedio, los estudiantes tienden a obtener calificaciones ligeramente superiores a la mitad de la escala de calificación.
RESUMEN DE LA VARIABLE DE INTERES
summary(datos$G3)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 8.00 11.00 10.42 14.00 20.00
Teniendo en cuenta el resultado anterior se concluye por medio de la mediana que el 50% de los estudiantes obtuvieron notas de 11 o menos, la media indica que la nota promedio es 10.42. Esto es un indicador del rendimiento general del grupo y el tercer cuartil indica que el 75% de las notas son iguales o inferiores a 14.00. Esto significa que el 25% de los estudiantes obtuvo notas entre 11 y 14. Teniendo en cuenta que la nota minima es 0 y la maxima 20.
ANALISIS DE DATOS FALTANTES
suppressMessages(library(tidyverse))
library(naniar)
# Resumen de datos faltantes
vis_miss(datos)
Es importante verificar la presencia de datos faltantes para entender la integridad y calidad del conjunto de datos, en este caso la grafica muestra un present del 100% lo que quiere decir que mis datos estan completos.
VARIABLES NUMERICAS
columnas_numericas <- sapply(datos, is.numeric)
nombres_numericos <- names(datos)[columnas_numericas]
print(nombres_numericos)
## [1] "age" "Medu" "Fedu" "traveltime" "studytime"
## [6] "failures" "famrel" "freetime" "goout" "Dalc"
## [11] "Walc" "health" "absences" "G1" "G2"
## [16] "G3"
VARIABLES CATEGORICAS
columnas_categoricas <- sapply(datos, function(x) is.factor(x) || is.character(x))
nombres_categoricos <- names(datos)[columnas_categoricas]
print(nombres_categoricos)
## [1] "school" "sex" "address" "famsize" "Pstatus"
## [6] "Mjob" "Fjob" "reason" "guardian" "schoolsup"
## [11] "famsup" "paid" "activities" "nursery" "higher"
## [16] "internet" "romantic"
DIAGRAMA DE DISPERSION DE age VS G3
ggplot(datos, aes(y = G3, x = age))+
geom_point(aes(color=G3), alpha = 1.9) +
labs(x="Edad", y="Nota final", fill= "")+
#guides(fill=FALSE)+ #Etiquetas
facet_wrap(. ~ "Diagrama de dispersión") + #Título
theme(legend.position = "none") +
theme_bw(base_size = 12)
El diagrama de dispersion anterior presenta una comparacion de la edad respecto a la nota final de los estudiantes, por lo que al observar concluimos que los estudiantes mayores de 20 años obtuvieron una nota por debajo de 10 lo que quiere decir que poseen un bajo rendimiento y tambien se puede considerar que hubieron estudiantes entre las edades de 15 a 18 años que obtuvieron una nota final superior de 20. Resumiendo,para este estudio, la edad de los estudiantes influye en el rendimiento academico, es decir que a mayor edad el estudiante obtienen notas bajas
DIAGRAMA DE DISPERSION JUNTO CON DIAGRAMA DE CAJAS Y BIGOTES
install.packages("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
library(ggplot2)
ggplot(datos, aes(y = G3, x = sex))+
geom_boxplot(aes(fill= G3),color="black",size = .75) +
geom_jitter(alpha = .9, aes(color=G3)) +
labs(x="sexo", y="Nota final", fill= "")+
#guides(fill=FALSE)+ #Etiquetas
scale_fill_manual(values = c("wheat", "yellow"))+ #Cambiar los colores
facet_wrap(. ~ "Diagramas de dispersión y de caja y bigotes ") + #Título
theme() +
theme_bw(base_size = 12) +
theme(axis.text.x = element_text(angle = 0, hjust = 1, vjust = 1))
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
## the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
## variable into a factor?
El gráfico permite comparar la distribución de las notas finales (G3) entre el sexo femenino y masculino. Las cajas muestran la mediana, los cuartiles y los valores atípicos, lo que puede indicar diferencias en el rendimiento o en la variabilidad de las notas entre los dos sexos.La mediana más alta para los hombres sugiere que, en términos de rendimiento académico medio (según la nota final), los hombres tienden a tener un rendimiento superior al de las mujeres en mi conjunto de datos.
GRAFICO DE DISPERSION (NOTA FINAL-SEXO-HORAS DE ESTUDIO)
ggplot(data=datos, aes(x=sex, y=G3, colour=studytime)) +
geom_point(aes(colour = studytime)) +
stat_smooth(method=lm, se=FALSE)
## `geom_smooth()` using formula = 'y ~ x'
Teniendo en cuenta el grafico anterior podemos concluir que los jovenes a diferencia de las niñas tuvieron mejor rendimiento y que el dedicarle tiempo a los estudios a la semana en el tiempo libre influye de manera positiva en el rendimiento del estudiante, ya que en el grafico se puede observar que los que dedicaron mas de 3 horas de estudio a la semana obtuvieron una nota final superior, en este caso en los varones que se obtubo una nota de 20.
GRAFICO EN FACETAS (ESCUELA GP(PUBLICA) Y ESCUELA MS(PRIVADA))
ggplot(data=datos, mapping = aes(x=G3, y=age)) +
geom_point() + facet_wrap(~school) + geom_smooth(method=loess, se=TRUE)
## `geom_smooth()` using formula = 'y ~ x'
El grafico anterior nos muestra un grafico dividido en 2 facetas, la primera es la escuela publica GP y la segunda la escuela privada MS haciendo las comparaciones de la nota final con base en la edad de los estudiantes.Al hacer la respectiva visualizacion concluimos que en la escuela privada los estudiantes estan en edades entre los 17 y 21 años a diferencia que en la escuela publica que tiene el max en edad de estudiante que es de 22 años y posee estudiantes a partir de los 15 que es el min en edad. Tambien se logra identificar que la escuela publica posee mayor numero de estudiantes que la privada por eso es que se muestra la mayor concentracion de puntos en la faceta 1. Haciendo la comparacion con base en la nota final determinamos que para la escuela privada la mayor concentracion de estudiantes con edad de 18 años saco una nota final entre 5 y 16 y en la publica la mayor concentracion de los estudiantes saco una nota final entre 5 y 19, lo que quiere decir que en las escuelas publicas hay mejor rendimiento.
TRAMAS DE VIOLIN-RELACION ROMANTICA VS NOTA FINAL
library(fun)
ggplot(data=datos, mapping = aes(x=romantic, y=G3)) +
geom_violin() + geom_jitter(height = 0, width = 0.1) +
stat_summary(fun.y=median, geom="point", size=3, color="red") +
stat_summary(fun.y=mean, geom="point", size=3, color="green")
## Warning: The `fun.y` argument of `stat_summary()` is deprecated as of ggplot2 3.3.0.
## ℹ Please use the `fun` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
El grafico anterior muestra la densidad de probabilidad, como podemos ver las areas mas gruesas indican una mayor probabilidad, teniendo en cuenta lo anterior concluimos que cuando los estudiantes no estan en una relacion amorosa poseen un mejor rendimiento academico a diferencia de los que si se encuentran en una relacion amorosa. y que para los que no estan en una relacion la media y la mediana equivalen aproximadamente a 11 lo que quiere decir que la probabilidad de que un estudiante no tenga una relacion amorosa y obtenga una nota de 11 aproximadamente es bastante alta. Al estar casi juntas la media y la mediana eso quiere decir que se esta acercando a la simetria y que es poco probale que exista sesgo
VALORES ATIPICOS
AGE
boxplot.stats(datos$age)$out
## [1] 22
out <- boxplot.stats(datos$age)$out
out_ind <- which(datos$age %in% c(out))
out_ind
## [1] 248
datos[out_ind, ]
boxplot(datos$age,
ylab = "age",
main = "Boxplot para la edad"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
Podemos identificar que la mayor concentracion de los datos estan entre 16 y 18 años y que el valor atipico son los estudiantes con edad de 22 años.
MATRIX DE CORRELACION
# Seleccionar solo columnas numéricas
datos_numericos <- datos[sapply(datos, is.numeric)]
# Calcular la matriz de correlación con solo datos numéricos
matriz_correlacion <- cor(datos_numericos, use = "complete.obs")
matriz_correlacion
## age Medu Fedu traveltime studytime
## age 1.000000000 -0.163658419 -0.163438069 0.070640721 -0.004140037
## Medu -0.163658419 1.000000000 0.623455112 -0.171639305 0.064944137
## Fedu -0.163438069 0.623455112 1.000000000 -0.158194054 -0.009174639
## traveltime 0.070640721 -0.171639305 -0.158194054 1.000000000 -0.100909119
## studytime -0.004140037 0.064944137 -0.009174639 -0.100909119 1.000000000
## failures 0.243665377 -0.236679963 -0.250408444 0.092238746 -0.173563031
## famrel 0.053940096 -0.003914458 -0.001369727 -0.016807986 0.039730704
## freetime 0.016434389 0.030890867 -0.012845528 -0.017024944 -0.143198407
## goout 0.126963880 0.064094438 0.043104668 0.028539674 -0.063903675
## Dalc 0.131124605 0.019834099 0.002386429 0.138325309 -0.196019263
## Walc 0.117276052 -0.047123460 -0.012631018 0.134115752 -0.253784731
## health -0.062187369 -0.046877829 0.014741537 0.007500606 -0.075615863
## absences 0.175230079 0.100284818 0.024472887 -0.012943775 -0.062700175
## G1 -0.064081497 0.205340997 0.190269936 -0.093039992 0.160611915
## G2 -0.143474049 0.215527168 0.164893393 -0.153197963 0.135879999
## G3 -0.161579438 0.217147496 0.152456939 -0.117142053 0.097819690
## failures famrel freetime goout Dalc
## age 0.24366538 0.053940096 0.01643439 0.126963880 0.131124605
## Medu -0.23667996 -0.003914458 0.03089087 0.064094438 0.019834099
## Fedu -0.25040844 -0.001369727 -0.01284553 0.043104668 0.002386429
## traveltime 0.09223875 -0.016807986 -0.01702494 0.028539674 0.138325309
## studytime -0.17356303 0.039730704 -0.14319841 -0.063903675 -0.196019263
## failures 1.00000000 -0.044336626 0.09198747 0.124560922 0.136046931
## famrel -0.04433663 1.000000000 0.15070144 0.064568411 -0.077594357
## freetime 0.09198747 0.150701444 1.00000000 0.285018715 0.209000848
## goout 0.12456092 0.064568411 0.28501871 1.000000000 0.266993848
## Dalc 0.13604693 -0.077594357 0.20900085 0.266993848 1.000000000
## Walc 0.14196203 -0.113397308 0.14782181 0.420385745 0.647544230
## health 0.06582728 0.094055728 0.07573336 -0.009577254 0.077179582
## absences 0.06372583 -0.044354095 -0.05807792 0.044302220 0.111908026
## G1 -0.35471761 0.022168316 0.01261293 -0.149103967 -0.094158792
## G2 -0.35589563 -0.018281347 -0.01377714 -0.162250034 -0.064120183
## G3 -0.36041494 0.051363429 0.01130724 -0.132791474 -0.054660041
## Walc health absences G1 G2
## age 0.11727605 -0.062187369 0.17523008 -0.06408150 -0.14347405
## Medu -0.04712346 -0.046877829 0.10028482 0.20534100 0.21552717
## Fedu -0.01263102 0.014741537 0.02447289 0.19026994 0.16489339
## traveltime 0.13411575 0.007500606 -0.01294378 -0.09303999 -0.15319796
## studytime -0.25378473 -0.075615863 -0.06270018 0.16061192 0.13588000
## failures 0.14196203 0.065827282 0.06372583 -0.35471761 -0.35589563
## famrel -0.11339731 0.094055728 -0.04435409 0.02216832 -0.01828135
## freetime 0.14782181 0.075733357 -0.05807792 0.01261293 -0.01377714
## goout 0.42038575 -0.009577254 0.04430222 -0.14910397 -0.16225003
## Dalc 0.64754423 0.077179582 0.11190803 -0.09415879 -0.06412018
## Walc 1.00000000 0.092476317 0.13629110 -0.12617921 -0.08492735
## health 0.09247632 1.000000000 -0.02993671 -0.07317207 -0.09771987
## absences 0.13629110 -0.029936711 1.00000000 -0.03100290 -0.03177670
## G1 -0.12617921 -0.073172073 -0.03100290 1.00000000 0.85211807
## G2 -0.08492735 -0.097719866 -0.03177670 0.85211807 1.00000000
## G3 -0.05193932 -0.061334605 0.03424732 0.80146793 0.90486799
## G3
## age -0.16157944
## Medu 0.21714750
## Fedu 0.15245694
## traveltime -0.11714205
## studytime 0.09781969
## failures -0.36041494
## famrel 0.05136343
## freetime 0.01130724
## goout -0.13279147
## Dalc -0.05466004
## Walc -0.05193932
## health -0.06133460
## absences 0.03424732
## G1 0.80146793
## G2 0.90486799
## G3 1.00000000
Teniendo en cuenta la matrix anteor nos damos cuenta que las variables que estan fuertemente correlacionas con mi variable de interes que es G3 son G1 y G2, es decir que la probabilidad de que apruebes los periodos anteriores y obtengas una buena nota final es alta
PRUEBAS DE NORMALIDAD
shapiro_test <- shapiro.test(datos$G3)
print(shapiro_test)
##
## Shapiro-Wilk normality test
##
## data: datos$G3
## W = 0.92873, p-value = 8.836e-13
El resultado de la prueba de normalidad anteriormente planeada indica que como el p valor es sumamente pequeño a 0.05 se rechaza la hipotesis nula, lo que quiere decir que la nota final de mi conjunto de datos no sigue una distribucion normal
GRAFICO
# Gráfico Q-Q
qqnorm(datos$G3)
qqline(datos$G3, col = "purple")
library(TSstudio)
class(datos)
## [1] "spec_tbl_df" "tbl_df" "tbl" "data.frame"
str(datos)
## spc_tbl_ [395 × 33] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ school : chr [1:395] "GP" "GP" "GP" "GP" ...
## $ sex : chr [1:395] "F" "F" "F" "F" ...
## $ age : num [1:395] 18 17 15 15 16 16 16 17 15 15 ...
## $ address : chr [1:395] "U" "U" "U" "U" ...
## $ famsize : chr [1:395] "GT3" "GT3" "LE3" "GT3" ...
## $ Pstatus : chr [1:395] "A" "T" "T" "T" ...
## $ Medu : num [1:395] 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : num [1:395] 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : chr [1:395] "at_home" "at_home" "at_home" "health" ...
## $ Fjob : chr [1:395] "teacher" "other" "other" "services" ...
## $ reason : chr [1:395] "course" "course" "other" "home" ...
## $ guardian : chr [1:395] "mother" "father" "mother" "mother" ...
## $ traveltime: num [1:395] 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : num [1:395] 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : num [1:395] 0 0 3 0 0 0 0 0 0 0 ...
## $ schoolsup : chr [1:395] "yes" "no" "yes" "no" ...
## $ famsup : chr [1:395] "no" "yes" "no" "yes" ...
## $ paid : chr [1:395] "no" "no" "yes" "yes" ...
## $ activities: chr [1:395] "no" "no" "no" "yes" ...
## $ nursery : chr [1:395] "yes" "no" "yes" "yes" ...
## $ higher : chr [1:395] "yes" "yes" "yes" "yes" ...
## $ internet : chr [1:395] "no" "yes" "yes" "yes" ...
## $ romantic : chr [1:395] "no" "no" "no" "yes" ...
## $ famrel : num [1:395] 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : num [1:395] 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : num [1:395] 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : num [1:395] 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : num [1:395] 1 1 3 1 2 2 1 1 1 1 ...
## $ health : num [1:395] 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : num [1:395] 6 4 10 2 4 10 0 6 0 0 ...
## $ G1 : num [1:395] 5 5 7 15 6 15 12 6 16 14 ...
## $ G2 : num [1:395] 6 5 8 14 10 15 12 5 18 15 ...
## $ G3 : num [1:395] 6 6 10 15 10 15 11 6 19 15 ...
## - attr(*, "spec")=
## .. cols(
## .. school = col_character(),
## .. sex = col_character(),
## .. age = col_double(),
## .. address = col_character(),
## .. famsize = col_character(),
## .. Pstatus = col_character(),
## .. Medu = col_double(),
## .. Fedu = col_double(),
## .. Mjob = col_character(),
## .. Fjob = col_character(),
## .. reason = col_character(),
## .. guardian = col_character(),
## .. traveltime = col_double(),
## .. studytime = col_double(),
## .. failures = col_double(),
## .. schoolsup = col_character(),
## .. famsup = col_character(),
## .. paid = col_character(),
## .. activities = col_character(),
## .. nursery = col_character(),
## .. higher = col_character(),
## .. internet = col_character(),
## .. romantic = col_character(),
## .. famrel = col_double(),
## .. freetime = col_double(),
## .. goout = col_double(),
## .. Dalc = col_double(),
## .. Walc = col_double(),
## .. health = col_double(),
## .. absences = col_double(),
## .. G1 = col_double(),
## .. G2 = col_double(),
## .. G3 = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
No se puede aplicar series temporales porque mis datos no contienen columnas de fecha