Análisis de Componentes Principales (ACP)

Principal Component Analysis (PCA): método estadístico que permite simplificar la complejidad de espacios muestrales con muchas dimensiones a la vez que conserva su información.

El análisis en componentes principales (ACP) se utiliza para describir tablas que tienen en las filas las unidades estadísticas, generalmente denominadas, “individuos”, y en las columnas las variables de tipo continuo que se han medido sobre los individuos.

Los objetivos del ACP son:

Eingenvectores y eigenvalores

Los eigenvectores y eigenvalores son números y vectores asociados a matrices cuadradas. Dada una matriz \(A\) de \(n\times n\), su eigenvector \(v\) de \(n\times\) tal que

\[Av =\lambda v\]

Ejemplo:

\[\begin{pmatrix} 2 & 3 \\ 2 & 1 \end{pmatrix} \begin{pmatrix} 3 \\ 2 \end{pmatrix} = \begin{pmatrix} 12 \\ 8 \end{pmatrix} = 4 \begin{pmatrix} 3 \\ 2 \end{pmatrix}\]

en R los puede calcular con la funcion eigen

Ejercicio:

#Escriba su código
# Escriba su código

Propiedades de los eigenvectores

  • Solo las matrices cuadradas tienen eigenvectores, pero no todas las matrices cuadradas los tienen.

  • Dada una matriz \(n\times n\) con eigenvectores, el número existente de ellos es \(n\).

  • Todos los eigenvectores de una matriz son perpendiculares. Esto significa que podemos expresar los datos respecto a estos eigenvectores.

  • Un eigenvalor > 1 indica que la componente principal explica más varianza de lo que lo hace una de las variables originales, estando los datos estandarizados.

ESTANDARIZACIÓN DE LAS VARIABLES

  • El cálculo de los componentes principales depende de las unidades de medida empleadas en las variables.

  • Es importante, antes de aplicar el PCA, estandarizar las variables para que tengan media 0 y desviación estándar 1

\[\frac{x_i−media(x)}{sd(x)}\]

Interpretación geométrica de las componentes principales

Una forma intuitiva de entender el proceso de PCA consiste en interpretar las componentes principales desde un punto de vista geométrico.

Cálculo de las componentes principales

  • Cada componente principal (\(Z_i\)) se obtiene por combinación lineal de las variables originales.

  • La primera componente principal de un grupo de variables \((X_1, X_2, …, X_p)\) es la combinación lineal normalizada de dichas variables que tiene mayor varianza:

\[Z_1=\phi_{11} X_1 + \phi_{21}X_2+ ... + \phi_{p1}X_p\] con la condición

\[\displaystyle\sum_{j=1}^p \phi^{2}_{j1}= 1\] En general \[ Z_{m}=\sum_{j=1}^{p} \phi_{j m} X_{j} \]

  • \(\phi_{1m},\phi_{2m},...,\phi_{pm}\) son las cargas o loadings de los componentes principales

  • La primera componente principal (\(Z_1\)) es aquella cuya dirección refleja o contiene la mayor variabilidad en los datos.

  • Este vector define la línea lo más próxima posible a los datos y que minimiza la suma de las distancias perpendiculares entre cada dato y la línea representada por la componente (usando como medida de cercanía el promedio de la distancia euclídea al cuadrado):

\[ z_{i1}=\phi_{11} x_{i 1}+\phi_{21} x_{i 2}+\ldots+\phi_{p 1} x_{i p} \] donde \(\phi_{11}\) corresponde al primer loading de la primera componente principal.

En otras palabras, el vector de loadings de la primera componente principal resuelve el problema de optimización

\[ \underset{\phi_{11}, \ldots, \phi_{p 1}}{\operatorname{maximize}}\left\{\frac{1}{n} \sum_{i=1}^{n}\left(\sum_{j=1}^{p} \phi_{j 1} x_{i j}\right)^{2}\right\} \] \[ \text { sujeto a } \sum_{j=1}^{p} \phi_{j 1}^{2}=1 \] - La segunda componente principal (\(Z_2\)) será una combinación lineal de las variables, que recoja la segunda dirección con mayor varianza de los datos, pero que no esté correlacionada con \(Z_1\). Esta condición es equivalente a decir que la dirección de \(Z_2\) (vector \(\phi_{2}\)) ha de ser perpendicular u ortogonal respecto a \(Z_1\) (vector \(\phi_1\)).

Proporción de la varianza explicada

  • ¿Cuánta información presente en el set de datos original se pierde al proyectar las observaciones en un espacio de menor dimensión?

  • ¿Cuanta información es capaz de capturar cada una de las componentes principales obtenidas?

Asumiendo que las variables se han normalizado para tener media cero, la varianza total presente en el set de datos se define como

\[\displaystyle\sum_{j=1}^p Var(X_j) = \displaystyle\sum_{j=1}^p \frac{1}{n} \displaystyle\sum_{i=1}^n x^{2}_{ij} \]

la varianza explicada por la componente \(m\) es:

\[\frac{1}{n} \sum_{i=1}^n z^{2}_{im} = \frac{1}{n} \sum_{i=1}^n \left( \sum_{j=1}^p \phi_{jm}x_{ij} \right)^2\] La proporción de varianza explicada por la componente \(m\) es:

\[\frac{\sum_{i=1}^n \left( \sum_{j=1}^p \phi_{jm}x_{ij} \right)^2} {\sum_{j=1}^p \sum_{i=1}^n x^{2}_{ij}}\]

Algunos comandos 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.

Visualizaciones:

  • library(FactoMineR)

    • fviz_pca_ind() -> Representación de observaciones sobre componentes principales.

    • fviz_pca_var() -> Representación de variables sobre componentes principales.

    • fviz_screeplot() -> Representación (gráfico barras) de eigenvalores.

    • fviz_contrib() -> Representa la contribución de filas/columnas de los resultados de un pca.

Matrix Alien Serenity Casablanca Amelie
1 1 1 0 0
3 3 3 0 0
4 4 4 0 0
5 5 5 0 0
0 2 0 4 4
0 0 0 5 5
0 1 0 2 2

Realice análisis de componentes de componentes principales para la base de películas y usuarios usando los paquetes “FACTO”

  • Ejercicio:

Defina una matriz llamela \(A\), los nombres de las columnas “Matrix”, “Alien”, “Serenity”,“Casablanca”, “Amelie” nombres de los individuos “Pedro”,“Adriana”, “Teo”, “Andres”, “Manuel”, “Javier”, “Maria”

# Escriba su código
  • Correlacion entre las variables
#cor(A)
library(psych)
## Warning: package 'psych' was built under R version 4.2.3
#corPlot(A)
library("factoextra")
## Warning: package 'factoextra' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
library("FactoMineR")
## Warning: package 'FactoMineR' was built under R version 4.2.3
#peliculas_pca=PCA(A, graph = F)
#peliculas_pca
#class(peliculas_pca)
#peliculas_pca$var$coord
#peliculas_pca
#get_eigenvalue(peliculas_pca)
#peliculas_pca$eig
#fviz_eig(peliculas_pca, addlabels=T)
  • Se puede observar tanto en la tabla como en el anterior gráfico que las componentes \(1\) y 2 son las más significativas ya que capturan el 98% de las varianzas de las variables.
#fviz_pca_var(peliculas_pca,repel = T, colvar="cos2", col.var = "contrib", alpha.var = "contrib", gradient.cols=c("#FF0000","#FFFF00","#00FF00"))

Analisis

  • Podemos visualizar que las variables están bien representadas sobre la dimensión \(1\), ya que su magnitud es considerablemente grande.

  • Se visualiza que las películas Alien, Matrix y Serenity son películas que tienen bastante ciencia ficción y están bien representadas sobre la dimensión \(1\) (Ciencia ficción) mientras que Amelie y Casablanca carecen de esta pues están en el sentido opuesto y las usaremos para representar la dimensión 2 (Películas de romance).

  • Por otro lado podemos observar que todas las películas tienen de alguna forma algo de romance.

  • Las cantidades numéricas que corroboran estas afirmaciones se pueden ver en las siguientes gráficos y tablas donde se muestran las coordenadas y las contribuciones.

library("corrplot")
## Warning: package 'corrplot' was built under R version 4.2.3
## corrplot 0.92 loaded
#get_pca_var(peliculas_pca)
#get_pca_var(peliculas_pca)$coord[,1:3]
#get_pca_var(peliculas_pca)$contrib[,1:5]
#corrplot(get_pca_var(peliculas_pca)$cos2)

Contribuciónn de cada variable a las componentes principales (cada película) en cada concepto(en cada componente principal)

Prueba que cada variable aporta un porcentaje en cada componente. La suma es $100

#colSums(get_pca_var(peliculas_pca)$contrib)

gráfica para mirar la contibucion de las variables al pca

#fviz_contrib(peliculas_pca, choice = "var", axes=1)
#fviz_contrib(peliculas_pca, choice = "var", axes=2)
#fviz_contrib(peliculas_pca, choice = "var", axes=3)
#fviz_pca_biplot(peliculas_pca)

A partir del anterior gráfico se puede decir

  • Andres y Teo les gusta las pel?culas de ciencia ficción.
  • Javier y Manuel les gusta las películas que contienen poca ciencia ficción porque están al lado opuesto en la dimensión \(1\).
  • Pedro es neutral respecto a las películas de ciencia ficción y no es afínn con las películas de romance.
#A=as.data.frame(A)
#library(GGally)
#ggpairs(A)

PCA base Iris

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data("iris")

iris %>%  head(200) %>%
  select(1:5) %>%
  DT::datatable()

Elegimos las variables cuantitativas

Iris=iris[,1:4]
library(psych)

corPlot(Iris, cex = 1.2, main = "Matriz de correlación")

Iris_pca=PCA(Iris, graph = F)
get_eigenvalue(Iris_pca)
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1 2.91849782       72.9624454                    72.96245
## Dim.2 0.91403047       22.8507618                    95.81321
## Dim.3 0.14675688        3.6689219                    99.48213
## Dim.4 0.02071484        0.5178709                   100.00000
fviz_eig(Iris_pca, addlabels=T)

fviz_pca_var(Iris_pca,repel = T, colvar="cos2", col.var = "contrib", alpha.var = "contrib", gradient.cols=c("#FF0000","#FFFF00","#00FF00"))

library(corrplot)
corrplot(get_pca_var(Iris_pca)$cos2)

Analisis de variables cualitativas

no se toman en cuanta para pca es para un análisis posterior

iris_pca_anal_sup=PCA(iris, quali.sup = 5, graph = F)
iris_pca_anal_sup$var$coord
##                   Dim.1      Dim.2       Dim.3       Dim.4
## Sepal.Length  0.8901688 0.36082989 -0.27565767 -0.03760602
## Sepal.Width  -0.4601427 0.88271627  0.09361987  0.01777631
## Petal.Length  0.9915552 0.02341519  0.05444699  0.11534978
## Petal.Width   0.9649790 0.06399985  0.24298265 -0.07535950
iris_pca_anal_sup$quali.sup
## $coord
##                Dim.1      Dim.2       Dim.3       Dim.4
## setosa     -2.224753  0.2889275 -0.04283910 -0.01834076
## versicolor  0.496448 -0.5501705 -0.09612951  0.03034009
## virginica   1.728305  0.2612430  0.13896861 -0.01199933
## 
## $cos2
##                Dim.1      Dim.2        Dim.3        Dim.4
## setosa     0.9829895 0.01657917 0.0003644734 6.680665e-05
## versicolor 0.4406515 0.54118069 0.0165219448 1.645816e-03
## virginica  0.9714759 0.02219630 0.0062809398 4.682797e-05
## 
## $v.test
##                 Dim.1     Dim.2      Dim.3      Dim.4
## setosa     -11.240362  2.608475 -0.9652043 -1.0999036
## versicolor   2.508258 -4.967011 -2.1658862  1.8195091
## virginica    8.732103  2.358536  3.1310905 -0.7196055
## 
## $dist
##     setosa versicolor  virginica 
##  2.2439201  0.7478701  1.7534945 
## 
## $eta2
##             Dim.1     Dim.2      Dim.3      Dim.4
## Species 0.9346162 0.1657182 0.06902197 0.02254243

Visualizar todas las variables en un solo gráfico

fviz_pca_var(iris_pca_anal_sup)

fviz_pca_var(iris_pca_anal_sup, axes=c(1,3), geom = c("arrow", "text") )

como mostrar las variables cualitativas, en este caso las competencias

fviz_pca_ind(iris_pca_anal_sup, addEllipses = T, habillage = 5)

library(ggplot2)
ggplot(data=iris, aes(x=Species, y=Petal.Width, fill=Species))+
  geom_boxplot()

fviz_pca_biplot(iris_pca_anal_sup,  habillage = 5)

  • En los dos anteriores gr?ficos observamos que hay una gran diferencia entre las flores iris de la especie setosa y las de las especies versicolor y virginica esta diferencia se da en la dimensión \(1\) que representa el ancho y la longitud del petalo y ls longitud del sepalo.

A continuación se puede visualizar las correlaciones graficamente de cada una de las variables.

pairs(iris[1:4], main = "Anderson's Iris Data -- 3 species",
      pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])

library(ggplot2)
library(GGally)
## Warning: package 'GGally' was built under R version 4.2.3
ggpairs(iris[,1:4], mapping = aes(color=iris$Species))