El Principal Component Analysis (PCA) es una técnica utilizada para resumir y visualizar información en conjuntos de datos con múltiples variables interrelacionadas. Permite reducir los datos a través de la creación de componentes principales que capturan la mayor variación en los datos. Con PCA, es posible representar gráficamente conjuntos de datos multivariados en dos o tres dimensiones, facilitando su interpretación, explicamos tambien cómo calcularlo y visualizarlo, y se muestra cómo identificar las variables más importantes que explican las variaciones en los datos.
Varias funciones de diferentes paquetes están disponibles en R para computación PCA:
prcomp() and princomp() del paquete base de R
PCA() del paquete FactoMineR
Independientemente de la función que decida utilizar, puede extraer y visualizar fácilmente los resultados de PCA utilizando el paquete factoextra. Aquí, usaremos los dos paquetes FactoMineR (para el análisis) y factoextra (para la visualización basada en ggplot2).
dat<-read.csv("nba-2023-24.csv",header=T, sep =";")
head(dat)
## EQUIPO PJ PG PP PTS AST PBAL ROB BLO
## 1 Boston Celtics 16 14 2 110.7 23.9 11.6 6.5 5.6
## 2 Dallas 19 12 7 106.4 21.6 12.9 6.4 5.7
## 3 Oklahoma 10 6 4 105.7 23.1 11.2 7.8 6.2
## 4 Dender Nugg 12 7 5 102.2 24.9 12.0 6.4 4.3
## 5 Minnesota 16 9 7 107.5 23.9 12.2 7.3 4.6
## 6 New York Knicks 13 7 6 109.9 22.5 11.2 5.7 5.4
#View(dat)
Realizamos un analisis exploratorio para observar correlaciones entre las variables a estudiar
cor<-cor(dat[,2:9])
corrplot(cor, tl.col = "gray2",tl.cex=0.7)
pairs.panels(cor)
corrplot.mixed(cor,tl.pos = "lt", diag = "l")
boxplot(dat[,2:9])
dat_sta<-scale(dat[,2:9])
boxplot(dat_sta)
Cabe aclarar que si utilizamos la funcion PCA de FactorMiner no es necesario estandarizar, lo hace internamente.
pca_nba<-PCA(dat, ncp = 5, graph = TRUE,quali.sup = 1)
pca_nba# Permite mostrar el contenido del objeto PCA
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 16 individuals, described by 9 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$quali.sup" "results for the supplementary categorical variables"
## 12 "$quali.sup$coord" "coord. for the supplementary categories"
## 13 "$quali.sup$v.test" "v-test of the supplementary categories"
## 14 "$call" "summary statistics"
## 15 "$call$centre" "mean of the variables"
## 16 "$call$ecart.type" "standard error of the variables"
## 17 "$call$row.w" "weights for the individuals"
## 18 "$call$col.w" "weights for the variables"
Usaremos el paquete factoextra para ayudar en la interpretación de PCA, Independientemente de la función que se decida utilizar podemos extraer y visualizar fácilmente los resultados de PCA usando las funciones del paquete factoextra. Estas funciones son:
get_eigenvalue(): la cual extrae los valores propios/varianzas de los componentes principales
fviz_ eig(): visualizamos los valores propios
getpca_ind(), getpca_var(): extraemos los resultados para individuos y variables , respectivamente.
fviz_pca_ind(), fviz_pca_var(): Visualiza los resultados individuos y respectivamente.
fviz_pca_biplot(): Realiza un biplot de individuos y variables.
Los valores propios miden la cantidad de variación retenida por cada componente principal. Los valores propios son grandes para las primeras PC y pequeños para las PC posteriores. En otras palabras, las primeras PC corresponden a las direcciones con la máxima cantidad de variación en el conjunto de datos.
Para determinar el número de componentes principales a considerar, examinamos los valores propios y la proporción de varianza retenida por cada PC. La proporción de varianza indica cuánta información se conserva al considerar cada componente principal.
podemos visualizar esto con la funcion get_eigenvalue
get_eigenvalue(pca_nba) #Permite observar la calidad del resultado(maxima resolucion que resulta)
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 3.807296e+00 4.759121e+01 47.59121
## Dim.2 1.879081e+00 2.348851e+01 71.07972
## Dim.3 1.014212e+00 1.267766e+01 83.75737
## Dim.4 6.039382e-01 7.549227e+00 91.30660
## Dim.5 3.346316e-01 4.182895e+00 95.48949
## Dim.6 1.850562e-01 2.313202e+00 97.80270
## Dim.7 1.757843e-01 2.197304e+00 100.00000
## Dim.8 4.123655e-32 5.154569e-31 100.00000
pca_nba$eig # Otra alternativa para observar la calidad
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 3.807296e+00 4.759121e+01 47.59121
## comp 2 1.879081e+00 2.348851e+01 71.07972
## comp 3 1.014212e+00 1.267766e+01 83.75737
## comp 4 6.039382e-01 7.549227e+00 91.30660
## comp 5 3.346316e-01 4.182895e+00 95.48949
## comp 6 1.850562e-01 2.313202e+00 97.80270
## comp 7 1.757843e-01 2.197304e+00 100.00000
## comp 8 4.123655e-32 5.154569e-31 100.00000
La suma de todos los valores propios da una varianza total de 8, y podemos ver la variación explicada por cada valor propio en la segunda columna, así funcio; Por ejemplo, 3,80 dividido entre es igual a 0,475 o sea, alrededor del 47,5 % de la variación se explica por este primer valor propio. El porcentaje acumulado explicado se obtiene sumando las sucesivas proporciones de variación explicadas para obtener el total acumulado. Por ejemplo, 47,59 % más 23,48 % es igual a 71,07 %, y así sucesivamente.
podemos ver los valores propios ordenados de mayor a menor con fviz_eig
fviz_eig(pca_nba, addlabels = TRUE, ylim = c(0, 60))
Extraemos los resultados de una salida PCA con la función get_pca_var()
var<-get_pca_var(pca_nba)
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"
Los componentes de la función get_pca_var() se pueden usar en la gráfica de variables:
head(var$coord)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010
head(pca_nba$var$coord)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010
head(var$cor)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010
head(pca_nba$var$cor)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010
head(var$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.7455317 0.122357067 0.047765925 0.084032543 0.0000268739
## PG 0.6485910 0.134707734 0.001749687 0.204754164 0.0089839070
## PP 0.3105631 0.016065638 0.544377619 0.065161987 0.0601826839
## PTS 0.6854416 0.008553309 0.137602165 0.062924503 0.0031024445
## AST 0.6436547 0.042671162 0.014288840 0.101264471 0.1848528076
## PBAL 0.4251933 0.364163152 0.082832032 0.008265986 0.0205497987
head(pca_nba$var$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.7455317 0.122357067 0.047765925 0.084032543 0.0000268739
## PG 0.6485910 0.134707734 0.001749687 0.204754164 0.0089839070
## PP 0.3105631 0.016065638 0.544377619 0.065161987 0.0601826839
## PTS 0.6854416 0.008553309 0.137602165 0.062924503 0.0031024445
## AST 0.6436547 0.042671162 0.014288840 0.101264471 0.1848528076
## PBAL 0.4251933 0.364163152 0.082832032 0.008265986 0.0205497987
head(var$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 19.58166 6.5115382 4.7096566 13.914097 0.008030891
## PG 17.03547 7.1688099 0.1725168 33.903166 2.684715964
## PP 8.15705 0.8549732 53.6749091 10.789513 17.984760207
## PTS 18.00337 0.4551858 13.5673904 10.419030 0.927122491
## AST 16.90582 2.2708529 1.4088606 16.767357 55.240697160
## PBAL 11.16785 19.3798554 8.1671281 1.368681 6.141022253
head(pca_nba$var$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 19.58166 6.5115382 4.7096566 13.914097 0.008030891
## PG 17.03547 7.1688099 0.1725168 33.903166 2.684715964
## PP 8.15705 0.8549732 53.6749091 10.789513 17.984760207
## PTS 18.00337 0.4551858 13.5673904 10.419030 0.927122491
## AST 16.90582 2.2708529 1.4088606 16.767357 55.240697160
## PBAL 11.16785 19.3798554 8.1671281 1.368681 6.141022253
Ahora describiremos cómo visualizar variables y sacar conclusiones sobre sus correlaciones.
La correlación entre una variable y un componente principal (PC) se utiliza como las coordenadas de la variable en el PC. La representación de las variables difiere de la gráfica de las observaciones: las observaciones están representadas por sus proyecciones, pero las variables están representadas por sus correlaciones.
head(var$coord, 8)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010
## ROB -0.3930281 0.8495771 -0.05320597 0.11107937 0.146327788
## BLO 0.4402841 0.6846762 -0.42751061 0.25533489 -0.188470753
fviz_pca_var(pca_nba,col.var = "black")
Este gráfico se conoce como gráficos de correlación de variables y muestra las relaciones entre todas las variables, para interpretarlo mejor tenemos lo siguiente:
Las variables correlacionadas positivamente se agrupan.
Las variables correlacionadas negativamente se colocan en los cuadrantes opuestos a los positivos
La distancia entre las variables y el origen nos dice la calidad de las variables en el mapa de factores.
La calidad de representación de las variables en el mapa de factores se llama cos2
head(var$cos2, 8)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.7455317 0.122357067 0.047765925 0.084032543 0.0000268739
## PG 0.6485910 0.134707734 0.001749687 0.204754164 0.0089839070
## PP 0.3105631 0.016065638 0.544377619 0.065161987 0.0601826839
## PTS 0.6854416 0.008553309 0.137602165 0.062924503 0.0031024445
## AST 0.6436547 0.042671162 0.014288840 0.101264471 0.1848528076
## PBAL 0.4251933 0.364163152 0.082832032 0.008265986 0.0205497987
## ROB 0.1544711 0.721781288 0.002830876 0.012338626 0.0214118215
## BLO 0.1938501 0.468781503 0.182765323 0.065195904 0.0355212247
Visualizamos el cos2 de las variables en todas las dimensiones usando el paquete corrplot:
corrplot(var$cos2, is.corr=T)
Tambien podemos colorear las variables del circulo de correlación usando col.var = “cos2”.
Los valores de cos2 se utilizan para estimar la calidad de la representación, Cuanto más cerca está una variable del círculo de correlaciones, mejor se representa en el mapa de factores.
fviz_pca_var(pca_nba, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel =T# Avoid text overLapping
)
Las contribuciones de las variables para explicar un componente principal determinado se expresan en porcentaje, estas variables están correlacionadas con PCl (Dim.1) y PC2 (Dim.2), cuanto mas grandeen porcentaje, mas contribuye la variables al componente.
head(var$contrib, 8)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 19.581655 6.5115382 4.7096566 13.914097 0.008030891
## PG 17.035473 7.1688099 0.1725168 33.903166 2.684715964
## PP 8.157050 0.8549732 53.6749091 10.789513 17.984760207
## PTS 18.003369 0.4551858 13.5673904 10.419030 0.927122491
## AST 16.905819 2.2708529 1.4088606 16.767357 55.240697160
## PBAL 11.167853 19.3798554 8.1671281 1.368681 6.141022253
## ROB 4.057238 38.4114013 0.2791206 2.043028 6.398625812
## BLO 5.091542 24.9473833 18.0204178 10.795129 10.615025222
Con la función corrplot resaltamos las variables que mas contribuyen.
corrplot(var$contrib, is.corr = F)
ind<-get_pca_ind(pca_nba)
head(ind$coord)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 1 1.9766508 0.7726267 -1.9060286 -1.526938417 0.95792573
## 2 2.0186365 1.5561826 0.7001610 -0.994471826 -0.83731406
## 3 0.4761687 1.0466179 -1.3245474 0.356224853 0.08377742
## 4 0.7330846 -0.1867719 0.3281672 -0.275232762 0.74735976
## 5 1.6568413 0.9450743 0.8740965 -0.154725381 0.11056175
## 6 1.5917756 -0.1626146 -0.2309605 -0.005780346 -0.88614748
head(pca_nba$ind$coord)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 1 1.9766508 0.7726267 -1.9060286 -1.526938417 0.95792573
## 2 2.0186365 1.5561826 0.7001610 -0.994471826 -0.83731406
## 3 0.4761687 1.0466179 -1.3245474 0.356224853 0.08377742
## 4 0.7330846 -0.1867719 0.3281672 -0.275232762 0.74735976
## 5 1.6568413 0.9450743 0.8740965 -0.154725381 0.11056175
## 6 1.5917756 -0.1626146 -0.2309605 -0.005780346 -0.88614748
head(ind$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 1 0.33893019 0.051783304 0.31514407 2.022523e-01 0.079600172
## 2 0.45936518 0.273000161 0.05526340 1.114877e-01 0.079034841
## 3 0.05317402 0.256894049 0.41144591 2.975954e-02 0.001646007
## 4 0.35466460 0.023021459 0.07107225 4.999308e-02 0.368611641
## 5 0.54504247 0.177337420 0.15170060 4.753260e-03 0.002427048
## 6 0.73820572 0.007704291 0.01554136 9.734672e-06 0.228784046
head(pca_nba$ind$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 1 0.33893019 0.051783304 0.31514407 2.022523e-01 0.079600172
## 2 0.45936518 0.273000161 0.05526340 1.114877e-01 0.079034841
## 3 0.05317402 0.256894049 0.41144591 2.975954e-02 0.001646007
## 4 0.35466460 0.023021459 0.07107225 4.999308e-02 0.368611641
## 5 0.54504247 0.177337420 0.15170060 4.753260e-03 0.002427048
## 6 0.73820572 0.007704291 0.01554136 9.734672e-06 0.228784046
head(ind$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 1 6.4139157 1.98551870 22.3877212 2.412851e+01 17.1386572
## 2 6.6892832 8.05481631 3.0209732 1.023464e+01 13.0945291
## 3 0.3722075 3.64343370 10.8115036 1.313215e+00 0.1310893
## 4 0.8822091 0.11602665 0.6636537 7.839490e-01 10.4321192
## 5 4.5063526 2.97075231 4.7083623 2.477483e-01 0.2283090
## 6 4.1593647 0.08795358 0.3287201 3.457762e-04 14.6664541
head(pca_nba$ind$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 1 6.4139157 1.98551870 22.3877212 2.412851e+01 17.1386572
## 2 6.6892832 8.05481631 3.0209732 1.023464e+01 13.0945291
## 3 0.3722075 3.64343370 10.8115036 1.313215e+00 0.1310893
## 4 0.8822091 0.11602665 0.6636537 7.839490e-01 10.4321192
## 5 4.5063526 2.97075231 4.7083623 2.477483e-01 0.2283090
## 6 4.1593647 0.08795358 0.3287201 3.457762e-04 14.6664541
ag<-pca_nba$var$cor
ag<-data.frame(ag)
ag
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010
## ROB -0.3930281 0.8495771 -0.05320597 0.11107937 0.146327788
## BLO 0.4402841 0.6846762 -0.42751061 0.25533489 -0.188470753
ag$dim<-rep(0,8)
for(i in 1:8){ag$dim[i] <- which.max(ag[i,-6])}
ag
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 dim
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004 1
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474 1
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593 3
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591 1
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122 1
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010 2
## ROB -0.3930281 0.8495771 -0.05320597 0.11107937 0.146327788 2
## BLO 0.4402841 0.6846762 -0.42751061 0.25533489 -0.188470753 2
ag$variables<-rownames(ag)
ag$cor.max<-rep(0,8)
for(i in 1:8){ag$cor.max[i] <- max(ag[i,-c(6,7)])}
ag
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 dim variables
## PJ 0.8634418 0.3497958 0.21855417 -0.28988367 -0.005184004 1 PJ
## PG 0.8053515 0.3670255 -0.04182925 -0.45249769 0.094783474 1 PG
## PP 0.5572819 0.1267503 0.73781950 0.25526846 -0.245321593 3 PP
## PTS 0.8279140 -0.0924841 -0.37094766 0.25084757 -0.055699591 1 PTS
## AST 0.8022809 -0.2065700 0.11953594 0.31822079 0.429945122 1 AST
## PBAL -0.6520685 0.6034593 0.28780555 0.09091747 0.143352010 2 PBAL
## ROB -0.3930281 0.8495771 -0.05320597 0.11107937 0.146327788 2 ROB
## BLO 0.4402841 0.6846762 -0.42751061 0.25533489 -0.188470753 2 BLO
## cor.max
## PJ 0.8634418
## PG 0.8053515
## PP 0.7378195
## PTS 0.8279140
## AST 0.8022809
## PBAL 0.6034593
## ROB 0.8495771
## BLO 0.6846762
# grafico de barras
ggplot(ag,aes(x=reorder(variables,-dim),y=cor.max, fill=as.factor(dim)))+
geom_bar(stat="identity")+coord_flip()
Usamos la función fviz_pca_ind() para producir el gráfico de individuos
fviz_pca_ind(pca_nba)
Podemos colorearlo tambien, teniendo en cuenta que los individuos similares se agrupan en el grafico:
fviz_pca_ind(pca_nba, col.ind = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel =T #Avoid text overLapping (sLow if many points)
)
fviz_pca_ind(pca_nba, col.ind = "cos2",pointsize = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE# Avoid text overlapping (slow if many points)
)
Para hacer el biplot con individuos y variables usamos el siguiente codigo:
fviz_pca_biplot(pca_nba, repel = TRUE,
col.var = "#2E9FDF", # VariabLes coLor
col.ind = "#696969" # IndividuaLs coLor
)
##Interpretacion
Un individuo que está del mismo lado de una variable dada tiene un valor alto
Un individuo que está en el lado opuesto de una determinada variable tiene un valor bajo