El análisis de componentes principales es un método estadístico que sirve para reducir la dimensionalidad de los datos, en especial es útil cuando la base de datos tiene una dimensión n grande (es decir, cuando hay muchas variables) de tal manera que se pueden encontrar un número de factores m < n que expliquen aproximadamente lo mismo que las n variables originales.
En el método de ACP, cada una de las componentes principales corresponde a un eigenvector, y el orden del mismo es establecido en orden decreciente según el eigenvalor asignado. Es decir, la primer componente será aquel eigenvector cuyo eigenvalor asociado sea el más alto y que a la vez sea el que aporte mayor varianza.
Por otro lado, los loadings son los pesos que tiene cada variable en cada componente principal y es de esta manera que se puede conocer el tipo de información que contiene cada una de las componentes; de tal manera que se tiene lo siguiente:
\(v_{11}\) es el loading de la variable X1 de la primera componente principal. \(v_{n1}\) es el loading de la variable Xn de la primera componente principal.
Ahora, implementaré la siguiente función que realizará el análisis de los componentes dada una base de datos. Es importante mencionar que el objeto que recibe la función es una base de datos; de preferencia un data frame.
PCA.analisis <- function(data){
pca= prcomp(data, scale=TRUE)
summary(pca)
pca$rotation[,1:2] #los valores de los primeros 2 eigenvectores
varianzas =pca$sdev ^2 #el valor de la varianza explicada (eigenvalores) en cada componente
par(mfrow=c(1,2))
plot(varianzas , xlab=" Componentes Principales ", ylab="Varianza Explicada ",type='b') #grafica de codo
plot(varianzas/10 , mainlab="Representación gráfica de los eigenvalores para cada componente",xlab=" Componente Principal ", ylab=" Proporcion de Varianza Explicada ",ylim=c(0,1) ,type='b')
n=dim(pca$x)[2]
par(mfrow=c(1,2))
plot(pca$x[,1:2], col=c("red", "blue"),pch=19) #componentes que explican mayor varianza
plot(pca$x[,(n-1):n], col=c("red", "green"),pch=19) #componentes que destacan datos atípicos
which(pca$x[,(n-1)]==max(pca$x[,(n-1)]))
which(pca$x[,n]==min(pca$x[,n]))
par(mfrow=c(1,1))
biplot(pca, scale=1, cex=.8) #escalada
library(DataExplorer)
par(mfrow=c(2,1))
plot_prcomp(data) #Visualizacion de la importancia relativa de cada uno de los PCA
z=max(which(pca$sdev^2>1))
print(paste("La cantidad de componentes que se van a considerar son ",z, "ya que son aquellos asociados a eigenvalores mayores a 1"))
library(ggplot2)
library(ggfortify)
library(dplyr)
autoplot(pca$rotation[,1:4]%>% abs) #para graficar los pesos
}
library(ElemStatLearn)
X=SAheart; attach(SAheart)
X=X[,-c(5)] #quito la variable que es un factor para que no genere respuestas incongruentes
PCA.analisis(X)
## [1] "La cantidad de componentes que se van a considerar son 4 ya que son aquellos asociados a eigenvalores mayores a 1"
Yo decidí implementar la función creada anteriormente con la base ‘SAheart’ que es una muestra de aquellos hombres con alto riesgo de contraer alguna enfermedad cardiaca en Western Cape, South Africa. La muestra contiene 462 observaciones con 10 variables; de las cuales una es de tipo categórica y es por ello que la eliminé de mi base de datos para evitar generar incongruencias en el análisis.
Primero aplico la función ‘prcomp’; la cual arroja los siguientes 5 outputs sobre los componentes: “sdev^2” <- eigenvalores “rotation” <- Es una matriz que proporciona los pesos, cuyas columnas son los eigenvectores “center” y “scale” <- medias y desviaciones estándar de las variables que se escalaron “x” <- componentes principales
Al pedir ‘summary(pca)’ se muestra la proporción de la varianza explicada por cada componente y la proporción acumulada, la cual es graficada porteriormente. Se observa que la primera componente principal explica alrededor del 33% de la varianza total de los datos y se puede destacar que a partir de la quinta componente los valores propios asociados ya no son mayores a 1. Es decir, que solo nos interesan las primeras cuatro componentes para realizar el análisis y la reducción de dimensionalidad de los datos de una manera eficiente.
Luego imprimo los primeros dos eigenvectores asociados a las primeras dos componentes solo para ilustrar la composición de los datos.
Consideré importante identificar la ubicación de los outliers para poder realizar los cambios que el usuario crea pertinentes debido a que los outliers en ocasiones conviene quitarlos. De esta manera, grafiqué las dos primeras componentes principales y las dos últimas también (esto para identificar los outliers en la muestra) y poder visualizar que tipo de relación hay entre las mismas. La función, además, indica en que posiciones de las dos últimas componentes se encuentran los dos valores más destacados como outliers para poder eliminarlos posteriormente si asi se desea. En el caso de la implementación de la base ‘SAheart’ se obtiene que la observación 45 del componente principal 7 y la observación 462 del componente principal 8 son son los outliers mas destacados.
Luego, grafiqué el biplot de los primeros dos componentes para visualizar las correlaciones y por último muestro otra gráfica para representar el porsentaje de varianza explicada por los componentes principales