Primero, importamos todas las librerías que vamos a usar a lo largo de la realización de este proyecto:
if (!require('RColorBrewer')) install.packages('RColorBrewer')
if (!require('corrplot')) install.packages('corrplot')
if (!require('GGally')) install.packages('GGally')
if (!require('moments')) install.packages('moments')
if (!require('fitdistrplus')) install.packages('fitdistrplus')
if (!require('tidyverse')) install.packages('tidyverse')
if (!require('psych')) install.packages('psych')
if (!require('nortest')) install.packages('nortest')
library('RColorBrewer')
library('corrplot')
library('GGally')
library('moments')
library('fitdistrplus')
library('tidyverse')
library('dplyr')
library('tidyselect')
Aviso: package ‘tidyselect’ was built under R version 4.4.3
library('psych')
library('nortest')
Luego, importamos la base de datos como un dataframe, cabe aclarar que revisamos la clase del dataframe. Esto nos ayudará a verificar que la base se haya cargado correctamente, porque en caso de no haberse cargado, aparecerá como “function”:
datos_u <- data
class(datos_u)
[1] "tbl_df" "tbl" "data.frame"
Inicialmente hacemos el análisis de variables categóricas, para ello crearemos una variable aparte y ajustaremos sus tipos de datos:
base_cate <- datos_u %>%
dplyr::select(-`Previous qualification (grade)`,
-`Mother's qualification`,
-`Father's qualification`,
-`Mother's occupation`,
-`Father's occupation`,
-`Admission grade`,
-`Age at enrollment`,
-`Curricular units 1st sem (credited)`,
-`Curricular units 1st sem (enrolled)`,
-`Curricular units 1st sem (evaluations)`,
-`Curricular units 1st sem (approved)`,
-`Curricular units 1st sem (grade)`,
-`Curricular units 1st sem (without evaluations)`,
-`Curricular units 2nd sem (credited)`,
-`Curricular units 2nd sem (enrolled)`,
-`Curricular units 2nd sem (evaluations)`,
-`Curricular units 2nd sem (approved)`,
-`Curricular units 2nd sem (grade)`,
-`Curricular units 2nd sem (without evaluations)`,
-`Unemployment rate`,
-`Inflation rate`,
-`GDP`) %>%
glimpse()
Rows: 4,424
Columns: 15
$ `Marital status` <dbl> 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ `Application mode` <dbl> 17, 15, 1, 17, 39, 39, 1, 18, 1, 1, 1, 1, 1, 53, …
$ `Application order` <dbl> 5, 1, 5, 2, 1, 1, 1, 4, 3, 1, 1, 1, 2, 1, 1, 1, 1…
$ Course <dbl> 171, 9254, 9070, 9773, 8014, 9991, 9500, 9254, 92…
$ `Daytime/evening attendance` <dbl> 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
$ `Previous qualification` <dbl> 1, 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, 1, 1, 42, 1, 1,…
$ Nacionality <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 62, 1, 1, 1, 1, 1, 1, 1, …
$ Displaced <dbl> 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1…
$ `Educational special needs` <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ Debtor <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0…
$ `Tuition fees up to date` <dbl> 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1…
$ Gender <dbl> 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0…
$ `Scholarship holder` <dbl> 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0…
$ International <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0…
$ Target <chr> "Dropout", "Graduate", "Dropout", "Graduate", "Gr…
# Análisis Descriptivo: ----
# Univariadas: ----
base_cate <- base_cate %>%
mutate(across(c(`Application mode`,
`Application order`,
`Course`,
`Daytime/evening attendance`,
`Previous qualification`,
`Nacionality`,
`Displaced`,
`Educational special needs`,
`Debtor`,
`Tuition fees up to date`,
`Gender`,
`Scholarship holder`,
`International`,
`Marital status`,
`Target`), as.factor))
Construimos las tablas de frecuencia y sus respectivas gráficas. Para esto usaremos las siguientes funciones:
tabla_frec <- function(columna) {
tabla <- table(base_cate[[columna]])
return(prop.table(tabla))
}
grafica <- function(columna){
base_cate %>%
ggplot(aes(x = .data[[columna]])) +
geom_bar(color = "black", fill = "purple") +
ggtitle(paste("Diagrama de barras de", columna)) +
labs(x = columna, y = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 30, size = 8))
}
tabla_grafica <- function(columna){
print(tabla_frec(columna))
grafica(columna)
}
Ejecutamos cada uno de los análisis que se obtuvieron desde las gráficas:
tabla_grafica("Marital status")
1 2 3 4 5 6
0.8858499096 0.0856690778 0.0009041591 0.0205696203 0.0056509946 0.0013562387
cat("Podemos notar que el 88.5849% de los estudiantes son solteros y tambien que
el 8.5669% son casados.\n")
Podemos notar que el 88.5849% de los estudiantes son solteros y tambien que
el 8.5669% son casados.
tabla_grafica("Course")
33 171 8014 9003 9070 9085 9119
0.002712477 0.048598553 0.048598553 0.047468354 0.051084991 0.076175407 0.038426763
9130 9147 9238 9254 9500 9556 9670
0.031871609 0.085895118 0.080244123 0.056962025 0.173146474 0.019439421 0.060578662
9773 9853 9991
0.074819168 0.043399638 0.060578662
cat("El curso con más porcentaje de inscripción es el 9500, el cual es
Enfermería, mientras que el que tiene menos, es el curso 33, el cual
Tecnologías de Producción de Biocombustibles.\n")
El curso con más porcentaje de inscripción es el 9500, el cual es
Enfermería, mientras que el que tiene menos, es el curso 33, el cual
Tecnologías de Producción de Biocombustibles.
tabla_grafica("Daytime/evening attendance")
0 1
0.1091772 0.8908228
cat("El 89.0822% de los estudiantes estudia de día, mientras que el 10.9177% de
noche.\n")
El 89.0822% de los estudiantes estudia de día, mientras que el 10.9177% de
noche.
tabla_grafica("Previous qualification")
1 2 3 4 5 6
0.8401898734 0.0051989150 0.0284810127 0.0018083183 0.0002260398 0.0036166365
9 10 12 14 15 19
0.0024864376 0.0009041591 0.0101717902 0.0002260398 0.0004520796 0.0366184448
38 39 40 42 43
0.0015822785 0.0495027125 0.0090415913 0.0081374322 0.0013562387
cat("El último título del 84.0189% de los estudiantes es la Escuela Secundaria,
mientras que el del 28.4810% es de Educación Superior.\n")
El último título del 84.0189% de los estudiantes es la Escuela Secundaria,
mientras que el del 28.4810% es de Educación Superior.
tabla_grafica("Nacionality")
1 2 6 11 13 14
0.9751356239 0.0004520796 0.0029385172 0.0006781193 0.0002260398 0.0002260398
17 21 22 24 25 26
0.0002260398 0.0004520796 0.0029385172 0.0011301989 0.0004520796 0.0031645570
32 41 62 100 101 103
0.0002260398 0.0085895118 0.0004520796 0.0006781193 0.0004520796 0.0006781193
105 108 109
0.0004520796 0.0002260398 0.0002260398
cat("El 97.5135% de los estudiantes es de Portugal, mientras que el porcentaje
de estudiantes colombianos es de 0,0226% :( \n")
El 97.5135% de los estudiantes es de Portugal, mientras que el porcentaje
de estudiantes colombianos es de 0,0226% :(
tabla_grafica("Displaced")
0 1
0.4516275 0.5483725
cat("El 54.8372% de los estudiantes son desplazados, lo cual llega ser un
porcentaje alto.\n")
El 54.8372% de los estudiantes son desplazados, lo cual llega ser un
porcentaje alto.
tabla_grafica("Debtor")
0 1
0.886302 0.113698
cat("Análisis")
Análisis
tabla_grafica("Tuition fees up to date")
0 1
0.119349 0.880651
cat("El 88.0651% de los estudiantes tienen su matrícula al día.\n")
El 88.0651% de los estudiantes tienen su matrícula al día.
tabla_grafica("Gender")
0 1
0.6482821 0.3517179
cat("Podemos evidenciar que el porcentaje de mujeres con respecto a hombres es
más alto, esto con un 64.8282% de estudiantes mujeres y un 35.1717% de
estudiantes hombres.\n")
Podemos evidenciar que el porcentaje de mujeres con respecto a hombres es
más alto, esto con un 64.8282% de estudiantes mujeres y un 35.1717% de
estudiantes hombres.
tabla_grafica("Scholarship holder")
0 1
0.7515823 0.2484177
cat("Logramos evidenciar que el porcentaje de estudiantes becados es muy bajo,
siendo sólo el 24.8417% estudiantes becados, mientras que el 75.1582% no son
becados.\n")
Logramos evidenciar que el porcentaje de estudiantes becados es muy bajo,
siendo sólo el 24.8417% estudiantes becados, mientras que el 75.1582% no son
becados.
tabla_grafica("International")
0 1
0.97513562 0.02486438
cat("Análisis")
Análisis
tabla_grafica("Target")
Dropout Enrolled Graduate
0.3212025 0.1794756 0.4993219
cat("El porcentaje de los estudiantes que se gradúan es el 49.9321%, mientras que
los que no logran graduarse es el 32.1202%.\n")
El porcentaje de los estudiantes que se gradúan es el 49.9321%, mientras que
los que no logran graduarse es el 32.1202%.
tabla_grafica("Educational special needs")
0 1
0.98847197 0.01152803
cat("EL porcentaje de estudiantes que necesitan Educación Especial es muy bajo,
con un 1.1528% de estudiantes.\n")
EL porcentaje de estudiantes que necesitan Educación Especial es muy bajo,
con un 1.1528% de estudiantes.
Ahora, haremos el análisis bivariado para cada una de las variables relevantes con respecto a Target(Estado del estudiante: Graduate, Dropout, Enrolled):
# Tablas de frecuencia y gráficos bivariados:---------
tabladoble <- function(columna1,columna2){
tabla2 <- table(base_cate[[columna1]],base_cate[[columna2]])
return(round(prop.table(tabla2),4))
}
# graficadoble <- function(columna1,columna2){
# grafica <- ggplot(base_cate,
# aes(x=base_cate[[columna1]],fill=base_cate[[columna2]]))+
# geom_bar()+theme_minimal()+
# theme(axis.text.x=element_text(angle=30,size=8))
# return(grafica)
# }
grafico_apilado <- function(variable1,variable2){
barras_target <- ggplot(base_cate, aes(x = .data[[variable1]], fill = .data[[variable2]])) +
geom_bar(position="fill")+ theme_minimal()+
theme(axis.text.x = element_text(angle=30, size=8))
return(barras_target)
}
TGO <- function(columna1,columna2){
print(tabladoble(columna1,columna2))
grafico_apilado(columna1,columna2)
}
TGO("Target","Nacionality")
1 2 6 11 13 14 17 21 22 24 25
Dropout 0.3140 0.0000 0.0009 0.0000 0.0000 0.0000 0.0002 0.0002 0.0009 0.0002 0.0000
Enrolled 0.1741 0.0000 0.0011 0.0000 0.0000 0.0000 0.0000 0.0002 0.0002 0.0000 0.0002
Graduate 0.4871 0.0005 0.0009 0.0007 0.0002 0.0002 0.0000 0.0000 0.0018 0.0009 0.0002
26 32 41 62 100 101 103 105 108 109
Dropout 0.0002 0.0000 0.0032 0.0000 0.0005 0.0002 0.0002 0.0002 0.0000 0.0002
Enrolled 0.0011 0.0002 0.0014 0.0002 0.0002 0.0000 0.0000 0.0002 0.0002 0.0000
Graduate 0.0018 0.0000 0.0041 0.0002 0.0000 0.0002 0.0005 0.0000 0.0000 0.0000
cat("Los estudiantes con más porcentaje de graduación son de Portugal con el
31.40%, entonces concuerda con que sea el país con más estudiantes. Ahora,
sin considerar a Portugal, el país con más porcentaje de graduación es
Brasil, con un 3.2% de graduados.\n")
Los estudiantes con más porcentaje de graduación son de Portugal con el
31.40%, entonces concuerda con que sea el país con más estudiantes. Ahora,
sin considerar a Portugal, el país con más porcentaje de graduación es
Brasil, con un 3.2% de graduados.
TGO("Target","Educational special needs")
0 1
Dropout 0.3174 0.0038
Enrolled 0.1770 0.0025
Graduate 0.4941 0.0052
cat("Podemos observar que los estudiantes que necesitan Educación Especial tienen
mayor porcentaje de deserción, con un 5.2%, mientras que su porcentaje de
graduación es del 3.8%.\n")
Podemos observar que los estudiantes que necesitan Educación Especial tienen
mayor porcentaje de deserción, con un 5.2%, mientras que su porcentaje de
graduación es del 3.8%.
TGO("Target","Gender")
0 1
Dropout 0.1627 0.1585
Enrolled 0.1101 0.0694
Graduate 0.3755 0.1239
cat("El porcentaje de hombres que no se gradúan, con un 15.85%, es mayor al
porcentaje de aquellos que se gradúan.\n")
El porcentaje de hombres que no se gradúan, con un 15.85%, es mayor al
porcentaje de aquellos que se gradúan.
TGO("Target","Tuition fees up to date")
0 1
Dropout 0.1033 0.2179
Enrolled 0.0095 0.1700
Graduate 0.0066 0.4928
cat("Los estudiantes que no están al día con su pago y tienden a no graduarse, es
del 10.33%.\n")
Los estudiantes que no están al día con su pago y tienden a no graduarse, es
del 10.33%.
TGO("Target","Daytime/evening attendance")
0 1
Dropout 0.0468 0.2744
Enrolled 0.0170 0.1625
Graduate 0.0454 0.4539
cat("Al ser el porcentaje de personas que estudian en la noche, es mucho más bajo
que aquellos que estudian de día, por lo tanto, no tiene mucho sentido
compararlos, sin embargo, el porcentaje de estudiantes que estudian en la
noche y se gradúan es levemente más pequeño que el porcentaje de aquellos que
no se gradúan.Así, vemos que el 4.54% se gradua y el 4.68% no se gradua.\n")
Al ser el porcentaje de personas que estudian en la noche, es mucho más bajo
que aquellos que estudian de día, por lo tanto, no tiene mucho sentido
compararlos, sin embargo, el porcentaje de estudiantes que estudian en la
noche y se gradúan es levemente más pequeño que el porcentaje de aquellos que
no se gradúan.Así, vemos que el 4.54% se gradua y el 4.68% no se gradua.
TGO("Target","Scholarship holder")
0 1
Dropout 0.2909 0.0303
Enrolled 0.1501 0.0294
Graduate 0.3106 0.1887
cat("El porcentaje de estudiantes becados que se gradúan, es mayor que aquellos
becados que no se gradúan. Esto con un 18.87% de becados graduados y un 3.03%
de becados no graduados.\n")
El porcentaje de estudiantes becados que se gradúan, es mayor que aquellos
becados que no se gradúan. Esto con un 18.87% de becados graduados y un 3.03%
de becados no graduados.
Hacemos lo mismo para las variables cualitativas. Para analizar las variables cuantitativas del conjunto de datos, implementamos varias funciones que nos permiten conocer cómo se comportan:
base_cuant <- datos_u %>%
dplyr::select(-`Marital status`,
-`Application mode`,
-`Application order`,
-`Course`,
-`Daytime/evening attendance`,
-`Previous qualification`,
-`Nacionality`,
-`Displaced`,
-`Educational special needs`,
-`Debtor`,
-`Tuition fees up to date`,
-`Gender`,
-`Scholarship holder`,
-`International`,
-`Target`) %>%
glimpse()
Rows: 4,424
Columns: 22
$ `Previous qualification (grade)` <chr> "122.0", "160.0", "122.0", "1…
$ `Mother's qualification` <dbl> 19, 1, 37, 38, 37, 37, 19, 37…
$ `Father's qualification` <dbl> 12, 3, 37, 37, 38, 37, 38, 37…
$ `Mother's occupation` <dbl> 5, 3, 9, 5, 9, 9, 7, 9, 9, 4,…
$ `Father's occupation` <dbl> 9, 3, 9, 3, 9, 7, 10, 9, 9, 7…
$ `Admission grade` <chr> "127.3", "142.5", "124.8", "1…
$ `Age at enrollment` <dbl> 20, 19, 19, 20, 45, 50, 18, 2…
$ `Curricular units 1st sem (credited)` <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ `Curricular units 1st sem (enrolled)` <dbl> 0, 6, 6, 6, 6, 5, 7, 5, 6, 6,…
$ `Curricular units 1st sem (evaluations)` <dbl> 0, 6, 0, 8, 9, 10, 9, 5, 8, 9…
$ `Curricular units 1st sem (approved)` <dbl> 0, 6, 0, 6, 5, 5, 7, 0, 6, 5,…
$ `Curricular units 1st sem (grade)` <chr> "0.0", "14.0", "0.0", "1.3428…
$ `Curricular units 1st sem (without evaluations)` <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ `Curricular units 2nd sem (credited)` <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ `Curricular units 2nd sem (enrolled)` <dbl> 0, 6, 6, 6, 6, 5, 8, 5, 6, 6,…
$ `Curricular units 2nd sem (evaluations)` <dbl> 0, 6, 0, 10, 6, 17, 8, 5, 7, …
$ `Curricular units 2nd sem (approved)` <dbl> 0, 6, 0, 5, 6, 5, 8, 0, 6, 2,…
$ `Curricular units 2nd sem (grade)` <chr> "0.0", "1.36666666666666E16",…
$ `Curricular units 2nd sem (without evaluations)` <dbl> 0, 0, 0, 0, 0, 5, 0, 0, 0, 0,…
$ `Unemployment rate` <dttm> 2025-08-10, 2025-09-13, 2025…
$ `Inflation rate` <chr> "45748.0", "-0.3", "45748.0",…
$ GDP <chr> "1.74", "0.79", "1.74", "-3.1…
Ahora, convertimos todas nuestras variables cuantitatias a tipo numeric, esto con el fin de poder las gráficas de los boxplot, histrogramas y pruebas de correlación, así mismo miramos que se hayan transformado:
base_cuant <- datos_u %>% dplyr::select(all_of(vars_cuant)) %>% dplyr::mutate(across(everything(),~as.numeric(.)))
base_cuant %>% dim()
[1] 4424 22
sapply(base_cuant, class)
Previous qualification (grade)
"numeric"
Mother's qualification
"numeric"
Father's qualification
"numeric"
Mother's occupation
"numeric"
Father's occupation
"numeric"
Admission grade
"numeric"
Age at enrollment
"numeric"
Curricular units 1st sem (credited)
"numeric"
Curricular units 1st sem (enrolled)
"numeric"
Curricular units 1st sem (evaluations)
"numeric"
Curricular units 1st sem (approved)
"numeric"
Curricular units 1st sem (grade)
"numeric"
Curricular units 1st sem (without evaluations)
"numeric"
Curricular units 2nd sem (credited)
"numeric"
Curricular units 2nd sem (enrolled)
"numeric"
Curricular units 2nd sem (evaluations)
"numeric"
Curricular units 2nd sem (approved)
"numeric"
Curricular units 2nd sem (grade)
"numeric"
Curricular units 2nd sem (without evaluations)
"numeric"
Unemployment rate
"numeric"
Inflation rate
"numeric"
GDP
"numeric"
vars_cuant <- c(
"Previous qualification (grade)",
"Mother's qualification",
"Father's qualification",
"Mother's occupation",
"Father's occupation",
"Admission grade",
"Age at enrollment",
"Curricular units 1st sem (credited)",
"Curricular units 1st sem (enrolled)",
"Curricular units 1st sem (evaluations)",
"Curricular units 1st sem (approved)",
"Curricular units 1st sem (grade)",
"Curricular units 1st sem (without evaluations)",
"Curricular units 2nd sem (credited)",
"Curricular units 2nd sem (enrolled)",
"Curricular units 2nd sem (evaluations)",
"Curricular units 2nd sem (approved)",
"Curricular units 2nd sem (grade)",
"Curricular units 2nd sem (without evaluations)",
"Unemployment rate",
"Inflation rate",
"GDP"
)
sapply(base_cuant, class)
Previous qualification (grade)
"numeric"
Mother's qualification
"numeric"
Father's qualification
"numeric"
Mother's occupation
"numeric"
Father's occupation
"numeric"
Admission grade
"numeric"
Age at enrollment
"numeric"
Curricular units 1st sem (credited)
"numeric"
Curricular units 1st sem (enrolled)
"numeric"
Curricular units 1st sem (evaluations)
"numeric"
Curricular units 1st sem (approved)
"numeric"
Curricular units 1st sem (grade)
"numeric"
Curricular units 1st sem (without evaluations)
"numeric"
Curricular units 2nd sem (credited)
"numeric"
Curricular units 2nd sem (enrolled)
"numeric"
Curricular units 2nd sem (evaluations)
"numeric"
Curricular units 2nd sem (approved)
"numeric"
Curricular units 2nd sem (grade)
"numeric"
Curricular units 2nd sem (without evaluations)
"numeric"
Unemployment rate
"numeric"
Inflation rate
"numeric"
GDP
"numeric"
summary(base_cuant)
Previous qualification (grade) Mother's qualification Father's qualification
Min. : 95.0 Min. : 1.00 Min. : 1.00
1st Qu.:125.0 1st Qu.: 2.00 1st Qu.: 3.00
Median :133.1 Median :19.00 Median :19.00
Mean :132.6 Mean :19.56 Mean :22.28
3rd Qu.:140.0 3rd Qu.:37.00 3rd Qu.:37.00
Max. :190.0 Max. :44.00 Max. :44.00
Mother's occupation Father's occupation Admission grade Age at enrollment
Min. : 0.00 Min. : 0.00 Min. : 95.0 Min. :17.00
1st Qu.: 4.00 1st Qu.: 4.00 1st Qu.:117.9 1st Qu.:19.00
Median : 5.00 Median : 7.00 Median :126.1 Median :20.00
Mean : 10.96 Mean : 11.03 Mean :127.0 Mean :23.27
3rd Qu.: 9.00 3rd Qu.: 9.00 3rd Qu.:134.8 3rd Qu.:25.00
Max. :194.00 Max. :195.00 Max. :190.0 Max. :70.00
Curricular units 1st sem (credited) Curricular units 1st sem (enrolled)
Min. : 0.00 Min. : 0.000
1st Qu.: 0.00 1st Qu.: 5.000
Median : 0.00 Median : 6.000
Mean : 0.71 Mean : 6.271
3rd Qu.: 0.00 3rd Qu.: 7.000
Max. :20.00 Max. :26.000
Curricular units 1st sem (evaluations) Curricular units 1st sem (approved)
Min. : 0.000 Min. : 0.000
1st Qu.: 6.000 1st Qu.: 3.000
Median : 8.000 Median : 5.000
Mean : 8.299 Mean : 4.707
3rd Qu.:10.000 3rd Qu.: 6.000
Max. :45.000 Max. :26.000
Curricular units 1st sem (grade) Curricular units 1st sem (without evaluations)
Min. : 0 Min. : 0.0000
1st Qu.: 12 1st Qu.: 0.0000
Median : 45788 Median : 0.0000
Mean : 4458090894470000 Mean : 0.1377
3rd Qu.:12166666666700000 3rd Qu.: 0.0000
Max. :17333333333300000 Max. :12.0000
Curricular units 2nd sem (credited) Curricular units 2nd sem (enrolled)
Min. : 0.0000 Min. : 0.000
1st Qu.: 0.0000 1st Qu.: 5.000
Median : 0.0000 Median : 6.000
Mean : 0.5418 Mean : 6.232
3rd Qu.: 0.0000 3rd Qu.: 7.000
Max. :19.0000 Max. :23.000
Curricular units 2nd sem (evaluations) Curricular units 2nd sem (approved)
Min. : 0.000 Min. : 0.000
1st Qu.: 6.000 1st Qu.: 2.000
Median : 8.000 Median : 5.000
Mean : 8.063 Mean : 4.436
3rd Qu.:10.000 3rd Qu.: 6.000
Max. :33.000 Max. :20.000
Curricular units 2nd sem (grade) Curricular units 2nd sem (without evaluations)
Min. : 0 Min. : 0.0000
1st Qu.: 11 1st Qu.: 0.0000
Median : 45760 Median : 0.0000
Mean : 3928633958070000 Mean : 0.1503
3rd Qu.:11666666666700000 3rd Qu.: 0.0000
Max. :18571428571400000 Max. :12.0000
Unemployment rate Inflation rate GDP
Min. :1736553600 Min. : -0.8 Min. : -4.06
1st Qu.:1744156800 1st Qu.: 0.3 1st Qu.: -1.70
Median :1749254400 Median :45748.0 Median : 0.32
Mean :1748359367 Mean :23605.0 Mean : 4275.50
3rd Qu.:1754784000 3rd Qu.:45810.0 3rd Qu.: 1.79
Max. :1757721600 Max. :45871.0 Max. :45690.00
Lo siguiente es calcular los estadísticos descriptivos, es decir, los valores que nos resumen lo más importante de una variable numérica, como por ejemplo, media, desviación estándar, varianza, entre otros. Para ello se mostrarán dos gráficos, un boxplot para ver si hay valores atípicos y un histograma para ver cómo se distribuyen los datos a comparación de una curva normal teórica y ver si siguen una distribución normal:
# Estadígrafos, Histogramas y Boxplots Descriptivos Univariados de Variables Cuantitativas: ----
analisis_cuant <- function(variable) {datos <- base_cuant[[variable]]
# Cálculo de estadígrafos
resumen <- resumen_variable(datos)
# Impresión
cat("Análisis de la variable:", variable, "\n\n")
print(resumen)
# Interpretación básica automática
cat("\n Interpretación:\n")
if (resumen$asimetria > 0.5) {
cat("- Distribución asimétrica positiva (cola hacia la derecha).\n")
} else if (resumen$asimetria < -0.5) {
cat("- Distribución asimétrica negativa (cola hacia la izquierda).\n")
} else {
cat("- Distribución aproximadamente simétrica.\n")
}
if (resumen$curtosis > 3) {
cat("- Leptocúrtica (picos altos, colas pesadas).\n")
} else if (resumen$curtosis < 3) {
cat("- Platicúrtica (más plana que una normal).\n")
} else {
cat("- Curtosis cercana a la distribución normal.\n")
}
# Boxplot
box <- ggplot(base_cuant, aes(y = .data[[variable]])) +
geom_boxplot(fill = "#65ce67", outlier.color = "red", alpha = 0.7) +
theme_minimal() +
labs(title = paste("Boxplot de", variable), y = variable)
print(box)
# Histograma con curva normal
histo <- ggplot(base_cuant, aes(x = .data[[variable]])) +
geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "#cb96eb", color = "black", alpha = 0.7) +
stat_function(fun = dnorm,
args = list(mean = mean(datos, na.rm = TRUE),
sd = sd(datos, na.rm = TRUE)),
color = "red", linewidth = 1) +
theme_minimal() +
labs(title = paste("Histograma de", variable, "con curva normal"), x = variable, y = "Densidad")
print(histo)
invisible(resumen)
}
Ahora, realizamos los respectivos análisis sobre el comportamiento de estas variables:
analisis_cuant("Previous qualification (grade)")
Análisis de la variable: Previous qualification (grade)
Interpretación:
- Distribución aproximadamente simétrica.
- Leptocúrtica (picos altos, colas pesadas).
cat("La nota promedio de la titulación previa es de 133, con una distribución casi
simétrica y picos marcados (curtosis ≈ 4). Esto indica que la mayoría de
estudiantes tiene calificaciones similares, aunque por supuesto, hay algunos
casos más extremos, los cuales no permiten la normalidad.\n")
La nota promedio de la titulación previa es de 133, con una distribución casi
simétrica y picos marcados (curtosis ≈ 4). Esto indica que la mayoría de
estudiantes tiene calificaciones similares, aunque por supuesto, hay algunos
casos más extremos, los cuales no permiten la normalidad.
analisis_cuant("Admission grade")
Análisis de la variable: Admission grade
Interpretación:
- Distribución asimétrica positiva (cola hacia la derecha).
- Leptocúrtica (picos altos, colas pesadas).
cat("La nota de admisión promedio es 127, con una asimetría positiva y una
distribución más picuda de lo normal (leptocúrtica). Esto sugiere que la
mayoría de los estudiantes tiene notas de admisión ligeramente por
debajo del promedio, pero hay algunos con notas notablemente altas.\n")
La nota de admisión promedio es 127, con una asimetría positiva y una
distribución más picuda de lo normal (leptocúrtica). Esto sugiere que la
mayoría de los estudiantes tiene notas de admisión ligeramente por
debajo del promedio, pero hay algunos con notas notablemente altas.
analisis_cuant("Curricular units 1st sem (grade)")
Análisis de la variable: Curricular units 1st sem (grade)
Interpretación:
- Distribución asimétrica positiva (cola hacia la derecha).
- Platicúrtica (más plana que una normal).
cat("La variable presenta valores atípicos muy altos y estos hacen que no haya una medida clara de centralidad, con una media extrañamente elevada de 4.46e15. La mediana es 13.5, y la distribución es asimétrica positiva y platicúrtica. Entonces se puede concluir que es necesario limpiar los datos para obtener un análisis más confiable.\n")
La variable presenta valores atípicos muy altos y estos hacen que no haya una medida clara de centralidad, con una media extrañamente elevada de 4.46e15. La mediana es 13.5, y la distribución es asimétrica positiva y platicúrtica. Entonces se puede concluir que es necesario limpiar los datos para obtener un análisis más confiable.
analisis_cuant("Curricular units 2nd sem (grade)")
Análisis de la variable: Curricular units 2nd sem (grade)
Interpretación:
- Distribución asimétrica positiva (cola hacia la derecha).
- Platicúrtica (más plana que una normal).
cat("Ocurre lo mismo que en el primer semestre: hay valores extremadamente altos, en este caso la media es de 3.93e15. La mediana es 13, y la distribución también es asimétrica positiva y más plana de lo normal (platicúrtica).\n")
Ocurre lo mismo que en el primer semestre: hay valores extremadamente altos, en este caso la media es de 3.93e15. La mediana es 13, y la distribución también es asimétrica positiva y más plana de lo normal (platicúrtica).
analisis_cuant("Unemployment rate")
Análisis de la variable: Unemployment rate
Interpretación:
- Distribución aproximadamente simétrica.
- Platicúrtica (más plana que una normal).
cat("Se cuenta con una tasa promedio de desempleo de 11.6% con distribución simétrica y dispersa. La mayoría de los valores están cerca de la media, pero hay cierta variabilidad (SD = 2.66).\n")
Se cuenta con una tasa promedio de desempleo de 11.6% con distribución simétrica y dispersa. La mayoría de los valores están cerca de la media, pero hay cierta variabilidad (SD = 2.66).
analisis_cuant("Inflation rate")
Análisis de la variable: Inflation rate
Interpretación:
- Distribución aproximadamente simétrica.
- Platicúrtica (más plana que una normal).
cat("Inflación media de 1.23, también con distribución simétrica y plana (platicúrtica). Los valores están relativamente concentrados entre el 0 y el 2.5.\n")
Inflación media de 1.23, también con distribución simétrica y plana (platicúrtica). Los valores están relativamente concentrados entre el 0 y el 2.5.
analisis_cuant("GDP")
Análisis de la variable: GDP
Interpretación:
- Distribución asimétrica positiva (cola hacia la derecha).
- Leptocúrtica (picos altos, colas pesadas).
cat("El PIB tiene una media cercana a cero (0.00197) debido a valores negativos y positivos. A pesar de eso, muestra una distribución simétrica y más dispersa, con una alta desviación estándar (2.27).\n")
El PIB tiene una media cercana a cero (0.00197) debido a valores negativos y positivos. A pesar de eso, muestra una distribución simétrica y más dispersa, con una alta desviación estándar (2.27).
Luego, procedemos a hacer el Análisis Bivariado Cuantitativo, donde lo haremos mediante la correlación que presenten las variables:
# Análisis Bivariado Cuantitativo: ----
analisis_bi_cuant <- function(var1, var2) {
x <- base_cuant[[var1]]
y <- base_cuant[[var2]]
# Calcular correlación
cor_val <- cor(x, y, use = "complete.obs")
# Interpretación textual
interpretacion <- case_when(
abs(cor_val) < 0.2 ~ "Muy débil o nula",
abs(cor_val) < 0.4 ~ "Débil",
abs(cor_val) < 0.6 ~ "Moderada",
abs(cor_val) < 0.8 ~ "Fuerte",
TRUE ~ "Muy fuerte"
)
direccion <- ifelse(cor_val > 0, "positiva", "negativa")
cat("Análisis bivariado:", var1, "vs", var2, "\n")
cat("Coeficiente de correlación:", round(cor_val, 4), "\n")
cat("Interpretación: Correlación", interpretacion, direccion, "\n\n")
# Diagrama de dispersión
p <- ggplot(base_cuant, aes(x = .data[[var1]], y = .data[[var2]])) +
geom_point(color = "darkblue", alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "red", linewidth = 1) +
theme_minimal() +
labs(title = paste("Dispersión:", var1, "vs", var2),
subtitle = paste("Correlación:", round(cor_val, 4)),
x = var1, y = var2)
print(p)
invisible(cor_val)
}
Su comportamiento o correlación se verá de la siguiente manera:
analisis_bi_cuant("Previous qualification (grade)", "GDP")
Análisis bivariado: Previous qualification (grade) vs GDP
Coeficiente de correlación: -0.0589
Interpretación: Correlación Muy débil o nula negativa
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Curricular units 1st sem (credited)", "Curricular units 2nd sem (credited)")
Análisis bivariado: Curricular units 1st sem (credited) vs Curricular units 2nd sem (credited)
Coeficiente de correlación: 0.9448
Interpretación: Correlación Muy fuerte positiva
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Curricular units 1st sem (evaluations)", "Curricular units 1st sem (approved)")
Análisis bivariado: Curricular units 1st sem (evaluations) vs Curricular units 1st sem (approved)
Coeficiente de correlación: 0.5224
Interpretación: Correlación Moderada positiva
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Curricular units 1st sem (grade)", "Curricular units 1st sem (without evaluations)")
Análisis bivariado: Curricular units 1st sem (grade) vs Curricular units 1st sem (without evaluations)
Coeficiente de correlación: -0.041
Interpretación: Correlación Muy débil o nula negativa
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Mother's occupation", "Father's occupation")
Análisis bivariado: Mother's occupation vs Father's occupation
Coeficiente de correlación: 0.9105
Interpretación: Correlación Muy fuerte positiva
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Previous qualification (grade)", "Admission grade")
Análisis bivariado: Previous qualification (grade) vs Admission grade
Coeficiente de correlación: 0.5804
Interpretación: Correlación Moderada positiva
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Curricular units 1st sem (enrolled)", "Inflation rate")
Análisis bivariado: Curricular units 1st sem (enrolled) vs Inflation rate
Coeficiente de correlación: 0.0353
Interpretación: Correlación Muy débil o nula positiva
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Curricular units 1st sem (approved)", "Curricular units 2nd sem (approved)")
Análisis bivariado: Curricular units 1st sem (approved) vs Curricular units 2nd sem (approved)
Coeficiente de correlación: 0.904
Interpretación: Correlación Muy fuerte positiva
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Curricular units 2nd sem (credited)", "Curricular units 2nd sem (approved)")
Análisis bivariado: Curricular units 2nd sem (credited) vs Curricular units 2nd sem (approved)
Coeficiente de correlación: 0.5191
Interpretación: Correlación Moderada positiva
`geom_smooth()` using formula = 'y ~ x'
analisis_bi_cuant("Unemployment rate", "GDP")
Análisis bivariado: Unemployment rate vs GDP
Coeficiente de correlación: -0.5728
Interpretación: Correlación Moderada negativa
`geom_smooth()` using formula = 'y ~ x'
# Diagrama de Correlación:
corrplot(cor(base_cuant), method = "shade", tl.cex = 0.6,
col=brewer.pal(n=8, name="PuOr"),addCoef.col = "black",
number.cex=0.4,type = "upper", diag = FALSE)
# Análisis de Modelo Distribucional: ----
cat("Ahora, miraremos si las variables cuantitativas cuentan con una distribución conocida como normal, gamma o lognormal, para ello estableceremos nuestra H0: la variable podría seguir una distribución normal vs H1: no H0.")
Ahora, miraremos si las variables cuantitativas cuentan con una distribución conocida como normal, gamma o lognormal, para ello estableceremos nuestra H0: la variable podría seguir una distribución normal vs H1: no H0.
analisis_distribucional <- function(variable) {
x <- base_cuant[[variable]]
x <- na.omit(x)
cat("Análisis de Modelo Distribucional para:", variable, "\n\n")
# 1. Test de normalidad
p_shapiro <- shapiro.test(x)$p.value
cat("Test de Shapiro-Wilk (normalidad): p-value =", round(p_shapiro, 5), "\n")
cat(ifelse(p_shapiro > 0.05,
"- No se rechaza H0: la variable podría seguir una distribución normal.\n",
"- Se rechaza H0: la variable NO sigue una distribución normal.\n"))
# 2. Histograma + curva normal teórica
histo <- ggplot(base_cuant, aes(x = .data[[variable]])) +
geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightblue", color = "black") +
stat_function(fun = dnorm,
args = list(mean = mean(x), sd = sd(x)),
color = "red", linewidth = 1) +
theme_minimal() +
labs(title = paste("Histograma con curva normal:", variable),
x = variable, y = "Densidad")
print(histo)
# 3. Ajuste de distribuciones conocidas
library(fitdistrplus)
modelos <- list()
modelos$norm <- fitdist(x, "norm")
if (all(x > 0)) {
modelos$lnorm <- fitdist(x, "lnorm")
modelos$gamma <- fitdist(x, "gamma")
}
# 4. Evaluar AIC
if (length(modelos) > 1) {
gof <- gofstat(modelos)
aic_table <- as_tibble_row(gof$aic)
} else {
aic_table <- tibble(norm = modelos$norm$aic)
}
aic_table <- aic_table %>%
pivot_longer(everything(), names_to = "Distribucion", values_to = "AIC") %>%
arrange(AIC)
print(aic_table)
cat("\n Distribución con menor AIC:", aic_table$Distribucion[1], "\n")
invisible(list(
p_shapiro = p_shapiro,
aic = aic_table
))
}
analisis_distribucional("Previous qualification (grade)")
Análisis de Modelo Distribucional para: Previous qualification (grade)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: 3-mle-gamma
analisis_distribucional("Mother's qualification")
Análisis de Modelo Distribucional para: Mother's qualification
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: 3-mle-gamma
analisis_distribucional("Father's qualification")
Análisis de Modelo Distribucional para: Father's qualification
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: 3-mle-gamma
analisis_distribucional("Mother's occupation")
Análisis de Modelo Distribucional para: Mother's occupation
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Father's occupation")
Análisis de Modelo Distribucional para: Father's occupation
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Admission grade")
Análisis de Modelo Distribucional para: Admission grade
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: 2-mle-lnorm
analisis_distribucional("Age at enrollment")
Análisis de Modelo Distribucional para: Age at enrollment
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: 2-mle-lnorm
analisis_distribucional("Curricular units 1st sem (credited)")
Análisis de Modelo Distribucional para: Curricular units 1st sem (credited)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 1st sem (enrolled)")
Análisis de Modelo Distribucional para: Curricular units 1st sem (enrolled)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 1st sem (evaluations)")
Análisis de Modelo Distribucional para: Curricular units 1st sem (evaluations)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 1st sem (approved)")
Análisis de Modelo Distribucional para: Curricular units 1st sem (approved)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 1st sem (grade)")
Análisis de Modelo Distribucional para: Curricular units 1st sem (grade)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 1st sem (without evaluations)")
Análisis de Modelo Distribucional para: Curricular units 1st sem (without evaluations)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 2nd sem (credited)")
Análisis de Modelo Distribucional para: Curricular units 2nd sem (credited)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 2nd sem (enrolled)")
Análisis de Modelo Distribucional para: Curricular units 2nd sem (enrolled)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 2nd sem (evaluations)")
Análisis de Modelo Distribucional para: Curricular units 2nd sem (evaluations)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 2nd sem (approved)")
Análisis de Modelo Distribucional para: Curricular units 2nd sem (approved)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 2nd sem (grade)")
Análisis de Modelo Distribucional para: Curricular units 2nd sem (grade)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Curricular units 2nd sem (without evaluations)")
Análisis de Modelo Distribucional para: Curricular units 2nd sem (without evaluations)
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("Unemployment rate")
Análisis de Modelo Distribucional para: Unemployment rate
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: 1-mle-norm
analisis_distribucional("Inflation rate")
Análisis de Modelo Distribucional para: Inflation rate
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
analisis_distribucional("GDP")
Análisis de Modelo Distribucional para: GDP
Test de Shapiro-Wilk (normalidad): p-value = 0
- Se rechaza H0: la variable NO sigue una distribución normal.
Distribución con menor AIC: norm
# Interpretación del Modelo Distribucional ----
cat("Se evaluó el ajuste de cada variable cuantitativa a tres distribuciones teóricas: Normal, Log-Normal y Gamma, utilizando el Test de Shapiro-Wilk (normalidad).\n\n")
Se evaluó el ajuste de cada variable cuantitativa a tres distribuciones teóricas: Normal, Log-Normal y Gamma, utilizando el Test de Shapiro-Wilk (normalidad).
cat("Para cada variable, se seleccionó la distribución con menor AIC como la de mejor ajuste.\n\n")
Para cada variable, se seleccionó la distribución con menor AIC como la de mejor ajuste.
cat("En general, se observaron los siguientes patrones:\n")
En general, se observaron los siguientes patrones:
cat("- Las variables como 'Previous qualification (grade)', 'Mother's qualification' y 'Age at enrollment' mostraron mejor ajuste con distribuciones gamma o log-normal, lo cual sugiere una asimetría positiva y valores no negativos.\n")
- Las variables como 'Previous qualification (grade)', 'Mother's qualification' y 'Age at enrollment' mostraron mejor ajuste con distribuciones gamma o log-normal, lo cual sugiere una asimetría positiva y valores no negativos.
cat("- Algunas variables como 'Mother's occupation' y 'Curricular units' solo pudieron ajustarse con la distribución normal, debido a la presencia de valores cero o negativos que impiden el uso de gamma o log-normal.\n")
- Algunas variables como 'Mother's occupation' y 'Curricular units' solo pudieron ajustarse con la distribución normal, debido a la presencia de valores cero o negativos que impiden el uso de gamma o log-normal.
cat("- Variables como 'GDP' e 'Inflation rate' también mostraron ajuste exclusivo a la distribución normal.\n\n")
- Variables como 'GDP' e 'Inflation rate' también mostraron ajuste exclusivo a la distribución normal.
cat("Esto implica que muchas de las variables analizadas (por no decir, Todas), no siguen una distribución normal clásica, por lo cual se rechaza la H0 y es recomendable considerar transformaciones o el uso de métodos no paramétricos si se requieren supuestos de normalidad en análisis posteriores.\n")
Esto implica que muchas de las variables analizadas (por no decir, Todas), no siguen una distribución normal clásica, por lo cual se rechaza la H0 y es recomendable considerar transformaciones o el uso de métodos no paramétricos si se requieren supuestos de normalidad en análisis posteriores.
Hacemos el analisis bivariado mixto
cat("Estamos haciendo análisis con respecto a la variable Target \n")
Estamos haciendo análisis con respecto a la variable Target
histograma_bi <- function(variable1, variable2) {
histograma <- datos_u %>%
ggplot(aes(x = !!sym(variable1))) +
geom_histogram(fill = "yellow", color = "black", bins = 15) +
ggtitle(variable1) +
labs(x = variable1, y = "Frecuencias") +
facet_wrap(vars(!!sym(variable2)), scales = "free") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.05))
return(histograma)
}
boxplot_bi <- function(variable1, variable2) {
ggplot(datos_u, aes(x = .data[[variable1]], y = .data[[variable2]])) +
geom_boxplot(fill = "skyblue", outlier.color = "red") +
theme_minimal() +
labs(
title = paste("Boxplot de", variable2, "según", variable1),
x = variable1,
y = variable2
)
}
descripcion <- function(variable1,variable2){
return(describeBy(datos_u[[variable1]],group=datos_u[[variable2]]))
}
histograma_bi("Curricular units 1st sem (approved)","Target")
descripcion("Curricular units 1st sem (approved)","Target")
Descriptive statistics by group
group: Dropout
------------------------------------------------------------------
group: Enrolled
------------------------------------------------------------------
group: Graduate
histograma_bi( "Curricular units 2nd sem (approved)","Target")
descripcion("Curricular units 2nd sem (approved)","Target")
Descriptive statistics by group
group: Dropout
------------------------------------------------------------------
group: Enrolled
------------------------------------------------------------------
group: Graduate
boxplot_bi("Curricular units 1st sem (approved)","Target")
boxplot_bi("Curricular units 2nd sem (approved)","Target")
boxplot_bi("Age at enrollment","Target")
boxplot_bi("Unemployment rate","Target")
NA
NA
Comenzamos con las pruebas de hipotesis
cat("Pruebas de Hipótesis\n")
Pruebas de Hipótesis
mean(datos_u$`Curricular units 1st sem (enrolled)`)
[1] 6.27057
Primera prueba de hipótesis:
Anteriormente pudimos ver que la media de los valores de los créditos inscritos en primer semestre es de 6.27057, por ende centremos nuestra hipótesis sobre esto.
H0: 6.27 > miu vs H1: miu <= 6.27
cat("Vamos a verificar si sigue una normal:\n")
Vamos a verificar si sigue una normal:
analisis_cuant("Curricular units 1st sem (enrolled)")
Análisis de la variable: Curricular units 1st sem (enrolled)
Interpretación:
- Distribución asimétrica positiva (cola hacia la derecha).
- Leptocúrtica (picos altos, colas pesadas).
lillie.test(datos_u$`Curricular units 1st sem (enrolled)`)
Lilliefors (Kolmogorov-Smirnov) normality test
data: datos_u$`Curricular units 1st sem (enrolled)`
D = 0.25478, p-value < 0.00000000000000022
cat("No sigue la normal, por lo tanto tendremos que suponer
normalidad :(
Así que para ello aplicaremos el t test.")
No sigue la normal, por lo tanto tendremos que suponer
normalidad :(
Así que para ello aplicaremos el t test.
t.test(datos_u$`Curricular units 1st sem (enrolled)`, alternative="less", mu = 6.27)
One Sample t-test
data: datos_u$`Curricular units 1st sem (enrolled)`
t = 0.015276, df = 4423, p-value = 0.5061
alternative hypothesis: true mean is less than 6.27
95 percent confidence interval:
-Inf 6.331917
sample estimates:
mean of x
6.27057
Para la segunda muestra evidenciamos que la proporcion de estudiantes que necesitan Educación Especial es de 0.01152803, por ende vamos a verificar que la proporcion poblacional de los estudiantes que necesitan educacion especial es menor al 2%, contra que sea mayor o igual al 2%
H0: miu < 0.02 vs H1: miu >= 0.02”)
prop.table(table(datos_u$`Educational special needs`))
0 1
0.98847197 0.01152803
table(datos_u$`Educational special needs`)
0 1
4373 51
cat("Implementamos el prop test:\n")
Implementamos el prop test:
prop.test(51,
n = length(datos_u$`Educational special needs`),
p = 0.02,
alternative = "less",
correct = FALSE)
1-sample proportions test without continuity correction
data: 51 out of length(datos_u$`Educational special needs`), null probability 0.02
X-squared = 16.2, df = 1, p-value = 0.00002849
alternative hypothesis: true p is less than 0.02
95 percent confidence interval:
0.00000000 0.01448245
sample estimates:
p
0.01152803
se rechaza comenzamos con bondad de ajuste
cat("H0: Los creditos aprobados en segundo semestre siguen una
distribucion binomial
vs
H1: No H0")
H0: Los creditos aprobados en segundo semestre siguen una
distribucion binomial
vs
H1: No H0
frecuencias <- table(datos_u$`Curricular units 2nd sem (approved)`)
frecuencias
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
870 114 198 285 414 726 965 331 321 36 38 48 34 21 6 2 8 2 3 2
valores <- as.numeric(names(frecuencias))
valores
[1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
cat("Tenemos que hallar la cantidad de intentos para conseguir un éxito,
entonces analizaremos los créditos inscritos:\n")
Tenemos que hallar la cantidad de intentos para conseguir un éxito,
entonces analizaremos los créditos inscritos:
maX <- sort(unique(datos_u$`Curricular units 2nd sem (enrolled)`), decreasing = TRUE)[2]
maX
[1] 21
cat("Tomaremos 19, luego borramos los datos que sean menores a 19...\n")
Tomaremos 19, luego borramos los datos que sean menores a 19...
datos2 <- datos_u[datos_u$`Curricular units 2nd sem (enrolled)`<=19,]
diagrama_creditosins<- boxplot(datos_u$`Curricular units 2nd sem (enrolled)`,horizontal=TRUE)
datos_u %>% dim()
[1] 4424 37
datos2 %>% count(`Curricular units 2nd sem (enrolled)`)
mean(datos_u$`Curricular units 2nd sem (enrolled)`)
[1] 6.232143
cat("Podemos ver que el máximo de créditos inscritos es 23, sin embargo
mayormente los datos están entre 4 y 7, aún así, para no perder datos
consideraremos el máximo:\n")
Podemos ver que el máximo de créditos inscritos es 23, sin embargo
mayormente los datos están entre 4 y 7, aún así, para no perder datos
consideraremos el máximo:
p <- sum(datos2$`Curricular units 2nd sem (approved)`)/(19*4421)
p
[1] 0.2329313
n <- datos_u %>% dim
p_i <- dbinom(valores,19,p)
p_i
[1] 0.006484111844922015 0.037410868883912561 0.102243098183286613 0.175936263529149872
[5] 0.213702229119323767 0.194681195115019717 0.137941354302626051 0.077791741582523943
[9] 0.035433858794491943 0.013151107339584982 0.003993521428558655 0.000992200724982270
[13] 0.000200863940165268 0.000032843570331155 0.000004274322366529 0.000000032845314182
[17] 0.000000001760108541 0.000000000059386898 0.000000000000949141 0.000000000000000000
b <- chisq.test(frecuencias,p=p_i,rescale.p=TRUE)
Aviso en chisq.test(frecuencias, p = p_i, rescale.p = TRUE) :
Chi-squared approximation may be incorrect
b
Chi-squared test for given probabilities
data: frecuencias
X-squared = Inf, df = 19, p-value < 0.00000000000000022
b$expected
0 1 2 3
28.685723212899084 165.505755548990152 452.323662062047447 778.342366605115785
4 5 6 7
945.419070662281683 861.269979819884270 610.252815462526542 344.150813658966513
8 9 10 11
156.759459129281993 58.180524042301990 17.667346443773859 4.389497906450984
12 13 14 16
0.888622455756313 0.145300018009520 0.018909610330826 0.000145307732807
17 18 19 20
0.000007786723555 0.000000262727748 0.000000004199002 0.000000000000000
cat("Bucamos 0 inflado:\n")
Bucamos 0 inflado:
con categoricas
H0:course sigue una distribucion uniforme vs H1:no H0
observado <- table(base_cate$Course)
total <- sum(observado)
esperado <- rep(total/length(observado),length(observado))
resultado <- chisq.test(x=observado,p=esperado/total)
resultado
Chi-squared test for given probabilities
data: observado
X-squared = 1602.4, df = 16, p-value < 0.00000000000000022
print("el p-value es muy bajo, entonces se rechaza la hipotesis nula")
[1] "el p-value es muy bajo, entonces se rechaza la hipotesis nula"
#sin embargo algo interesante es que course podria seguir una distribucion zipf
#para mirar si sigue esta distribucion usamos la grafica log-log
frecuencias <- as.data.frame(table(base_cate$Course))
colnames(frecuencias) <- c("course","count")
frecuencias <- frecuencias[order(-frecuencias$count),]
frecuencias$Rank <- 1:nrow(frecuencias)
log_log <- ggplot(frecuencias, aes(x = Rank, y = frecuencias$count)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "red") +
scale_x_log10() +
scale_y_log10() +
labs(title = "Ajuste lineal en escala log-log",
x = "Rango del curso (log)",
y = "Frecuencia (log)") +
theme_minimal()
log_log
Aviso: Use of `frecuencias$count` is discouraged.
ℹ Use `count` instead.
Aviso: Use of `frecuencias$count` is discouraged.
ℹ Use `count` instead.
como podemos ver el grafico, no sigue la linea, entonces no sigue la distribucion, lo intentamos :(
test_independencia <- function(var1, var2) {
tabla <- table(datos_u[[var1]], datos_u[[var2]])
cat("\n¿Hay independencia entre", var1, "y", var2, "?\n\n")
min_esperado <- min(chisq.test(tabla)$expected)
if (any(tabla < 5) || min_esperado < 5) {
test <- fisher.test(tabla)
metodo <- "Test exacto de Fisher"
} else {
test <- chisq.test(tabla)
metodo <- "Chi-cuadrado de independencia"
}
cat("Método:", metodo, "\n")
cat("p-valor =", signif(test$p.value, 6), "\n\n")
if (test$p.value < 0.05) {
cat("Se rechaza H0: hay evidencia de dependencia entre", var1, "y", var2, "\n\n")
} else {
cat("No se rechaza H0: no hay evidencia suficiente de dependencia entre", var1, "y", var2, "\n\n")
}
cat("Tabla de contingencia (% por fila):\n")
print(round(prop.table(tabla, margin = 1) * 100, 2))
invisible(test)
p <- grafico_apilado(var1, var2)
print(p)
}
test_independencia("Target", "Scholarship holder")
¿Hay independencia entre Target y Scholarship holder ?
Método: Chi-cuadrado de independencia
p-valor = 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000959393
Se rechaza H0: hay evidencia de dependencia entre Target y Scholarship holder
Tabla de contingencia (% por fila):
0 1
Dropout 90.57 9.43
Enrolled 83.63 16.37
Graduate 62.20 37.80
test_independencia("Target", "Daytime/evening attendance")
¿Hay independencia entre Target y Daytime/evening attendance ?
Método: Chi-cuadrado de independencia
p-valor = 0.000000574383
Se rechaza H0: hay evidencia de dependencia entre Target y Daytime/evening attendance
Tabla de contingencia (% por fila):
0 1
Dropout 14.57 85.43
Enrolled 9.45 90.55
Graduate 9.10 90.90
test_independencia("Target", "Gender")
¿Hay independencia entre Target y Gender ?
Método: Chi-cuadrado de independencia
p-valor = 0.00000000000000000000000000000000000000000000000000222248
Se rechaza H0: hay evidencia de dependencia entre Target y Gender
Tabla de contingencia (% por fila):
0 1
Dropout 50.67 49.33
Enrolled 61.34 38.66
Graduate 75.19 24.81
test_independencia("Debtor", "Scholarship holder")
¿Hay independencia entre Debtor y Scholarship holder ?
Método: Chi-cuadrado de independencia
p-valor = 0.00000924454
Se rechaza H0: hay evidencia de dependencia entre Debtor y Scholarship holder
Tabla de contingencia (% por fila):
0 1
0 74.11 25.89
1 83.30 16.70
test_independencia("Target", "Tuition fees up to date")
¿Hay independencia entre Target y Tuition fees up to date ?
Método: Chi-cuadrado de independencia
p-valor = 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000147163
Se rechaza H0: hay evidencia de dependencia entre Target y Tuition fees up to date
Tabla de contingencia (% por fila):
0 1
Dropout 32.16 67.84
Enrolled 5.29 94.71
Graduate 1.31 98.69
residuales_posthoc <- function(var1, var2) {
tabla <- table(datos_u[[var1]], datos_u[[var2]])
test <- chisq.test(tabla)
residuales <- test$stdres
cat("Análisis post-hoc de residuales estandarizados:\n")
print(round(residuales, 2))
sig_res <- abs(residuales) >= 2
cat("\n Celdas con contribución significativa (|residual| ≥ 2):\n")
print(which(sig_res, arr.ind = TRUE))
library(reshape2)
df_res <- melt(residuales)
ggplot(df_res, aes(x = Var2, y = Var1, fill = value)) +
geom_tile(color = "purple") +
geom_text(aes(label = round(value, 2)), color = "black", size = 3) +
scale_fill_gradient2(low = "yellow", mid = "lightblue", high = "red", midpoint = 0) +
labs(title = paste("Residuales estandarizados:", var1, "vs", var2),
x = var2, y = var1) +
theme_minimal()
}
residuales_posthoc("Target", "Scholarship holder")
Análisis post-hoc de residuales estandarizados:
0 1
Dropout 16.32 -16.32
Enrolled 6.10 -6.10
Graduate -19.92 19.92
Celdas con contribución significativa (|residual| ≥ 2):
row col
Dropout 1 1
Enrolled 2 1
Graduate 3 1
Dropout 1 2
Enrolled 2 2
Graduate 3 2
Aviso: package ‘reshape2’ was built under R version 4.4.3
Adjuntando el paquete: ‘reshape2’
The following object is masked from ‘package:tidyr’:
smiths
residuales_posthoc("Target", "Daytime/evening attendance")
Análisis post-hoc de residuales estandarizados:
0 1
Dropout 5.35 -5.35
Enrolled -1.47 1.47
Graduate -3.87 3.87
Celdas con contribución significativa (|residual| ≥ 2):
row col
Dropout 1 1
Graduate 3 1
Dropout 1 2
Graduate 3 2
residuales_posthoc("Target", "Gender")
Análisis post-hoc de residuales estandarizados:
0 1
Dropout -13.57 13.57
Enrolled -2.28 2.28
Graduate 14.42 -14.42
Celdas con contribución significativa (|residual| ≥ 2):
row col
Dropout 1 1
Enrolled 2 1
Graduate 3 1
Dropout 1 2
Enrolled 2 2
Graduate 3 2
residuales_posthoc("Debtor", "Scholarship holder")
Análisis post-hoc de residuales estandarizados:
0 1
0 -4.49 4.49
1 4.49 -4.49
Celdas con contribución significativa (|residual| ≥ 2):
row col
0 1 1
1 2 1
0 1 2
1 2 2
residuales_posthoc("Target", "Tuition fees up to date")
Análisis post-hoc de residuales estandarizados:
0 1
Dropout 28.54 -28.54
Enrolled -6.38 6.38
Graduate -21.76 21.76
Celdas con contribución significativa (|residual| ≥ 2):
row col
Dropout 1 1
Enrolled 2 1
Graduate 3 1
Dropout 1 2
Enrolled 2 2
Graduate 3 2
Pruebas Ks
# Pruebas K-S :3
# Cargar la base de datos
library(readr)
library(tidyverse)
data <- read_delim("data.csv", delim = ";",
escape_double = FALSE, trim_ws = TRUE)
Rows: 4424 Columns: 37
── Column specification ────────────────────────────────────────────────────────────────
Delimiter: ";"
chr (1): Target
dbl (36): Marital status, Application mode, Application order, Course, Daytime/eveni...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
datos_u <- data
datos_u %>% dim()
[1] 4424 37
# Como K-S es útil para bondad de ajuste de variables cuantitativas continuas,
# se usará a continuación:
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Notas del examen de admisión (admission grade)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
admission_grade <- datos_u$`Admission grade`
admission_grade
[1] 127.3 142.5 124.8 119.6 141.5 114.8 128.4 113.1 129.3 123.0 130.6 119.3 130.2
[14] 111.8 137.1 120.7 137.4 127.3 136.3 124.6 120.3 121.8 125.5 114.9 123.9 157.0
[27] 116.4 131.0 122.1 118.8 150.0 130.0 138.8 134.5 131.4 102.5 128.8 122.9 113.9
[40] 120.0 121.1 120.4 100.6 121.4 109.7 134.1 127.6 132.4 133.4 126.1 113.5 121.3
[53] 121.8 159.3 120.0 129.1 130.0 155.3 139.8 115.2 114.9 131.9 126.0 130.2 120.9
[66] 126.0 128.2 130.0 120.1 100.0 134.0 130.8 135.8 111.7 132.9 115.5 106.0 120.3
[79] 130.8 117.0 110.2 155.7 180.4 125.5 110.0 161.0 100.0 117.6 128.7 112.2 100.8
[92] 105.0 100.0 115.5 114.0 137.0 124.9 120.3 134.3 111.5 128.8 110.0 113.5 160.0
[105] 117.4 122.2 118.2 106.7 108.2 107.0 136.1 115.3 139.8 157.0 131.0 100.0 140.4
[118] 113.4 137.0 121.8 131.0 118.6 122.3 127.9 121.3 117.1 160.0 145.3 122.6 128.0
[131] 124.9 123.7 120.1 131.7 133.2 109.3 113.0 157.9 112.1 174.7 128.8 110.1 99.7
[144] 121.0 131.7 119.1 124.7 117.2 128.8 131.5 121.7 123.4 124.7 132.8 108.7 138.1
[157] 126.5 127.4 123.6 122.0 118.2 123.9 125.8 123.3 124.4 126.0 170.0 121.5 130.0
[170] 117.0 130.0 108.0 132.3 148.0 122.6 123.0 102.5 113.3 133.0 140.0 128.3 140.0
[183] 104.0 122.3 135.0 119.1 126.6 129.0 162.3 163.4 121.5 122.8 118.0 134.0 129.8
[196] 152.0 122.8 150.0 131.8 105.9 132.1 127.4 129.5 126.7 116.5 119.1 126.5 149.8
[209] 115.1 124.5 128.3 136.0 140.0 126.3 126.9 145.0 115.8 100.0 102.5 131.5 147.0
[222] 122.5 117.5 150.0 127.5 140.0 130.0 133.3 97.0 112.0 123.6 130.5 133.3 132.1
[235] 100.0 140.4 141.7 119.7 122.5 140.0 119.4 155.0 119.1 122.7 117.9 130.0 120.0
[248] 130.0 116.8 123.4 125.4 127.2 103.4 123.2 124.1 99.5 124.9 110.8 118.9 118.8
[261] 137.0 100.0 120.0 122.8 121.6 149.2 140.0 133.4 126.2 127.8 150.0 113.7 117.8
[274] 136.7 144.7 139.8 113.7 140.0 142.3 119.6 123.7 143.0 100.1 119.4 122.1 100.0
[287] 113.9 101.0 111.8 140.0 124.4 150.0 140.0 116.0 135.6 121.0 118.7 125.7 107.1
[300] 125.5 127.0 113.5 154.4 122.0 128.0 115.5 117.2 150.0 155.3 120.0 116.1 118.9
[313] 127.3 113.7 118.5 146.7 124.3 137.8 130.2 147.8 150.0 100.0 155.6 117.4 128.8
[326] 117.5 120.4 130.9 125.0 136.8 121.6 151.0 103.5 119.4 134.4 143.0 110.0 132.5
[339] 114.7 166.9 125.9 178.3 117.0 150.0 130.0 135.1 110.0 136.2 116.0 100.0 116.3
[352] 134.0 124.2 134.5 120.7 127.1 133.0 128.2 130.0 172.0 128.5 128.5 112.0 142.5
[365] 133.0 106.0 125.5 131.2 112.9 124.8 140.9 148.0 148.4 129.7 128.2 104.0 119.9
[378] 141.0 116.6 140.0 140.0 100.0 121.0 117.0 140.2 129.3 145.3 146.2 122.5 156.1
[391] 140.0 140.0 128.4 115.0 158.7 124.5 111.9 150.0 114.2 96.0 128.9 121.7 114.8
[404] 127.0 131.3 137.1 120.0 139.0 129.1 128.2 120.8 135.8 118.9 140.0 127.1 137.0
[417] 127.4 97.0 126.3 127.5 126.6 120.0 140.0 131.5 112.2 150.5 121.0 112.2 129.4
[430] 114.4 120.3 120.0 114.5 127.8 124.6 130.3 118.2 118.8 133.0 129.0 100.0 120.7
[443] 132.5 120.3 114.6 116.5 127.8 129.9 118.9 114.3 114.8 123.0 122.1 123.7 132.4
[456] 114.8 130.0 122.3 152.4 120.1 155.1 124.5 126.9 153.2 129.8 135.0 131.3 125.2
[469] 141.3 117.1 126.5 120.1 128.4 140.0 110.0 116.8 104.5 140.0 113.2 118.6 123.8
[482] 126.7 133.8 140.0 100.6 132.7 106.6 140.4 128.3 118.6 123.4 124.0 121.3 101.0
[495] 116.9 130.0 120.0 130.4 118.7 131.5 120.4 129.1 132.0 130.0 132.8 143.7 152.8
[508] 133.5 146.2 115.2 120.7 101.8 100.0 121.9 120.4 120.4 148.8 123.0 100.0 112.1
[521] 126.8 115.9 132.5 132.2 183.5 136.0 100.9 114.5 110.3 137.2 116.9 121.8 127.3
[534] 120.0 150.0 100.0 150.0 116.9 140.0 122.1 160.0 118.4 150.0 144.9 121.1 121.8
[547] 146.8 138.0 138.0 116.3 122.5 115.0 115.0 119.8 95.0 150.0 117.8 144.2 130.0
[560] 128.2 135.3 143.9 140.7 130.4 123.2 118.0 120.0 118.9 117.2 120.0 118.1 124.8
[573] 106.5 116.8 109.3 120.0 137.5 150.0 120.4 136.7 118.5 133.0 128.8 133.0 102.0
[586] 133.9 127.0 120.4 124.5 123.9 117.8 126.7 110.0 134.7 113.2 141.0 111.5 140.0
[599] 134.3 125.3 140.0 119.6 170.0 150.5 128.0 108.7 121.6 125.3 117.6 124.3 106.1
[612] 139.9 110.8 118.0 117.8 127.5 129.7 130.6 126.3 140.0 105.0 114.6 114.6 131.0
[625] 109.0 132.0 130.0 109.5 115.9 131.6 120.0 109.7 136.4 120.0 132.6 112.9 134.3
[638] 123.2 117.2 129.8 158.0 116.5 121.0 133.8 115.0 131.8 121.0 152.4 110.2 113.5
[651] 144.4 143.3 100.0 126.3 115.9 114.9 121.0 112.3 127.0 120.0 180.0 117.4 115.8
[664] 136.5 129.0 137.6 129.5 129.1 130.2 134.3 138.4 120.0 123.5 116.1 110.8 142.8
[677] 155.5 126.7 163.5 161.9 123.3 137.5 166.6 103.5 110.0 128.2 137.7 128.8 170.0
[690] 116.4 100.9 136.0 130.0 100.0 157.0 152.1 162.9 137.2 140.0 146.5 130.0 128.0
[703] 190.0 133.2 124.3 138.1 144.3 140.0 148.3 96.0 121.7 160.0 110.3 129.0 150.0
[716] 100.0 107.5 170.0 123.0 138.5 140.0 113.6 170.0 115.5 130.0 140.0 126.6 143.2
[729] 131.4 133.3 118.3 140.0 124.7 140.0 150.0 115.6 116.9 123.4 146.5 117.1 113.9
[742] 128.7 132.9 123.0 129.8 156.1 120.0 117.2 107.0 128.4 123.4 126.7 123.0 137.2
[755] 125.9 138.0 128.2 126.5 112.4 109.0 100.0 144.7 120.0 100.0 154.0 111.3 150.0
[768] 100.0 162.5 134.1 133.0 119.0 131.1 129.4 123.9 140.0 162.0 131.6 110.6 117.4
[781] 137.8 106.7 156.9 129.0 124.8 115.1 146.7 132.8 159.1 137.6 124.0 149.0 129.6
[794] 110.0 116.1 133.3 144.3 133.6 123.2 137.2 130.0 110.0 118.0 128.4 113.6 113.5
[807] 146.9 141.3 129.7 121.3 109.1 107.1 129.2 154.1 147.2 120.0 130.8 120.8 125.4
[820] 121.3 127.0 151.6 131.6 106.0 111.6 117.3 121.4 126.1 137.0 120.8 128.7 118.0
[833] 120.0 160.0 150.0 121.8 125.4 126.6 150.0 114.5 107.0 115.7 120.0 134.8 133.6
[846] 129.0 128.4 122.2 113.3 129.9 126.2 112.6 149.0 120.0 120.4 128.1 141.7 130.0
[859] 113.3 105.9 122.7 120.0 119.8 122.9 160.0 125.2 143.4 96.7 126.9 143.1 114.5
[872] 140.0 113.7 131.5 143.5 126.8 115.2 100.0 121.4 120.0 129.9 151.1 120.0 130.0
[885] 119.0 122.0 129.7 112.5 136.0 133.1 151.3 133.3 130.8 140.0 150.0 130.0 125.3
[898] 124.0 113.8 124.4 107.7 110.0 130.0 138.8 126.3 114.5 116.5 128.6 130.0 134.6
[911] 146.8 135.7 120.0 138.0 135.5 120.0 111.7 100.0 160.0 114.8 131.0 97.0 131.7
[924] 120.0 110.0 133.0 140.0 100.0 129.3 137.0 122.2 108.0 110.0 127.7 121.3 140.1
[937] 114.8 150.0 131.7 110.0 105.5 127.3 130.0 130.0 122.7 113.9 151.1 125.8 128.2
[950] 135.1 120.2 132.8 140.0 129.3 108.2 125.4 140.2 116.1 137.8 128.4 106.0 130.2
[963] 126.0 141.0 113.0 120.0 130.9 120.0 134.1 120.0 114.8 123.0 118.0 100.0 151.1
[976] 116.9 106.0 127.1 155.5 101.0 128.2 113.0 122.8 145.6 116.5 142.0 150.0 133.3
[989] 115.8 100.0 128.6 137.1 149.0 147.0 150.0 103.5 107.8 130.0 109.4 143.6
[ reached getOption("max.print") -- omitted 3424 entries ]
# ¿Se ajusta a una normal?
# H0: Las notas de admisión se ajustan a una distribución normal
# H1: No H0
# Gráfico de las CDFs
grid <- seq(min(pull(admission_grade)), max(pull(admission_grade)), length.out = 100)
Error en UseMethod("pull"):
no applicable method for 'pull' applied to an object of class "c('double', 'numeric')"
normalidad
vamos a mirar las pruebas de normalidad sobre las variables continuas, las variables continuas son: previous qualification (grade) admission grade curricular units 1st sem(grade) curricular units 2nd sem(grade) uneployment rate inflation rate GDP
base_2 <- datos_u
base_2$transformada <- 0
histo_norm <- function(a){
base_2[[a]] <- as.numeric(base_2[[a]])
asime <- skewness(base_2[[a]], na.rm = TRUE)
b <- base_2%>% ggplot(aes(x=base_2[[a]],y=..density..))+
geom_histogram(fill="seagreen2",color="white")+
geom_line(aes(x=base_2[[a]],y=dnorm(base_2[[a]],mean(base_2[[a]]),sd(base_2[[a]]))),color="deeppink4",size=1)+
ggtitle(a)+
labs(x=a,y="densidad ")+
theme_minimal()
print(paste("Asimetría:", asime))
print(lillie.test(base_2[[a]]))
return(b)
}
library(dplyr)
library(e1071) # Para usar skewness()
#1
histo_norm("Previous qualification (grade)")
[1] "Asimetría: 0.312655358535117"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.090842, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
print("no sigue una normal, ahora miraremos entre las transformaciones a ver cual ajusta la variable
a una normal")
[1] "no sigue una normal, ahora miraremos entre las transformaciones a ver cual ajusta la variable\n a una normal"
base_2$`Previous qualification (grade)` <- as.numeric(base_2$`Previous qualification (grade)`)
columna=base_2$`Previous qualification (grade)`
base_2$`Previous qualification (grade)` <- as.numeric(base_2$`Previous qualification (grade)`)
#hacemos transformacion
base_2 <- base_2 %>% mutate(transformada = sqrt(base_2$`Previous qualification (grade)`))
histo_norm("transformada")
[1] "Asimetría: 0.103692788984921"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.083663, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
base_2 <- base_2 %>% mutate(transformada = log1p(columna + 1))
histo_norm("transformada")
[1] "Asimetría: -0.0975132315158571"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.092936, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
base_2 <- base_2 %>% mutate(transformada = 1 / (columna + 1))
histo_norm("transformada")
[1] "Asimetría: 0.511592397367028"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.11288, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#en este caso la mas cercana fue la transformacion al cuadrado sin embargo sigue sin seguir
#una distribucion normal, esto debido a que se rechazan las pruebas,por lo tanto se tienen que #hacer pruebas no parametricas sobre esta"
#2
base_2$`Admission grade` <- as.numeric(base_2$`Admission grade`)
# Visualiza el histograma original
histo_norm("Admission grade")
[1] "Asimetría: 0.530240105257676"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.065863, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
print("No sigue una normal, sin embargo se podría aproximar con una transformación.")
[1] "No sigue una normal, sin embargo se podría aproximar con una transformación."
# Guarda la columna original
columna1 <- base_2$`Admission grade`
# --- Transformación raíz cuadrada ---
base_2 <- base_2 %>% mutate(transformada = sqrt(columna1))
print("Transformación: raíz cuadrada")
[1] "Transformación: raíz cuadrada"
histo_norm("transformada")
[1] "Asimetría: 0.337736379573868"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.054623, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación logarítmica ---
base_2 <- base_2 %>% mutate(transformada = log1p(columna1 + 1))
print("Transformación: logarítmica")
[1] "Transformación: logarítmica"
histo_norm("transformada")
[1] "Asimetría: 0.156192262192071"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.044161, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación inversa ---
base_2 <- base_2 %>% mutate(transformada = 1 / (columna1 + 1))
print("Transformación: inversa")
[1] "Transformación: inversa"
histo_norm("transformada")
[1] "Asimetría: 0.206335391318819"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.043315, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#el que presento menos asimetria fue la transformacion logaritmica, sin embargo sigue sin seguir una
#distribucion normal y rechaza las pruebas de hipotesis entonces se tienen que hace pruebas no parametricas
#sobre esta
#3
# Asegura que la variable sea numérica
base_2 <- datos_u
base_2$transformada <-0
base_2$`Curricular units 1st sem (credited)` <- as.numeric(base_2$`Curricular units 1st sem (credited)`)
# Visualiza el histograma original
histo_norm("Curricular units 1st sem (credited)")
[1] "Asimetría: 4.16622208152399"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.48778, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
print("No sigue una normal, sin embargo se podría aproximar con una transformación.")
[1] "No sigue una normal, sin embargo se podría aproximar con una transformación."
print("intentaremos ver como se comporta si retiramos los valores que son 0")
[1] "intentaremos ver como se comporta si retiramos los valores que son 0"
base_2<- base_2[datos_u$`Curricular units 1st sem (credited)`>0,]
base_2 %>% dim()
[1] 577 38
print("se pierden demasiados datos, no vale la pena ")
[1] "se pierden demasiados datos, no vale la pena "
histo_norm("Curricular units 1st sem (credited)")
[1] "Asimetría: 1.08461384035436"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.15327, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Guarda la columna original
columna2 <- base_2$`Curricular units 1st sem (credited)`
# --- Transformación raíz cuadrada ---
base_2 <- base_2 %>% mutate(transformada = sqrt(columna2))
print("Transformación: raíz cuadrada")
[1] "Transformación: raíz cuadrada"
histo_norm("transformada")
[1] "Asimetría: 0.429406388978208"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.12473, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación logarítmica ---
base_2 <- base_2 %>% mutate(transformada = log1p(columna2 + 1))
print("Transformación: logarítmica")
[1] "Transformación: logarítmica"
histo_norm("transformada")
[1] "Asimetría: 0.198546122229408"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.12695, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación inversa ---
base_2 <- base_2 %>% mutate(transformada = 1 / (columna2 + 1))
print("Transformación: inversa")
[1] "Transformación: inversa"
histo_norm("transformada")
[1] "Asimetría: 0.762692480623509"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.16174, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
print("se tiene que proceder con pruebas no parametricas")
[1] "se tiene que proceder con pruebas no parametricas"
#4
# Asegura que la variable sea numérica
base_2 <- datos_u
base_2$transformada <- 0
base_2$`Curricular units 2nd sem (grade)` <- as.numeric(base_2$`Curricular units 2nd sem (grade)`)
# Visualiza el histograma original
histo_norm("Curricular units 2nd sem (grade)")
[1] "Asimetría: 0.904985181350275"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.42806, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
print("No sigue una normal, sin embargo se podría aproximar con una transformación.")
[1] "No sigue una normal, sin embargo se podría aproximar con una transformación."
print("Intentaremos ver cómo se comporta si retiramos los valores que son 0")
[1] "Intentaremos ver cómo se comporta si retiramos los valores que son 0"
# Retira los ceros
base_2 <- base_2[base_2$`Curricular units 2nd sem (grade)` > 0, ]
base_2 %>% dim()
[1] 3554 38
print("En este caso perdemos cerca de 1000 datos")
[1] "En este caso perdemos cerca de 1000 datos"
histo_norm("Curricular units 2nd sem (grade)")
[1] "Asimetría: 0.557442281715525"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.38706, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Guarda la columna original
columna3 <- base_2$`Curricular units 2nd sem (grade)`
# --- Transformación raíz cuadrada ---
base_2 <- base_2 %>% mutate(transformada = sqrt(columna3))
print("Transformación: raíz cuadrada")
[1] "Transformación: raíz cuadrada"
histo_norm("transformada")
[1] "Asimetría: 0.50326402541313"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.39143, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación logarítmica ---
base_2 <- base_2 %>% mutate(transformada = log1p(columna3 + 1))
print("Transformación: logarítmica")
[1] "Transformación: logarítmica"
histo_norm("transformada")
[1] "Asimetría: 0.288817167697241"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.2709, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación inversa ---
base_2 <- base_2 %>% mutate(transformada = 1 / (columna3 + 1))
print("Transformación: inversa")
[1] "Transformación: inversa"
histo_norm("transformada")
[1] "Asimetría: 1.07368030709016"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.45525, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Conclusión
print("Se debe considerar usar pruebas no paramétricas si las transformaciones no logran normalizar la variable.")
[1] "Se debe considerar usar pruebas no paramétricas si las transformaciones no logran normalizar la variable."
#5
# Asegura que la variable sea numérica y reinicia base_2
base_2 <- datos_u
base_2$transformada <- 0
base_2$`Inflation rate` <- as.numeric(base_2$`Inflation rate`)
# Visualiza el histograma original
histo_norm("Inflation rate")
[1] "Asimetría: -0.0614843495211974"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.34866, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
print("No sigue una normal, sin embargo se podría aproximar con una transformación.")
[1] "No sigue una normal, sin embargo se podría aproximar con una transformación."
print("Intentaremos ver cómo se comporta si retiramos los valores que son 0")
[1] "Intentaremos ver cómo se comporta si retiramos los valores que son 0"
# Retira los ceros
base_2 <- base_2[base_2$`Inflation rate` != 0, ]
base_2 %>% dim()
[1] 4424 38
print("podemos ver que se pierden mas de mil datos")
[1] "podemos ver que se pierden mas de mil datos"
# Revisa de nuevo el histograma con los datos sin ceros
histo_norm("Inflation rate")
[1] "Asimetría: -0.0614843495211974"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.34866, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Guarda la columna original sin ceros
columna4 <- base_2$`Inflation rate`
# --- Transformación raíz cuadrada ---
base_2 <- base_2 %>% mutate(transformada = sqrt(columna4))
Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `transformada = sqrt(columna4)`.
Caused by warning in `sqrt()`:
! Se han producido NaNs
print("Transformación: raíz cuadrada")
[1] "Transformación: raíz cuadrada"
histo_norm("transformada")
[1] "Asimetría: -0.634429754110677"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.41868, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Aviso: Removed 923 rows containing non-finite outside the scale range (`stat_bin()`).
Aviso: Removed 4424 rows containing missing values or values outside the scale range
(`geom_line()`).
# --- Transformación logarítmica ---
base_2 <- base_2 %>% mutate(transformada = log1p(columna4 + 1))
print("Transformación: logarítmica")
[1] "Transformación: logarítmica"
histo_norm("transformada")
[1] "Asimetría: -0.067007839899423"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.34897, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación inversa ---
base_2 <- base_2 %>% mutate(transformada = 1 / (columna4 + 1))
print("Transformación: inversa")
[1] "Transformación: inversa"
histo_norm("transformada")
[1] "Asimetría: 1.99843146943972"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.32869, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Conclusión
print("ni con trtamiento atipico de datos, ni con trasnformaciones se pudo evidenciar que siguiera una normal, se debe proceder con pruebas no parametricas ")
[1] "ni con trtamiento atipico de datos, ni con trasnformaciones se pudo evidenciar que siguiera una normal, se debe proceder con pruebas no parametricas "
#6
# Asegura que la variable sea numérica y reinicia base_2
base_2 <- datos_u
base_2$transformada <- 0
base_2$GDP <- as.numeric(base_2$GDP)
# Visualiza el histograma original
histo_norm("GDP")
[1] "Asimetría: 2.78997323116808"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.53231, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
print("No sigue una normal, sin embargo se podría aproximar con una transformación.")
[1] "No sigue una normal, sin embargo se podría aproximar con una transformación."
print("Intentaremos ver cómo se comporta si retiramos los valores que son 0")
[1] "Intentaremos ver cómo se comporta si retiramos los valores que son 0"
# Retira los ceros
base_2 <- base_2[base_2$GDP > 0, ]
base_2 %>% dim()
[1] 2713 38
print("se pierden mas de 2000 datos")
[1] "se pierden mas de 2000 datos"
# Revisa de nuevo el histograma con los datos sin ceros
histo_norm("GDP")
[1] "Asimetría: 1.93108563062652"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.51168, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Guarda la columna original sin ceros
columna5 <- base_2$GDP
# --- Transformación raíz cuadrada ---
base_2 <- base_2 %>% mutate(transformada = sqrt(columna5))
print("Transformación: raíz cuadrada")
[1] "Transformación: raíz cuadrada"
histo_norm("transformada")
[1] "Asimetría: 1.93096869623263"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.50827, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación logarítmica ---
base_2 <- base_2 %>% mutate(transformada = log1p(columna5 + 1))
print("Transformación: logarítmica")
[1] "Transformación: logarítmica"
histo_norm("transformada")
[1] "Asimetría: 1.90589861228058"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.45762, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# --- Transformación inversa ---
base_2 <- base_2 %>% mutate(transformada = 1 / (columna5 + 1))
print("Transformación: inversa")
[1] "Transformación: inversa"
histo_norm("transformada")
[1] "Asimetría: -0.0151785374435241"
Lilliefors (Kolmogorov-Smirnov) normality test
data: base_2[[a]]
D = 0.20153, p-value < 0.00000000000000022
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
Aviso: Use of `base_2[[a]]` is discouraged.
ℹ Use `.data[[a]]` instead.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Conclusión
print("a pesar de las trasnformaciones no muestra seguir una distribucion normal, se tendra que manejar con pruebas no parametricas ")
[1] "a pesar de las trasnformaciones no muestra seguir una distribucion normal, se tendra que manejar con pruebas no parametricas "
““” NInguna de las variables continuas se puede manejar como una normal, por lo tanto a todas se les tendra que hacer pruebas no parametricas
““”
cat("h0: La media muestral (o mediana) de créditos aprobados en el primer semestre de los Dropout es menor o igual a la de los Graduados.
H₁: La media muestral de los que aprueban todos sus créditos en primer semestre pero no se gradúan es mayor que la de los que sí se gradúan.
")
h0: La media muestral (o mediana) de créditos aprobados en el primer semestre de los Dropout es menor o igual a la de los Graduados.
H₁: La media muestral de los que aprueban todos sus créditos en primer semestre pero no se gradúan es mayor que la de los que sí se gradúan.
cat("Miramos si el comportamiento de las dos gráficas es normal:\n")
Miramos si el comportamiento de las dos gráficas es normal:
histograma_bi("Curricular units 1st sem (approved)","Target")
cat("Notamos que no siguen una distribución normal, por lo tanto
usamos transformaciones:\n")
Notamos que no siguen una distribución normal, por lo tanto
usamos transformaciones:
datos_u <- datos_u %>% mutate(approves_log = log1p(`Curricular units 1st sem (approved)`))
histograma_bi("approves_log","Target")
cat("Probamos pruebas de normalidad sobre estas dos variables:\n")
Probamos pruebas de normalidad sobre estas dos variables:
descripcion("approves_log","Target")
Descriptive statistics by group
group: Dropout
------------------------------------------------------------------
group: Enrolled
------------------------------------------------------------------
group: Graduate
datos_drop <- datos_u %>% filter(Target == "Dropout")
datos_grad <- datos_u %>% filter(Target=="Graduate")
options(scipen = 999)
lillie.test(datos_drop$approves_log)
Lilliefors (Kolmogorov-Smirnov) normality test
data: datos_drop$approves_log
D = 0.26696, p-value < 0.00000000000000022
lillie.test(datos_grad$approves_log)
Lilliefors (Kolmogorov-Smirnov) normality test
data: datos_grad$approves_log
D = 0.28477, p-value < 0.00000000000000022
cat("Aún no siguen una normal :( \n")
Aún no siguen una normal :(
# Prueba No Paramétrica: -----
wilcox.test(
datos_drop$`Curricular units 1st sem (approved)`,
datos_grad$`Curricular units 1st sem (approved)`,
alternative = "greater"
)
Wilcoxon rank sum test with continuity correction
data: datos_drop$`Curricular units 1st sem (approved)` and datos_grad$`Curricular units 1st sem (approved)`
W = 444728, p-value = 1
alternative hypothesis: true location shift is greater than 0
El p-value es mayor a 0.005 entonces no se rechaza h0.