Aplicar el método de análisis de componentes principales PCA a una base de datos que incluye la información de 98 mujeres atletas de élite que fueron entrenadas en el Instituto Australiano de Deporte.
Reducir la dimensión del conjunto de datos e interpretar los resultados obtenidos.
La base de datos escojida para la aplicación del análisis de componentes principales, contiene la información de 98 mujeres atletas de élites que fueron entrenadas en el instituto australiano del deporte. Las variables contenidas en la base de datos son la masa corporal magra (lbm), estatura en centimetros (ht), el peso en kilogramos (wt) y el conteo de globulos rojos (rcc).
Inicialmente verificamos que los datos cumplieran con la condición de los supuestos y se procedio aplicar la técnica del PCA con el fin de transformar el conjunto principal de variables en otro conjunto de nuevas variables incorrelacionadas entre si, que son una trasformación lineal de las variables principales, a estas nuevas variables se le denominan componentes.
El PCA pertenece a la familia de técnicas conocidas como unsupervised learning y permite transformar o condensar las variables que cumpla con la variabilidad o correlación entre sí. Este método estadístico tiene como punto de partida una matriz de datos que contiene cierta cantidad de variables y se busca hacer un análisis que determine las componentes principales, está componente deben tener variabilidad en sus datos.
Los componentes principales se definen como las combinaciones lineales de las variables originales que determinan la varianza en los datos de cierta información suministrada, además se debe tener en cuenta que el máximo de componentes extraidos en la base de datos siempre es igual al número de variables.
Una de las aplicaciones más importante del PCA es la reducción de dimensionalidad (variables), que hace que se vaya perdiendo la menor cantidad de varianza cuando contamos con un gran número de variables cuantitativas posiblemente correlacionadas entre sí, lo cual hace que el PCA permita reducirlas a un número menor de variables transformadas (componentes principales) expliquen gran parte de la variabilidad de los datos.
datos%>%DT::datatable()
# Resumen estadístico de la base de datos
summary(datos)
## lbm ht wt rcc
## Min. :34.36 Min. :148.9 Min. :37.80 Min. :3.800
## 1st Qu.:51.81 1st Qu.:170.9 1st Qu.:60.02 1st Qu.:4.162
## Median :55.20 Median :175.0 Median :67.70 Median :4.385
## Mean :54.91 Mean :174.6 Mean :67.08 Mean :4.406
## 3rd Qu.:59.52 3rd Qu.:179.7 3rd Qu.:74.38 3rd Qu.:4.553
## Max. :72.98 Max. :195.9 Max. :96.30 Max. :5.330
# Estructura de la base de datos
str(datos)
## tibble [98 x 4] (S3: tbl_df/tbl/data.frame)
## $ lbm: num [1:98] 60.2 41.5 48.3 47.6 61.9 ...
## $ ht : num [1:98] 186 156 174 162 189 ...
## $ wt : num [1:98] 75.2 49.8 62.3 52.8 75.5 51.9 74.3 96.3 74.4 64.7 ...
## $ rcc: num [1:98] 4.31 4.21 4.42 4.2 4.62 4.52 4.44 4.71 4.41 5.31 ...
# Nombre de las variables
names(datos)
## [1] "lbm" "ht" "wt" "rcc"
# Correlación entre variables
ggpairs(datos) +
labs(title = "Diagrama de dispersión con correlaciones")+
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
# Matriz de correlación redondeada a 7 unidades
round(cor(datos),7)
## lbm ht wt rcc
## lbm 1.0000000 0.7113271 0.9391796 0.0852420
## ht 0.7113271 1.0000000 0.7150643 0.0146028
## wt 0.9391796 0.7150643 1.0000000 0.0205492
## rcc 0.0852420 0.0146028 0.0205492 1.0000000
Si no se estandarizan las variables para que tengan media cero y desviación estándar 1 antes de realizar el estudio PCA, la variable ht dominará la mayoría de las componentes principales.Por lo tanto, se resta a cada valor la media de la variable a la que pertenece. Con esto se consigue centralizar las variables y que su media sea 0.
standardise<- datos
standardise$lbm <- datos$lbm - mean(datos$lbm)
standardise$ht <- datos$ht - mean(datos$ht)
standardise$wt <- datos$wt - mean(datos$wt)
standardise$rcc <- datos$rcc - mean(datos$rcc)
standardise
## # A tibble: 98 x 4
## lbm ht wt rcc
## <dbl> <dbl> <dbl> <dbl>
## 1 5.26 11.6 8.12 -0.0962
## 2 -13.4 -18.6 -17.3 -0.196
## 3 -6.58 -0.765 -4.78 0.0138
## 4 -7.34 -12.6 -14.3 -0.206
## 5 6.94 14.1 8.42 0.214
## 6 -12.0 -5.97 -15.2 0.114
## 7 6.38 4.93 7.22 0.0338
## 8 13.6 18.8 29.2 0.304
## 9 3.64 15.1 7.32 0.00378
## 10 2.63 -0.465 -2.38 0.904
## # ... with 88 more rows
estandarización=scale(datos)
# Matriz de covarianza
matriz_cov <- cov(standardise)
matriz_cov
## lbm ht wt rcc
## lbm 48.8803634 41.30914749 71.29967042 0.19294510
## ht 41.3091475 68.99527877 64.49505365 0.03926972
## wt 71.2996704 64.49505365 117.90800021 0.07224037
## rcc 0.1929451 0.03926972 0.07224037 0.10481550
# Estandarización de la media
apply(X = datos, MARGIN = 2, FUN = mean)
## lbm ht wt rcc
## 54.914796 174.565306 67.076531 4.406224
# Estandarización de la varianza
apply(X =datos, MARGIN = 2, FUN = var)
## lbm ht wt rcc
## 48.8803634 68.9952788 117.9080002 0.1048155
# eigenvalues
eigen <- eigen(matriz_cov)
eigen$values
## [1] 205.5596405 26.0637080 4.1644076 0.1007018
# eigenvectores
eigen$vectors
## [,1] [,2] [,3] [,4]
## [1,] -0.4648174308 -0.234717025 0.85329356 -0.027254008
## [2,] -0.4891474961 0.871793708 -0.02658981 0.001854618
## [3,] -0.7380236174 -0.429977925 -0.51982604 0.014866504
## [4,] -0.0007895071 -0.001622341 0.03104800 0.999516266
# Valores propios
ais.active<-standardise[,1:ncol(standardise)]
res.pca <- PCA(ais.active, graph = FALSE)
eig.val <- get_eigenvalue(res.pca)
eig.val
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 2.58533346 64.633336 64.63334
## Dim.2 1.00027282 25.006820 89.64016
## Dim.3 0.35580812 8.895203 98.53536
## Dim.4 0.05858561 1.464640 100.00000
pca <- princomp(standardise, cor=TRUE)
pca
## Call:
## princomp(x = standardise, cor = TRUE)
##
## Standard deviations:
## Comp.1 Comp.2 Comp.3 Comp.4
## 1.6078972 1.0001364 0.5964965 0.2420446
##
## 4 variables and 98 observations.
summary(pca)
## Importance of components:
## Comp.1 Comp.2 Comp.3 Comp.4
## Standard deviation 1.6078972 1.0001364 0.59649654 0.2420446
## Proportion of Variance 0.6463334 0.2500682 0.08895203 0.0146464
## Cumulative Proportion 0.6463334 0.8964016 0.98535360 1.0000000
prc<-prcomp(datos, center = TRUE, scale. = TRUE)
prc
## Standard deviations (1, .., p=4):
## [1] 1.6078972 1.0001364 0.5964965 0.2420446
##
## Rotation (n x k) = (4 x 4):
## PC1 PC2 PC3 PC4
## lbm -0.59604653 0.02431702 -0.38113698 0.706308589
## ht -0.53654149 -0.06060311 0.84168775 0.003494673
## wt -0.59569501 -0.04457075 -0.38000813 -0.706225686
## rcc -0.04471254 0.99686980 0.04347585 -0.048592644
summary(prc)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.6079 1.0001 0.59650 0.24204
## Proportion of Variance 0.6463 0.2501 0.08895 0.01465
## Cumulative Proportion 0.6463 0.8964 0.98535 1.00000
La primera componente explica 64,6% de la varianza observada en los datos y la segunda componente explica el 25%.
La porción de varianza explicada por las dos primeras componentes es aproximadamente el 90%.
La tercera y la cuarta componente no superan por separado el 1% de varianza explicada.
La primera componente es el resultado de la siguiente combinación lineal de las variables originales:
\[PC1=-0.59604653 lbm -0.53654149 ht -0.59569501 wt -0.04471254 rcc\]
La información asignada en la primera componente a las variables wt, lbm y ht son aproximadamente iguales entre ellos y muy superior al asignado a rcc.
En la segunda componente es la variable rcc la que aporta mayor información en comparación a las variables wt, lbm y ht que aportan poca información.
pca$sdev^2
## Comp.1 Comp.2 Comp.3 Comp.4
## 2.58533346 1.00027282 0.35580812 0.05858561
plot(pca, type="l")
fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 80))
La varianza explicada es mayor en la primera componente que en las demas componentes.
Aplicando la técnica del codo elijimos la primera y la segunda componente principal y rechazamos la tercera y la cuarta componente.
# Grafico de las dos primeras componentes principales
biplot(x = pca, scale = 0, cex = 0.5, col = c("blue4", "brown3"))
El gráfico nos indica que los individuos como 10 y 15 tienen un valor alto para la variable rcc.
Los individuos 5 y 44 tienen un valor alto para la variable lbm, ya que están en el mismo lado de la variable.
Los individuos 95 y 19 tienen un valor bajo para la variable wt, ya que se encuentran en el lado opuesto de dicha variable.
# Información de las variables
var <- get_pca_var(res.pca)
var
## Principal Component Analysis Results for variables
## ===================================================
## Name Description
## 1 "$coord" "Coordinates for the variables"
## 2 "$cor" "Correlations between variables and dimensions"
## 3 "$cos2" "Cos2 for the variables"
## 4 "$contrib" "contributions of the variables"
# Coordenadas
head(var$coord)
## Dim.1 Dim.2 Dim.3 Dim.4
## lbm 0.95838156 0.02432033 -0.22734689 -0.1709582067
## ht 0.86270357 -0.06061137 0.50206383 -0.0008458669
## wt 0.95781635 -0.04457683 -0.22667353 0.1709381406
## rcc 0.07189317 0.99700577 0.02593319 0.0117615890
# Cos2
head(var$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4
## lbm 0.918495206 0.0005914787 0.0516866067 2.922671e-02
## ht 0.744257457 0.0036737385 0.2520680894 7.154908e-07
## wt 0.917412167 0.0019870939 0.0513808908 2.921985e-02
## rcc 0.005168628 0.9940205066 0.0006725305 1.383350e-04
# Constribucion de las variables a las componentes
head(var$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4
## lbm 35.5271465 0.05913173 14.5265395 49.887182236
## ht 28.7876774 0.36727365 70.8438276 0.001221274
## wt 35.4852549 0.19865519 14.4406179 49.875471980
## rcc 0.1999211 99.37493943 0.1890149 0.236124510
# Coordenadas de las variables
head(var$coord, 4)
## Dim.1 Dim.2 Dim.3 Dim.4
## lbm 0.95838156 0.02432033 -0.22734689 -0.1709582067
## ht 0.86270357 -0.06061137 0.50206383 -0.0008458669
## wt 0.95781635 -0.04457683 -0.22667353 0.1709381406
## rcc 0.07189317 0.99700577 0.02593319 0.0117615890
# Circulo de correlaciones
fviz_pca_var(res.pca, col.var = "red",repel = TRUE)
# Coordenadas de las variables
head(var$coord, 4)
## Dim.1 Dim.2 Dim.3 Dim.4
## lbm 0.95838156 0.02432033 -0.22734689 -0.1709582067
## ht 0.86270357 -0.06061137 0.50206383 -0.0008458669
## wt 0.95781635 -0.04457683 -0.22667353 0.1709381406
## rcc 0.07189317 0.99700577 0.02593319 0.0117615890
head(var$cos2, 4)
## Dim.1 Dim.2 Dim.3 Dim.4
## lbm 0.918495206 0.0005914787 0.0516866067 2.922671e-02
## ht 0.744257457 0.0036737385 0.2520680894 7.154908e-07
## wt 0.917412167 0.0019870939 0.0513808908 2.921985e-02
## rcc 0.005168628 0.9940205066 0.0006725305 1.383350e-04
corrplot(var$cos2, is.corr=FALSE)
fviz_cos2(res.pca, choice = "var", axes = 1:2)
#Circulo de correlación
# Color por valores de cos2: calidad en el mapa de factores
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Avoid text overlapping
)
las variables rcc, wt, lbm y ht tienen un coseno cuadrado alto, por lo tanto, tienen una buena representación en el componente principal en las dimesiones 1 y 2.
La correlación entre la dimesión 1 y las variables lbm, ht y wt es muy alta, por lo tanto la primera dimesión absorbe información que es común en esas variables.
La dimesión 2 tiene relación con la variable rcc y captura información de dicha variable.
La dimesión 3 captura mas información de la variable ht y recibe poca información de las variables lbm.
La dimesión 4 captura poca información de las variables lbm y wt.
Las variables rcc, wt, lbm y ht representan muy bien las dimensiones 1 y 2.
El vector de la variable rcc es ortogonal con los vectores variables lbm, ht y wt, lo cual implica que las variables no están correlacionadas.
Los vectores variables lbm, ht y wt tienen ángulos pequeños, por lo tanto su correlación es alta.
Como las variables se encuentran cerca de la circunferencia del circulo de correlación, las variables rcc, wt, lb y ht tienen una buena representación.
La proyección para la variable rcc es muy buena.
# Constribucion de cada variable a cada componente
res.val <- get_pca_var(pca)
res.val$contrib
## Dim.1 Dim.2 Dim.3 Dim.4
## lbm 35.5271465 0.05913173 14.5265395 49.887182236
## ht 28.7876774 0.36727365 70.8438276 0.001221274
## wt 35.4852549 0.19865519 14.4406179 49.875471980
## rcc 0.1999211 99.37493943 0.1890149 0.236124510
# Contributions of variables to PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 4)
# Contributions of variables to PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 4)
# Contributions of variables to PC3
fviz_contrib(res.pca, choice = "var", axes = 3, top = 4)
# Contributions of variables to PC4
fviz_contrib(res.pca, choice = "var", axes = 4, top = 4)
# Contribuciones de las variables en los ejes
corrplot(var$contrib, is.corr=FALSE)
# Grafica de correlación de las variables mas constribuyentes
fviz_pca_var(res.pca, col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
Las variables lbm, wt y ht están relacionadas con la dimensión 1 y la variable rcc esta relacionada con la dimensión 2, por lo tanto, estas variables son las mas importantes para explicar la variablidad en el conjunto de datos.
Las variables lbm, wt y ht son muy importante para la constribución de la componente PC1.
La variable rcc es muy importante para la constribución de la componente PC2.
La variable ht es importante para la constribución de la componente PC3.
Las variables lbm y wt son importantes para la constribución de la componente PC4.
https://rpubs.com/alejo0574/analisis-componentes-principales
Practical Guide To Clauter Analysis in R Unsupervised Machine Learning by Alboukadel kassambara, Edition 1