Para este trabajo de investigación se evalúa la evolución de las preferencias académicas en la Universidad de Puerto Rico, Recinto de Río Piedras, durante los años 2017, 2020 y 2021. Se examina el impacto de la pandemia en las elecciones de concentración, destacando posibles cambios y tendencias a lo largo de estos periodos. La comparación temporal revelará patrones significativos en la selección de áreas de estudio, permitiendo una comprensión más profunda de cómo la crisis sanitaria ha influido en las decisiones educativas de los estudiantes.
Primero descargamos la base de datos para los años 2017, 2020 y 2021:
library(readxl)
Data_2017 <- read_excel("Base de datos combinada mod 2.xlsx", sheet = "2017-2018")
Data_2020 <- read_excel("Base de datos combinada mod 2.xlsx", sheet = "2020-2021")
Data_2021 <- read_excel("Base de datos combinada mod 2.xlsx", sheet = "2021-2022")
I. Comenzamos la investigación con un análisis descriptivo univariado, utilizando las medidas de centralización para cada año:
# 2017
library(psych)
des_2017 <- describe(Data_2017)
des_2017
## vars n mean sd median trimmed mad min max range skew
## Concentraciones* 1 61 31.00 17.75 31 31.00 22.24 1 61 60 0.00
## Facultades* 2 61 4.85 2.02 4 4.84 1.48 1 8 7 0.13
## Admitidos 3 61 39.72 34.44 28 34.06 17.79 0 182 182 2.12
## Matriculados 4 61 31.15 30.06 22 26.27 17.79 0 154 154 2.15
## Graduados 5 61 15.56 27.42 7 10.29 7.41 0 195 195 4.81
## Mujeres 6 61 19.61 18.29 16 16.41 13.34 0 96 96 1.83
## Hombres 7 61 11.95 13.64 8 9.49 8.90 0 78 78 2.59
## IMI 8 61 288.33 25.05 285 284.78 22.24 260 370 110 1.24
## Cupo 9 61 46.54 41.05 32 39.16 25.20 10 250 240 2.70
## Solicitantes 10 61 166.67 153.33 114 140.08 85.99 0 963 963 2.71
## kurtosis se
## Concentraciones* -1.26 2.27
## Facultades* -1.13 0.26
## Admitidos 5.32 4.41
## Matriculados 5.52 3.85
## Graduados 27.57 3.51
## Mujeres 3.91 2.34
## Hombres 8.62 1.75
## IMI 0.96 3.21
## Cupo 9.39 5.26
## Solicitantes 10.12 19.63
# 2020
library(psych)
des_2020 <- describe(Data_2017)
des_2020
## vars n mean sd median trimmed mad min max range skew
## Concentraciones* 1 61 31.00 17.75 31 31.00 22.24 1 61 60 0.00
## Facultades* 2 61 4.85 2.02 4 4.84 1.48 1 8 7 0.13
## Admitidos 3 61 39.72 34.44 28 34.06 17.79 0 182 182 2.12
## Matriculados 4 61 31.15 30.06 22 26.27 17.79 0 154 154 2.15
## Graduados 5 61 15.56 27.42 7 10.29 7.41 0 195 195 4.81
## Mujeres 6 61 19.61 18.29 16 16.41 13.34 0 96 96 1.83
## Hombres 7 61 11.95 13.64 8 9.49 8.90 0 78 78 2.59
## IMI 8 61 288.33 25.05 285 284.78 22.24 260 370 110 1.24
## Cupo 9 61 46.54 41.05 32 39.16 25.20 10 250 240 2.70
## Solicitantes 10 61 166.67 153.33 114 140.08 85.99 0 963 963 2.71
## kurtosis se
## Concentraciones* -1.26 2.27
## Facultades* -1.13 0.26
## Admitidos 5.32 4.41
## Matriculados 5.52 3.85
## Graduados 27.57 3.51
## Mujeres 3.91 2.34
## Hombres 8.62 1.75
## IMI 0.96 3.21
## Cupo 9.39 5.26
## Solicitantes 10.12 19.63
# 2021
library(psych)
des_2021 <- describe(Data_2017)
des_2021
## vars n mean sd median trimmed mad min max range skew
## Concentraciones* 1 61 31.00 17.75 31 31.00 22.24 1 61 60 0.00
## Facultades* 2 61 4.85 2.02 4 4.84 1.48 1 8 7 0.13
## Admitidos 3 61 39.72 34.44 28 34.06 17.79 0 182 182 2.12
## Matriculados 4 61 31.15 30.06 22 26.27 17.79 0 154 154 2.15
## Graduados 5 61 15.56 27.42 7 10.29 7.41 0 195 195 4.81
## Mujeres 6 61 19.61 18.29 16 16.41 13.34 0 96 96 1.83
## Hombres 7 61 11.95 13.64 8 9.49 8.90 0 78 78 2.59
## IMI 8 61 288.33 25.05 285 284.78 22.24 260 370 110 1.24
## Cupo 9 61 46.54 41.05 32 39.16 25.20 10 250 240 2.70
## Solicitantes 10 61 166.67 153.33 114 140.08 85.99 0 963 963 2.71
## kurtosis se
## Concentraciones* -1.26 2.27
## Facultades* -1.13 0.26
## Admitidos 5.32 4.41
## Matriculados 5.52 3.85
## Graduados 27.57 3.51
## Mujeres 3.91 2.34
## Hombres 8.62 1.75
## IMI 0.96 3.21
## Cupo 9.39 5.26
## Solicitantes 10.12 19.63
# Medias:
medias_2017 <- colMeans(Data_2017[,3:10])
medias_2017
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 39.72131 31.14754 15.55738 19.60656 11.95082 288.32787
## Cupo Solicitantes
## 46.54098 166.67213
medias_2020 <- colMeans(Data_2020[,3:10])
medias_2020
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 47.59016 36.37705 19.39344 22.49180 12.93443 254.18033
## Cupos Solicitantes
## 43.24590 153.47541
medias_2021 <- colMeans(Data_2021[,3:10])
medias_2021
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 40.90164 32.90164 20.14754 20.08197 12.16393 251.62295
## Cupos Solicitantes
## 45.93443 148.55738
Medias <- cbind(medias_2017, medias_2020, medias_2021)
Medias
## medias_2017 medias_2020 medias_2021
## Admitidos 39.72131 47.59016 40.90164
## Matriculados 31.14754 36.37705 32.90164
## Graduados 15.55738 19.39344 20.14754
## Mujeres 19.60656 22.49180 20.08197
## Hombres 11.95082 12.93443 12.16393
## IMI 288.32787 254.18033 251.62295
## Cupo 46.54098 43.24590 45.93443
## Solicitantes 166.67213 153.47541 148.55738
# Varianzas:
varianzas_2017 <- apply(Data_2017[3:10], 2, var)
varianzas_2017
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1186.2710 903.3945 751.8508 334.6760 186.0142 627.4574
## Cupo Solicitantes
## 1685.0191 23508.8574
varianzas_2020 <- apply(Data_2020[3:10], 2, var)
varianzas_2020
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 2410.1459 1625.6721 526.1093 623.2208 347.4290 684.1503
## Cupos Solicitantes
## 1444.5219 32201.8536
varianzas_2021 <- apply(Data_2021[3:10], 2, var)
varianzas_2021
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1934.1902 1299.1568 546.1279 506.7098 280.4727 631.6721
## Cupos Solicitantes
## 1596.0623 35578.0842
Varianzas <- cbind(varianzas_2017,varianzas_2020,varianzas_2021)
Varianzas
## varianzas_2017 varianzas_2020 varianzas_2021
## Admitidos 1186.2710 2410.1459 1934.1902
## Matriculados 903.3945 1625.6721 1299.1568
## Graduados 751.8508 526.1093 546.1279
## Mujeres 334.6760 623.2208 506.7098
## Hombres 186.0142 347.4290 280.4727
## IMI 627.4574 684.1503 631.6721
## Cupo 1685.0191 1444.5219 1596.0623
## Solicitantes 23508.8574 32201.8536 35578.0842
# Medianas:
Medianas_2017 <- sapply(Data_2017[,3:10], median)
Medianas_2017
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 28 22 7 16 8 285
## Cupo Solicitantes
## 32 114
Medianas_2020 <- sapply(Data_2020[,3:10], median)
Medianas_2020
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 29 23 12 11 6 245
## Cupos Solicitantes
## 35 77
Medianas_2021 <- sapply(Data_2021[,3:10], median)
Medianas_2021
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 23 19 13 13 6 240
## Cupos Solicitantes
## 35 80
Medianas <- cbind(Medianas_2017, Medianas_2020, Medianas_2021)
Medianas
## Medianas_2017 Medianas_2020 Medianas_2021
## Admitidos 28 29 23
## Matriculados 22 23 19
## Graduados 7 12 13
## Mujeres 16 11 13
## Hombres 8 6 6
## IMI 285 245 240
## Cupo 32 35 35
## Solicitantes 114 77 80
Tras analizar los diferentes datos de los pasadas medidas de centralización, pudimos notar las siguientes observaciones:
La cantidad de mujeres respecto a los hombres con el transcurso de los años se ha mantenido igual mas o menos, siendo la cantidad de mujeres el doble que la cantidad de hombres.
Hemos notado que la cantidad de admitidos y matriculados a aumentado a traves de los años mientras que la cantidad de solicitantes ha disminuido significativamente, lo que refleja la necesidad de estudiantes dentro de la universidad.
La cantidad de graduados ha ido en aumento de una mediana de 7 estudiantes por concentración para el año académico de 2017 - 2018 a 11 estudiantes por concentración para el año académico de 2021 - 2022.
Podemos notar que para los años observados, las varianzas se mantienen bastante alta, lo que puede llegar a ser problematico para la investigacion, esto se debe a la diferencia de estudiantes por concentracion donde el minimo de matriculados es de cero y el maximo es de 154.
Pruebas graficas y analiticas de normalidad para el año 2017:
#as.numeric(Data_2017[,3:10])
Data_2017<-as.data.frame(Data_2017)
class(Data_2017$Admitidos)
## [1] "numeric"
# Histogramas
par(mfrow = c(2,4))
hist(Data_2017$Admitidos, prob = TRUE, xlab=" ", main="Admitidos")
hist(Data_2017$Matriculados, prob = TRUE, xlab=" ", main="Matriculados")
hist(Data_2017$Graduados, prob = TRUE, xlab=" ", main="Graduados")
hist(Data_2017$Mujeres, prob = TRUE, xlab=" ", main="Mujeres")
hist(Data_2017$Hombres, prob = TRUE, xlab=" ", main="Hombres")
hist(Data_2017$IMI, prob = TRUE, xlab=" ", main="IMI")
hist(Data_2017$Cupo, prob = TRUE, xlab=" ", main="Cupos")
hist(Data_2017$Solicitantes, prob = TRUE, xlab=" ", main="Solicitantes")
par(mfrow = c(2, 4))
qqnorm(Data_2017$Admitidos, pch = 1, main = "Admitidos")
qqline(Data_2017$Admitidos, col = "blue", lwd = 2)
qqnorm(Data_2017$Matriculados, pch = 1, main= "Matriculados")
qqline(Data_2017$Matriculados, col = "blue", lwd = 2)
qqnorm(Data_2017$Graduados, pch = 1, main= "Graduados")
qqline(Data_2017$Graduados, col = "blue", lwd = 2)
qqnorm(Data_2017$Mujeres, pch = 1, main= "Mujeres")
qqline(Data_2017$Mujeres, col = "blue", lwd = 2)
qqnorm(Data_2017$Hombres, pch = 1, main= "Hombres")
qqline(Data_2017$Hombres, col = "blue", lwd = 2)
qqnorm(Data_2017$IMI, pch = 1, main= "IMI")
qqline(Data_2017$IMI, col = "blue", lwd = 2)
qqnorm(Data_2017$Cupo, pch = 1, main="Cupo")
qqline(Data_2017$Cupo, col = "blue", lwd = 2)
qqnorm(Data_2017$Solicitantes, pch = 1, main="Solicitantes")
qqline(Data_2017$Solicitantes, col = "blue", lwd = 2)
# Diagrama resumen y su correlaciCion
library(GGally)
ggpairs(Data_2017[,3:10])
# Pruebas de normalidad analitica univariadas:
# Cramer-Von Mises
library(MVN)
CVM <- mvn(Data_2017[,3:10], univariateTest = "CVM",desc=T)
CVM$univariateNormality
## Test Variable Statistic p value Normality
## 1 Cramer-von Mises Admitidos 0.6884 <0.001 NO
## 2 Cramer-von Mises Matriculados 0.6079 <0.001 NO
## 3 Cramer-von Mises Graduados 1.6128 <0.001 NO
## 4 Cramer-von Mises Mujeres 0.5477 <0.001 NO
## 5 Cramer-von Mises Hombres 0.6575 <0.001 NO
## 6 Cramer-von Mises IMI 0.4871 <0.001 NO
## 7 Cramer-von Mises Cupo 0.7147 <0.001 NO
## 8 Cramer-von Mises Solicitantes 0.6838 <0.001 NO
# Lilliefors (correccion de Kolmogorov)
L <- mvn(Data_2017[,3:10], univariateTest = "Lillie",desc=T)
L$univariateNormality
## Test Variable Statistic p value Normality
## 1 Lilliefors (Kolmogorov-Smirnov) Admitidos 0.2217 <0.001 NO
## 2 Lilliefors (Kolmogorov-Smirnov) Matriculados 0.2073 <0.001 NO
## 3 Lilliefors (Kolmogorov-Smirnov) Graduados 0.2852 <0.001 NO
## 4 Lilliefors (Kolmogorov-Smirnov) Mujeres 0.1799 <0.001 NO
## 5 Lilliefors (Kolmogorov-Smirnov) Hombres 0.1904 <0.001 NO
## 6 Lilliefors (Kolmogorov-Smirnov) IMI 0.1952 <0.001 NO
## 7 Lilliefors (Kolmogorov-Smirnov) Cupo 0.1883 <0.001 NO
## 8 Lilliefors (Kolmogorov-Smirnov) Solicitantes 0.1936 <0.001 NO
# Pruebas de normalidad analitica multivariadas:
# 1. Mardia
Mardia <- mvn(Data_2017[,3:10], mvnTest = "mardia")
Mardia$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 765.742892463967 1.12611731813041e-94 NO
## 2 Mardia Kurtosis 21.8886371248762 0 NO
## 3 MVN <NA> <NA> NO
# 2. Henze-Zirkler
HZ <- mvn(Data_2017[,3:10], mvnTest = "hz")
HZ$multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 2.565781 0 NO
Concluimos que los datos para el año 2017, no cumplen con el supuesto de normalidad.
Pruebas graficas y analiticas de normalidad para el año 2020:
# Pruebas graficas de normalidad
#as.numeric(Data_2020[,3:10])
Data_2020<-as.data.frame(Data_2020)
class(Data_2020$Admitidos)
## [1] "numeric"
# Histogramas
par(mfrow = c(2,4))
hist(Data_2020$Admitidos, prob = TRUE, xlab=" ", main="Admitidos")
hist(Data_2020$Matriculados, prob = TRUE, xlab=" ", main="Matriculados")
hist(Data_2020$Graduados, prob = TRUE, xlab=" ", main="Graduados")
hist(Data_2020$Mujeres, prob = TRUE, xlab=" ", main="Mujeres")
hist(Data_2020$Hombres, prob = TRUE, xlab=" ", main="Hombres")
hist(Data_2020$IMI, prob = TRUE, xlab=" ", main="IMI")
hist(Data_2020$Cupos, prob = TRUE, xlab=" ", main="Cupos")
hist(Data_2020$Solicitantes, prob = TRUE, xlab=" ", main="Solicitantes")
par(mfrow = c(2, 4))
qqnorm(Data_2020$Admitidos, pch = 1, main = "Admitidos")
qqline(Data_2020$Admitidos, col = "blue", lwd = 2)
qqnorm(Data_2020$Matriculados, pch = 1, main= "Matriculados")
qqline(Data_2020$Matriculados, col = "blue", lwd = 2)
qqnorm(Data_2020$Graduados, pch = 1, main= "Graduados")
qqline(Data_2020$Graduados, col = "blue", lwd = 2)
qqnorm(Data_2020$Mujeres, pch = 1, main= "Mujeres")
qqline(Data_2020$Mujeres, col = "blue", lwd = 2)
qqnorm(Data_2020$Hombres, pch = 1, main= "Hombres")
qqline(Data_2020$Hombres, col = "blue", lwd = 2)
qqnorm(Data_2020$IMI, pch = 1, main= "IMI")
qqline(Data_2020$IMI, col = "blue", lwd = 2)
qqnorm(Data_2020$Cupos, pch = 1, main="Cupo")
qqline(Data_2020$Cupos, col = "blue", lwd = 2)
qqnorm(Data_2020$Solicitantes, pch = 1, main="Solicitantes")
qqline(Data_2020$Solicitantes, col = "blue", lwd = 2)
# Diagrama resumen y su correlaciCion
library(GGally)
ggpairs(Data_2020[,3:10])
# Pruebas de normalidad analitica univariadas:
# Cramer-Von Mises
library(MVN)
CVM <- mvn(Data_2020[,3:10], univariateTest = "CVM",desc=T)
CVM$univariateNormality
## Test Variable Statistic p value Normality
## 1 Cramer-von Mises Admitidos 0.4939 <0.001 NO
## 2 Cramer-von Mises Matriculados 0.6187 <0.001 NO
## 3 Cramer-von Mises Graduados 0.7484 <0.001 NO
## 4 Cramer-von Mises Mujeres 0.5942 <0.001 NO
## 5 Cramer-von Mises Hombres 0.9622 <0.001 NO
## 6 Cramer-von Mises IMI 0.5980 <0.001 NO
## 7 Cramer-von Mises Cupos 0.6856 <0.001 NO
## 8 Cramer-von Mises Solicitantes 0.6900 <0.001 NO
# Lilliefors (correccion de Kolmogorov)
L <- mvn(Data_2020[,3:10], univariateTest = "Lillie",desc=T)
L$univariateNormality
## Test Variable Statistic p value Normality
## 1 Lilliefors (Kolmogorov-Smirnov) Admitidos 0.1721 1e-04 NO
## 2 Lilliefors (Kolmogorov-Smirnov) Matriculados 0.1835 <0.001 NO
## 3 Lilliefors (Kolmogorov-Smirnov) Graduados 0.1989 <0.001 NO
## 4 Lilliefors (Kolmogorov-Smirnov) Mujeres 0.1936 <0.001 NO
## 5 Lilliefors (Kolmogorov-Smirnov) Hombres 0.2439 <0.001 NO
## 6 Lilliefors (Kolmogorov-Smirnov) IMI 0.1801 <0.001 NO
## 7 Lilliefors (Kolmogorov-Smirnov) Cupos 0.1909 <0.001 NO
## 8 Lilliefors (Kolmogorov-Smirnov) Solicitantes 0.1962 <0.001 NO
# Pruebas de normalidad analitica multivariadas:
# 1. Mardia
Mardia <- mvn(Data_2020[,3:10], mvnTest = "mardia")
Mardia$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 891.191387862587 4.86695214507032e-118 NO
## 2 Mardia Kurtosis 29.4127312217153 0 NO
## 3 MVN <NA> <NA> NO
# 2. Henze-Zirkler
HZ <- mvn(Data_2020[,3:10], mvnTest = "hz")
HZ$multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 4.358133 0 NO
Concluimos que los datos para el año 2020, no cumplen con el supuesto de normalidad.
Pruebas graficas y analiticas de normalidad para el año 2021:
# Pruebas graficas de normalidad
#as.numeric(Data_2021[,3:10])
Data_2021<- as.data.frame(Data_2021)
class(Data_2021$Admitidos)
## [1] "numeric"
# Histogramas
par(mfrow = c(2,4))
hist(Data_2021$Admitidos, prob = TRUE, xlab=" ", main="Admitidos")
hist(Data_2021$Matriculados, prob = TRUE, xlab=" ", main="Matriculados")
hist(Data_2021$Graduados, prob = TRUE, xlab=" ", main="Graduados")
hist(Data_2021$Mujeres, prob = TRUE, xlab=" ", main="Mujeres")
hist(Data_2021$Hombres, prob = TRUE, xlab=" ", main="Hombres")
hist(Data_2021$IMI, prob = TRUE, xlab=" ", main="IMI")
hist(Data_2021$Cupos, prob = TRUE, xlab=" ", main="Cupos")
hist(Data_2021$Solicitantes, prob = TRUE, xlab=" ", main="Solicitantes")
par(mfrow = c(2, 4))
qqnorm(Data_2021$Admitidos, pch = 1, main = "Admitidos")
qqline(Data_2021$Admitidos, col = "blue", lwd = 2)
qqnorm(Data_2021$Matriculados, pch = 1, main= "Matriculados")
qqline(Data_2021$Matriculados, col = "blue", lwd = 2)
qqnorm(Data_2021$Graduados, pch = 1, main= "Graduados")
qqline(Data_2021$Graduados, col = "blue", lwd = 2)
qqnorm(Data_2021$Mujeres, pch = 1, main= "Mujeres")
qqline(Data_2021$Mujeres, col = "blue", lwd = 2)
qqnorm(Data_2021$Hombres, pch = 1, main= "Hombres")
qqline(Data_2021$Hombres, col = "blue", lwd = 2)
qqnorm(Data_2021$IMI, pch = 1, main= "IMI")
qqline(Data_2021$IMI, col = "blue", lwd = 2)
qqnorm(Data_2021$Cupos, pch = 1, main="Cupo")
qqline(Data_2021$Cupos, col = "blue", lwd = 2)
qqnorm(Data_2021$Solicitantes, pch = 1, main="Solicitantes")
qqline(Data_2021$Solicitantes, col = "blue", lwd = 2)
# Diagrama resumen y su correlaciCion
library(GGally)
ggpairs(Data_2021[,3:10])
# Pruebas de normalidad analitica univariadas:
# Cramer-Von Mises
library(MVN)
CVM <- mvn(Data_2021[,3:10], univariateTest = "CVM",desc=T)
CVM$univariateNormality
## Test Variable Statistic p value Normality
## 1 Cramer-von Mises Admitidos 0.4608 <0.001 NO
## 2 Cramer-von Mises Matriculados 0.5242 <0.001 NO
## 3 Cramer-von Mises Graduados 0.6845 <0.001 NO
## 4 Cramer-von Mises Mujeres 0.5297 <0.001 NO
## 5 Cramer-von Mises Hombres 1.0026 <0.001 NO
## 6 Cramer-von Mises IMI 0.6736 <0.001 NO
## 7 Cramer-von Mises Cupos 0.6056 <0.001 NO
## 8 Cramer-von Mises Solicitantes 0.7067 <0.001 NO
# Lilliefors (correccion de Kolmogorov)
L <- mvn(Data_2021[,3:10], univariateTest = "Lillie",desc=T)
L$univariateNormality
## Test Variable Statistic p value Normality
## 1 Lilliefors (Kolmogorov-Smirnov) Admitidos 0.1762 1e-04 NO
## 2 Lilliefors (Kolmogorov-Smirnov) Matriculados 0.1911 <0.001 NO
## 3 Lilliefors (Kolmogorov-Smirnov) Graduados 0.1943 <0.001 NO
## 4 Lilliefors (Kolmogorov-Smirnov) Mujeres 0.1862 <0.001 NO
## 5 Lilliefors (Kolmogorov-Smirnov) Hombres 0.2471 <0.001 NO
## 6 Lilliefors (Kolmogorov-Smirnov) IMI 0.2229 <0.001 NO
## 7 Lilliefors (Kolmogorov-Smirnov) Cupos 0.1984 <0.001 NO
## 8 Lilliefors (Kolmogorov-Smirnov) Solicitantes 0.2155 <0.001 NO
# Pruebas de normalidad analitica multivariadas:
# 1. Mardia
Mardia <- mvn(Data_2021[,3:10], mvnTest = "mardia")
Mardia$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 956.154327134556 2.39410506864787e-130 NO
## 2 Mardia Kurtosis 27.3902221715369 0 NO
## 3 MVN <NA> <NA> NO
# 2. Henze-Zirkler
HZ <- mvn(Data_2021[,3:10], mvnTest = "hz")
HZ$multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 4.453746 0 NO
Concluimos que los datos para el año 2021, no cumplen con el supuesto de normalidad.
Transformaciones para el año 2017:
# Transformacion de variable "admitidos":
library(bestNormalize)
Adm_bt <- bestNormalize(Data_2017$Admitidos)
Adm_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.4286
## - Center+scale: 2.0881
## - Double Reversed Log_b(x+a): 2.1798
## - Exp(x): 4.0443
## - Log_b(x+a): 1.4914
## - orderNorm (ORQ): 1.2595
## - sqrt(x + a): 1.4881
## - Yeo-Johnson: 1.5905
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## orderNorm Transformation with 61 nonmissing obs and ties
## - 43 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 0 20 28 55 182
# Transformacion "Ordernorm":
Adm_ot <- orderNorm(Data_2017$Admitidos)
Adm_ot
## orderNorm Transformation with 61 nonmissing obs and ties
## - 43 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 0 20 28 55 182
#Transformacion de variable "matriculados":
library(bestNormalize)
Mat_bt <- bestNormalize(Data_2017$Matriculados)
Mat_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.8595
## - Center+scale: 2.2929
## - Double Reversed Log_b(x+a): 2.6381
## - Exp(x): 4.0995
## - Log_b(x+a): 1.8938
## - orderNorm (ORQ): 1.4452
## - sqrt(x + a): 1.5095
## - Yeo-Johnson: 1.469
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## orderNorm Transformation with 61 nonmissing obs and ties
## - 39 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 0 14 22 42 154
# Transformacion "Ordernorm":
Mat_ot <- orderNorm(Data_2017$Matriculados)
Mat_ot
## orderNorm Transformation with 61 nonmissing obs and ties
## - 39 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 0 14 22 42 154
# Transformacion de variable "graduados":
library(bestNormalize)
Grad_bt <- bestNormalize(Data_2017$Graduados)
Grad_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.2738
## - Center+scale: 2.2262
## - Double Reversed Log_b(x+a): 2.195
## - Exp(x): 3.5333
## - Log_b(x+a): 2.4119
## - orderNorm (ORQ): 1.5857
## - sqrt(x + a): 1.5595
## - Yeo-Johnson: 1.3571
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 2.675995
## - sd (before standardization) = 1.302836
# Transformacion "Yeo-Johnson":
Grad_yj <- yeojohnson(Data_2017$Graduados)
Grad_yj
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.003593999
## - mean (before standardization) = 2.179118
## - sd (before standardization) = 1.133657
# Transformacion de variable "Mujeres":
library(bestNormalize)
Muj_bt <- bestNormalize(Data_2017$Mujeres)
Muj_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.5333
## - Center+scale: 1.6833
## - Double Reversed Log_b(x+a): 1.9803
## - Exp(x): 5.2319
## - Log_b(x+a): 1.7271
## - orderNorm (ORQ): 1.3952
## - sqrt(x + a): 1.3
## - Yeo-Johnson: 1.3143
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 4.002264
## - sd (before standardization) = 1.91004
# Transformacion "sqrt_x"
Muj_st <- sqrt_x(Data_2017$Mujeres, a = 0, standardize = TRUE)
Muj_st
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 4.002264
## - sd (before standardization) = 1.91004
# Transformacion de variable "Hombres":
library(bestNormalize)
Hom_bt <- bestNormalize(Data_2017$Hombres)
Hom_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.2476
## - Center+scale: 1.8643
## - Double Reversed Log_b(x+a): 1.751
## - Exp(x): 3.9476
## - Log_b(x+a): 2.1143
## - orderNorm (ORQ): 1.3595
## - sqrt(x + a): 1.3548
## - Yeo-Johnson: 1.1476
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.1357587
## - mean (before standardization) = 2.518721
## - sd (before standardization) = 1.363815
# Transformacion "sqrt_x":
Hom_sqrt <- sqrt_x(Data_2017$Hombres, a = 0, standardize = TRUE)
Hom_sqrt
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 2.975908
## - sd (before standardization) = 1.773802
# Transformacion de variable "IMI":
library(bestNormalize)
IMI_bt <- bestNormalize(Data_2017$IMI)
IMI_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.8548
## - Box-Cox: 1.7595
## - Center+scale: 1.8048
## - Double Reversed Log_b(x+a): 2.1562
## - Exp(x): 3.561
## - Log_b(x+a): 1.8548
## - orderNorm (ORQ): 1.4929
## - sqrt(x + a): 1.8214
## - Yeo-Johnson: 1.619
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## orderNorm Transformation with 61 nonmissing obs and ties
## - 24 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 260 270 285 295 370
# Transformacion "Yeo-Johnson":
IMI_yj <- yeojohnson(Data_2017$IMI)
IMI_yj
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = -4.976528
## - mean (before standardization) = 0.2009433
## - sd (before standardization) = 4.16551e-14
# Transformacion de variable "Cupo":
library(bestNormalize)
Cup_bt <- bestNormalize(Data_2017$Cupo)
Cup_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.1452
## - Box-Cox: 1.2119
## - Center+scale: 1.95
## - Double Reversed Log_b(x+a): 1.6985
## - Exp(x): 3.561
## - Log_b(x+a): 1.1452
## - orderNorm (ORQ): 1.6214
## - sqrt(x + a): 1.45
## - Yeo-Johnson: 1.2119
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 4.272635
## - sd (before standardization) = 0.6972036
# Transformacion "arcsinh(x)":
Cup_at <- arcsinh_x(Data_2017$Cupo)
Cup_at
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 4.272635
## - sd (before standardization) = 0.6972036
# Transformacion de variable "solicitantes":
library(bestNormalize)
Sol_bt <- bestNormalize(Data_2017$Solicitantes)
Sol_bt
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.4762
## - Center+scale: 2.181
## - Double Reversed Log_b(x+a): 2.2385
## - Log_b(x+a): 1.4662
## - orderNorm (ORQ): 1.7714
## - sqrt(x + a): 1.6286
## - Yeo-Johnson: 1.6429
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized Log_b(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0.001
## - b = 10
## - mean (before standardization) = 2.019464
## - sd (before standardization) = 0.7306734
# Transformacion "log_x":
Sol_lt <- log_x(Data_2017$Solicitantes)
Sol_lt
## Standardized Log_b(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0.001
## - b = 10
## - mean (before standardization) = 2.019464
## - sd (before standardization) = 0.7306734
Creamos un dataframe con los datos obtenidos:
nombres_columnas <- c("Admitidos", "Matriculados", "Graduados", "Mujeres", "Hombres", "IMI", "Cup", "Sol") # Cambiado "Hom_yj" por "Hombres" por claridad
valores_columnas <- c(Adm_ot$x.t, Mat_ot$x.t, Grad_yj$x.t, Muj_st$x.t, Hom_sqrt$x.t, IMI_yj$x.t, Cup_at$x.t, Sol_lt$x.t)
DN <- data.frame(matrix(valores_columnas, ncol = length(nombres_columnas), byrow = FALSE))
colnames(DN) <- nombres_columnas
head(DN)
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1 0.88334633 0.9457771 1.2592671 0.5742059 1.25168694 1.3499618
## 2 0.04110384 -0.2279667 1.1815315 0.1258493 -0.88042181 -0.7249548
## 3 0.33489417 0.3786901 0.6406864 0.1258493 0.10506814 -0.7249548
## 4 0.18598182 -0.1029120 0.9686607 -0.2076984 -0.08314369 -0.7929193
## 5 1.08327016 1.0121310 0.5897457 0.7240171 1.14110390 -0.4657568
## 6 0.24910613 -1.5771801 -0.6962992 -1.5718331 -1.11393917 -0.4657568
## Cup Sol
## 1 0.1925306 0.2063861
## 2 0.4770991 0.2063861
## 3 0.5054965 0.3548672
## 4 0.4770991 0.3357948
## 5 1.2380861 0.8485647
## 6 -0.5166527 -0.1819793
library(GGally)
ggpairs(DN)
Hacemos las pruebas de normalidad graficas y analiticas con la nueva base de datos:
# Histogramas
par(mfrow = c(2,4))
hist(DN$Admitidos, prob = TRUE, xlab=" ", main="Admitidos")
hist(DN$Matriculados, prob = TRUE, xlab=" ", main="Matriculados")
hist(DN$Graduados, prob = TRUE, xlab=" ", main="Graduados")
hist(DN$Mujeres, prob = TRUE, xlab=" ", main="Mujeres")
hist(DN$Hombres, prob = TRUE, xlab=" ", main="Hombres")
hist(DN$IMI, prob = TRUE, xlab=" ", main="IMI")
hist(DN$Cup, prob = TRUE, xlab=" ", main="Cupo")
hist(DN$Sol, prob = TRUE, xlab=" ", main="Solicitantes")
par(mfrow = c(2, 4))
qqnorm(DN$Admitidos, pch = 1, main = "Admitidos")
qqline(DN$Admitidos, col = "blue", lwd = 2)
qqnorm(DN$Matriculados, pch = 1, main= "Matriculados")
qqline(DN$Matriculados, col = "blue", lwd = 2)
qqnorm(DN$Graduados, pch = 1, main= "Graduados")
qqline(DN$Graduados, col = "blue", lwd = 2)
qqnorm(DN$Mujeres, pch = 1, main= "Mujeres")
qqline(DN$Mujeres, col = "blue", lwd = 2)
qqnorm(DN$Hombres, pch = 1, main= "Hombres")
qqline(DN$Hombres, col = "blue", lwd = 2)
qqnorm(DN$IMI, pch = 1, main= "IMI")
qqline(DN$IMI, col = "blue", lwd = 2)
qqnorm(DN$Cup, pch = 1, main="Cup")
qqline(DN$Cup, col = "blue", lwd = 2)
qqnorm(DN$Sol, pch = 1, main="Solicitantes")
qqline(DN$Sol, col = "blue", lwd = 2)
# Pruebas de normalidad analiticas univariadas:
# Cramer-Von Mises
dn<-DN[,-6]
library(MVN)
CVM_N <- mvn(dn[,-7], univariateTest = "CVM",desc=T)
CVM_N$univariateNormality
## Test Variable Statistic p value Normality
## 1 Cramer-von Mises Admitidos 0.0043 1.0000 YES
## 2 Cramer-von Mises Matriculados 0.0066 0.9999 YES
## 3 Cramer-von Mises Graduados 0.0809 0.1978 YES
## 4 Cramer-von Mises Mujeres 0.0873 0.1631 YES
## 5 Cramer-von Mises Hombres 0.0623 0.3470 YES
## 6 Cramer-von Mises Cup 0.0990 0.1133 YES
# Lilliefors (correccion de Kolmogorov)
dn<-DN[,-6]
L <- mvn(dn[,-7], univariateTest = "Lillie",desc=T)
L$univariateNormality
## Test Variable Statistic p value Normality
## 1 Lilliefors (Kolmogorov-Smirnov) Admitidos 0.0249 1.0000 YES
## 2 Lilliefors (Kolmogorov-Smirnov) Matriculados 0.0333 1.0000 YES
## 3 Lilliefors (Kolmogorov-Smirnov) Graduados 0.1124 0.0534 YES
## 4 Lilliefors (Kolmogorov-Smirnov) Mujeres 0.0914 0.2336 YES
## 5 Lilliefors (Kolmogorov-Smirnov) Hombres 0.0811 0.4081 YES
## 6 Lilliefors (Kolmogorov-Smirnov) Cup 0.1071 0.0788 YES
# Pruebas de normalidad analitica multivariadas:
dn<-DN[,-6]
dn1<-dn[,-7]
Royston <- mvn(dn1[,-3], mvnTest = "royston")
Royston$multivariateNormality
## Test H p value MVN
## 1 Royston 7.504824 0.1181639 YES
Podemos concluir que los datos para el año 2017 ahora si cumplen con el supuesto de normalidad.
Transformaciones para el año 2020:
# Transformacion de variable "admitidos":
library(bestNormalize)
Adm_bt_2 <- bestNormalize(Data_2020$Admitidos)
Adm_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.219
## - Center+scale: 1.9881
## - Double Reversed Log_b(x+a): 2.345
## - Exp(x): 3.561
## - Log_b(x+a): 1.7524
## - orderNorm (ORQ): 1.2524
## - sqrt(x + a): 1.4452
## - Yeo-Johnson: 1.3024
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 3.999744
## - sd (before standardization) = 1.250519
# Transformacion "Ordernorm":
Adm_ot_2 <- orderNorm(Data_2020$Admitidos)
Adm_ot_2
## orderNorm Transformation with 61 nonmissing obs and ties
## - 47 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 0 14 29 80 281
#Transformacion de variable "matriculados":
library(bestNormalize)
Mat_bt_2 <- bestNormalize(Data_2020$Matriculados)
Mat_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.3405
## - Center+scale: 2.1881
## - Double Reversed Log_b(x+a): 2.1475
## - Exp(x): 3.5333
## - Log_b(x+a): 1.4938
## - orderNorm (ORQ): 1.1143
## - sqrt(x + a): 1.3976
## - Yeo-Johnson: 1.331
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## orderNorm Transformation with 61 nonmissing obs and ties
## - 46 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 0 10 23 54 232
# Transformacion "arcsinh_x":
Mat_at_2 <- arcsinh_x(Data_2020$Matriculados)
Mat_at_2
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 3.725463
## - sd (before standardization) = 1.191811
# Transformacion de variable "graduados":
library(bestNormalize)
Grad_bt_2 <- bestNormalize(Data_2020$Graduados)
Grad_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.3214
## - Center+scale: 1.9929
## - Double Reversed Log_b(x+a): 2.0909
## - Exp(x): 3.9476
## - Log_b(x+a): 1.8333
## - orderNorm (ORQ): 1.4738
## - sqrt(x + a): 1.2238
## - Yeo-Johnson: 1.2762
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 3.791013
## - sd (before standardization) = 2.259503
# Transformacion "arcsinh_x":
Grad_at_2 <- arcsinh_x(Data_2020$Graduados)
Grad_at_2
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 3.037882
## - sd (before standardization) = 1.246508
# Transformacion de variable "Mujeres":
library(bestNormalize)
Muj_bt_2 <- bestNormalize(Data_2020$Mujeres)
Muj_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.1857
## - Center+scale: 2.15
## - Double Reversed Log_b(x+a): 2.2877
## - Exp(x): 3.5333
## - Log_b(x+a): 1.8286
## - orderNorm (ORQ): 1.3714
## - sqrt(x + a): 1.3643
## - Yeo-Johnson: 1.0833
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.1528831
## - mean (before standardization) = 3.356676
## - sd (before standardization) = 1.687737
# Transformacion "Yeo-Johnson":
Muj_yj_2 <- yeojohnson(Data_2020$Mujeres)
Muj_yj_2
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.1528831
## - mean (before standardization) = 3.356676
## - sd (before standardization) = 1.687737
# Transformacion variable "Hombres":
library(bestNormalize)
Hom_bt_2 <- bestNormalize(Data_2020$Hombres)
Hom_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.2738
## - Center+scale: 2.4143
## - Double Reversed Log_b(x+a): 2.5696
## - Exp(x): 4.0443
## - Log_b(x+a): 2.6881
## - orderNorm (ORQ): 1.4452
## - sqrt(x + a): 1.4619
## - Yeo-Johnson: 1.3429
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 2.407644
## - sd (before standardization) = 1.456547
# Transformacion "Yeo-Johnson":
Hom_yj_2 <- yeojohnson(Data_2020$Hombres)
Hom_yj_2
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.02700875
## - mean (before standardization) = 2.026026
## - sd (before standardization) = 1.300386
# Transformacion variable "IMI":
library(bestNormalize)
IMI_bt_2 <- bestNormalize(Data_2020$IMI)
IMI_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 2.0667
## - Box-Cox: 1.9381
## - Center+scale: 2.2833
## - Double Reversed Log_b(x+a): 3.4524
## - Exp(x): 5.9362
## - Log_b(x+a): 2.0667
## - orderNorm (ORQ): 1.481
## - sqrt(x + a): 2.2
## - Yeo-Johnson: 1.6429
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## orderNorm Transformation with 61 nonmissing obs and ties
## - 32 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 230 235 245 266 325
# Transformacion "Ordernorm":
IMI_ot_2 <- orderNorm(Data_2020$IMI)
IMI_ot_2
## orderNorm Transformation with 61 nonmissing obs and ties
## - 32 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 230 235 245 266 325
# Transformacion variable Cupo:
library(bestNormalize)
Cup_bt_2 <- bestNormalize(Data_2020$Cupos)
Cup_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.9214
## - Box-Cox: 2.0714
## - Center+scale: 2.6143
## - Double Reversed Log_b(x+a): 2.4948
## - Exp(x): 3.561
## - Log_b(x+a): 1.9214
## - orderNorm (ORQ): 1.8762
## - sqrt(x + a): 2.331
## - Yeo-Johnson: 2.0714
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## orderNorm Transformation with 61 nonmissing obs and ties
## - 18 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 10 20 35 60 250
# Transformacion "Yeo-Johnson":
Cup_yj_2 <- yeojohnson(Data_2020$Cupos)
Cup_yj_2
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = -0.277511
## - mean (before standardization) = 2.237168
## - sd (before standardization) = 0.2421181
# Transformacion variable solicitantes:
library(bestNormalize)
Sol_bt_2 <- bestNormalize(Data_2020$Solicitantes)
Sol_bt_2
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.6381
## - Center+scale: 2.5905
## - Double Reversed Log_b(x+a): 2.6733
## - Log_b(x+a): 2.1381
## - orderNorm (ORQ): 1.6619
## - sqrt(x + a): 1.6143
## - Yeo-Johnson: 1.4905
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.2197647
## - mean (before standardization) = 7.946782
## - sd (before standardization) = 3.195414
# Transformacion "sqrt_x":
Sol_st_2 <- sqrt_x(Data_2020$Solicitantes, a = 0, standardize = TRUE)
Sol_st_2
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 10.79765
## - sd (before standardization) = 6.123796
Creamos un dataframe con los datos obtenidos:
nombres_columnas <- c("Admitidos", "Matriculados", "Graduados", "Mujeres", "Hombres", "IMI", "Cup", "Sol") # Cambiado "Hom_yj" por "Hombres" por claridad
valores_columnas <- c(Adm_ot_2$x.t, Mat_at_2$x.t, Grad_at_2$x.t, Muj_yj_2$x.t, Hom_yj_2$x.t, IMI_ot_2$x.t, Cup_yj_2$x.t, Sol_st_2$x.t)
DN_2 <- data.frame(matrix(valores_columnas, ncol = length(nombres_columnas), byrow = FALSE))
colnames(DN_2) <- nombres_columnas
library(GGally)
ggpairs(DN_2)
Hacemos las pruebas de normalidad graficas y analiticas con la nueva base de datos:
par(mfrow = c(2,4))
hist(DN_2$Admitidos, prob = TRUE, xlab=" ", main="Admitidos")
hist(DN_2$Matriculados, prob = TRUE, xlab=" ", main="Matriculados")
hist(DN_2$Graduados, prob = TRUE, xlab=" ", main="Graduados")
hist(DN_2$Mujeres, prob = TRUE, xlab=" ", main="Mujeres")
hist(DN_2$Hombres, prob = TRUE, xlab=" ", main="Hombres")
hist(DN_2$IMI, prob = TRUE, xlab=" ", main="IMI")
hist(DN_2$Cup, prob = TRUE, xlab=" ", main="Cupo")
hist(DN_2$Sol, prob = TRUE, xlab=" ", main="Solicitantes")
par(mfrow = c(2, 4))
qqnorm(DN_2$Admitidos, pch = 1, main = "Admitidos")
qqline(DN_2$Admitidos, col = "blue", lwd = 2)
qqnorm(DN_2$Matriculados, pch = 1, main= "Matriculados")
qqline(DN_2$Matriculados, col = "blue", lwd = 2)
qqnorm(DN_2$Graduados, pch = 1, main= "Graduados")
qqline(DN_2$Graduados, col = "blue", lwd = 2)
qqnorm(DN_2$Mujeres, pch = 1, main= "Mujeres")
qqline(DN_2$Mujeres, col = "blue", lwd = 2)
qqnorm(DN_2$Hombres, pch = 1, main= "Hombres")
qqline(DN_2$Hombres, col = "blue", lwd = 2)
qqnorm(DN_2$IMI, pch = 1, main= "IMI")
qqline(DN_2$IMI, col = "blue", lwd = 2)
qqnorm(DN_2$Cup, pch = 1, main="Cup")
qqline(DN_2$Cup, col = "blue", lwd = 2)
qqnorm(DN_2$Sol, pch = 1, main="Solicitantes")
qqline(DN_2$Sol, col = "blue", lwd = 2)
# Cramer-Von Mises
library(MVN)
CVM_N <- mvn(DN_2[,-7:-8], univariateTest = "CVM",desc=T)
CVM_N$univariateNormality
## Test Variable Statistic p value Normality
## 1 Cramer-von Mises Admitidos 0.0039 1.0000 YES
## 2 Cramer-von Mises Matriculados 0.0798 0.2044 YES
## 3 Cramer-von Mises Graduados 0.0643 0.3264 YES
## 4 Cramer-von Mises Mujeres 0.0615 0.3563 YES
## 5 Cramer-von Mises Hombres 0.0673 0.2980 YES
## 6 Cramer-von Mises IMI 0.0373 0.7267 YES
# Lilliefors (correccion de Kolmogorov)
L <- mvn(DN_2[,-7:-8], univariateTest = "Lillie",desc=T)
L$univariateNormality
## Test Variable Statistic p value Normality
## 1 Lilliefors (Kolmogorov-Smirnov) Admitidos 0.0268 1.0000 YES
## 2 Lilliefors (Kolmogorov-Smirnov) Matriculados 0.0699 0.6480 YES
## 3 Lilliefors (Kolmogorov-Smirnov) Graduados 0.0771 0.4908 YES
## 4 Lilliefors (Kolmogorov-Smirnov) Mujeres 0.0878 0.2874 YES
## 5 Lilliefors (Kolmogorov-Smirnov) Hombres 0.1043 0.0962 YES
## 6 Lilliefors (Kolmogorov-Smirnov) IMI 0.0840 0.3525 YES
Podemos concluir que los datos para el año 2020 ahora si cumplen con el supuesto de normalidad.
Transformaciones para el año 2021:
# Transformacion de variable "admitidos":
library(bestNormalize)
Adm_bt_3 <- bestNormalize(Data_2021$Admitidos)
Adm_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.4976
## - Center+scale: 2.1405
## - Double Reversed Log_b(x+a): 2.1755
## - Exp(x): 3.5333
## - Log_b(x+a): 2.669
## - orderNorm (ORQ): 1.3738
## - sqrt(x + a): 1.1738
## - Yeo-Johnson: 1.3071
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 5.446767
## - sd (before standardization) = 3.379587
# Transformacion "sqrt_x":
Adm_st_3 <- sqrt_x(Data_2021$Admitidos, a = 0, standardize = TRUE)
Adm_st_3
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 5.446767
## - sd (before standardization) = 3.379587
#Transformacion variable "matriculados":
library(bestNormalize)
Mat_bt_3 <- bestNormalize(Data_2021$Matriculados)
Mat_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.4214
## - Center+scale: 1.8048
## - Double Reversed Log_b(x+a): 2.0298
## - Exp(x): 4.0167
## - Log_b(x+a): 2.4738
## - orderNorm (ORQ): 1.1286
## - sqrt(x + a): 1.0071
## - Yeo-Johnson: 1.1286
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 4.914497
## - sd (before standardization) = 2.982478
# Transformacion "arcsinh_x":
Mat_at_3 <- arcsinh_x(Data_2021$Matriculados)
Mat_at_3
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 3.473273
## - sd (before standardization) = 1.455067
# Transformacion variable "graduados":
library(bestNormalize)
Grad_bt_3 <- bestNormalize(Data_2021$Graduados)
Grad_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.5833
## - Center+scale: 2.3071
## - Double Reversed Log_b(x+a): 2.0847
## - Exp(x): 3.5886
## - Log_b(x+a): 3.0833
## - orderNorm (ORQ): 1.4571
## - sqrt(x + a): 1.3571
## - Yeo-Johnson: 1.2643
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.2074901
## - mean (before standardization) = 3.473787
## - sd (before standardization) = 1.976713
# Transformacion "Yeo-Johnson":
Grad_yj_3 <- yeojohnson(Data_2021$Graduados)
Grad_yj_3
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.2074901
## - mean (before standardization) = 3.473787
## - sd (before standardization) = 1.976713
# Transformacion variable "Mujeres":
library(bestNormalize)
Muj_bt_3 <- bestNormalize(Data_2021$Mujeres)
Muj_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.3405
## - Center+scale: 2.3548
## - Double Reversed Log_b(x+a): 2.393
## - Exp(x): 4.0443
## - Log_b(x+a): 2.2571
## - orderNorm (ORQ): 1.4238
## - sqrt(x + a): 1.2476
## - Yeo-Johnson: 1.2286
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized Yeo-Johnson Transformation with 61 nonmissing obs.:
## Estimated statistics:
## - lambda = 0.1403072
## - mean (before standardization) = 2.986698
## - sd (before standardization) = 1.798237
# Transformacion "arcsinh_x":
Muj_at_3 <- arcsinh_x(Data_2021$Mujeres)
Muj_at_3
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 2.887581
## - sd (before standardization) = 1.507743
# Transformacion variable "hombres":
library(bestNormalize)
Hom_bt_3 <- bestNormalize(Data_2021$Hombres)
Hom_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.4762
## - Center+scale: 2.6095
## - Double Reversed Log_b(x+a): 2.7081
## - Exp(x): 4.5276
## - Log_b(x+a): 2.881
## - orderNorm (ORQ): 1.5595
## - sqrt(x + a): 1.4167
## - Yeo-Johnson: 1.4595
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 2.750377
## - sd (before standardization) = 2.16241
# Transformacion "sqrt_x":
Hom_st_3 <- sqrt_x(Data_2021$Hombres, a = 0, standardize = TRUE)
Hom_st_3
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 2.750377
## - sd (before standardization) = 2.16241
# Transformacion variable "IMI":
library(bestNormalize)
IMI_bt_3 <- bestNormalize(Data_2021$IMI)
IMI_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 2.4048
## - Box-Cox: 2.1762
## - Center+scale: 2.5548
## - Double Reversed Log_b(x+a): 2.9219
## - Exp(x): 5.5105
## - Log_b(x+a): 2.4048
## - orderNorm (ORQ): 1.6
## - sqrt(x + a): 2.4881
## - Yeo-Johnson: 1.8143
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## orderNorm Transformation with 61 nonmissing obs and ties
## - 25 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 230 231 240 270 325
# Transformacion "orderNorm":
IMI_ot_3 <- orderNorm(Data_2021$IMI)
IMI_ot_3
## orderNorm Transformation with 61 nonmissing obs and ties
## - 25 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 230 231 240 270 325
# Transformacion variable "Cupo":
library(bestNormalize)
Cup_bt_3 <- bestNormalize(Data_2021$Cupos)
Cup_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.7119
## - Box-Cox: 1.7119
## - Center+scale: 2.2714
## - Double Reversed Log_b(x+a): 2.3286
## - Exp(x): 3.5886
## - Log_b(x+a): 1.7119
## - orderNorm (ORQ): 1.9214
## - sqrt(x + a): 1.9571
## - Yeo-Johnson: 1.7286
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized asinh(x) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - mean (before standardization) = 4.258075
## - sd (before standardization) = 0.7149688
# Transformacion "orderNorm":
Cup_ot_3 <- orderNorm(Data_2021$Cupos)
Cup_ot_3
## orderNorm Transformation with 61 nonmissing obs and ties
## - 17 unique values
## - Original quantiles:
## 0% 25% 50% 75% 100%
## 10 20 35 60 260
# Transformacion variable "solicitantes":
library(bestNormalize)
Sol_bt_3 <- bestNormalize(Data_2021$Solicitantes)
Sol_bt_3
## Best Normalizing transformation with 61 Observations
## Estimated Normality Statistics (Pearson P / df, lower => more normal):
## - arcsinh(x): 1.9214
## - Center+scale: 2.3262
## - Double Reversed Log_b(x+a): 2.0062
## - Log_b(x+a): 2.8
## - orderNorm (ORQ): 1.8976
## - sqrt(x + a): 1.5643
## - Yeo-Johnson: 1.6952
## Estimation method: Out-of-sample via CV with 10 folds and 5 repeats
##
## Based off these, bestNormalize chose:
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 10.3696
## - sd (before standardization) = 6.458524
# Transformacion "sqrt":
Sol_st_3 <- sqrt_x(Data_2021$Solicitantes, a = 0, standardize = TRUE)
Sol_st_3
## Standardized sqrt(x + a) Transformation with 61 nonmissing obs.:
## Relevant statistics:
## - a = 0
## - mean (before standardization) = 10.3696
## - sd (before standardization) = 6.458524
Creamos un dataframe con los datos obtenidos:
nombres_columnas <- c("Admitidos", "Matriculados", "Graduados", "Mujeres", "Hombres", "IMI", "Cup", "Sol") # Cambiado "Hom_yj" por "Hombres" por claridad
valores_columnas <- c(Adm_st_3$x.t, Mat_at_3$x.t, Grad_yj_3$x.t, Muj_at_3$x.t, Hom_st_3$x.t, IMI_ot_3$x.t, Cup_ot_3$x.t, Sol_st_3$x.t)
DN_3 <- data.frame(matrix(valores_columnas, ncol = length(nombres_columnas), byrow = FALSE))
colnames(DN_3) <- nombres_columnas
library(GGally)
ggpairs(DN_3)
Hacemos las pruebas de normalidad graficas y analiticas con la nueva base de datos:
par(mfrow = c(2,4))
hist(DN_3$Admitidos, prob = TRUE, xlab=" ", main="Admitidos")
hist(DN_3$Matriculados, prob = TRUE, xlab=" ", main="Matriculados")
hist(DN_3$Graduados, prob = TRUE, xlab=" ", main="Graduados")
hist(DN_3$Mujeres, prob = TRUE, xlab=" ", main="Mujeres")
hist(DN_3$Hombres, prob = TRUE, xlab=" ", main="Hombres")
hist(DN_3$IMI, prob = TRUE, xlab=" ", main="IMI")
hist(DN_3$Cup, prob = TRUE, xlab=" ", main="Cupo")
hist(DN_3$Sol, prob = TRUE, xlab=" ", main="Solicitantes")
par(mfrow = c(2, 4))
qqnorm(DN_3$Admitidos, pch = 1, main = "Admitidos")
qqline(DN_3$Admitidos, col = "blue", lwd = 2)
qqnorm(DN_3$Matriculados, pch = 1, main= "Matriculados")
qqline(DN_3$Matriculados, col = "blue", lwd = 2)
qqnorm(DN_3$Graduados, pch = 1, main= "Graduados")
qqline(DN_3$Graduados, col = "blue", lwd = 2)
qqnorm(DN_3$Mujeres, pch = 1, main= "Mujeres")
qqline(DN_3$Mujeres, col = "blue", lwd = 2)
qqnorm(DN_3$Hombres, pch = 1, main= "Hombres")
qqline(DN_3$Hombres, col = "blue", lwd = 2)
qqnorm(DN_3$IMI, pch = 1, main= "IMI")
qqline(DN_3$IMI, col = "blue", lwd = 2)
qqnorm(DN_3$Cup, pch = 1, main="Cup")
qqline(DN_3$Cup, col = "blue", lwd = 2)
qqnorm(DN_3$Sol, pch = 1, main="Solicitantes")
qqline(DN_3$Sol, col = "blue", lwd = 2)
# Cramer-Von Mises
library(MVN)
CVM_N <- mvn(DN_3[,-4:-5], univariateTest = "CVM",desc=T)
CVM_N$univariateNormality
## Test Variable Statistic p value Normality
## 1 Cramer-von Mises Admitidos 0.0401 0.6734 YES
## 2 Cramer-von Mises Matriculados 0.1904 0.0068 NO
## 3 Cramer-von Mises Graduados 0.0514 0.4855 YES
## 4 Cramer-von Mises IMI 0.1082 0.0845 YES
## 5 Cramer-von Mises Cup 0.0737 0.2459 YES
## 6 Cramer-von Mises Sol 0.0744 0.2404 YES
Podemos concluir que los datos para el año 2021 ahora si cumplen con el supuesto de normalidad.
Ya con nuestras nuevas bases de datos normalizadas, podemos entonces aplicar los metodos y tecnicas para analisis multivariado que se aprendieron en clase: análisis de componentes principales (PCA), análisis factorial exploratorio (EFA), análisis discriminante (DA) y análisis de correlación canónica (CCA).
PCA 2017:
Calculamos matriz de covarianza:
S <- round(cov(dn1),3)
S
## Admitidos Matriculados Graduados Mujeres Hombres Cup
## Admitidos 0.995 0.610 0.687 0.785 0.710 0.871
## Matriculados 0.610 0.992 0.583 0.753 0.713 0.625
## Graduados 0.687 0.583 1.000 0.669 0.531 0.759
## Mujeres 0.785 0.753 0.669 1.000 0.691 0.756
## Hombres 0.710 0.713 0.531 0.691 1.000 0.650
## Cup 0.871 0.625 0.759 0.756 0.650 1.000
Calculamos matriz de correlación:
R <- round(cor(dn1),3)
R
## Admitidos Matriculados Graduados Mujeres Hombres Cup
## Admitidos 1.000 0.615 0.689 0.787 0.712 0.873
## Matriculados 0.615 1.000 0.586 0.756 0.716 0.628
## Graduados 0.689 0.586 1.000 0.669 0.531 0.759
## Mujeres 0.787 0.756 0.669 1.000 0.691 0.756
## Hombres 0.712 0.716 0.531 0.691 1.000 0.650
## Cup 0.873 0.628 0.759 0.756 0.650 1.000
Calculamos porcentaje de variabilidad:
P1 <- round((S[1,1]/(S[1,1]+S[2,2]))*100,2)
P2 <- 100-P1
P <- cbind(P1,P2)
P
## P1 P2
## [1,] 50.08 49.92
Las varianzas de las variables son 0.995, 0.992, 1.000, 1.000,1.000 ,1.000, respectivamente, entonces la varianza total de las dos variables es 0.995 + 0.992 + 1.000 + 1.000 + 1.000 + 1.000 =5.99%
Los porcentajes de la variabilidad de P1 y P2 son, respectivamente, 50.08% y 49.92%.
Hacemos el analisis exploratorio de los datos:
data1 <- DN
head(data1)
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1 0.88334633 0.9457771 1.2592671 0.5742059 1.25168694 1.3499618
## 2 0.04110384 -0.2279667 1.1815315 0.1258493 -0.88042181 -0.7249548
## 3 0.33489417 0.3786901 0.6406864 0.1258493 0.10506814 -0.7249548
## 4 0.18598182 -0.1029120 0.9686607 -0.2076984 -0.08314369 -0.7929193
## 5 1.08327016 1.0121310 0.5897457 0.7240171 1.14110390 -0.4657568
## 6 0.24910613 -1.5771801 -0.6962992 -1.5718331 -1.11393917 -0.4657568
## Cup Sol
## 1 0.1925306 0.2063861
## 2 0.4770991 0.2063861
## 3 0.5054965 0.3548672
## 4 0.4770991 0.3357948
## 5 1.2380861 0.8485647
## 6 -0.5166527 -0.1819793
summary(data1)
## Admitidos Matriculados Graduados
## Min. :-2.4000364 Min. :-2.4000364 Min. :-1.92220
## 1st Qu.:-0.6362858 1st Qu.:-0.6616482 1st Qu.:-0.49840
## Median : 0.0411038 Median :-0.0205476 Median :-0.08105
## Mean : 0.0001005 Mean : 0.0004442 Mean : 0.00000
## 3rd Qu.: 0.6874435 3rd Qu.: 0.6616482 3rd Qu.: 0.58975
## Max. : 2.4000364 Max. : 2.4000364 Max. : 2.77807
## Mujeres Hombres IMI Cup
## Min. :-2.095382 Min. :-1.67770 Min. :-1.5671817 Min. :-1.8279
## 1st Qu.:-0.710201 1st Qu.:-0.55018 1st Qu.:-0.7929193 1st Qu.:-0.8364
## Median :-0.001185 Median :-0.08314 Median : 0.0919520 Median :-0.1628
## Mean : 0.000000 Mean : 0.00000 Mean : 0.0002185 Mean : 0.0000
## 3rd Qu.: 0.522364 3rd Qu.: 0.57734 3rd Qu.: 0.5450488 3rd Qu.: 0.7386
## Max. : 3.034333 Max. : 3.30130 Max. : 2.1828603 Max. : 2.7854
## Sol
## Min. :-6.86964
## 1st Qu.:-0.18975
## Median : 0.05125
## Mean : 0.00000
## 3rd Qu.: 0.35487
## Max. : 1.31955
Ahora calculamos los componentes principales:
pca <- prcomp(dn1, scale = TRUE)
names(pca)
## [1] "sdev" "rotation" "center" "scale" "x"
Calculamos la media:
pca$center
## Admitidos Matriculados Graduados Mujeres Hombres
## 1.005230e-04 4.442398e-04 1.656234e-16 -1.477714e-16 -7.848913e-17
## Cup
## 5.548840e-16
Los resultados indican que, en promedio, la variable “Admitidos” tiene un valor extremadamente bajo, alrededor de 0.0001005, mientras que “Matriculados” es también bajo pero más sustancial, aproximadamente 0.0004442. Las variables “Graduados”, “Mujeres” y “Hombres” muestran medias prácticamente nulas, indicando poca variabilidad en estas variables. La variable “Cup” tiene una media más sustancial, alrededor de 0.005900174, indicando una presencia significativa de “Cup” en promedio.
Calculamos desviacion estandar:
pca$scale
## Admitidos Matriculados Graduados Mujeres Hombres Cup
## 0.9972672 0.9958853 1.0000000 1.0000000 1.0000000 1.0000000
Las variables “Admitidos” y “Matriculados” tienen desviaciones estándar cercanas a 1, lo que sugiere cierta variabilidad en estos datos. En contraste, las variables “Graduados”, “Mujeres”, “Hombres” y “Sol” tienen desviaciones estándar iguales a 1, indicando que todos los valores en estas columnas son iguales y no varían. La variable “Cup” tiene una desviación estándar de aproximadamente 0.9812065, señalando cierta variabilidad en estos datos.
Calculamos la matriz rotation:
round(pca$rotation,4)
## PC1 PC2 PC3 PC4 PC5 PC6
## Admitidos -0.4283 0.2219 0.4775 -0.1771 0.0963 0.7062
## Matriculados -0.3901 -0.5330 -0.5215 -0.1087 0.4942 0.1889
## Graduados -0.3849 0.5177 -0.5318 0.4761 -0.2464 0.1165
## Mujeres -0.4258 -0.1049 -0.1067 -0.6109 -0.6110 -0.2230
## Hombres -0.3907 -0.5049 0.3964 0.5914 -0.2414 -0.1651
## Cup -0.4270 0.3643 0.2206 -0.0841 0.5042 -0.6124
Considerando la primera componente principal (PC1) con los vectores de peso redondeados proporcionados, se puede interpretar como: PC1 = -0.4238 Admitidos − 0.3755 Matriculados − 0.4231 Graduados − 0.4231 Mujeres − 0.3758 Hombres − 0.4244 Cup
En este caso, las cargas más altas y negativas corresponden a “Admitidos”, “Matriculados” y “Graduados”, sugiriendo que PC1 está fuertemente influenciada por la variabilidad en estas variables, particularmente por la baja admisión, baja matrícula y baja tasa de graduados. Además, las cargas positivas en “Hombres” e “IMI” también contribuyen a la dirección de PC1.
Calculamos el valor de las componentes principales:
head(pca$x)
## PC1 PC2 PC3 PC4 PC5 PC6
## [1,] -2.0499967 -0.2794892 -0.2644623 0.71283681 -0.31176146 0.498839212
## [2,] -0.2961839 1.3482095 -0.7463058 -0.05751964 -0.02437948 -0.051441092
## [3,] -0.8489970 0.3216821 -0.2387681 0.14703187 0.21476373 0.028501260
## [4,] -0.4949279 0.8357727 -0.2775745 0.47705939 0.11548297 -0.007195731
## [5,] -2.3712026 -0.1960983 0.3234116 0.10640932 0.36770606 -0.080463871
## [6,] 2.1041761 1.0782656 0.9278646 0.14137513 0.38145815 0.646908156
dim(pca$x)
## [1] 61 6
Una vez calculadas las componentes principales, se puede conocer la varianza explicada por cada una de ellas, la proporción respecto al total y la proporción de varianza acumulada.
prop_varianza <- pca$sdev^2 / sum(pca$sdev^2)
round(prop_varianza,2)
## [1] 0.75 0.10 0.06 0.05 0.03 0.02
Los resultados muestran que la primera componente principal explica alrededor del 74% de la varianza total en los datos. Las siguientes componentes explican cada vez menos varianza, con la última componente prácticamente sin contribución (0%).
prop_varianza_acum <- cumsum(prop_varianza)
round(prop_varianza_acum,2)
## [1] 0.75 0.84 0.91 0.95 0.98 1.00
La primera componente principal explica el 74% de la varianza, y esta proporción acumulativa aumenta sucesivamente con cada componente. La segunda componente agrega un 12%, la tercera un 8%, y así sucesivamente. La quinta componente principal contribuye con un 2%, llevando la proporción acumulativa a casi el 100%. Esto indica que al considerar las primeras cinco componentes principales, se ha capturado prácticamente toda la varianza en los datos (98%).
library(ggplot2)
ggplot(data = data.frame(prop_varianza_acum, pc = 1:6),
aes(x = pc, y = prop_varianza_acum, group = 1)) +
geom_point() +
geom_line() +
theme_bw() +
labs(x = "Componente principal",
y = "Prop. varianza explicada acumulada")
Mediante la función biplot() se puede obtener una representación de las dos primeras componentes tanto de las observaciones como de las variables.
par(mfrow = c(1,1))
pca$rotation <- -pca$rotation
pca$x <- -pca$x
biplot(pca, scale = 0, cex = 0.5, col = c("blue2", "red2"))
library(plotly)
plot_ly(dn1, x = ~Admitidos, y = ~Graduados, z = ~Matriculados, color = Data_2017$Facultades, colors = c("turquoise1","seagreen2", "deeppink2", "pink", "deepskyblue1", "purple", "yellow", "violet"))
plot_ly(dn1, x = ~Hombres, y = ~Mujeres, z = ~Cup, color = Data_2017$Facultades, colors = c("turquoise1","seagreen2", "deeppink2", "pink", "deepskyblue1", "purple", "yellow", "violet"))
PCA 2020:
Calculamos la matriz de covarianza:
S <- round(cov(DN_2),3)
S
## Admitidos Matriculados Graduados Mujeres Hombres IMI Cup Sol
## Admitidos 0.986 0.687 0.703 0.749 0.651 0.396 0.811 0.825
## Matriculados 0.687 1.000 0.592 0.876 0.704 0.463 0.674 0.693
## Graduados 0.703 0.592 1.000 0.661 0.505 0.531 0.765 0.753
## Mujeres 0.749 0.876 0.661 1.000 0.613 0.517 0.702 0.762
## Hombres 0.651 0.704 0.505 0.613 1.000 0.422 0.589 0.658
## IMI 0.396 0.463 0.531 0.517 0.422 0.920 0.429 0.610
## Cup 0.811 0.674 0.765 0.702 0.589 0.429 1.000 0.817
## Sol 0.825 0.693 0.753 0.762 0.658 0.610 0.817 1.000
Calculamos la matriz de correlación:
R <- round(cor(DN_2),3)
R
## Admitidos Matriculados Graduados Mujeres Hombres IMI Cup Sol
## Admitidos 1.000 0.692 0.709 0.755 0.656 0.416 0.817 0.831
## Matriculados 0.692 1.000 0.592 0.876 0.704 0.483 0.674 0.693
## Graduados 0.709 0.592 1.000 0.661 0.505 0.554 0.765 0.753
## Mujeres 0.755 0.876 0.661 1.000 0.613 0.539 0.702 0.762
## Hombres 0.656 0.704 0.505 0.613 1.000 0.440 0.589 0.658
## IMI 0.416 0.483 0.554 0.539 0.440 1.000 0.448 0.636
## Cup 0.817 0.674 0.765 0.702 0.589 0.448 1.000 0.817
## Sol 0.831 0.693 0.753 0.762 0.658 0.636 0.817 1.000
Calculamos el porcentaje de variabilidad:
P1 <- round((S[1,1]/(S[1,1]+S[2,2]))*100,2)
P2 <- 100-P1
P <- cbind(P1,P2)
P
## P1 P2
## [1,] 49.65 50.35
Las varianzas de las variables son 0.986, 1.000, 1.000, 1.000, 1.000, 0.920, 1.000, 1.000 respectivamente, entonces la varianza total de las dos variables es 0.986 + 1.000 + 1.000 + 1.000 + 1.000 + 0.920 + 1.000 + 1.000= 7.906
Los porcentajes de la variabilidad de P1 y P2 son, respectivamente, 49.65% y 50.35%
Hacemos el analisis exploratorio de los datos:
data2 <- DN_2
head(data2)
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1 1.0121310 1.0323893 1.1364551 1.0473783 1.15284305 1.2450462
## 2 1.2450462 1.0084171 0.7632880 1.1174287 0.99386637 0.5385985
## 3 0.3348942 0.4856342 0.7632880 0.2624732 0.79873072 0.8833463
## 4 0.5625072 0.7548222 0.7632880 1.1174287 -0.14626775 0.6113263
## 5 0.8533908 0.8627214 0.3925704 0.7802303 1.06100876 0.7677715
## 6 -0.2491061 -2.3863589 -0.9782819 -0.2726917 0.08683413 -0.2703575
## Cup Sol
## 1 0.8870626 0.5053714
## 2 1.1685686 0.8647944
## 3 0.8870626 0.4458177
## 4 0.9899130 0.8341756
## 5 0.8870626 1.2256046
## 6 0.1375252 -0.3302998
summary(data2)
## Admitidos Matriculados Graduados Mujeres
## Min. :-2.134683 Min. :-3.12588 Min. :-2.4371 Min. :-1.9889
## 1st Qu.:-0.661648 1st Qu.:-0.61020 1st Qu.:-0.5820 1st Qu.:-0.6460
## Median : 0.020548 Median : 0.08697 Median : 0.1138 Median :-0.1978
## Mean : 0.001829 Mean : 0.00000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.661648 3rd Qu.: 0.80277 3rd Qu.: 0.7633 3rd Qu.: 0.7802
## Max. : 2.400036 Max. : 2.02585 Max. : 1.9730 Max. : 2.4557
## Hombres IMI Cup Sol
## Min. :-1.55802 Min. :-1.44827 Min. :-2.0075 Min. :-1.7632
## 1st Qu.:-0.70052 1st Qu.:-0.63629 1st Qu.:-0.7508 1st Qu.:-0.7176
## Median :-0.02159 Median : 0.02055 Median : 0.1375 Median :-0.3303
## Mean : 0.00000 Mean : 0.01535 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.79873 3rd Qu.: 0.68744 3rd Qu.: 0.8871 3rd Qu.: 0.6312
## Max. : 2.26381 Max. : 2.40004 Max. : 2.4312 Max. : 3.7164
Calculamos los componentes principales:
pca <- prcomp(DN_2, scale = TRUE)
names(pca)
## [1] "sdev" "rotation" "center" "scale" "x"
Calculamos la media:
pca$center
## Admitidos Matriculados Graduados Mujeres Hombres
## 1.829160e-03 -6.589105e-17 -4.288464e-17 -1.353227e-16 -6.489572e-17
## IMI Cup Sol
## 1.535209e-02 -4.447717e-16 -1.032871e-16
La variable “Admitidos” tiene un valor bajo de aproximadamente 0.001829, mientras que “Matriculados” es prácticamente cero, sugiriendo una baja variabilidad. Las variables “Graduados”, “Mujeres” y “Hombres” tienen medias prácticamente nulas, señalando una consistencia en sus valores. La variable “IMI” tiene una media más sustancial, alrededor de 0.015352, indicando una presencia significativa en promedio. Las variables “Cup” y “Sol” tienen medias cercanas a cero, sugiriendo que sus valores son bajos y consistentes en el conjunto de datos.
Calculamos la desviación estandar:
pca$scale
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 0.9928317 1.0000000 1.0000000 1.0000000 1.0000000 0.9591614
## Cup Sol
## 1.0000000 1.0000000
Las variables “Admitidos” y “Matriculados” tienen desviaciones estándar de aproximadamente 0.9928 y 1, respectivamente, señalando cierta variabilidad. En contraste, las variables “Graduados”, “Mujeres”, “Hombres”, “Cup” y “Sol” tienen desviaciones estándar iguales a 1, indicando que sus datos son constantes y no varían. La variable “IMI” tiene una desviación estándar de aproximadamente 0.9592, indicando cierta variabilidad moderada
Calculamos la matriz rotation:
round(pca$rotation,4)
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
## Admitidos -0.3738 -0.2605 -0.2525 -0.1124 -0.4105 -0.4668 0.5387 -0.1984
## Matriculados -0.3610 -0.2297 0.4206 0.4097 0.1786 0.2274 0.0249 -0.6228
## Graduados -0.3492 0.2059 -0.4577 0.0341 0.7369 -0.2773 -0.0482 -0.0521
## Mujeres -0.3739 -0.1013 0.2160 0.5542 -0.0780 -0.2092 -0.0884 0.6622
## Hombres -0.3237 -0.2574 0.4861 -0.6924 0.2550 -0.0310 -0.0185 0.2165
## IMI -0.2762 0.8540 0.2742 -0.0649 -0.1459 0.0846 0.2941 -0.0117
## Cup -0.3692 -0.1357 -0.4092 -0.0626 -0.0719 0.7716 0.1660 0.2142
## Sol -0.3884 0.1130 -0.1555 -0.1539 -0.3987 -0.0791 -0.7646 -0.1965
PC1=−0.3738⋅Admitidos−0.3610⋅Matriculados−0.3492⋅Graduados−0.3739⋅Mujeres−0.3237⋅Hombres−0.2762⋅IMI−0.3692⋅Cup−0.3884⋅Sol
En este caso, las mayores contribuciones negativas provienen de “Admitidos”, “Matriculados” y “Graduados”, sugiriendo que PC1 está fuertemente influenciada por la baja admisión, baja matrícula y baja tasa de graduados. Además, las contribuciones positivas de “Hombres” e “IMI” también juegan un papel en la dirección de PC1.
Calculamos el valor de las componentes principales:
head(pca$x)
## PC1 PC2 PC3 PC4 PC5 PC6
## [1,] -2.792536 0.36041201 0.35373530 -0.08705622 0.3640990 -0.057393963
## [2,] -2.756151 -0.36477713 0.02004085 -0.01219656 -0.1135357 0.047852468
## [3,] -1.674513 0.42876027 0.03097413 -0.40324080 0.3211263 0.388213761
## [4,] -1.981638 0.25161673 -0.36858517 0.76161064 -0.1533501 0.217406828
## [5,] -2.424519 -0.00501492 0.31245160 -0.32694774 -0.3658903 0.144646177
## [6,] 1.531070 0.10754222 -0.59549312 -1.13224291 -0.8347444 0.008085159
## PC7 PC8
## [1,] 0.54310536 0.11470103
## [2,] 0.23888218 0.11275844
## [3,] 0.19056751 0.02971015
## [4,] -0.10063788 0.12710557
## [5,] -0.18317150 -0.04165055
## [6,] 0.06183073 1.52356584
dim(pca$x)
## [1] 61 8
Una vez calculadas las componentes principales, se puede conocer la varianza explicada por cada una de ellas, la proporción respecto al total y la proporción de varianza acumulada.
prop_varianza <- pca$sdev^2 / sum(pca$sdev^2)
round(prop_varianza,2)
## [1] 0.70 0.09 0.08 0.05 0.03 0.02 0.02 0.01
La primera componente principal (PC1) explica la mayoría de la variabilidad con un 74%, seguida por PC2 con un 12%. Las siguientes componentes (PC3, PC4, PC5 y PC6) explican el 8%, 4%, 2% y 0% respectivamente. Estos hallazgos indican que las dos primeras componentes son especialmente relevantes para resumir la información en el conjunto de datos, ya que capturan la mayor proporción de la variabilidad total.
prop_varianza_acum <- cumsum(prop_varianza)
round(prop_varianza_acum,2)
## [1] 0.70 0.79 0.87 0.92 0.95 0.97 0.99 1.00
La primera componente principal (PC1) sola explica el 74% de la varianza, pero al considerar las dos primeras (PC1 y PC2), la proporción acumulativa aumenta al 86%, sugiriendo que estas dos componentes son esenciales para capturar una parte significativa de la variabilidad total. Al incluir las primeras cuatro componentes principales (PC1 a PC4), se alcanza un 98% de varianza acumulativa, indicando que estas componentes son suficientes para explicar la mayor parte de la variabilidad en el conjunto de datos.
library(ggplot2)
ggplot(data = data.frame(prop_varianza_acum, pc = 1:8),
aes(x = pc, y = prop_varianza_acum, group = 1)) +
geom_point() +
geom_line() +
theme_bw() +
labs(x = "Componente principal",
y = "Prop. varianza explicada acumulada")
Mediante la función biplot() se puede obtener una representación de las dos primeras componentes tanto de las observaciones como de las variables.
par(mfrow = c(1,1))
pca$rotation <- -pca$rotation
pca$x <- -pca$x
biplot(pca, scale = 0, cex = 0.5, col = c("blue2", "red2"))
library(plotly)
plot_ly(DN_2, x = ~Admitidos, y = ~Graduados, z = ~Matriculados, color = Data_2020$Facultades, colors = c("turquoise1","seagreen2", "deeppink2", "pink", "deepskyblue1", "purple", "yellow", "violet"))
plot_ly(DN_2, x = ~Hombres, y = ~Mujeres, z = ~Cup, color = Data_2020$Facultades, colors = c("turquoise1","seagreen2", "deeppink2", "pink", "deepskyblue1", "purple", "yellow", "violet"))
PCA 2021:
Calculamos la matriz de covarianza:
S <- round(cov(DN_3),3)
S
## Admitidos Matriculados Graduados Mujeres Hombres IMI Cup Sol
## Admitidos 1.000 0.745 0.833 0.774 0.827 0.382 0.833 0.889
## Matriculados 0.745 1.000 0.685 0.912 0.792 0.391 0.662 0.710
## Graduados 0.833 0.685 1.000 0.723 0.708 0.465 0.806 0.826
## Mujeres 0.774 0.912 0.723 1.000 0.712 0.451 0.665 0.743
## Hombres 0.827 0.792 0.708 0.712 1.000 0.411 0.707 0.747
## IMI 0.382 0.391 0.465 0.451 0.411 0.868 0.326 0.520
## Cup 0.833 0.662 0.806 0.665 0.707 0.326 0.942 0.801
## Sol 0.889 0.710 0.826 0.743 0.747 0.520 0.801 1.000
Calculamos la matriz de correlación:
R <- round(cor(DN_3),3)
R
## Admitidos Matriculados Graduados Mujeres Hombres IMI Cup Sol
## Admitidos 1.000 0.745 0.833 0.774 0.827 0.410 0.859 0.889
## Matriculados 0.745 1.000 0.685 0.912 0.792 0.419 0.682 0.710
## Graduados 0.833 0.685 1.000 0.723 0.708 0.499 0.830 0.826
## Mujeres 0.774 0.912 0.723 1.000 0.712 0.484 0.685 0.743
## Hombres 0.827 0.792 0.708 0.712 1.000 0.441 0.729 0.747
## IMI 0.410 0.419 0.499 0.484 0.441 1.000 0.361 0.559
## Cup 0.859 0.682 0.830 0.685 0.729 0.361 1.000 0.826
## Sol 0.889 0.710 0.826 0.743 0.747 0.559 0.826 1.000
Calculamos el porcentaje de variabilidad:
P1 <- round((S[1,1]/(S[1,1]+S[2,2]))*100,2)
P2 <- 100-P1
P <- cbind(P1,P2)
P
## P1 P2
## [1,] 50 50
Las varianzas de las variables son 1.000, 1.000, 1.000, 1.000, 1.000, 0.868, 0.942, 1.000 respectivamente, entonces la varianza total de las dos variables es 1.000 + 1.000 + 1.000 + 1.000 + 1.000 + 0.868 + 0.942 + 1.000= 7.81
Los porcentajes de la variabilidad de P1 y P2 son, respectivamente, 50% y 50%
Hacemos el analisis exploratorio de los datos:
data3 <- DN_3
head(data3)
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1 0.95085202 0.9687431 0.8410815 0.9395944 1.2184496 1.5771801
## 2 0.25973241 0.4270244 0.6356783 0.5641911 0.1154375 0.7956603
## 3 0.43834830 0.6072572 0.1386331 0.5641911 0.6900929 0.7956603
## 4 0.56270255 0.6901351 0.4775917 0.8433442 0.3300599 0.7956603
## 5 1.08405752 0.9257810 0.8410815 0.7307253 1.4639696 -0.1235907
## 6 -0.07415542 -1.7812923 -0.3490936 -1.3306029 -1.2719032 -1.1603615
## Cup Sol
## 1 1.08327016 0.8669344
## 2 0.61132626 0.5510215
## 3 0.61132626 0.5895843
## 4 0.61132626 0.8080569
## 5 0.61132626 1.1857436
## 6 -0.02054758 -0.2381104
summary(data3)
## Admitidos Matriculados Graduados Mujeres
## Min. :-1.6117 Min. :-2.3870 Min. :-1.7574 Min. :-1.9152
## 1st Qu.:-0.7240 1st Qu.:-0.4789 1st Qu.:-0.5445 1st Qu.:-0.7091
## Median :-0.1926 Median : 0.1134 Median : 0.0202 Median : 0.2467
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.6223 3rd Qu.: 0.6901 3rd Qu.: 0.6357 3rd Qu.: 0.8433
## Max. : 2.8660 Max. : 1.6620 Max. : 2.5197 Max. : 1.6681
## Hombres IMI Cup Sol
## Min. :-1.2719 Min. :-1.16036 Min. :-1.739384 Min. :-1.6056
## 1st Qu.:-0.6179 1st Qu.:-0.66165 1st Qu.:-0.740467 1st Qu.:-0.6637
## Median :-0.1391 Median :-0.12359 Median :-0.020548 Median :-0.2207
## Mean : 0.0000 Mean : 0.02745 Mean : 0.008822 Mean : 0.0000
## 3rd Qu.: 0.5191 3rd Qu.: 0.79566 3rd Qu.: 0.611326 3rd Qu.: 0.6275
## Max. : 2.9916 Max. : 2.40004 Max. : 2.400036 Max. : 3.8905
Calculamos los componentes principales:
pca <- prcomp(DN_3, scale = TRUE)
names(pca)
## [1] "sdev" "rotation" "center" "scale" "x"
Calculamos la media:
pca$center
## Admitidos Matriculados Graduados Mujeres Hombres
## 8.099168e-17 1.491293e-16 3.981333e-18 -1.472524e-16 -6.802391e-17
## IMI Cup Sol
## 2.744526e-02 8.821983e-03 7.348402e-17
Estas medias son extremadamente cercanas a cero, indicando una eficaz centralización de los datos en torno al origen. La variable “IMI” tiene una media más substancial de aproximadamente 0.0274, lo que sugiere su presencia significativa después de la transformación. Asimismo, “Cup” muestra una media de alrededor de 0.0088, señalando su contribución en el nuevo espacio de componentes principales.
Calculamos la desviacion estandar:
pca$scale
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 0.9317435
## Cup Sol
## 0.9705461 1.0000000
Las variables “Admitidos”, “Matriculados” y “Graduados” tienen desviaciones estándar iguales a 1, indicando que han sido estandarizadas en la transformación. La variable “IMI” tiene una desviación estándar de aproximadamente 0.9317, lo que sugiere cierta variabilidad moderada. Además, “Cup” muestra una desviación estándar de alrededor de 0.9705, indicando su contribución significativa, aunque ligeramente menos estable en comparación con otras variables.
Calculamos la matriz rotation:
round(pca$rotation,4)
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
## Admitidos -0.3837 -0.1943 -0.1888 0.1246 -0.3332 -0.2639 -0.5812 0.4954
## Matriculados -0.3580 -0.0966 0.5971 -0.0814 0.0920 0.1535 0.4044 0.5511
## Graduados -0.3671 -0.0127 -0.3331 -0.3228 0.6436 -0.4678 0.1294 0.0005
## Mujeres -0.3623 -0.0003 0.5020 -0.4205 -0.1252 -0.0581 -0.3700 -0.5329
## Hombres -0.3586 -0.1072 0.1480 0.8212 0.2283 -0.0677 0.0223 -0.3264
## IMI -0.2363 0.9364 -0.0476 0.0779 0.0443 0.1659 -0.1281 0.1143
## Cup -0.3620 -0.2478 -0.3751 -0.1200 0.1246 0.7909 -0.0764 -0.0749
## Sol -0.3783 0.0549 -0.2827 -0.0456 -0.6172 -0.1642 0.5677 -0.2043
PC1=−0.3837⋅Admitidos−0.3580⋅Matriculados−0.3671⋅Graduados−0.3623⋅Mujeres−0.3586⋅Hombres−0.2363⋅IMI−0.3620⋅Cup−0.3783⋅Sol
En este contexto, las mayores contribuciones negativas provienen de “Admitidos”, “Matriculados” y “Graduados”, lo que sugiere que PC1 está fuertemente influenciada por la baja admisión, baja matrícula y baja tasa de graduados. Además, las contribuciones positivas de “Hombres” e “IMI” también juegan un papel significativo en la dirección de PC1.
head(pca$x)
## PC1 PC2 PC3 PC4 PC5 PC6
## [1,] -2.919523 0.9108176 0.03116613 0.3307308 0.15072302 0.3764553
## [2,] -1.359710 0.5361222 -0.13340048 -0.3854498 0.09136049 0.1963220
## [3,] -1.530933 0.4308263 0.18020785 0.2527121 -0.16407513 0.3641738
## [4,] -1.787444 0.4448373 0.11841148 -0.2709348 -0.23172107 0.1577804
## [5,] -2.480828 -0.7084824 0.09109371 0.5419667 -0.15359029 -0.4095067
## [6,] 2.134785 -0.8715652 -1.65018661 -0.3212459 -0.40095478 -0.1235526
## PC7 PC8
## [1,] -0.178040501 0.03688647
## [2,] 0.057593836 -0.03892468
## [3,] -0.002975415 -0.04677855
## [4,] 0.014868176 -0.01524337
## [5,] 0.261923771 -0.12692429
## [6,] -0.228031740 0.01087249
dim(pca$x)
## [1] 61 8
Una vez calculadas las componentes principales, se puede conocer la varianza explicada por cada una de ellas, la proporción respecto al total y la proporción de varianza acumulada:
prop_varianza <- pca$sdev^2 / sum(pca$sdev^2)
round(prop_varianza,2)
## [1] 0.74 0.09 0.07 0.04 0.02 0.02 0.01 0.01
El componente principal (PC1) tiene la contribución más significativa, explicando el 74% de la varianza total. Las siguientes componentes (PC2 a PC8) disminuyen progresivamente en su contribución relativa, con valores que oscilan entre el 9% y el 1%. La proporción acumulativa de varianza explicada por las ocho primeras componentes es del 98%, lo que sugiere que estas son suficientes para capturar la mayor parte de la información relevante en el conjunto de datos
prop_varianza_acum <- cumsum(prop_varianza)
round(prop_varianza_acum,2)
## [1] 0.74 0.84 0.90 0.94 0.96 0.98 0.99 1.00
Se observa que la primera componente principal (PC1) sola explica el 74% de la varianza total. A medida que se incorporan las siguientes componentes, la proporción acumulativa aumenta progresivamente, alcanzando un 84%, 90%, 94%, 96%, 98%, 99%, y finalmente el 100% con las ocho primeras componentes. Estos resultados indican que al considerar las ocho primeras componentes principales, se logra capturar prácticamente toda la variabilidad presente en el conjunto de datos.
library(ggplot2)
ggplot(data = data.frame(prop_varianza_acum, pc = 1:8),
aes(x = pc, y = prop_varianza_acum, group = 1)) +
geom_point() +
geom_line() +
theme_bw() +
labs(x = "Componente principal",
y = "Prop. varianza explicada acumulada")
Mediante la función biplot() se puede obtener una representación de las dos primeras componentes tanto de las observaciones como de las variables.
par(mfrow = c(1,1))
pca$rotation <- -pca$rotation
pca$x <- -pca$x
biplot(pca, scale = 0, cex = 0.5, col = c("blue2", "red2"))
library(plotly)
plot_ly(DN_3, x = ~Admitidos, y = ~Graduados, z = ~Matriculados, color = Data_2021$Facultades, colors = c("turquoise1","seagreen2", "deeppink2", "pink", "deepskyblue1", "purple", "yellow", "violet"))
plot_ly(DN_3, x = ~Hombres, y = ~Mujeres, z = ~Cup, color = Data_2021$Facultades, colors = c("turquoise1","seagreen2", "deeppink2", "pink", "deepskyblue1", "purple", "yellow", "violet"))
V. Análisis Factorial Exploratorio (EFA) para los años 2017, 2020 y 2021
EFA 2017:
Modificamos nuestra base de datos, para que solo contenga las variables numericas:
data_B <-DN
Ahora realizamos un análisis exploratorio descriptivo utilizando la
librería psych:
library(psych)
describe(Data_2017)
## vars n mean sd median trimmed mad min max range skew
## Concentraciones* 1 61 31.00 17.75 31 31.00 22.24 1 61 60 0.00
## Facultades* 2 61 4.85 2.02 4 4.84 1.48 1 8 7 0.13
## Admitidos 3 61 39.72 34.44 28 34.06 17.79 0 182 182 2.12
## Matriculados 4 61 31.15 30.06 22 26.27 17.79 0 154 154 2.15
## Graduados 5 61 15.56 27.42 7 10.29 7.41 0 195 195 4.81
## Mujeres 6 61 19.61 18.29 16 16.41 13.34 0 96 96 1.83
## Hombres 7 61 11.95 13.64 8 9.49 8.90 0 78 78 2.59
## IMI 8 61 288.33 25.05 285 284.78 22.24 260 370 110 1.24
## Cupo 9 61 46.54 41.05 32 39.16 25.20 10 250 240 2.70
## Solicitantes 10 61 166.67 153.33 114 140.08 85.99 0 963 963 2.71
## kurtosis se
## Concentraciones* -1.26 2.27
## Facultades* -1.13 0.26
## Admitidos 5.32 4.41
## Matriculados 5.52 3.85
## Graduados 27.57 3.51
## Mujeres 3.91 2.34
## Hombres 8.62 1.75
## IMI 0.96 3.21
## Cupo 9.39 5.26
## Solicitantes 10.12 19.63
Con la funcion table podemos observar la cantidad de
estudiantes por cada categoría en las variables de interés:
table(data_B$Admitidos)
##
## -2.40003637712739 -1.96702500710193 -1.73938415691956 -1.50959208990538
## 1 1 1 2
## -1.3397462093911 -1.24504623877406 -1.16036153809415 -1.04703818482935
## 1 1 1 2
## -0.94577708618932 -0.853390797663431 -0.740467468641571 -0.636285791799107
## 1 2 2 2
## -0.562507211254823 -0.491672587911351 -0.400858113491923 -0.313239960732027
## 1 2 2 2
## -0.206928659602106 -0.123590715270334 -0.0616774825659391 0.041103838195112
## 3 1 2 3
## 0.123590715270334 0.185981822220581 0.249106129120478 0.291731656343878
## 1 2 1 1
## 0.334894172729616 0.378690063724591 0.423224946321688 0.468615827002329
## 1 1 1 1
## 0.53859848315853 0.61132626451705 0.687443523449877 0.767771497333423
## 2 1 2 1
## 0.824182153996376 0.883346327508692 0.978415525720013 1.08327016348967
## 1 1 2 1
## 1.20162668788281 1.3397462093911 1.44827204150775 1.57718006606787
## 2 1 1 1
## 1.73938415691956 1.96702500710193 2.40003637712739
## 1 1 1
table(data_B$Matriculados)
##
## -2.40003637712739 -1.84132620013724 -1.57718006606787 -1.44827204150775
## 1 2 1 1
## -1.24504623877406 -1.08327016348967 -1.01213102537296 -0.914116301414476
## 3 1 1 2
## -0.824182153996376 -0.767771497333423 -0.661648181506751 -0.53859848315853
## 1 1 3 2
## -0.468615827002329 -0.378690063724591 -0.227966696566032 -0.102912033721444
## 1 3 4 2
## -0.0205475791820154 0.0822772694097737 0.185981822220581 0.270357483332753
## 2 3 2 2
## 0.334894172729616 0.378690063724591 0.423224946321688 0.468615827002329
## 1 1 1 1
## 0.53859848315853 0.61132626451705 0.661648181506751 0.713704640910261
## 2 1 1 1
## 0.767771497333423 0.853390797663431 0.94577708618932 1.01213102537296
## 1 2 1 1
## 1.08327016348967 1.24504623877406 1.44827204150775 1.57718006606787
## 1 3 1 1
## 1.73938415691956 1.96702500710193 2.40003637712739
## 1 1 1
Ahora pasamos a graficar nuestras variables, primero creando los vectores correspondientes a cada variable:
x1 <- data_B$Admitidos
x2 <- data_B$Matriculados
x3 <- data_B$Graduados
x4 <- data_B$Mujeres
x5 <- data_B$Hombres
x6 <- data_B$IMI
x7 <- data_B$Cupo
x8 <- data_B$Solicitantes
Creamos un histograma para la variable matriculados:
hist((x2), main = "Estudiantes Matriculados", col = "darkseagreen1", ylab = "", xlab = "Matriculados")
Verificamos que la matriz de correlaciones sea factorizable:
library(psych)
describe(data_B)
## vars n mean sd median trimmed mad min max range skew
## Admitidos 1 61 0 1 0.04 0.00 1.00 -2.40 2.40 4.80 0.00
## Matriculados 2 61 0 1 -0.02 0.00 0.95 -2.40 2.40 4.80 0.01
## Graduados 3 61 0 1 -0.08 0.02 0.74 -1.92 2.78 4.70 0.00
## Mujeres 4 61 0 1 0.00 -0.07 0.93 -2.10 3.03 5.13 0.60
## Hombres 5 61 0 1 -0.08 -0.05 0.92 -1.68 3.30 4.98 0.66
## IMI 6 61 0 1 0.09 -0.04 1.31 -1.57 2.18 3.75 0.35
## Cup 7 61 0 1 -0.16 -0.05 1.00 -1.83 2.79 4.61 0.44
## Sol 8 61 0 1 0.05 0.10 0.42 -6.87 1.32 8.19 -5.24
## kurtosis se
## Admitidos -0.32 0.13
## Matriculados -0.33 0.13
## Graduados 0.12 0.13
## Mujeres 0.36 0.13
## Hombres 0.97 0.13
## IMI -0.81 0.13
## Cup -0.27 0.13
## Sol 33.65 0.13
R2 <- cor(data_B)
library(ggcorrplot)
ggcorrplot(R2,type="lower",hc.order = T, lab = T, lab_size = 2)
Otra forma:
cor.plot(R2,main="Mapa de calor", diag=F, show.legend = T, cex=0.5)
Procedemos a hacer la prueba de esfericidad de Bartlett:
cortest.bartlett(R2)
## $chisq
## [1] 581.7174
##
## $p.value
## [1] 8.610947e-105
##
## $df
## [1] 28
Ahora pasamos a hacer la prueba de KMO:
KMO(R2)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R2)
## Overall MSA = 0.87
## MSA for each item =
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 0.84 0.81 0.93 0.89 0.87 0.91
## Cup Sol
## 0.86 0.88
Determinamos el número de factores adecuado:
# 1. Valores propios
ei <- eigen(R2)
plot(ei$values,type="b",pch=20,col="blue")
abline(h=1,lty=3,col="red")
# 2. Scree plot
scree(R2)
# 3. Paralelo
fa.parallel(R2,main=" ",ylab="")
## Parallel analysis suggests that the number of factors = 1 and the number of components = 1
Rotamos los factores:
library(GPArotation)
rot<-c("none", "varimax", "quartimax","Promax")
bi_mod<-function(tipo){biplot.psych(fa(data_B,nfactors = 1,fm="ml",rotate = tipo),main = paste("Biplot con rotacion ",tipo),col=c(2,3,4),pch = c(21,18),group = bfi[,"gender"])}
sapply(rot,bi_mod)
## $none
## NULL
##
## $varimax
## NULL
##
## $quartimax
## NULL
##
## $Promax
## NULL
modelo_varimax2 <- fa(R2,nfactors = 1,rotate = "varimax",fa="ml")
fa.diagram(modelo_varimax2)
Conclusión:
Para el año academico 2017, no existen factores latentes que explican la variabilidad en las variables observadas, ya que todas las variuables se acomodan en un mismo grupo.
Método de Componentes principales:
modelo <- principal(data_B,nfactors=2,rotate="varimax")
modelo
## Principal Components Analysis
## Call: principal(r = data_B, nfactors = 2, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 h2 u2 com
## Admitidos 0.76 0.49 0.82 0.184 1.7
## Matriculados 0.87 0.02 0.76 0.235 1.0
## Graduados 0.78 0.26 0.67 0.328 1.2
## Mujeres 0.85 0.29 0.81 0.187 1.2
## Hombres 0.73 0.38 0.68 0.323 1.5
## IMI 0.64 0.12 0.42 0.577 1.1
## Cup 0.79 0.44 0.81 0.186 1.6
## Sol 0.17 0.95 0.93 0.067 1.1
##
## RC1 RC2
## SS loadings 4.27 1.64
## Proportion Var 0.53 0.21
## Cumulative Var 0.53 0.74
## Proportion Explained 0.72 0.28
## Cumulative Proportion 0.72 1.00
##
## Mean item complexity = 1.3
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.07
## with the empirical chi square 16.57 with prob < 0.22
##
## Fit based upon off diagonal values = 0.99
library(ade4)
load <- modelo$loadings[,1:2]
s.corcircle(load,grid=FALSE)
Conclusión:
Para el año académico 2017, no existen factores latentes que explican la variabilidad en las variables observadas, ya que todas las variables se acomodan en un mismo grupo.
EFA 2020:
Modificamos nuestra base de datos, para que solo contenga las variables numericas:
data_B <-DN_2
Ahora realizamos un análisis exploratorio descriptivo utilizando la
librería psych:
library(psych)
describe(Data_2020)
## vars n mean sd median trimmed mad min max range skew
## Concentraciones* 1 61 31.00 17.75 31 31.00 22.24 1 61 60 0.00
## Facultades* 2 61 4.85 2.02 4 4.84 1.48 1 8 7 0.13
## Admitidos 3 61 47.59 49.09 29 40.82 29.65 0 281 281 2.28
## Matriculados 4 61 36.38 40.32 23 29.96 22.24 0 232 232 2.52
## Graduados 5 61 19.39 22.94 12 15.02 11.86 0 122 122 2.45
## Mujeres 6 61 22.49 24.96 11 18.59 13.34 0 147 147 2.32
## Hombres 7 61 12.93 18.64 6 9.29 8.90 0 105 105 2.97
## IMI 8 61 254.18 26.16 245 249.61 19.27 230 325 95 1.29
## Cupos 9 61 43.25 38.01 35 37.10 22.24 10 250 240 3.11
## Solicitantes 10 61 153.48 179.45 77 121.80 83.03 0 1126 1126 2.91
## kurtosis se
## Concentraciones* -1.26 2.27
## Facultades* -1.13 0.26
## Admitidos 7.41 6.29
## Matriculados 8.44 5.16
## Graduados 7.16 2.94
## Mujeres 7.98 3.20
## Hombres 10.56 2.39
## IMI 0.69 3.35
## Cupos 13.05 4.87
## Solicitantes 11.98 22.98
Con la funcion table podemos observar la cantidad de
estudiantes por cada categoría en las variables de interés:
table(data_B$Admitidos)
##
## -2.13468333391307 -1.73938415691956 -1.50959208990538 -1.29094914768227
## 2 1 2 2
## -1.16036153809415 -1.01213102537296 -0.853390797663431 -0.740467468641571
## 1 3 2 2
## -0.661648181506751 -0.61132626451705 -0.514993764889511 -0.400858113491923
## 1 1 3 2
## -0.334894172729616 -0.291731656343878 -0.249106129120478 -0.206928659602106
## 1 1 1 1
## -0.165116280362015 -0.123590715270334 -0.0822772694097735 -0.041103838195112
## 1 1 1 1
## 0.0205475791820154 0.0822772694097737 0.123590715270334 0.165116280362015
## 2 1 1 1
## 0.206928659602106 0.249106129120478 0.291731656343878 0.334894172729616
## 1 1 1 1
## 0.378690063724591 0.423224946321688 0.491672587911351 0.562507211254823
## 1 1 2 1
## 0.61132626451705 0.661648181506751 0.713704640910261 0.767771497333423
## 1 1 1 1
## 0.853390797663431 0.94577708618932 1.01213102537296 1.1209830393527
## 2 1 1 2
## 1.24504623877406 1.3397462093911 1.44827204150775 1.57718006606787
## 1 1 1 1
## 1.73938415691956 1.96702500710193 2.40003637712739
## 1 1 1
table(data_B$Matriculados)
##
## -3.12588323944401 -2.38635885495337 -1.91458799309942 -1.6000994874708
## 1 1 2 1
## -1.18561118433833 -1.03513308655506 -0.907310085972108 -0.796259360651751
## 1 1 2 2
## -0.698113206130168 -0.610197479694059 -0.530588201505833 -0.457855852125512
## 2 3 4 2
## -0.390909757286041 -0.328899080898938 -0.166334038800955 -0.118452976424201
## 1 2 1 1
## -0.0731536021489256 0.0107171080980353 0.0869687884178443 0.15687004501973
## 1 1 3 1
## 0.251891497969663 0.309746129039167 0.337243940460363 0.389676567391169
## 2 1 1 1
## 0.439025843748156 0.485634222664455 0.551026440139106 0.686303791314158
## 1 2 1 1
## 0.754822166223375 0.787091672780597 0.802772734575938 0.862721439157433
## 1 1 1 1
## 0.891162752164165 0.905029916300521 0.996169104520935 1.00841705246428
## 1 1 1 1
## 1.020488801565 1.0323893490964 1.04412348272582 1.05569579207441
## 1 1 1 1
## 1.06711067949089 1.12196597310016 1.19319636184507 1.28548799551176
## 1 1 1 1
## 1.76987402521688 2.02584565973771
## 1 1
Ahora pasamos a graficar nuestras variables, primero creando los vectores correspondientes a cada variable:
x1 <- data_B$Admitidos
x2 <- data_B$Matriculados
x3 <- data_B$Graduados
x4 <- data_B$Mujeres
x5 <- data_B$Hombres
x6 <- data_B$IMI
x7 <- data_B$Cupos
x8 <- data_B$Solicitantes
Creamos un histograma para la variable matriculados:
hist((x2), main = "Estudiantes Matriculados", col = "darkseagreen1", ylab = "", xlab = "Matriculados")
Verificamos que la matriz de correlaciones sea factorizable:
library(psych)
describe(data_B)
## vars n mean sd median trimmed mad min max range skew
## Admitidos 1 61 0.00 0.99 0.02 0.00 1.01 -2.13 2.40 4.53 0.03
## Matriculados 2 61 0.00 1.00 0.09 0.07 1.03 -3.13 2.03 5.15 -0.63
## Graduados 3 61 0.00 1.00 0.11 0.06 1.03 -2.44 1.97 4.41 -0.50
## Mujeres 4 61 0.00 1.00 -0.20 0.02 1.26 -1.99 2.46 4.44 -0.03
## Hombres 5 61 0.00 1.00 -0.02 -0.01 1.15 -1.56 2.26 3.82 -0.01
## IMI 6 61 0.02 0.96 0.02 -0.02 0.97 -1.45 2.40 3.85 0.20
## Cup 7 61 0.00 1.00 0.14 0.00 1.32 -2.01 2.43 4.44 0.03
## Sol 8 61 0.00 1.00 -0.33 -0.08 0.96 -1.76 3.72 5.48 0.96
## kurtosis se
## Admitidos -0.39 0.13
## Matriculados 0.48 0.13
## Graduados -0.03 0.13
## Mujeres -0.60 0.13
## Hombres -0.81 0.13
## IMI -0.63 0.12
## Cup -0.69 0.13
## Sol 1.49 0.13
R2 <- cor(data_B)
library(ggcorrplot)
ggcorrplot(R2,type="lower",hc.order = T, lab = T, lab_size = 2)
Otra forma:
cor.plot(R2,main="Mapa de calor", diag=F, show.legend = T, cex=0.5)
Procedemos a hacer la prueba de esfericidad de Bartlett:
cortest.bartlett(R2)
## $chisq
## [1] 725.1277
##
## $p.value
## [1] 1.081584e-134
##
## $df
## [1] 28
Ahora pasamos a hacer la prueba de KMO:
KMO(R2)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R2)
## Overall MSA = 0.87
## MSA for each item =
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 0.89 0.81 0.93 0.84 0.88 0.82
## Cup Sol
## 0.90 0.88
Determinamos el número de factores adecuado:
# 1. Valores propios
ei <- eigen(R2)
plot(ei$values,type="b",pch=20,col="blue")
abline(h=1,lty=3,col="red")
# 2. Scree plot
scree(R2)
# 3. Paralelo
fa.parallel(R2,main=" ",ylab="")
## Parallel analysis suggests that the number of factors = 1 and the number of components = 1
Rotamos los factores:
library(GPArotation)
rot<-c("none", "varimax", "quartimax","Promax")
bi_mod<-function(tipo){biplot.psych(fa(data_B,nfactors = 1,fm="ml",rotate = tipo),main = paste("Biplot con rotacion ",tipo),col=c(2,3,4),pch = c(21,18),group = bfi[,"gender"])}
sapply(rot,bi_mod)
## $none
## NULL
##
## $varimax
## NULL
##
## $quartimax
## NULL
##
## $Promax
## NULL
modelo_varimax2 <- fa(R2,nfactors = 1,rotate = "varimax",fa="ml")
fa.diagram(modelo_varimax2)
Método de Componentes principales:
modelo <- principal(data_B,nfactors=2,rotate="varimax")
modelo
## Principal Components Analysis
## Call: principal(r = data_B, nfactors = 2, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 h2 u2 com
## Admitidos 0.88 0.25 0.83 0.166 1.2
## Matriculados 0.84 0.26 0.77 0.230 1.2
## Graduados 0.64 0.56 0.72 0.284 2.0
## Mujeres 0.81 0.36 0.79 0.206 1.4
## Hombres 0.77 0.19 0.64 0.364 1.1
## IMI 0.22 0.94 0.94 0.065 1.1
## Cup 0.82 0.33 0.78 0.220 1.3
## Sol 0.76 0.54 0.86 0.141 1.8
##
## RC1 RC2
## SS loadings 4.43 1.90
## Proportion Var 0.55 0.24
## Cumulative Var 0.55 0.79
## Proportion Explained 0.70 0.30
## Cumulative Proportion 0.70 1.00
##
## Mean item complexity = 1.4
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.07
## with the empirical chi square 15.65 with prob < 0.27
##
## Fit based upon off diagonal values = 0.99
library(ade4)
load <- modelo$loadings[,1:2]
s.corcircle(load,grid=FALSE)
Conclusión:
Para el año académico 2020, no existen factores latentes que explican la variabilidad en las variables observadas, ya que todas las variables se acomodan en un mismo grupo.
EFA 2021:
Modificamos nuestra base de datos, para que solo contenga las variables numericas:
data_B <-DN_3
Ahora realizamos un análisis exploratorio descriptivo utilizando la
librería psych:
library(psych)
describe(Data_2021)
## vars n mean sd median trimmed mad min max range skew
## Concentraciones* 1 61 31.00 17.75 31 31.00 22.24 1 61 60 0.00
## Facultades* 2 61 4.85 2.02 4 4.84 1.48 1 8 7 0.13
## Admitidos 3 61 40.90 43.98 23 34.27 29.65 0 229 229 1.93
## Matriculados 4 61 32.90 36.04 19 27.08 23.72 0 181 181 1.98
## Graduados 5 61 20.15 23.37 13 15.96 13.34 0 131 131 2.44
## Mujeres 6 61 20.08 22.51 13 16.39 16.31 0 111 111 1.62
## Hombres 7 61 12.16 16.75 6 8.80 7.41 0 85 85 2.33
## IMI 8 61 251.62 25.13 240 247.08 14.83 230 325 95 1.27
## Cupos 9 61 45.93 39.95 35 39.61 22.24 10 260 250 2.92
## Solicitantes 10 61 148.56 188.62 80 118.37 94.89 0 1260 1260 3.55
## kurtosis se
## Concentraciones* -1.26 2.27
## Facultades* -1.13 0.26
## Admitidos 4.85 5.63
## Matriculados 4.84 4.61
## Graduados 7.47 2.99
## Mujeres 2.98 2.88
## Hombres 6.05 2.14
## IMI 0.76 3.22
## Cupos 11.90 5.12
## Solicitantes 17.37 24.15
Con la funcion table podemos observar la cantidad de
estudiantes por cada categoría en las variables de interés:
table(data_B$Admitidos)
##
## -1.61166657949641 -1.31577241886266 -1.0991628596158 -0.950027122174087
## 6 1 1 4
## -0.886876868074584 -0.774751509505885 -0.723984097595138 -0.630296671017087
## 2 1 2 1
## -0.58665913973518 -0.504532007657835 -0.465673423121844 -0.321893835310068
## 1 1 1 1
## -0.255709190696792 -0.223799945220106 -0.192608036364876 -0.10289648046672
## 3 2 4 1
## -0.0741554198545628 0.113678037124662 0.138866882166197 0.188187333740657
## 1 1 1 1
## 0.259732408396405 0.328641188559401 0.351073237462241 0.373251792470567
## 1 1 1 1
## 0.438348300026054 0.459592544939898 0.501440391093336 0.542475425513772
## 1 1 1 1
## 0.562702554769077 0.622285343651873 0.641796211240342 0.736920510802958
## 1 1 1 1
## 0.881581935011942 0.950852019906672 1.00159988896374 1.0840575174141
## 1 1 1 1
## 1.13234298126599 1.25713374536636 1.28749226619091 1.30255293296729
## 1 1 2 1
## 1.40587361856297 1.43475025926656 2.40203709549964 2.86602458158749
## 1 1 1 1
table(data_B$Matriculados)
##
## -2.38701947438211 -1.78129231130209 -1.13728561443253 -0.947420753241343
## 4 2 3 3
## -0.797787919357591 -0.674534821572699 -0.569837985142057 -0.478878927919611
## 1 1 1 1
## -0.398489703449996 -0.201700512312519 -0.0960750308095209 -0.0487720130935346
## 2 4 1 1
## 0.0370782009582435 0.0762964616227723 0.113400121819132 0.214033153853708
## 5 1 3 1
## 0.328740982824647 0.427024354881324 0.492493511385268 0.58941152076074
## 1 2 1 1
## 0.607257246594754 0.624651426300064 0.658172662824229 0.690135060861678
## 2 1 2 2
## 0.7354539473186 0.818006948671708 0.868002794881796 0.879953525137065
## 1 1 1 1
## 0.925781035488379 0.968743122741842 0.999289401508939 1.02853570515981
## 1 1 1 3
## 1.10093880159291 1.16643640626687 1.22623174421431 1.58156844250354
## 1 1 1 1
## 1.66203941407415
## 1
Ahora pasamos a graficar nuestras variables, primero creando los vectores correspondientes a cada variable:
x1 <- data_B$Admitidos
x2 <- data_B$Matriculados
x3 <- data_B$Graduados
x4 <- data_B$Mujeres
x5 <- data_B$Hombres
x6 <- data_B$IMI
x7 <- data_B$Cupos
x8 <- data_B$Solicitantes
Creamos un histograma para la variable matriculados:
hist((x2), main = "Estudiantes Matriculados", col = "darkseagreen1", ylab = "", xlab = "Matriculados")
Verificamos que la matriz de correlaciones sea factorizable:
library(psych)
describe(data_B)
## vars n mean sd median trimmed mad min max range skew
## Admitidos 1 61 0.00 1.00 -0.19 -0.02 1.03 -1.61 2.87 4.48 0.38
## Matriculados 2 61 0.00 1.00 0.11 0.11 0.88 -2.39 1.66 4.05 -0.82
## Graduados 3 61 0.00 1.00 0.02 0.01 0.91 -1.76 2.52 4.28 -0.03
## Mujeres 4 61 0.00 1.00 0.25 0.07 1.03 -1.92 1.67 3.58 -0.47
## Hombres 5 61 0.00 1.00 -0.14 -0.09 0.98 -1.27 2.99 4.26 0.77
## IMI 6 61 0.03 0.93 -0.12 -0.04 1.36 -1.16 2.40 3.56 0.34
## Cup 7 61 0.01 0.97 -0.02 0.00 1.07 -1.74 2.40 4.14 0.12
## Sol 8 61 0.00 1.00 -0.22 -0.04 0.90 -1.61 3.89 5.50 0.91
## kurtosis se
## Admitidos -0.10 0.13
## Matriculados 0.07 0.13
## Graduados -0.28 0.13
## Mujeres -0.89 0.13
## Hombres 0.29 0.13
## IMI -0.69 0.12
## Cup -0.48 0.12
## Sol 2.06 0.13
R2 <- cor(data_B)
library(ggcorrplot)
ggcorrplot(R2,type="lower",hc.order = T, lab = T, lab_size = 2)
Otra forma:
cor.plot(R2,main="Mapa de calor", diag=F, show.legend = T, cex=0.5)
Procedemos a hacer la prueba de esfericidad de Bartlett:
cortest.bartlett(R2)
## $chisq
## [1] 889.5696
##
## $p.value
## [1] 2.998745e-169
##
## $df
## [1] 28
Ahora pasamos a hacer la prueba de KMO:
KMO(R2)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R2)
## Overall MSA = 0.85
## MSA for each item =
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 0.84 0.78 0.94 0.80 0.84 0.74
## Cup Sol
## 0.92 0.89
Determinamos el número de factores adecuado:
# 1. Valores propios
ei <- eigen(R2)
plot(ei$values,type="b",pch=20,col="blue")
abline(h=1,lty=3,col="red")
# 2. Scree plot
scree(R2)
# 3. Paralelo
fa.parallel(R2,main=" ",ylab="")
## Parallel analysis suggests that the number of factors = 1 and the number of components = 1
Rotamos los factores:
library(GPArotation)
rot<-c("none", "varimax", "quartimax","Promax")
bi_mod<-function(tipo){biplot.psych(fa(data_B,nfactors = 1,fm="ml",rotate = tipo),main = paste("Biplot con rotacion ",tipo),col=c(2,3,4),pch = c(21,18),group = bfi[,"gender"])}
sapply(rot,bi_mod)
## $none
## NULL
##
## $varimax
## NULL
##
## $quartimax
## NULL
##
## $Promax
## NULL
modelo_varimax2 <- fa(R2,nfactors = 1,rotate = "varimax",fa="ml")
fa.diagram(modelo_varimax2)
Método de Componentes principales:
modelo <- principal(data_B,nfactors=2,rotate="varimax")
modelo
## Principal Components Analysis
## Call: principal(r = data_B, nfactors = 2, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 h2 u2 com
## Admitidos 0.93 0.19 0.90 0.0980 1.1
## Matriculados 0.84 0.24 0.77 0.2326 1.2
## Graduados 0.84 0.32 0.80 0.2000 1.3
## Mujeres 0.82 0.33 0.78 0.2210 1.3
## Hombres 0.85 0.24 0.77 0.2283 1.2
## IMI 0.24 0.97 0.99 0.0096 1.1
## Cup 0.90 0.13 0.82 0.1765 1.0
## Sol 0.84 0.38 0.85 0.1488 1.4
##
## RC1 RC2
## SS loadings 5.23 1.46
## Proportion Var 0.65 0.18
## Cumulative Var 0.65 0.84
## Proportion Explained 0.78 0.22
## Cumulative Proportion 0.78 1.00
##
## Mean item complexity = 1.2
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.06
## with the empirical chi square 11.9 with prob < 0.54
##
## Fit based upon off diagonal values = 0.99
library(ade4)
load <- modelo$loadings[,1:2]
s.corcircle(load,grid=FALSE)
Conclusión:
Para el año académico 2021, no existen factores latentes que explican la variabilidad en las variables observadas, ya que todas las variables se acomodan en un mismo grupo.
V. Análisis Discriminante (DA) para los años 2017, 2020 y 2021
DA 2017:
Se pretende generar un modelo discriminante que permita determinar si es sencillo o no diferenciar características de las diferentes facultades de la universidad con la información de las variables restantes en nuestras bases de datos para los tres años académicos ya determinados. Para este proceso, decidimos dividir las facultades en dos grupos (1 y 2). Con esto, se busca mejorar la capacidad del modelo para capturar diferencias más específicas permitiendo que el modelo se enfoque en particularidades únicas de cada grupo, potencialmente mejorando la capacidad de predicción al identificar patrones más distintivos. Los grupos son los siguientes:
Grupo 1: Escuela de Arquitectura, Facultad de Ciencias Sociales, Facultad de Comunicación e Información, Facultad de Educación Grupo 2: Facultad de Administración de Empresas, Facultad de Humanidades, Facultad de Ciencias Naturales, Facultad de Estudios Generales
Creamos el nuevo vector y modificamos nuestra base de datos:
Grup <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
data_dis_2017 <- dn1
data_g_2017 <- cbind(Grup, data_dis_2017)
str(data_g_2017)
## 'data.frame': 61 obs. of 7 variables:
## $ Grup : num 1 1 1 1 2 2 2 2 2 2 ...
## $ Admitidos : num 0.8833 0.0411 0.3349 0.186 1.0833 ...
## $ Matriculados: num 0.946 -0.228 0.379 -0.103 1.012 ...
## $ Graduados : num 1.259 1.182 0.641 0.969 0.59 ...
## $ Mujeres : num 0.574 0.126 0.126 -0.208 0.724 ...
## $ Hombres : num 1.2517 -0.8804 0.1051 -0.0831 1.1411 ...
## $ Cup : num 0.193 0.477 0.505 0.477 1.238 ...
Convertimos el nuevo vector en factor:
data_g_2017$Grup <- factor(data_g_2017$Grup)
str(data_g_2017)
## 'data.frame': 61 obs. of 7 variables:
## $ Grup : Factor w/ 2 levels "1","2": 1 1 1 1 2 2 2 2 2 2 ...
## $ Admitidos : num 0.8833 0.0411 0.3349 0.186 1.0833 ...
## $ Matriculados: num 0.946 -0.228 0.379 -0.103 1.012 ...
## $ Graduados : num 1.259 1.182 0.641 0.969 0.59 ...
## $ Mujeres : num 0.574 0.126 0.126 -0.208 0.724 ...
## $ Hombres : num 1.2517 -0.8804 0.1051 -0.0831 1.1411 ...
## $ Cup : num 0.193 0.477 0.505 0.477 1.238 ...
Creamos una visualizacion paea cada par de variables y un grafico 3d para observar el comportamientos de los datos para las variables “Matricula”, “Graduados” y “Admitidos”:
pairs(data_g_2017[,-1], col = c("turquoise1", "violet")[data_g_2017$Grup], pch = 19)
Esta grafica nos permite ver que es muy dificil discriminar basandose en las carasteristicas o informacion que ofrecen las variables para determinar la facultad.
Grafica 3d:
library(plotly)
fig <- plot_ly(data_dis_2017, x = ~Matriculados, y = ~Admitidos, z = ~Graduados, color = ~Grup, colors = c("turquoise1", "pink"))
fig <- fig %>% add_markers()
fig
Para definir que método usaremos, debemos analizar si las matrices de covarianzas para las ocho poblaciones se pueden suponer iguales o diferentes:
library(biotools)
boxM(data_g_2017[,2:7], grouping = data_g_2017[,1])
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: data_g_2017[, 2:7]
## Chi-Sq (approx.) = 37.615, df = 21, p-value = 0.01429
La prueba nos da evidencia para suponer que la matriz de covarianza no es constante en todos los grupos, esta condición conlleva a suponer que QDA es más adecuado.
prop.table(table(data_g_2017$Grup))
##
## 1 2
## 0.2131148 0.7868852
QDA:
library(MASS)
modelo2017 <- qda(Grup ~ ., data = data_g_2017)
modelo2017
## Call:
## qda(Grup ~ ., data = data_g_2017)
##
## Prior probabilities of groups:
## 1 2
## 0.2131148 0.7868852
##
## Group means:
## Admitidos Matriculados Graduados Mujeres Hombres Cup
## 1 0.5022817 0.09295941 0.6120920 0.26391087 0.05618137 0.6979390
## 2 -0.1359069 -0.02461195 -0.1657749 -0.07147586 -0.01521579 -0.1890251
Predicciones:
predicciones <- predict(modelo2017)
table(data_g_2017$Grup,predicciones$class,
dnn = c("Real", "Predicha"))
## Predicha
## Real 1 2
## 1 10 3
## 2 2 46
Tasa de error:
tasa_error <- mean(data_g_2017$Grup != predicciones$class)
round(tasa_error*100,1)
## [1] 8.2
Podemos observar que, en cuanto al grupo 1, el margen de error es de 3/10, mientras que para el grupo 2, el margen de error es de 2/48 En total solo hubieron 5 errores de las 61 observaciones. Es decir, que el modelo creado solo tiene un margen de error del 8%, lo que es bueno, pero no ideal.
Finalmente podemos visualizar como se realizó la clasificación para cada par de variables:
library(klaR)
par(mfrow = c(1,1))
partimat(Grup ~ .,data_g_2017,
method = "qda", image.colors = c("pink", "turquoise1"),
col.mean = "lightgreen")
En conclusión, pudimos determinar que con el modelo creado con la clasificacion “qda” para la base de datos del año academico 2017 si es bueno, pero no ideal para discriminar los grupos creados de las facultades en la base de datos, con un 92% de confianza.
DA 2020:
Creamos el nuevo vector y modificamos nuestra base de datos:
Grup <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
data_dis_2020 <- DN_2
data_g_2020 <- cbind(Grup, data_dis_2020)
Convertimos el nuevo vector en factor:
data_g_2020$Grup <- factor(data_g_2020$Grup)
str(data_g_2020)
## 'data.frame': 61 obs. of 9 variables:
## $ Grup : Factor w/ 2 levels "1","2": 1 1 1 1 2 2 2 2 2 2 ...
## $ Admitidos : num 1.012 1.245 0.335 0.563 0.853 ...
## $ Matriculados: num 1.032 1.008 0.486 0.755 0.863 ...
## $ Graduados : num 1.136 0.763 0.763 0.763 0.393 ...
## $ Mujeres : num 1.047 1.117 0.262 1.117 0.78 ...
## $ Hombres : num 1.153 0.994 0.799 -0.146 1.061 ...
## $ IMI : num 1.245 0.539 0.883 0.611 0.768 ...
## $ Cup : num 0.887 1.169 0.887 0.99 0.887 ...
## $ Sol : num 0.505 0.865 0.446 0.834 1.226 ...
Creamos una visualizacion para cada par de variables y un grafico 3d para observar el comportamientos de los datos para las variables “Matricula”, “Graduados” y “Admitidos”:
pairs(data_g_2020[,-1], col = c("turquoise1", "violet")[data_g_2020$Grup], pch = 19)
Esta grafica nos permite ver que es muy dificil discriminar basandose en las carasteristicas o informacion que ofrecen las variables para determinar la facultad.
Grafica 3d:
library(plotly)
fig <- plot_ly(data_dis_2020, x = ~Matriculados, y = ~Admitidos, z = ~Graduados, color = ~Grup, colors = c("turquoise1", "violet"))
fig <- fig %>% add_markers()
fig
Para definir que método usaremos, debemos analizar si las matrices de covarianzas para las ocho poblaciones se pueden suponer iguales o diferentes:
library(biotools)
boxM(data_g_2020[,2:7], grouping = data_g_2020[,1])
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: data_g_2020[, 2:7]
## Chi-Sq (approx.) = 95.235, df = 21, p-value = 1.988e-11
La prueba nos da evidencia para suponer que la matriz de covarianza no es constante en todos los grupos, esta condición conlleva a suponer que QDA es más adecuado.
prop.table(table(data_g_2020$Grup))
##
## 1 2
## 0.2131148 0.7868852
QDA:
library(MASS)
modelo2020 <- qda(Grup ~ ., data = data_g_2020)
modelo2020
## Call:
## qda(Grup ~ ., data = data_g_2020)
##
## Prior probabilities of groups:
## 1 2
## 0.2131148 0.7868852
##
## Group means:
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1 0.5645929 0.2789756 0.6771135 0.4395268 0.28720090 -0.03517854
## 2 -0.1505860 -0.0755559 -0.1833849 -0.1190385 -0.07778358 0.02903747
## Cup Sol
## 1 0.8468100 0.4115813
## 2 -0.2293444 -0.1114699
Predicciones:
predicciones_2 <- predict(modelo2020)
table(data_g_2020$Grup,predicciones$class,
dnn = c("Real", "Predicha"))
## Predicha
## Real 1 2
## 1 10 3
## 2 2 46
Tasa de error:
tasa_error_2 <- mean(data_g_2017$Grup != predicciones$class)
round(tasa_error*100,1)
## [1] 8.2
Al igual que para el año académico 2017, podemos observar que en cuanto al grupo 1, el margen de error es de 3/10, mientras que para el grupo 2, el margen de error es de 2/48. En total solo hubieron 5 errores de las 61 observaciones. Es decir, que el modelo creado solo tiene un margen de error del 8%, lo que es bueno, pero no ideal.
Finalmente podemos visualizar como se realizó la clasificación para cada par de variables:
library(klaR)
par(mfrow = c(1,1))
partimat(Grup ~ .,data_g_2020,
method = "qda", image.colors = c("pink", "turquoise1"),
col.mean = "lightgreen")
En conclusión, pudimos determinar que con el modelo creado con la clasificacion “qda” para la base de datos del año academico 2020 si es bueno, pero no ideal para discriminar los grupos creados de las facultades en la base de datos, con un 92% de confianza.
DA 2021:
Creamos el nuevo vector y modificamos nuestra base de datos:
Grup <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
data_dis_2021 <- DN_3
data_g_2021 <- cbind(Grup, data_dis_2021)
Convertimos el nuevo vector en factor:
data_g_2021$Grup <- factor(data_g_2021$Grup)
str(data_g_2021)
## 'data.frame': 61 obs. of 9 variables:
## $ Grup : Factor w/ 2 levels "1","2": 1 1 1 1 2 2 2 2 2 2 ...
## $ Admitidos : num 0.951 0.26 0.438 0.563 1.084 ...
## $ Matriculados: num 0.969 0.427 0.607 0.69 0.926 ...
## $ Graduados : num 0.841 0.636 0.139 0.478 0.841 ...
## $ Mujeres : num 0.94 0.564 0.564 0.843 0.731 ...
## $ Hombres : num 1.218 0.115 0.69 0.33 1.464 ...
## $ IMI : num 1.577 0.796 0.796 0.796 -0.124 ...
## $ Cup : num 1.083 0.611 0.611 0.611 0.611 ...
## $ Sol : num 0.867 0.551 0.59 0.808 1.186 ...
Debemos convertir las variable facultades en factor:
Creamos una visualizacion paea cada par de variables y un grafico 3d para observar el comportamientos de los datos para las variables “Matricula”, “Graduados” y “Admitidos”:
pairs(data_g_2021[,-1], col = c("turquoise1", "violet")[data_g_2021$Grup], pch = 19)
Esta gráfica nos permite ver que es muy dificil discriminar basandose en las carasteristicas o informacion que ofrecen las variables para determinar la facultad.
Grafica 3d:
library(plotly)
fig <- plot_ly(data_dis_2021, x = ~Matriculados, y = ~Admitidos, z = ~Graduados, color = ~Grup, colors = c("turquoise1", "pink"))
fig <- fig %>% add_markers()
fig
Para definir que método usaremos, debemos analizar si las matrices de covarianzas para las ocho poblaciones se pueden suponer iguales o diferentes:
library(biotools)
boxM(data_g_2021[,2:7], grouping = data_g_2021[,1])
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: data_g_2021[, 2:7]
## Chi-Sq (approx.) = 75.274, df = 21, p-value = 4.899e-08
La prueba nos da evidencia para suponer que la matriz de covarianza no es constante en todos los grupos, esta condición conlleva a suponer que QDA es más adecuado.
prop.table(table(data_g_2021$Grup))
##
## 1 2
## 0.2131148 0.7868852
QDA:
library(MASS)
modelo2021 <- qda(Grup ~ ., data = data_g_2021)
modelo2021
## Call:
## qda(Grup ~ ., data = data_g_2021)
##
## Prior probabilities of groups:
## 1 2
## 0.2131148 0.7868852
##
## Group means:
## Admitidos Matriculados Graduados Mujeres Hombres IMI
## 1 0.4173895 0.27465881 0.6051522 0.3857106 0.11773679 0.105343640
## 2 -0.1130430 -0.07438676 -0.1638954 -0.1044633 -0.03188705 0.006347783
## Cup Sol
## 1 0.6678498 0.4664164
## 2 -0.1696647 -0.1263211
Predicciones:
predicciones_3 <- predict(modelo2021)
table(data_g_2021$Grup,predicciones$class,
dnn = c("Real", "Predicha"))
## Predicha
## Real 1 2
## 1 10 3
## 2 2 46
Tasa de error:
tasa_error_3 <- mean(data_g_2021$Grup != predicciones$class)
round(tasa_error*100,1)
## [1] 8.2
Al igual que para el año académico previos, podemos observar que en cuanto al grupo 1, el margen de error es de 3/10, mientras que para el grupo 2, el margen de error es de 2/48. En total solo hubieron 5 errores de las 61 observaciones. Es decir, que el modelo creado solo tiene un margen de error del 8%, lo que es bueno, pero no ideal.
Finalmente podemos visualizar como se realizó la clasificación para cada par de variables:
library(klaR)
par(mfrow = c(1,1))
partimat(Grup ~ .,data_g_2021,
method = "qda", image.colors = c("pink", "turquoise1"),
col.mean = "lightgreen")
En conclusión, pudimos determinar que con el modelo creado con la clasificación “qda” para la base de datos del año académico 2021 si es bueno, pero no ideal para discriminar los grupos creados de las facultades en la base de datos, con un 92% de confianza.
CCA 2017:
library(DT)
x <- Data_2017[,(3:5)]
y <- Data_2017[,(8:10)]
Matriz de covarianza para variables sobre población estudiantil:
datatable(x)
Matriz de covarianza para variables sobre proceso de admision:
datatable(y)
Creamos gráficas de correlación:
library(GGally)
ggpairs(x, title = "Variables Población Estudiantil")
ggpairs(y, title = "Variables Proceso de admision")
Creamos gráfica para ver correlación entre ambos grupos de variables:
ggduo(Data_2017,columnsX = 3:7,columnsY = 8:10,
types = list(continuous = "smooth_lm"),
title = "Correlación entre variables de población estudiantil y Proceso de Admision",)
Calculamos las matrices de covarianzas que se necesitan para el desarrollo del problema:
Sxx <- cov(x)
Sxx
## Admitidos Matriculados Graduados
## Admitidos 1186.2710 918.8251 760.7746
## Matriculados 918.8251 903.3945 642.5664
## Graduados 760.7746 642.5664 751.8508
Syy <- cov(y)
Syy
## IMI Cupo Solicitantes
## IMI 627.4574 505.303 1978.043
## Cupo 505.3030 1685.019 5863.230
## Solicitantes 1978.0426 5863.230 23508.857
Sxy <- cov(x,y)
Sxy
## IMI Cupo Solicitantes
## Admitidos 447.8929 1334.7033 4696.624
## Matriculados 357.0842 1068.2522 3790.633
## Graduados 329.3142 963.8768 3514.436
Syx <- cov(y,x)
Syx
## Admitidos Matriculados Graduados
## IMI 447.8929 357.0842 329.3142
## Cupo 1334.7033 1068.2522 963.8768
## Solicitantes 4696.6238 3790.6325 3514.4358
Encontramos los valores propios de cualquiera de las matrices cuadradas A y B:
A <- solve(Sxx)%*%Sxy%*%solve(Syy)%*%Syx
B <- solve(Syy)%*%Syx%*%solve(Sxx)%*%Sxy
# Valores propios
Valores_A <- eigen(A)$values
Con los valores propios, podemos ahora calcular las correspondientes correlaciones canónicas, las cuales serán las raíces cuadradas de los valores propios:
r <- sqrt(Valores_A)
r
## [1] 0.961243697 0.133928853 0.009997984
Para este problema, las correlaciones canónicas son: $r1=0.961243697 $, \(r2=0.133928853\), \(r3=0.009997984\)
Vectores canónicos:
Encontramos los vectores propios de cada matriz cuadrada A y B:
# Vectores propios
Vectores_A <- eigen(A)$vectors
Vectores_A
## [,1] [,2] [,3]
## [1,] -0.88809888 -0.62069090 0.5089112
## [2,] -0.07648614 0.06731343 -0.8327730
## [3,] -0.45324414 0.78116049 0.2179416
Vectores_B <- eigen(B)$vectors
Vectores_B
## [,1] [,2] [,3]
## [1,] 0.13559602 -0.04800216 0.9841237
## [2,] 0.99009491 -0.96029174 -0.1716721
## [3,] 0.03641125 0.27483735 -0.0450470
Calculamos la correlación canónica y los vectores canónicos:
library(CCA)
ccl <- cc(x,y)
ccl[3:4]
## $xcoef
## [,1] [,2] [,3]
## Admitidos -0.02049767 -0.047195586 -0.04530830
## Matriculados -0.00176533 0.005118324 0.07414167
## Graduados -0.01046105 0.059397242 -0.01940332
##
## $ycoef
## [,1] [,2] [,3]
## IMI -0.0028444516 -0.003161346 -0.046411519
## Cupo -0.0207696143 -0.063243275 0.008096100
## Solicitantes -0.0007638133 0.018100347 0.002124428
Creamos los vectores canónicos para poder calcular las variables canónicas:
a_1 <- Vectores_A[,1]
den1a <- a_1%*%Sxx%*%a_1
den1a
## [,1]
## [1,] 1877.214
b_1 <- Vectores_B[,]
den1b <- b_1%*%Sxx%*%b_1
den1b
## [,1] [,2] [,3]
## [1,] 853.44583 -503.56629 692.6125
## [2,] -45.26602 59.60417 170.3836
## [3,] 291.94981 -208.46707 206.2240
Calculamos las variables canónicas:
a_1can <- a_1/sqrt(den1a)
a_1can
## [1] -0.02049767 -0.00176533 -0.01046105
b_1can <- b_1/sqrt(den1b)
b_1can
## [,1] [,2] [,3]
## [1,] 0.004641506 NaN 0.037394223
## [2,] NaN -0.1243841 -0.013151822
## [3,] 0.002130991 NaN -0.003136868
Construir las faltantes dos parejas de variables canónica:
library(CCP)
cc2 <- cc(x,y)
rho <- cc2$cor
n <- dim(Data_2017)[1]
p <- length(x)
q <- length(y)
p.asym(rho, n, p, q, tstat ="Wilks")
## Wilks' Lambda, using F-approximation (Rao's F):
## stat approx df1 df2 p.value
## 1 to 3: 0.0746397 28.358667161 9 134.0062 0.0000000
## 2 to 3: 0.9819649 0.255958897 4 112.0000 0.9054845
## 3 to 3: 0.9999000 0.005698272 1 57.0000 0.9400916
plt.cc(ccl, var.label = TRUE, d1 = 1, d2 = 2, type = "b")
CCA 2020:
library(DT)
x_2 <- Data_2020[,(3:5)]
y_2 <- Data_2020[,(8:10)]
Matriz de covarianza para variables sobre población estudiantil:
datatable(x_2)
Matriz de covarianza para variables sobre proceso de admision:
datatable(y_2)
Creamos gráficas de correlación:
library(GGally)
ggpairs(x_2, title = "Variables Población Estudiantil")
ggpairs(y_2, title = "Variables Proceso de admision")
Creamos gráfica para ver correlación entre ambos grupos de variables:
ggduo(Data_2020,columnsX = 3:7,columnsY = 8:10,
types = list(continuous = "smooth_lm"),
title = "Correlación entre variables de población estudiantil y Proceso de Admision",)
Calculamos las matrices de covarianzas que se necesitan para el desarrollo del problema:
Sxx_2 <- cov(x_2)
Sxx_2
## Admitidos Matriculados Graduados
## Admitidos 2410.146 1887.3404 1004.4639
## Matriculados 1887.340 1625.6721 813.0992
## Graduados 1004.464 813.0992 526.1093
Syy_2 <- cov(y_2)
Syy_2
## IMI Cupos Solicitantes
## IMI 684.1503 491.3216 3119.146
## Cupos 491.3216 1444.5219 6122.598
## Solicitantes 3119.1462 6122.5978 32201.854
Sxy_2 <- cov(x_2,y_2)
Sxy_2
## IMI Cupos Solicitantes
## Admitidos 659.4918 1710.286 7876.415
## Matriculados 579.2475 1370.589 6336.351
## Graduados 370.1779 792.885 3499.693
Syx_2 <- cov(y_2,x_2)
Syx_2
## Admitidos Matriculados Graduados
## IMI 659.4918 579.2475 370.1779
## Cupos 1710.2858 1370.5891 792.8850
## Solicitantes 7876.4148 6336.3511 3499.6932
Encontramos los valores propios de cualquiera de las matrices cuadradas A y B:
A_2 <- solve(Sxx_2)%*%Sxy_2%*%solve(Syy_2)%*%Syx_2
B_2 <- solve(Syy_2)%*%Syx_2%*%solve(Sxx_2)%*%Sxy_2
# Valores propios
Valores_A_2 <- eigen(A_2)$values
Con los valores propios, podemos ahora calcular las correspondientes correlaciones canónicas, las cuales serán las raíces cuadradas de los valores propios:
r_2 <- sqrt(Valores_A_2)
r_2
## [1] 0.95098604 0.49479478 0.09981838
Para este problema, las correlaciones canónicas son: $r1=0.95098604 $, \(r2=0.49479478\), \(r3=0.09981838\)
Vectores canónicos:
Encontramos los vectores propios de cada matriz cuadrada A y B:
# Vectores propios
Vectores_A_2 <- eigen(A_2)$vectors
Vectores_A_2
## [,1] [,2] [,3]
## [1,] 0.3343537 0.5029922 0.4827626
## [2,] 0.1688888 -0.1281950 -0.8019066
## [3,] 0.9271916 -0.8547309 0.3519744
Vectores_B_2 <- eigen(B_2)$vectors
Vectores_B_2
## [,1] [,2] [,3]
## [1,] 0.2246178 -0.7992629 0.3505611
## [2,] 0.9735626 -0.5662088 -0.9208859
## [3,] 0.0415046 0.2014607 0.1705169
Calculamos la correlación canónica y los vectores canónicos:
library(CCA)
ccl_2 <- cc(x_2,y_2)
ccl_2[3:4]
## $xcoef
## [,1] [,2] [,3]
## Admitidos -0.007755388 0.05245502 0.04996665
## Matriculados -0.003917404 -0.01336894 -0.08299853
## Graduados -0.021506360 -0.08913641 0.03642988
##
## $ycoef
## [,1] [,2] [,3]
## IMI -0.0047597718 -0.05049736 -0.018025272
## Cupos -0.0206303117 -0.03577303 0.047350435
## Solicitantes -0.0008795047 0.01272827 -0.008767699
Creamos los vectores canónicos para poder calcular las variables canónicas:
a_2 <- Vectores_A_2[,1]
den2a <- a_2%*%Sxx_2%*%a_2
den2a
## [,1]
## [1,] 1858.682
b_2 <- Vectores_B_2[,1]
den2b <- b_2%*%Sxx_2%*%b_2
den2b
## [,1]
## [1,] 2573.242
Calculamos las variables canónicas:
a_2can <- a_2/sqrt(den2a)
a_2can
## [1] 0.007755388 0.003917404 0.021506360
b_2can <- b_2/sqrt(den2b)
b_2can
## [1] 0.0044279628 0.0191921496 0.0008181934
Construir las faltantes dos parejas de variables canónicas:
library(CCP)
cc2_2 <- cc(x_2,y_2)
rho_2 <- cc2_2$cor
n_2 <- dim(Data_2020)[1]
p_2 <- length(x_2)
q_2 <- length(y_2)
p.asym(rho_2, n_2, p_2, q_2, tstat ="Wilks")
## Wilks' Lambda, using F-approximation (Rao's F):
## stat approx df1 df2 p.value
## 1 to 3: 0.0714948 29.1304437 9 134.0062 0.000000000
## 2 to 3: 0.7476538 4.3823061 4 112.0000 0.002494741
## 3 to 3: 0.9900363 0.5736471 1 57.0000 0.451933045
plt.cc(ccl, var.label = TRUE, d1 = 1, d2 = 2, type = "b")
CCA 2021:
library(DT)
x_3 <- Data_2021[,(3:5)]
y_3 <- Data_2021[,(8:10)]
Matriz de covarianza para variables sobre población estudiantil:
datatable(x_3)
Matriz de covarianza para variables sobre proceso de admision:
datatable(y_3)
Creamos gráficas de correlación:
library(GGally)
ggpairs(x_3, title = "Variables Población Estudiantil")
ggpairs(y_3, title = "Variables Proceso de admision")
Creamos gráfica para ver correlación entre ambos grupos de variables:
ggduo(Data_2021,columnsX = 3:7,columnsY = 8:10,
types = list(continuous = "smooth_lm"),
title = "Correlación entre variables de población estudiantil y Proceso de Admision",)
Calculamos las matrices de covarianzas que se necesitan para el desarrollo del problema:
Sxx_3 <- cov(x_3)
Sxx_3
## Admitidos Matriculados Graduados
## Admitidos 1934.1902 1497.0235 891.2981
## Matriculados 1497.0235 1299.1568 701.7981
## Graduados 891.2981 701.7981 546.1279
Syy_3 <- cov(y_3)
Syy_3
## IMI Cupos Solicitantes
## IMI 631.6721 520.8749 2949.480
## Cupos 520.8749 1596.0623 6699.037
## Solicitantes 2949.4803 6699.0372 35578.084
Sxy_3 <- cov(x_3,y_3)
Sxy_3
## IMI Cupos Solicitantes
## Admitidos 526.6123 1606.1268 7052.956
## Matriculados 470.6790 1253.5268 5521.422
## Graduados 368.7732 847.1432 3703.733
Syx_3 <- cov(y_3,x_3)
Syx_3
## Admitidos Matriculados Graduados
## IMI 526.6123 470.679 368.7732
## Cupos 1606.1268 1253.527 847.1432
## Solicitantes 7052.9557 5521.422 3703.7331
Encontramos los valores propios de cualquiera de las matrices cuadradas A y B:
A_3 <- solve(Sxx_3)%*%Sxy_3%*%solve(Syy_3)%*%Syx_3
B_3 <- solve(Syy_3)%*%Syx_3%*%solve(Sxx_3)%*%Sxy_3
Valores propios:
Valores_A_3 <- eigen(A_3)$values
Con los valores propios, podemos ahora calcular las correspondientes correlaciones canónicas, las cuales serán las raíces cuadradas de los valores propios:
r_3 <- sqrt(Valores_A_3)
r_3
## [1] 0.94893209 0.44788182 0.02318196
Para este problema, las correlaciones canónicas son: $r1=0.94893209 $, \(r2=0.44788182\), \(r3=0.02318196\)
Vectores canónicos:
Encontramos los vectores propios de cada matriz cuadrada A y B:
# Vectores propios
Vectores_A_3 <- eigen(A_3)$vectors
Vectores_A_3
## [,1] [,2] [,3]
## [1,] -0.36661798 0.6530817 -0.3576784
## [2,] -0.07806442 -0.3840314 0.7919922
## [3,] -0.92709072 -0.6526900 -0.4947873
Vectores_B_3 <- eigen(B_3)$vectors
Vectores_B_3
## [,1] [,2] [,3]
## [1,] -0.20583698 -0.99130968 0.01149845
## [2,] -0.97828529 -0.07828034 -0.97509082
## [3,] -0.02426998 0.10572278 0.22150776
Calculamos la correlación canónica y los vectores canónicos:
library(CCA)
ccl_3 <- cc(x_3,y_3)
ccl_3[3:4]
## $xcoef
## [,1] [,2] [,3]
## Admitidos -0.009371427 0.06874032 0.03359587
## Matriculados -0.001995469 -0.04042135 -0.07438991
## Graduados -0.023698137 -0.06869909 0.04647417
##
## $ycoef
## [,1] [,2] [,3]
## IMI -0.0044572965 -0.050859077 -0.0005955443
## Cupos -0.0211842774 -0.004016167 0.0505033177
## Solicitantes -0.0005255542 0.005424100 -0.0114726510
Creamos los vectores canónicos para poder calcular las variables canónicas:
a_3 <- Vectores_A_3[,1]
den3a <- a_3%*%Sxx_3%*%a_3
den3a
## [,1]
## [1,] 1530.439
b_3 <- Vectores_B_3[,1]
den3b <- b_3%*%Sxx_3%*%b_3
den3b
## [,1]
## [1,] 1970.753
Calculamos las variables canónicas:
a_3can <- a_3/sqrt(den3a)
a_3can
## [1] -0.009371427 -0.001995469 -0.023698137
b_3can <- b_3/sqrt(den3b)
b_3can
## [1] -0.0046366821 -0.0220368465 -0.0005467053
Construir las faltantes dos parejas de variables canónicas:
library(CCP)
cc2_3 <- cc(x_3,y_3)
rho_3 <- cc2_3$cor
n_3 <- dim(Data_2021)[1]
p_3 <- length(x_3)
q_3 <- length(y_3)
p.asym(rho_3, n_3, p_3, q_3, tstat ="Wilks")
## Wilks' Lambda, using F-approximation (Rao's F):
## stat approx df1 df2 p.value
## 1 to 3: 0.07952002 27.24768089 9 134.0062 0.00000000
## 2 to 3: 0.79897227 3.32507916 4 112.0000 0.01295728
## 3 to 3: 0.99946260 0.03064847 1 57.0000 0.86164736
plt.cc(ccl, var.label = TRUE, d1 = 1, d2 = 2, type = "b")
En cuanto al análisis de correlación canónica (CCA) en 2017, se evidencia una distribución específica de admitidos, matriculados y graduados para diferentes concentraciones en los grupos 1 y 2. La información para 2020 y 2021 se enfoca en cantidades de IMI, Cupos y Solicitantes para las concentraciones en los grupos 1 y 2, mostrando cambios en la oferta educativa y las preferencias de los estudiantes.