Análisis de componentes principales

El análisis de componentes principales (PCA) es un tipo de aprendizaje automático que utilizamos como un paso de preprocesamiento de datos para ayudar con algunos enfoques diferentes. En muchos casos de análisis de datos, es posible que tengamos características que están altamente correlacionadas entre sí. Si tuviéramos que explotar esos datos con un modelo de aprendizaje automático sin ningún tipo de selección de características de antemano, podríamos obtener algún error adicional en nuestro procedimiento de modelado porque algunas de nuestras características podrían estar altamente correlacionadas.

Por ejemplo, si desea modelar las ventas de un producto en función de la econometría de varios países, es posible que tenga algunos datos que podrían tener características como País, Año, Población, Porcentaje de usuarios de banda ancha, Porcentaje de población urbana, PIB, PIB. Per cápita, índice de pobreza, esperanza de vida, etc. En teoría, algunos de estos valores son muy dependientes entre sí, como el PIB y la Población. En algunos casos, pueden estar correlacionados linealmente. La función del PCA en este caso sería reducir esa correlación entre el PIB y la Población a una sola característica, que sería la relación funcional entre los dos.

Si se tuviera algún tipo de conjunto de datos de ejemplo con 30 o 40 características, pero la mayoría de ellas estuvieran altamente correlacionadas entre sí, podría ejecutar un algoritmo PCA en él y reducir los datos a solo dos características. Esto reduciría considerablemente la complejidad computacional del conjunto de datos.

Con PCA, podría reducir sus datos de algo que se parece a esto

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

a una forma más compacta, como esta:

La utilidad de PCA para la reducción de la dimensionalidad de los datos puede resultar útil para visualizar patrones de datos complejos. Los cerebros humanos son muy adeptos a la visualización y podemos leer muy bien un gráfico bidimensional. El cerebro puede discernir fácilmente las visualizaciones tridimensionales en la vida real, pero son un poco más difíciles de ver en la pantalla de una computadora. que en sí mismo es un plano bidimensional. PCA puede ayudarnos a tomar datos complejos y visualizarlos en un espacio más compacto para facilitar el análisis. La Figura 7-1 muestra un ejemplo de datos que podrían usar un pase de PCA:

pairs(mtcars[, 1:7], lower.panel = NULL)
*Figura 7-1. Una selección de variables del conjunto de datos mtcars; puede utilizar PCA para encontrar correlaciones en los datos y reducir la complejidad del conjunto de datos para su procesamiento futuro.*

Figura 7-1. Una selección de variables del conjunto de datos mtcars; puede utilizar PCA para encontrar correlaciones en los datos y reducir la complejidad del conjunto de datos para su procesamiento futuro.

En el conjunto de datos de mtcars, hay una buena cantidad de características, algunas de las cuales parecen estar correlacionadas entre sí. Una buena práctica general antes de aplicar PCA es echar un vistazo a sus datos y ver si realmente hay valores que parezcan estar correlacionados.

A primera vista de los datos, parece que hay algunos valores bien correlacionados, y muchos de ellos corresponden a la variable de peso del vehículo, wt. Veamos cómo puede reducir algunas de las dependencias de estas variables y generar una imagen más simplificada de los datos.

En R, hay dos funciones que son bastante similares en términos de sintaxis que pueden hacer PCA de forma inmediata: princomp y prcomp. Uno de sus primeros objetivos es visualizar qué parte de la varianza puede explicar un cierto número de componentes principales en sus datos. La función princomp tiene una funcionalidad incorporada simple que se presta mejor para trazar, así que usemos princomp por el momento:

pca <- princomp(mtcars, scores = TRUE, cor = TRUE)

Puede utilizar el argumento score para almacenar algunos datos utilizados para puntuar cada componente, a lo que llegaremos en un segundo. El argumento cor se alinea con el uso de una matriz de correlación para los cálculos en lugar de una matriz de covarianza. Las diferencias son sutiles y dependen un poco de los datos o del tipo de cálculo que desea hacer, pero nos adentraremos demasiado en las malas hierbas estadísticas que avanzan por ese camino, así que use la matriz de correlación por ahora.

Echemos un vistazo a la salida del objeto pca:

summary(pca)
## Importance of components:
##                           Comp.1    Comp.2     Comp.3     Comp.4     Comp.5
## Standard deviation     2.5706809 1.6280258 0.79195787 0.51922773 0.47270615
## Proportion of Variance 0.6007637 0.2409516 0.05701793 0.02450886 0.02031374
## Cumulative Proportion  0.6007637 0.8417153 0.89873322 0.92324208 0.94355581
##                            Comp.6     Comp.7     Comp.8      Comp.9     Comp.10
## Standard deviation     0.45999578 0.36777981 0.35057301 0.277572792 0.228112781
## Proportion of Variance 0.01923601 0.01229654 0.01117286 0.007004241 0.004730495
## Cumulative Proportion  0.96279183 0.97508837 0.98626123 0.993265468 0.997995963
##                            Comp.11
## Standard deviation     0.148473587
## Proportion of Variance 0.002004037
## Cumulative Proportion  1.000000000

Esta tabla muestra la importancia de cada uno de estos misteriosos componentes principales para el conjunto de datos general. La fila que más interesa es la Proporción de varianza, que indica qué cantidad de datos se explica para ese componente principal. Los componentes siempre se ordenan según su importancia, por lo que los componentes más importantes siempre serán los primeros. En el resultado anterior, puede ver que el componente 1 explica el 60% de los datos, con el componente 2 llegando al 24% y luego una fuerte caída para el resto. Si desea representar estos datos gráficamente, siga el ejemplo que se muestra en la Figura 7-2:

plot(pca)
*Figura 7-2. Las variaciones de nuestros diversos componentes; esta es una forma más visual de ver en que medida nuestros componentes principales explican los datos.*

Figura 7-2. Las variaciones de nuestros diversos componentes; esta es una forma más visual de ver en que medida nuestros componentes principales explican los datos.

Este gráfico muestra la importancia de los componentes e indica que el primer componente principal explica una gran parte de los datos. Combinado con el componente 2, esto explica más del 84% del conjunto de datos con solo dos características en lugar de las 11 con las que comenzamos. Pero estos componentes principales suenan algo misteriosos. ¿Qué significa el componente 1 para nosotros como seres humanos o tomadores de decisiones? En PCA, puede mirar las cargas loadings para ver qué cantidad de cada variable está contenida en cada componente que está viendo:

pca$loadings[, 1:5]
##          Comp.1      Comp.2      Comp.3       Comp.4      Comp.5
## mpg   0.3625305  0.01612440  0.22574419  0.022540255  0.10284468
## cyl  -0.3739160  0.04374371  0.17531118  0.002591838  0.05848381
## disp -0.3681852 -0.04932413  0.06148414 -0.256607885  0.39399530
## hp   -0.3300569  0.24878402 -0.14001476  0.067676157  0.54004744
## drat  0.2941514  0.27469408 -0.16118879 -0.854828743  0.07732727
## wt   -0.3461033 -0.14303825 -0.34181851 -0.245899314 -0.07502912
## qsec  0.2004563 -0.46337482 -0.40316904 -0.068076532 -0.16466591
## vs    0.3065113 -0.23164699 -0.42881517  0.214848616  0.59953955
## am    0.2349429  0.42941765  0.20576657  0.030462908  0.08978128
## gear  0.2069162  0.46234863 -0.28977993  0.264690521  0.04832960
## carb -0.2140177  0.41357106 -0.52854459  0.126789179 -0.36131875

Estos valores son las correlaciones entre el componente principal y las características con las que comenzó. Este ejemplo muestra solo los primeros cinco componentes principales para ahorrar espacio, ya que los componentes del 6 al 9 no son realmente tan útiles de todos modos.

Cuanto más cercano esté el número de correlación a 1 o –1 para cada combinación de componente y característica, más importante será esa característica para ese componente. Veamos el componente 1. Este tiene un equilibrio de todas las características iniciales, siendo mpg el valor positivo dominante y cyl el valor negativo dominante. El componente 2 está dominado principalmente por las variables qsec, gear y am, en ese orden. Lo mismo para el resto de componentes.

Entonces, si tuviera que atribuir algún tipo de relación entre los componentes y las características, dirías que:

Si desea ver este tipo de información en un sentido más gráfico, puede trazar las puntuaciones de los componentes principales, como se muestra en la Figura 7-3:

scores.df <- data.frame(pca$scores) #se crea un nuevo data frame con los valores de score
scores.df$car <- row.names(scores.df) # se le estan poniendo los nombres de los carros a las filas.
plot(x = scores.df$Comp.1, y = scores.df$Comp.2, xlab = "Comp1 (mpg,cyl)",
ylab = "Comp2 (qsec, gear, am)")
text(scores.df$Comp.1, scores.df$Comp.2, labels = scores.df$car,
cex = 0.7, pos = 3)
*Figura 7-3. Una gráfica de los datos en función de los dos componentes principales; Los automóviles en esta parcela que están agrupados son muy similares entre sí en función de los componentes utilizados para describirlos.*

Figura 7-3. Una gráfica de los datos en función de los dos componentes principales; Los automóviles en esta parcela que están agrupados son muy similares entre sí en función de los componentes utilizados para describirlos.

Lo que hemos hecho en esta última etapa es mostrar que muchos de los datos se pueden comprimir en dos componentes principales: uno tiene que ver principalmente con las variables mpg y cyl, y el otro es una combinación de las variables qsec, gear y am. En la Figura 7-3, puede ver que algunos autos caen en ciertos extremos del espectro en comparación con otros y pueden estar muy bien relacionados entre sí en función de muchos factores que se comprimen en solo una o dos variables.

Observe que los valores de los ejes aquí también son algo diferentes a los valores de la variable inicial. Esto se debe a que algunos algoritmos de PCA tienen técnicas de escalamiento de características integradas que aseguran que todas las variables estén dentro del mismo rango entre sí por el bien de la comparación; de lo contrario, si tuviera una variable (como el peso del vehículo) que podría ser cientos o miles de veces más grande que otra variable (como el número de cilindros), el análisis podría ser muy engañoso. Con la función princomp, esta función de escalado está integrada, pero otros algoritmos de PCA en R pueden requerir que habilite explícitamente el escalado.

Librerias en R

library(stats)

prcomp() -> Forma rápida de implementar PCA sobre una matriz de datos.

princomp()

library(FactoMineR)

PCA() -> PCA con resultados más detallados. Los valores ausentes se reemplazan por la media de cada columna. Pueden incluirse variables categóricas suplementarias. Estandariza automáticamente los datos.

library(factoextra)

get_pca() -> Extrae la información sobre las observaciones y variables de un análisis PCA.

get_pca_var() -> Extrae la información sobre las variables.

get_pca_ind() -> Extrae la información sobre las observaciones.