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”

data=c(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)
A=matrix(data, nrow=7, byrow = T)
peliculas=c("Matrix", "Alien", "Serenity","Casablanca", "Amelie")
individuos=c("Pedro","Adriana", "Teo", "Andres", "Manuel", "Javier", "Maria")
colnames(A)=peliculas
rownames(A)=individuos

A
##         Matrix Alien Serenity Casablanca Amelie
## Pedro        1     1        1          0      0
## Adriana      3     3        3          0      0
## Teo          4     4        4          0      0
## Andres       5     5        5          0      0
## Manuel       0     2        0          4      4
## Javier       0     0        0          5      5
## Maria        0     1        0          2      2
  • Correlacion entre las variables
cor(A)
##                Matrix      Alien   Serenity Casablanca     Amelie
## Matrix      1.0000000  0.9318326  1.0000000 -0.7487835 -0.7487835
## Alien       0.9318326  1.0000000  0.9318326 -0.6525827 -0.6525827
## Serenity    1.0000000  0.9318326  1.0000000 -0.7487835 -0.7487835
## Casablanca -0.7487835 -0.6525827 -0.7487835  1.0000000  1.0000000
## Amelie     -0.7487835 -0.6525827 -0.7487835  1.0000000  1.0000000
library(psych)
## Warning: package 'psych' was built under R version 4.3.1
corPlot(A)

library("factoextra")
library("FactoMineR")
peliculas_pca=PCA(A, graph = T)

peliculas_pca
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 7 individuals, described by 5 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 "$call"            "summary statistics"                 
## 12 "$call$centre"     "mean of the variables"              
## 13 "$call$ecart.type" "standard error of the variables"    
## 14 "$call$row.w"      "weights for the individuals"        
## 15 "$call$col.w"      "weights for the variables"
  • "$eig"

    • Representa los autovalores asociados a cada componente principal.
    • Los autovalores indican la cantidad de varianza que cada componente principal representa. Cuanto más grande es un autovalor, más varianza del conjunto original de datos es capturada por ese componente.
  • "$var" Proporciona un resumen de los resultados relacionados con las variables.

  • "$var$coord" Son las coordenadas de las variables en el espacio de los componentes principales. Estas coordenadas ayudan a interpretar la relación entre las variables y cada componente principal.

  • "$var$cor" Representa las correlaciones entre las variables originales y los componentes principales. Una correlación alta indica que la variable está bien representada por ese componente principal.

  • "$var$cos2" Es el cuadrado del coseno de los ángulos entre las variables y los componentes principales. Muestra la calidad de representación de las variables en cada componente principal. Un valor cercano a 1 indica una buena representación.

  • "$var$contrib" Indica cuánto contribuye cada variable a cada componente principal.

  • "$ind" Proporciona un resumen de los resultados relacionados con las observaciones o individuos.

  • "$ind$coord" Son las coordenadas de los individuos en el espacio de los componentes principales.

  • "$ind$cos2" muestra la calidad de representación de los individuos en cada componente principal.

  • "$ind$contrib" Indica cuánto contribuye cada individuo a cada componente principal.

  • "$call" Estadísticas resumidas del PCA.

  • "$call$centre" Es la media de cada variable. El PCA se realiza comúnmente después de centrar (restar la media) los datos.

  • "$call$ecart.type" Representa la desviación estándar o el error estándar de las variables.

  • "$call$row.w" Son los pesos asociados a cada individuo.

  • "$call$col.w" Son los pesos asociados a cada variable.

class(peliculas_pca)
## [1] "PCA"  "list"
peliculas_pca$var$coord
##                 Dim.1     Dim.2       Dim.3         Dim.4         Dim.5
## Matrix      0.9617509 0.2441499  0.12420145  1.035644e-33  0.000000e+00
## Alien       0.9051834 0.3632297 -0.22069699 -4.065142e-49  6.137228e-82
## Serenity    0.9617509 0.2441499  0.12420145 -1.035644e-33 -5.759958e-82
## Casablanca -0.8946615 0.4462091  0.02186887  1.016285e-49 -2.539979e-66
## Amelie     -0.8946615 0.4462091  0.02186887  1.016285e-49  2.539979e-66
get_eigenvalue(peliculas_pca)
##         eigenvalue variance.percent cumulative.variance.percent
## Dim.1 4.270125e+00     8.540250e+01                    85.40250
## Dim.2 6.493593e-01     1.298719e+01                    98.38969
## Dim.3 8.051566e-02     1.610313e+00                   100.00000
## Dim.4 1.464622e-33     2.929243e-32                   100.00000
## Dim.5 3.592073e-66     7.184147e-65                   100.00000
peliculas_pca$eig
##          eigenvalue percentage of variance cumulative percentage of variance
## comp 1 4.270125e+00           8.540250e+01                          85.40250
## comp 2 6.493593e-01           1.298719e+01                          98.38969
## comp 3 8.051566e-02           1.610313e+00                         100.00000
## comp 4 1.464622e-33           2.929243e-32                         100.00000
## comp 5 3.592073e-66           7.184147e-65                         100.00000
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")
## corrplot 0.92 loaded
get_pca_var(peliculas_pca)
## 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"
get_pca_var(peliculas_pca)$coord[,1:3]
##                 Dim.1     Dim.2       Dim.3
## Matrix      0.9617509 0.2441499  0.12420145
## Alien       0.9051834 0.3632297 -0.22069699
## Serenity    0.9617509 0.2441499  0.12420145
## Casablanca -0.8946615 0.4462091  0.02186887
## Amelie     -0.8946615 0.4462091  0.02186887
get_pca_var(peliculas_pca)$contrib[,1:5]
##               Dim.1     Dim.2      Dim.3        Dim.4        Dim.5
## Matrix     21.66131  9.179687 19.1590072 7.323108e-32 0.000000e+00
## Alien      19.18813 20.317849 60.4940241 1.128303e-62 1.048575e-95
## Serenity   21.66131  9.179687 19.1590072 7.323108e-32 9.236201e-96
## Casablanca 18.74463 30.661389  0.5939807 7.051897e-64 1.796037e-64
## Amelie     18.74463 30.661389  0.5939807 7.051897e-64 1.796037e-64
peliculas_pca$var$cos2
##                Dim.1      Dim.2        Dim.3        Dim.4         Dim.5
## Matrix     0.9249648 0.05960915 0.0154260011 1.072558e-66  0.000000e+00
## Alien      0.8193570 0.13193585 0.0487071628 1.652538e-97 3.766557e-163
## Serenity   0.9249648 0.05960915 0.0154260011 1.072558e-66 3.317711e-163
## Casablanca 0.8004192 0.19910259 0.0004782475 1.032836e-98 6.451495e-132
## Amelie     0.8004192 0.19910259 0.0004782475 1.032836e-98 6.451495e-132
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)
##        Dim.1        Dim.2        Dim.3        Dim.4        Dim.5 
## 1.000000e+02 1.000000e+02 1.000000e+02 1.464622e-31 3.592073e-64

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=1:2)

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)
## Warning: package 'GGally' was built under R version 4.3.1
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
ggpairs(A)

PCA base Iris

library(dplyr)
## 
## 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 la 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)
ggpairs(iris[,1:4], mapping = aes(color=iris$Species))