Departamento acádemico de estadística e informática
Jesús Salinas
Análisis factorial mixto
2022-I
Torres Jorges, David Jesus (20190312@lamolina.edu.pe)
Uriarte Zaga, Aron Salvador (20181161@lamolina.edu.pe)
Vasquez Pelaez, Melannie Geraldine (20190315@lamolina.edu.pe)
Vilca Chávez, Xiomara Coret (20191319@lamolina.edu.pe)
Dentro de un caso de estudio, el cual tiene como tema principal los abalone la predicción de la edad del abalón a partir de mediciones físicas de manera que la edad del abalón se determina cortando la concha a través del cono (*parte donde se almacena la glándula a un diente radular en forma de arpón), tiñéndola y contando el número de anillos a través de un microscopio, una tarea muy tediosa donde se requiere de mucho tiempo. Para predecir la edad se utilizan otras mediciones, más accesibles de obtener. Para resolver el problema puede ser necesaria más información, como los patrones climáticos y la ubicación (por tanto, la disponibilidad de alimentos).
De los datos originales se han eliminado los ejemplos con valores perdidos (la mayoría de los cuales carecen del valor predicho), y los rangos de los valores continuos se han escalado para su uso con una RNA (dividiendo por 200).
library(pacman)
p_load(FactoMineR,dplyr, funModeling, readr, tidyr, fastDummies,knitr,visdat, naniar,PCAmixdata, ggcorrplot,corrr,psych,
factoextra)
Los datos fueron extraido de UCI Machine Learning Repository: Base de datos
dt <- read.delim("abalone.data", col.names = c("Sexo","Longitud","Diametro",
"Altura","PesoE","PesoD","PesoV",
"PesoC","Anillos"),sep = ",")
knitr::kable(head(dt))
| Sexo | Longitud | Diametro | Altura | PesoE | PesoD | PesoV | PesoC | Anillos |
|---|---|---|---|---|---|---|---|---|
| M | 0.350 | 0.265 | 0.090 | 0.2255 | 0.0995 | 0.0485 | 0.070 | 7 |
| F | 0.530 | 0.420 | 0.135 | 0.6770 | 0.2565 | 0.1415 | 0.210 | 9 |
| M | 0.440 | 0.365 | 0.125 | 0.5160 | 0.2155 | 0.1140 | 0.155 | 10 |
| I | 0.330 | 0.255 | 0.080 | 0.2050 | 0.0895 | 0.0395 | 0.055 | 7 |
| I | 0.425 | 0.300 | 0.095 | 0.3515 | 0.1410 | 0.0775 | 0.120 | 8 |
| F | 0.530 | 0.415 | 0.150 | 0.7775 | 0.2370 | 0.1415 | 0.330 | 20 |
En este caso particular, al ver que tenemos en la variable anillos, un total de 29 niveles siendo una variable cuantitativa, se decidio categorizar esta variable en 4 nuevos niveles, los cuales son Crias, Joven, Adulto y Longevo, reduciendo asi los niveles que observamos en la presentación del caso.
El criterio de clasificación de la variable anillos, se extrajo del siguiente articulo : Articulo
dt$Division<- factor(dt$Anillos, levels=c(1:3,4:8,9:13,14:28,29), labels = c(rep('cria',3),rep('joven',5),rep('adulto',5),rep('longevo',15),'longevo'))
dt$Sexo <- factor(dt$Sexo)
dt$Division <- factor(dt$Division)
dt <- dt[,-9]
Antes de iniciar con la implementación del algoritmo, se realiza una limpieza de datos, comenzando por encontrar la presencia o ausencia de valores perdidos.
De forma gráfica :
vis_dat(dt, palette = "qual",warn_large_data = TRUE)
Del paquete visdat, con ayuda de la función vis_dat, implementa un gráfico en donde se puede visualizar que nuestro conjunto de datos presenta dos variables factor (División-Sexo) y 7 variables númericas (Longitud, Diametro, Altura, PesoE,PesoD, PesoV,PesoC ), en el cual no encontramos presencia de valores perdidos.
Otra función del mismo paquete es : viss_miss
vis_miss(dt ,sort_miss = TRUE,show_perc=TRUE)
Observamos un gráfico en donde se tiene por filas, la cantidad de datos, en las columnas, las variables con su respectivos porcentaje. El criterio del gráfico es colorear de color negro, en caso se halle un valor perdido, y de color gris, la ausencia de los mismo.
dt %>% miss_var_summary()
## # A tibble: 9 × 3
## variable n_miss pct_miss
## <chr> <int> <dbl>
## 1 Sexo 0 0
## 2 Longitud 0 0
## 3 Diametro 0 0
## 4 Altura 0 0
## 5 PesoE 0 0
## 6 PesoD 0 0
## 7 PesoV 0 0
## 8 PesoC 0 0
## 9 Division 0 0
Otra manera de visualizarlo seria con el paquete naniar, con la función miss_var_summary, en donde nos da como resultado, una tabla con dos columnas que son :
n_miss: Indica la cantidad de valores perdidos por cada variable.
pct_miss: Indica el porcentaje de valores perdidos por cada variable.
df_status(dt)
## variable q_zeros p_zeros q_na p_na q_inf p_inf type unique
## 1 Sexo 0 0.00 0 0 0 0 factor 3
## 2 Longitud 0 0.00 0 0 0 0 numeric 134
## 3 Diametro 0 0.00 0 0 0 0 numeric 111
## 4 Altura 2 0.05 0 0 0 0 numeric 51
## 5 PesoE 0 0.00 0 0 0 0 numeric 2429
## 6 PesoD 0 0.00 0 0 0 0 numeric 1515
## 7 PesoV 0 0.00 0 0 0 0 numeric 880
## 8 PesoC 0 0.00 0 0 0 0 numeric 926
## 9 Division 0 0.00 0 0 0 0 factor 4
La función df_status del paquete funModeling, nos arroja un tabla cuyos indicadores serian :
Podemos ver que hay dos valores de cero para la variable altura, al tener esta variable expresada en centímetros, y ante los resultados observados,existen dos abalones con altura igual a 0. Se analiza la altura de los mismos, se concluye que no pueden existir registros con altura cero. Por tal motivo se excluyen los registros.
dt <- data.frame(dt, N = c(1:nrow(dt)))
ceros <- dt %>% filter(Altura==0)
ceros <- ceros$N
dt <- dt[-ceros,]
dt <- dt[,-10]
head(dt)
## Sexo Longitud Diametro Altura PesoE PesoD PesoV PesoC Division
## 1 M 0.350 0.265 0.090 0.2255 0.0995 0.0485 0.070 joven
## 2 F 0.530 0.420 0.135 0.6770 0.2565 0.1415 0.210 adulto
## 3 M 0.440 0.365 0.125 0.5160 0.2155 0.1140 0.155 adulto
## 4 I 0.330 0.255 0.080 0.2050 0.0895 0.0395 0.055 joven
## 5 I 0.425 0.300 0.095 0.3515 0.1410 0.0775 0.120 joven
## 6 F 0.530 0.415 0.150 0.7775 0.2370 0.1415 0.330 longevo
summary(dt)
## Sexo Longitud Diametro Altura PesoE
## F:1307 Min. :0.0750 Min. :0.055 Min. :0.0100 Min. :0.0020
## I:1340 1st Qu.:0.4500 1st Qu.:0.350 1st Qu.:0.1150 1st Qu.:0.4421
## M:1527 Median :0.5450 Median :0.425 Median :0.1400 Median :0.8000
## Mean :0.5241 Mean :0.408 Mean :0.1396 Mean :0.8291
## 3rd Qu.:0.6150 3rd Qu.:0.480 3rd Qu.:0.1650 3rd Qu.:1.1538
## Max. :0.8150 Max. :0.650 Max. :1.1300 Max. :2.8255
## PesoD PesoV PesoC Division
## Min. :0.0010 Min. :0.0005 Min. :0.0015 cria : 17
## 1st Qu.:0.1861 1st Qu.:0.0935 1st Qu.:0.1300 joven :1388
## Median :0.3360 Median :0.1710 Median :0.2340 adulto :2280
## Mean :0.3595 Mean :0.1807 Mean :0.2389 longevo: 489
## 3rd Qu.:0.5020 3rd Qu.:0.2530 3rd Qu.:0.3289
## Max. :1.4880 Max. :0.7600 Max. :1.0050
Se puede observar que para las variables númericas, se tiene estadisticos de tendencia central, mientras que para las variables cualitativas, se tiene la frecuencia de los datos.
psych::describe(dt)
## vars n mean sd median trimmed mad min max range skew
## Sexo* 1 4174 2.05 0.82 2.00 2.07 1.48 1.00 3.00 2.00 -0.10
## Longitud 2 4174 0.52 0.12 0.54 0.53 0.12 0.07 0.81 0.74 -0.64
## Diametro 3 4174 0.41 0.10 0.42 0.41 0.10 0.06 0.65 0.60 -0.61
## Altura 4 4174 0.14 0.04 0.14 0.14 0.04 0.01 1.13 1.12 3.16
## PesoE 5 4174 0.83 0.49 0.80 0.80 0.53 0.00 2.83 2.82 0.53
## PesoD 6 4174 0.36 0.22 0.34 0.34 0.23 0.00 1.49 1.49 0.72
## PesoV 7 4174 0.18 0.11 0.17 0.17 0.12 0.00 0.76 0.76 0.59
## PesoC 8 4174 0.24 0.14 0.23 0.23 0.15 0.00 1.00 1.00 0.62
## Division* 9 4174 2.78 0.65 3.00 2.73 0.00 1.00 4.00 3.00 0.16
## kurtosis se
## Sexo* -1.52 0.01
## Longitud 0.06 0.00
## Diametro -0.05 0.00
## Altura 76.65 0.00
## PesoE -0.03 0.01
## PesoD 0.59 0.00
## PesoV 0.08 0.00
## PesoC 0.53 0.00
## Division* -0.54 0.01
profiling_num(dt)
## variable mean std_dev variation_coef p_01 p_05 p_25 p_50
## 1 Longitud 0.5240812 0.12007891 0.2291227 0.195000 0.295000 0.450000 0.545
## 2 Diametro 0.4079504 0.09922953 0.2432392 0.140000 0.220000 0.350000 0.425
## 3 Altura 0.1395939 0.04172470 0.2989006 0.045000 0.075000 0.115000 0.140
## 4 PesoE 0.8290800 0.49038380 0.5914795 0.035730 0.125825 0.442125 0.800
## 5 PesoD 0.3595087 0.22197107 0.6174288 0.013500 0.052325 0.186125 0.336
## 6 PesoV 0.1806718 0.10961163 0.6066893 0.007865 0.027000 0.093500 0.171
## 7 PesoC 0.2388551 0.13922198 0.5828722 0.010365 0.038325 0.130000 0.234
## p_75 p_95 p_99 skewness kurtosis iqr
## 1 0.615000 0.690000 0.735000 -0.6411302 3.066325 0.165000
## 2 0.480000 0.545000 0.580000 -0.6102220 2.955660 0.130000
## 3 0.165000 0.200000 0.220000 3.1656704 79.684026 0.050000
## 4 1.153750 1.695950 2.144660 0.5299749 2.974638 0.711625
## 5 0.502000 0.740350 0.998065 0.7181031 3.592296 0.315875
## 6 0.253000 0.379675 0.476175 0.5908538 3.082210 0.159500
## 7 0.328875 0.480000 0.620000 0.6204775 3.529712 0.198875
## range_98 range_80
## 1 [0.195, 0.735] [0.355, 0.66]
## 2 [0.14, 0.58] [0.265, 0.523500000000001]
## 3 [0.045, 0.22] [0.09, 0.185]
## 4 [0.03573, 2.14466] [0.20515, 1.47835]
## 5 [0.0135, 0.998064999999996] [0.0865, 0.647]
## 6 [0.007865, 0.476174999999999] [0.0435, 0.326]
## 7 [0.010365, 0.62] [0.065, 0.42]
Con ayuda del paquete funModeling, se obtiene una tabla de métricas con muchos indicadores para todas las variables numéricas, omitiendo automáticamente las variables no numéricas.
Las métricas actuales son:
newdt <- dummy_cols(dt, select_columns = c("Sexo", "Division")) %>%
select(-c("Sexo", "Division"))
cor(newdt)
## Longitud Diametro Altura PesoE PesoD
## Longitud 1.0000000 0.9868031 0.8281069 0.9252112 0.8978506
## Diametro 0.9868031 1.0000000 0.8343205 0.9254143 0.8931046
## Altura 0.8281069 0.8343205 1.0000000 0.8198742 0.7756054
## PesoE 0.9252112 0.9254143 0.8198742 1.0000000 0.9693868
## PesoD 0.8978506 0.8931046 0.7756054 0.9693868 1.0000000
## PesoV 0.9029528 0.8996733 0.7988818 0.9663509 0.9319187
## PesoC 0.8984108 0.9060819 0.8195849 0.9559197 0.8831184
## Sexo_F 0.3093625 0.3183553 0.2980553 0.2994356 0.2636902
## Sexo_I -0.5512536 -0.5641029 -0.5181495 -0.5574398 -0.5216907
## Sexo_M 0.2364599 0.2402560 0.2152594 0.2520141 0.2517800
## Division_cria -0.1893750 -0.1838876 -0.1544636 -0.1047315 -0.1005009
## Division_joven -0.5874564 -0.5989268 -0.5416415 -0.5635913 -0.5053972
## Division_adulto 0.4528835 0.4511016 0.3692317 0.3979682 0.4142239
## Division_longevo 0.1969909 0.2154657 0.2524593 0.2302797 0.1190278
## PesoV PesoC Sexo_F Sexo_I Sexo_M
## Longitud 0.9029528 0.8984108 0.30936251 -0.55125358 0.23645986
## Diametro 0.8996733 0.9060819 0.31835525 -0.56410287 0.24025602
## Altura 0.7988818 0.8195849 0.29805530 -0.51814955 0.21525935
## PesoE 0.9663509 0.9559197 0.29943565 -0.55743979 0.25201412
## PesoD 0.9319187 0.8831184 0.26369018 -0.52169072 0.25177999
## PesoV 1.0000000 0.9081762 0.30813102 -0.55594241 0.24219044
## PesoC 0.9081762 1.0000000 0.30631987 -0.54745682 0.23570926
## Sexo_F 0.3081310 0.3063199 1.00000000 -0.46427620 -0.51282182
## Sexo_I -0.5559424 -0.5474568 -0.46427620 1.00000000 -0.52226993
## Sexo_M 0.2421904 0.2357093 -0.51282182 -0.52226993 1.00000000
## Division_cria -0.1020385 -0.1059302 -0.04317759 0.06882811 -0.02514151
## Division_joven -0.5550821 -0.5893687 -0.27261933 0.50147975 -0.22359224
## Division_adulto 0.4109728 0.3609815 0.19514344 -0.37101943 0.17173480
## Division_longevo 0.1971492 0.3255358 0.10582323 -0.17389940 0.06666868
## Division_cria Division_joven Division_adulto Division_longevo
## Longitud -0.18937500 -0.58745639 0.4528835 0.19699086
## Diametro -0.18388759 -0.59892678 0.4511016 0.21546574
## Altura -0.15446361 -0.54164150 0.3692317 0.25245926
## PesoE -0.10473151 -0.56359132 0.3979682 0.23027968
## PesoD -0.10050095 -0.50539721 0.4142239 0.11902781
## PesoV -0.10203852 -0.55508207 0.4109728 0.19714923
## PesoC -0.10593020 -0.58936866 0.3609815 0.32553576
## Sexo_F -0.04317759 -0.27261933 0.1951434 0.10582323
## Sexo_I 0.06882811 0.50147975 -0.3710194 -0.17389940
## Sexo_M -0.02514151 -0.22359224 0.1717348 0.06666868
## Division_cria 1.00000000 -0.04513762 -0.0701636 -0.02329540
## Division_joven -0.04513762 1.00000000 -0.7744290 -0.25712237
## Division_adulto -0.07016360 -0.77442901 1.0000000 -0.39968065
## Division_longevo -0.02329540 -0.25712237 -0.3996806 1.00000000
Se hace uso del paquete fastDummies, se hace uso de la función dummy_cols la cual crea columnas ficticias (binarias) a partir de columnas de tipo carácter y factor en los datos introducidos (y columnas numéricas si se especifica.)
\[H_0: \rho = 0\]
\[H_1: \rho \neq 0\]
corr.test(newdt)
## Call:corr.test(x = newdt)
## Correlation matrix
## Longitud Diametro Altura PesoE PesoD PesoV PesoC Sexo_F Sexo_I
## Longitud 1.00 0.99 0.83 0.93 0.90 0.90 0.90 0.31 -0.55
## Diametro 0.99 1.00 0.83 0.93 0.89 0.90 0.91 0.32 -0.56
## Altura 0.83 0.83 1.00 0.82 0.78 0.80 0.82 0.30 -0.52
## PesoE 0.93 0.93 0.82 1.00 0.97 0.97 0.96 0.30 -0.56
## PesoD 0.90 0.89 0.78 0.97 1.00 0.93 0.88 0.26 -0.52
## PesoV 0.90 0.90 0.80 0.97 0.93 1.00 0.91 0.31 -0.56
## PesoC 0.90 0.91 0.82 0.96 0.88 0.91 1.00 0.31 -0.55
## Sexo_F 0.31 0.32 0.30 0.30 0.26 0.31 0.31 1.00 -0.46
## Sexo_I -0.55 -0.56 -0.52 -0.56 -0.52 -0.56 -0.55 -0.46 1.00
## Sexo_M 0.24 0.24 0.22 0.25 0.25 0.24 0.24 -0.51 -0.52
## Division_cria -0.19 -0.18 -0.15 -0.10 -0.10 -0.10 -0.11 -0.04 0.07
## Division_joven -0.59 -0.60 -0.54 -0.56 -0.51 -0.56 -0.59 -0.27 0.50
## Division_adulto 0.45 0.45 0.37 0.40 0.41 0.41 0.36 0.20 -0.37
## Division_longevo 0.20 0.22 0.25 0.23 0.12 0.20 0.33 0.11 -0.17
## Sexo_M Division_cria Division_joven Division_adulto
## Longitud 0.24 -0.19 -0.59 0.45
## Diametro 0.24 -0.18 -0.60 0.45
## Altura 0.22 -0.15 -0.54 0.37
## PesoE 0.25 -0.10 -0.56 0.40
## PesoD 0.25 -0.10 -0.51 0.41
## PesoV 0.24 -0.10 -0.56 0.41
## PesoC 0.24 -0.11 -0.59 0.36
## Sexo_F -0.51 -0.04 -0.27 0.20
## Sexo_I -0.52 0.07 0.50 -0.37
## Sexo_M 1.00 -0.03 -0.22 0.17
## Division_cria -0.03 1.00 -0.05 -0.07
## Division_joven -0.22 -0.05 1.00 -0.77
## Division_adulto 0.17 -0.07 -0.77 1.00
## Division_longevo 0.07 -0.02 -0.26 -0.40
## Division_longevo
## Longitud 0.20
## Diametro 0.22
## Altura 0.25
## PesoE 0.23
## PesoD 0.12
## PesoV 0.20
## PesoC 0.33
## Sexo_F 0.11
## Sexo_I -0.17
## Sexo_M 0.07
## Division_cria -0.02
## Division_joven -0.26
## Division_adulto -0.40
## Division_longevo 1.00
## Sample Size
## [1] 4174
## Probability values (Entries above the diagonal are adjusted for multiple tests.)
## Longitud Diametro Altura PesoE PesoD PesoV PesoC Sexo_F Sexo_I
## Longitud 0 0 0 0 0 0 0 0.00 0
## Diametro 0 0 0 0 0 0 0 0.00 0
## Altura 0 0 0 0 0 0 0 0.00 0
## PesoE 0 0 0 0 0 0 0 0.00 0
## PesoD 0 0 0 0 0 0 0 0.00 0
## PesoV 0 0 0 0 0 0 0 0.00 0
## PesoC 0 0 0 0 0 0 0 0.00 0
## Sexo_F 0 0 0 0 0 0 0 0.00 0
## Sexo_I 0 0 0 0 0 0 0 0.00 0
## Sexo_M 0 0 0 0 0 0 0 0.00 0
## Division_cria 0 0 0 0 0 0 0 0.01 0
## Division_joven 0 0 0 0 0 0 0 0.00 0
## Division_adulto 0 0 0 0 0 0 0 0.00 0
## Division_longevo 0 0 0 0 0 0 0 0.00 0
## Sexo_M Division_cria Division_joven Division_adulto
## Longitud 0.0 0.00 0.00 0
## Diametro 0.0 0.00 0.00 0
## Altura 0.0 0.00 0.00 0
## PesoE 0.0 0.00 0.00 0
## PesoD 0.0 0.00 0.00 0
## PesoV 0.0 0.00 0.00 0
## PesoC 0.0 0.00 0.00 0
## Sexo_F 0.0 0.02 0.00 0
## Sexo_I 0.0 0.00 0.00 0
## Sexo_M 0.0 0.21 0.00 0
## Division_cria 0.1 0.00 0.01 0
## Division_joven 0.0 0.00 0.00 0
## Division_adulto 0.0 0.00 0.00 0
## Division_longevo 0.0 0.13 0.00 0
## Division_longevo
## Longitud 0.00
## Diametro 0.00
## Altura 0.00
## PesoE 0.00
## PesoD 0.00
## PesoV 0.00
## PesoC 0.00
## Sexo_F 0.00
## Sexo_I 0.00
## Sexo_M 0.00
## Division_cria 0.21
## Division_joven 0.00
## Division_adulto 0.00
## Division_longevo 0.00
##
## To see confidence intervals of the correlations, print with the short=FALSE option
cor.plot(cor(newdt),
main="Mapa de Calor",
diag=T,
show.legend = T,numbers=F,upper=F)
Nos arroja un gráfico de calor, en forma de una matrix triangular inferior, en donde de acuerdo a la intensidad de los colores ubicado en la leyenda, en donde se puede observar la variación de los colores conforme la correlación se encuentra entre \(-1\space y \space1\).
model.matrix(~0+., data=newdt) %>%
cor(use="pairwise.complete.obs") %>%
ggcorrplot(show.diag = F, type="lower", lab=TRUE, lab_size=2)
De acuerdo a las variables en estudio, podemos observar la alta
correlación que presentan alguna variables como :
Ante la presencia de correlación entre multiples variables, se puede implementar un Análisis Factorial Mixto, principalmente por el tipo de dato que presenta nuestro conjunto de datos, tanto variables cualitativas como cuantitativas.
cor <- correlate(newdt)
network_plot(cor)
Se puede observar que en las variables cualitativas, al describir estas las dimensiones y caracteristicas fisicas del individuo, poseen correlación altas.
Por medio de los gráficos y la prueba estadistica, se puede verificar que si existe correlación entre las variables, para lo cual procedemos a realizar un analisis factorial mixto, ya que, contamos tanto con variables cuantitativas como cualitativas.
Sexo <- dt$Sexo
Division <- dt$Division
dt <- scale(dt[,-c(1,9)])
dt <- data.frame(Sexo, dt , Division )
head(dt,6)
## Sexo Longitud Diametro Altura PesoE PesoD PesoV
## 1 M -1.44972355 -1.4406035 -1.1885985 -1.2308319 -1.1713632 -1.2058189
## 2 F 0.04929078 0.1214315 -0.1101006 -0.3101245 -0.4640638 -0.3573688
## 3 M -0.70021638 -0.4328390 -0.3497668 -0.6384387 -0.6487726 -0.6082546
## 4 I -1.61628070 -1.5413800 -1.4282647 -1.2726359 -1.2164141 -1.2879270
## 5 I -0.82513424 -1.0878859 -1.0687654 -0.9738903 -0.9844019 -0.9412484
## 6 F 0.04929078 0.0710433 0.2493987 -0.1051830 -0.5519131 -0.3573688
## PesoC Division
## 1 -1.2128477 joven
## 2 -0.2072593 adulto
## 3 -0.6023119 adulto
## 4 -1.3205893 joven
## 5 -0.8537090 joven
## 6 0.6546735 longevo
Ante la diferencia de los rangos en todas las variables declaradas dentro de nuestro conjunto de datos, y como requisito del análisis factorial, estandarizamos las variables, cuyo objetivo es estabilizar los pesos de los niveles de cada factor.
(res.famd <- FAMD(dt, graph = FALSE))
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues and inertia"
## 2 "$var" "Results for the variables"
## 3 "$ind" "results for the individuals"
## 4 "$quali.var" "Results for the qualitative variables"
## 5 "$quanti.var" "Results for the quantitative variables"
summary(res.famd)
##
## Call:
## FAMD(base = dt, graph = FALSE)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Variance 7.160 1.032 1.017 0.990 0.725
## % of var. 59.668 8.602 8.475 8.254 6.038
## Cumulative % of var. 59.668 68.270 76.745 84.999 91.036
##
## Individuals (the 10 first)
## Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
## 1 | 3.892 | -3.360 0.038 0.745 | -0.438 0.004 0.013 | 0.111 0.000
## 2 | 1.880 | -0.092 0.000 0.002 | 0.027 0.000 0.000 | -0.298 0.002
## 3 | 2.219 | -1.111 0.004 0.251 | -1.139 0.030 0.263 | 0.262 0.002
## 4 | 4.202 | -4.122 0.057 0.962 | 0.262 0.002 0.004 | -0.351 0.003
## 5 | 3.265 | -3.076 0.032 0.888 | 0.283 0.002 0.008 | -0.412 0.004
## 6 | 3.267 | 0.456 0.001 0.020 | 2.864 0.190 0.769 | 0.646 0.010
## 7 | 3.181 | 0.271 0.000 0.007 | 2.750 0.175 0.747 | 0.618 0.009
## 8 | 2.123 | -0.971 0.003 0.209 | -1.139 0.030 0.288 | 0.240 0.001
## 9 | 3.227 | 0.821 0.002 0.065 | 2.819 0.184 0.763 | 0.618 0.009
## 10 | 3.272 | -0.247 0.000 0.006 | 2.787 0.180 0.725 | 0.625 0.009
## cos2
## 1 0.001 |
## 2 0.025 |
## 3 0.014 |
## 4 0.007 |
## 5 0.016 |
## 6 0.039 |
## 7 0.038 |
## 8 0.013 |
## 9 0.037 |
## 10 0.036 |
##
## Continuous variables
## Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr cos2
## Longitud | 0.962 12.923 0.925 | -0.020 0.038 0.000 | -0.076 0.566 0.006 |
## Diametro | 0.965 13.005 0.931 | -0.006 0.003 0.000 | -0.063 0.392 0.004 |
## Altura | 0.877 10.752 0.770 | 0.067 0.431 0.004 | -0.029 0.081 0.001 |
## PesoE | 0.975 13.271 0.950 | 0.001 0.000 0.000 | 0.026 0.065 0.001 |
## PesoD | 0.937 12.258 0.878 | -0.093 0.844 0.009 | -0.009 0.008 0.000 |
## PesoV | 0.953 12.688 0.908 | -0.022 0.048 0.000 | 0.017 0.027 0.000 |
## PesoC | 0.952 12.659 0.906 | 0.095 0.879 0.009 | 0.055 0.301 0.003 |
##
## Categories
## Dim.1 ctr cos2 v.test Dim.2 ctr cos2 v.test
## F | 1.404 1.205 0.525 22.892 | 0.580 9.888 0.090 24.902 |
## I | -2.503 3.924 0.886 -41.557 | 0.129 0.504 0.002 5.654 |
## M | 0.995 0.706 0.393 18.239 | -0.610 12.775 0.148 -29.457 |
## cria | -6.348 0.320 0.144 -9.800 | -2.020 1.560 0.015 -8.213 |
## joven | -2.497 4.043 0.893 -42.541 | 0.181 1.026 0.005 8.136 |
## adulto | 1.167 1.450 0.708 30.900 | -0.575 16.960 0.172 -40.125 |
## longevo | 1.868 0.797 0.333 16.426 | 2.237 55.043 0.477 51.823 |
## Dim.3 ctr cos2 v.test
## F -0.189 1.084 0.010 -8.184 |
## I -0.173 0.931 0.004 -7.630 |
## M 0.314 3.487 0.039 15.275 |
## cria 14.379 81.412 0.741 58.900 |
## joven -0.329 3.484 0.016 -14.884 |
## adulto -0.085 0.378 0.004 -5.946 |
## longevo 0.829 7.785 0.066 19.345 |
Se muestra todos las caracteristicas de las dimensiones halladas, mediante ciertos criterios, se hará la elección de las dimensiones óptimas de acuerdo de nuestros criterios de estudio.
res.famd$eig
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 7.1601323 59.667769 59.66777
## comp 2 1.0322221 8.601851 68.26962
## comp 3 1.0170209 8.475174 76.74479
## comp 4 0.9904644 8.253870 84.99866
## comp 5 0.7245357 6.037798 91.03646
Al observar los resultados, se puede afirmar una posible decisión respecto al número de dimensiones a eligir, según el criterio de eigenvalue, estos tienen que ser mayores a 1 (\(>1\)), descartando asi, 4 y 5 dimensiones.
fviz_screeplot(res.famd,barcolor="black",barfill="#EE30A7")
plot(get_eigenvalue(res.famd)[,1],type="b",pch=20,col="blue",
main="Gráfico de sedimentación",
ylab="Autovalores",
xlab="Número de dimensiones")
Por los gráficos de sedimentación confirmamos que es aceptable trabajar con dos componentes, ya que, despues del segundo componente no suele existir un cambio considerable. Presentandose asi, el punto de inflexión.
fviz_famd_var(res.famd, repel = TRUE)
fviz_contrib(res.famd, "var", axes = 1,fill="#9F79EE",color="black",ggtheme = theme_minimal(),title="Contribuciones de la variables en la Dim1")
Se puede observar que las variables cuantitativas, tiene una mejor representación en la primera dimensión. Siendo las menos explicadas, las varibles cuantitativas.
fviz_contrib(res.famd, "var", axes = 2,fill="olivedrab3",color="black",
,title="Contribuciones de la variables en la Dim2")
Caso contrario al primer gráfico de contribuciones, se puede observar que las variables cualitativas tienen mejor representación en la segunda dimensión.
fviz_famd_var(res.famd, "quanti.var", col.var = "contrib",
gradient.cols = c("#9A32CD", "white", "#00B2EE"),
repel = TRUE)
fviz_famd_var(res.famd, "quali.var", col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)
fviz_famd_ind(res.famd, col.ind = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)
fviz_mfa_ind(res.famd,
habillage = "Sexo",palette = c( "#EEAD0E", "#B4EEB4", "#9AC0CD"), repel = TRUE)
fviz_mfa_ind(res.famd,
habillage = "Division", palette = c("#B3EE3A", "#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)
fviz_ellipses(res.famd, c("Sexo", "Division"), repel = TRUE)
Conclusión:
Por medio del analisis factorial mixto, comprobamos que debemos reducir a dos dimensiones donde las variables: Altura, Peso, Longitud, Diametro,Altura, Peso total, Peso sin cascara, Peso de viceras, Peso de cascara y anillos se encuentran asociadas a la primera dimensión, demostrando su mejor representatividad en la priera dimensión, mientras que las variables: Division y Sexo siendo ambas variables categoricas, se encuentran asociadas a la segunda dimension.
Se tiene que separar tanto variables cuantitativas como cualitativas, formando si, dos grupos de variables dentro de nuestro conjunto de datos.
dtsep <- splitmix(dt)
Realizamos el Análisis Factorial mixto con el paquete PCAmix.
(res.pcamix <- PCAmix(X.quanti=dtsep$X.quanti,
X.quali=dtsep$X.quali,
rename.level=TRUE,
graph=FALSE,
ndim=12))
##
## Call:
## PCAmix(X.quanti = dtsep$X.quanti, X.quali = dtsep$X.quali, ndim = 12, rename.level = TRUE, graph = FALSE)
##
## Method = Principal Component of mixed data (PCAmix)
##
##
## "name" "description"
## "$eig" "eigenvalues of the principal components (PC) "
## "$ind" "results for the individuals (coord,contrib,cos2)"
## "$quanti" "results for the quantitative variables (coord,contrib,cos2)"
## "$levels" "results for the levels of the qualitative variables (coord,contrib,cos2)"
## "$quali" "results for the qualitative variables (contrib,relative contrib)"
## "$sqload" "squared loadings"
## "$coef" "coef of the linear combinations defining the PC"
(summary(res.pcamix))
##
## Call:
## PCAmix(X.quanti = dtsep$X.quanti, X.quali = dtsep$X.quali, ndim = 12, rename.level = TRUE, graph = FALSE)
##
## Method = Factor Analysis of mixed data (FAmix)
##
## Data:
## number of observations: 4174
## number of variables: 9
## number of numerical variables: 7
## number of categorical variables: 2
##
## Squared loadings :
## dim 1 dim 2 dim 3 dim 4 dim 5 dim 6 dim 7 dim 8 dim 9 dim 10 dim 11
## Longitud 0.93 0.00 0.01 0.00 0.01 0.00 0.00 0.05 0.00 0.00 0.01
## Diametro 0.93 0.00 0.00 0.00 0.00 0.00 0.00 0.05 0.00 0.00 0.01
## Altura 0.77 0.00 0.00 0.00 0.00 0.00 0.21 0.01 0.00 0.00 0.00
## PesoE 0.95 0.00 0.00 0.00 0.02 0.00 0.01 0.01 0.00 0.00 0.00
## PesoD 0.88 0.01 0.00 0.00 0.05 0.01 0.01 0.01 0.02 0.02 0.00
## PesoV 0.91 0.00 0.00 0.00 0.02 0.00 0.01 0.01 0.00 0.04 0.00
## PesoC 0.91 0.01 0.00 0.00 0.01 0.00 0.00 0.00 0.06 0.00 0.00
## Sexo 0.42 0.24 0.06 0.72 0.35 0.22 0.00 0.00 0.00 0.00 0.00
## Division 0.47 0.77 0.95 0.27 0.27 0.26 0.01 0.00 0.00 0.00 0.00
## dim 12
## Longitud 0
## Diametro 0
## Altura 0
## PesoE 0
## PesoD 0
## PesoV 0
## PesoC 0
## Sexo 0
## Division 0
## NULL
A diferencia del paquete FactoMineR, la función FAMD por default nos arroja 5 dimensiones, en cambio el paquete PCAmix cuya función comparte el nombre del paquete, nos arroja por default 12 dimensiones.
res.pcamix$eig
## Eigenvalue Proportion Cumulative
## dim 1 7.160132287 59.66776906 59.66777
## dim 2 1.032222141 8.60185117 68.26962
## dim 3 1.017020910 8.47517425 76.74479
## dim 4 0.990464411 8.25387009 84.99866
## dim 5 0.724535740 6.03779783 91.03646
## dim 6 0.492850103 4.10708419 95.14355
## dim 7 0.259048465 2.15873721 97.30228
## dim 8 0.152767343 1.27306119 98.57535
## dim 9 0.089155850 0.74296542 99.31831
## dim 10 0.062880741 0.52400618 99.84232
## dim 11 0.012576182 0.10480152 99.94712
## dim 12 0.006345825 0.05288188 100.00000
Segun estos resultados la variabilidad que explicariamos si trabajamos con 2 componentes seria de \(68.25\%\) tal como nos dio a saber los resultados anteriores.
plot(res.pcamix$eig[,1],type="b",pch=20,col="blue",
ylab="Autovalores")
eig.val <- res.pcamix$eig
barplot(eig.val[, 2], names.arg=1:nrow(eig.val),
main = "Autovalores",
xlab = "Componentes Principales",
ylab = "Porcentaje de variancias",
col ="steelblue")
lines(x = 1:nrow(eig.val), eig.val[, 2],
type="b", pch=19, col = "red")
plot(res.pcamix,choice="ind",coloring.ind = dtsep$X.quali,cex=0.8,
posleg="topright",main="Scores")
plot(res.pcamix, choice="sqload",main="Squared correlations")
plot(res.pcamix, choice="cor",main="Correlation circle")
Conclusion:
Como podemos visualizar obtenemos resultados iguales, es decir, explicamos el 68.25% de la variabilidad de los datos con 2 componentes, además que observamos las variables altura, Peso, Longitud, Diametro,Altura, Peso total, Peso sin cascara,Peso de viceras, Peso de cascara y anillos son explicadas con la primera dimension, mientras que las variables: Division y Sexo son explicadas por la segunda dimension dimensión. Se podría trabajar con 3 dimensiones, pero se tiene en cuenta el gasto computacional que ello implicaria.