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:
Los eigenvectores y eigenvalores son números y vectores asociados a matrices cuadradas. Dada una matriz A de n×n, su eigenvector v de n× tal que
Av=λv
Ejemplo:
(2231)(32)=(128)=4(32)
en R los puede calcular con la funcion eigen
Ejercicio:
# Escriba su código
vector1 <- c(2,3)
vector2 <- c(2,1)
b <- rbind(vector1, vector2)
b
## [,1] [,2]
## vector1 2 3
## vector2 2 1
eigen(b)
## eigen() decomposition
## $values
## [1] 4 -1
##
## $vectors
## [,1] [,2]
## [1,] 0.8320503 -0.7071068
## [2,] 0.5547002 0.7071068
xi−media(x)sd(x)
Una forma intuitiva de entender el proceso de PCA consiste en interpretar las componentes principales desde un punto de vista geométrico.
Z1=ϕ11X1+ϕ21X2+…+ϕp1Xp
con la condicion
∑j=1pϕ2j1=1
En general
Zm=∑j=1pϕjmXj
loadings de los
componentes principaleszi1=ϕ11xi1+ϕ21xi2+…+ϕp1xip
donde ϕ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
maximizeϕ11,…,ϕp1⎧⎩⎨1n∑i=1n(∑j=1pϕj1xij)2⎫⎭⎬
sujeto a ∑j=1pϕ2j1=1
- La segunda componente principal (Z2) 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 Z1. Esta condición es equivalente a decir que la dirección de Z2 (vector ϕ2) ha de ser perpendicular u ortogonal respecto a Z1 (vector ϕ1).
Asumiendo que las variables se han normalizado para tener media cero, la varianza total presente en el set de datos se define como
∑j=1pVar(Xj)=∑j=1p1n∑i=1nx2ij
la varianza explicada por la componente m es:
1n∑i=1nz2im=1n∑i=1n(∑j=1pϕjmxij)2
La proporción de varianza explicada por la componente m es:
∑ni=1(∑pj=1ϕjmxij)2∑pj=1∑ni=1x2ij
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.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.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.Realice análisis de componentes de componentes principales para la base de películas y usuarios usando los paquetes “FACTO”
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
A = matrix(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), nrow=7, byrow = T)
rownames(A) <- c("Pedro","Adriana", "Teo", "Andres", "Manuel", "Javier", "Maria")
colnames(A) <- c("Matrix", "Alien", "Serenity","Casablanca", "Amelie")
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
Correlación entre variables
library(psych)
corPlot(A)
library("factoextra")
## Cargando paquete requerido: ggplot2
##
## Adjuntando el paquete: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
library("FactoMineR")
peliculas_pca=PCA(A, graph = F)
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"
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 6.332561e-33 1.266512e-31 100.00000
## Dim.5 1.309999e-65 2.619998e-64 100.00000
fviz_eig(peliculas_pca, addlabels=T)
fviz_pca_var(peliculas_pca,repel = T, colvar="cos2", col.var = "contrib", alpha.var = "contrib", gradient.cols=c("#FF0000","#FFFF00","#00FF00"))
Analisis
library("corrplot")
## corrplot 0.95 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:2] #ver coordenadas
## Dim.1 Dim.2
## Matrix 0.9617509 0.2441499
## Alien 0.9051834 0.3632297
## Serenity 0.9617509 0.2441499
## Casablanca -0.8946615 0.4462091
## Amelie -0.8946615 0.4462091
corrplot(get_pca_var(peliculas_pca)$cos2)
image 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 $1$00
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 6.332561e-31 1.309999e-63
# grafica 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
library(dplyr)
##
## Adjuntando el paquete: '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"))
corrplot(get_pca_var(Iris_pca)$cos2)
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)
como mostrar las variables cualitativas, en este caso las competencias
fviz_pca_ind(iris_pca_anal_sup, addEllipses = T, habillage = 5)
fviz_pca_biplot(iris_pca_anal_sup, habillage = 5)
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))