ITBA análisis de componentes principales.
pptx
PCA Concepto: reducir el número de variables que consideramos demasiado grandes a un
conjunto de valores menor que representa correctamente las características originales. Esto se
hace cuando tengo variables altamente correlacionadas
Usos: Simplificación, Eliminación de ruidos, Elección de variable, Visualización (2 o 3
dimensiones), Clusterización.
Tipos
● La eliminación de características: consiste en eliminar algunas variables por completo si
son redundantes con alguna otra variable o si no proporcionan información nueva sobre
el conjunto de datos.
● La extracción de características comunes: La formación de nuevas variables a partir de
las antiguas (componentes principales). Juntar la variables similares y formar una sola
variable con toda la información → PCA
Principal Component Analysis (PCA) es un método estadístico que permite simplificar la
complejidad de espacios muestrales con muchas dimensiones y a la vez conservar su
información. PCA permite encontrar un número de factores subyacentes (z<p) que explican
aproximadamente lo mismo que las p variables originales.
→ Busco hacer combinaciones lineales de las variables
Un individuo se caracteriza por p variables, es decir el espacio muestral es de p dimensiones.
PCA encuentra un número de factores z tal que z<p, que logra explicar aproximadamente lo mismo
que las p variable originales. Donde antes se necesitaban p valores para caracterizar a cada individuo,
ahora basta con z. Cada una de estas z variables nuevas se llaman componentes principales
Resultados: conjunto de ponderadores para cada variables del dataset, con algún criterio
decido qué variable me quedo a raíz de su ponderador.
Buscar ponderadores: los dos primeros componentes principales apuntan a darme la mayor
información ya que son ortogonales entre sí, irán en distintas direcciones
(1) Cálculo del primer componente principal:
la combinación lineal de las variables originales que tiene varianza máxima. Si queremos
maximizar la varianza , debemos restringir la maximización, sino el módulo puede crecer
infinito. Poniendo la restricción de que el módulo sea igual a uno, es suficiente para que solo se
maximice la varianza.
(2) Cálculo del segundo componente principal:
maximizar la varianza ortogonalmente a la primera
(3) Resultado final:
voy a tener tantos componentes principales
como dimensiones tenga.
La idea de esto entonces, es quedarnos con el primer componente que explica el 89% de la
variabilidad total y descartar el segundo que sólo explica el 11%.
Archivo: PCA_Europa.R
1. Hacer un segundo dataset con solo variables numéricas
2. Función para hacer componentes principales: prcomp(df, scale=TRUE)
● Esta función genera una lista
● scale sirve para centralizar las variables
● Lo que ocurre es que estamos utilizando variables medidas en escalas diferentes
(área en \(m^2\), GDP en millones, y el resto de variables en porcentajes!). Cuando
ocurre esto, un subconjunto de variables (en este caso GDP y Área) tienden a
'monopolizar' la variabilidad en los datos! Pero esto es debido exclusivamente al
efecto de 'escala' con el que hemos medido los datos. Por ello, en vez de utilizar la
matriz de covarianzas para hacer PCA, se utiliza la matriz de correlación. Scale =
True -> utilizamos la matriz de CORRELACIÓN para obtener las componentes!
3. Otra función para hacer PCA (usar esta): incluye el gráfico del círculo P
CA( df,
scale.unit = TRUE, … )
4. Ver resultados: summary(pca.Europa2)
desvest > 1 se conviene porque explica (proporcionalmente mas de una variable
aislada), desvest < 1 me explica menos que una variable aislada
5. Matriz de rotación: pca.Europa2$rotation. Cuánto contribuye cada variable al
componente principal.
6. Primer componente principal:
>PCATotal<-pca.Europa2$x
>PC1<-PCATotal[,1]
7. ¿Cómo seleccionar la cantidad de componentes principales?
Elegir los que tengan varianza mayor a 1. Se pueden ver a varianzas graficadas con un
línea que marca el 1 en el siguiente gráfico:
>screeplot(pca.Europa2, type = "l", npcs = 5, main = "Screeplot of the first 10 PCs")
>abline(h = 1, col="red", lty=5)
>legend("topright", legend=c("Eigenvalue = 1"), col=c("red"), lty=5, cex=0.6)
8. Ver la varianza total explicada para el número de componentes principales seleccionado
(gráfico):
>cumpro <- cumsum(pca.Europa2$sdev^2 / sum(pca.Europa2$sdev^2))
>plot(cumpro[0:7], xlab = "PC #", ylab = "Amount of explained variance",
main = "Cumulative variance plot")
>abline(v = 3, col="blue", lty=5)
>abline(h = 0.7825, col="blue", lty=5)
9. Ver solo las primeras 2 (concentran el 63%): plot(pca.Europa2$x[,1],pca.Europa2$x[,2],
xlab="PC1 (46.1%)", ylab = "PC2 (16.9%)", main = "PC1 / PC2 - plot")
10. Aplicar a clusters:
library("cluster")
library("factoextra")
hc4 <- diana(Europa2)
hc4$dc # divise coefficient
pltree(hc4, cex = 0.6, hang = -1, main = "Dendrogram of diana")
Gráfico cluster df original Gráfico cluster con PCA
clust <- cutree(hc4, k = 2) clust <- cutree(hc4, k = 2)
fviz_cluster(list(data = Europa2, cluster = clust)) fviz_cluster(list(data = PCATotal, cluster = clust))
Con ruido y superposición Dos grupos más definidos, sin ruido
Agregar al df las columnas del Dim del PCA:
df = cbind(df,pcamae$ind$coord[,1:3]) %>% as_tibble()
MCA.pptx
Análisis de multi correspondencia (MCA): PCA pero para variables categóricas.
Tabla original:
Transformación a una Tabla Completa Disyuntiva (TCD): Ahora se tiene una columna por cada
categoría de las columnas originales (muchas más columnas). Aquí el valor de cada elemento
es 1 si pertenece a tal categoría, 0 si no.
¿Cómo funciona el MCA? Se pondera cada atributo. Se divide cada elemento de la TCD por
la proporción de individuos con esas características, por lo que cuanto más rara es la
característica más distintiva se vuelve poseerla. Se resta 1 para centrar.
Representación:
● 2 individuos que tienen las mismas categorías: 𝑑_(𝑖,𝑖′)^2=0
● 2 individuos que tienen muchas categorías en común tendrán una distancia chica
● 2 individuos que tienen muchas categorías, pero uno tiene una característica rara, una
distancia grande.
● 2 individuos que comparten una categoría rara: distancia pequeña.
● 2 individuos con poca distancia entre sí, tienen simular distancia al origen.
Inercia:
La matriz resultante de Tabla Completa Disyuntiva (TCD) se proyecta sobre una serie de ejes
ortogonales (independientes) mediante Descomposición de Valores Singulares (SVD):
𝑆𝑉𝐷(𝑇𝐶𝐷)=𝑈∗𝛴∗𝑉^𝑇 .
En comparación a PCA, aquí lo que se verifica no es el la varianza, sino la inercia que
funcionan como análogos. Ambas son medidas de variabilidad de los datos.
Las primeras dos dimensiones explican el 23.86% de la variabilidad de los datos.
Análisis e interpretación
Gráfico típico: Tomamos las dos primeras columnas para representarlas en un gráfico y,
adicionalmente, coloreamos según si esa persona participa en, por ejemplo, jardinería
obtenemos este gráfico.
Gráfico para análisis general:
Gráfico para análisis de Dim 1 y Dim 2 en particular: El ratio de correlación, permite interpretar
cada dimensión resultante en términos de la variable original:
Gráfico variabilidad explicada por variables nuevas: Este análisis, realizado para todas las
variables respecto a las dimensiones nuevas 1 y 2 permite evaluar cuánta variabilidad
individual explican las variables nuevas.
mca.R
1. Transforma la tabla original en Tabla Completa Disyuntiva (TCD):
No sé si es necesario, en algunos casos lo hace y en otros no.
2. MCA + gráfico de la variabilidad explicada:
mca.df=MCA(df,graph = T)
Otra forma de hacer MCA con todo el df sin transformar:
mca.res <- MCA(hobbies,quali.sup=19:22,quanti.sup=23)
Arguments
● X: a data frame with n rows (individuals) and p columns (categorical variables)
● quanti.sup: a vector indicating the indexes of the quantitative supplementary variables
● quali.sup: a vector indicating the indexes of the categorical supplementary variables
Gráfico para una sola categoría (“Gardening”):
h3=cbind(hobbies_indicator,mcah$svd$U[,1:2] %>% as_tibble())
ggplot() + geom_point(aes(V1,V2,color=as.factor(Gardening_y)),alpha=0.35,data=h3)
+ labs(color="Gardening")
+ geom_point(aes(mean(h3$V1[h3$Gardening_y==1]),mean(h3$V2[h3$Gardening_y==1])))
+ geom_text(aes(label="Gardening_y",mean(h3$V1[h3$Gardening_y==1]),
mean(h3$V1[h3$Gardening_y==1])))
+ geom_point(aes(mean(h3$V1[h3$Gardening_y==0]),mean(h3$V2[h3$Gardening_y==0])))
+ geom_text(aes(label="Gardening_n",mean(h3$V1[h3$Gardening_y==0]),
mean(h3$V1[h3$Gardening_y==0]))) + geom_hline(yintercept = 0) + geom_vline(xintercept = 0)
Gráfico de % de varianza explicada:
mca.df=MCA(df)
fviz_screeplot(mca.df, addlabels = TRUE, ylim = c(0, 50))
Gráfico para análisis general:
p1=fviz_mca_var(mca.df,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Avoid text overlapping
)
Otro gráfico para cuando tengo 2 opciones:
h3=cbind(vote,mca.res.vote$svd$U[,1:2] %>% as_tibble())
ggplot() + geom_point(aes(V1,V2,color=as.factor(party)),alpha=0.95,data=h3)
+ geom_text(aes(label="Democrat",mean(h3$V1[h3$party=="democrat"]),
mean(h3$V1[h3$party=="democrat"])))
+ geom_text(aes(label="Republican",mean(h3$V1[h3$party!="democrat"]),
mean(h3$V2[h3$party!="democrat"])))
+ geom_hline(yintercept = 0)+geom_vline(xintercept = 0)
Más gráficos
plot(mca.res,invis=c("ind","quali.sup"),col.var=c(rep(c("black","red"),17),"black",rep("red",4)),
title="Graph of the active categories")
plot(mca.res,invisible=c("ind","var"),hab="quali",
palette=palette(c("blue","maroon","darkgreen","black","red")),
title="Graph of the supplementary categories")
plot(mca.res,choix="var",title="Graph of the variables")
plot(mca.res,choix="quanti.sup",title="Graph of the continuous variables")
PCA + Clusters
Archivo mio: Ejercicios 14 Octubre.R
Eliminar NA (mejor función): drop_na()
Linea para elegir componentes principales:
pca$svd$vs %>% enframe() %>% ggplot(aes(name,value)) + geom_line() +
geom_hline(yintercept = 1)
- Nro PCA: Elijo el mayor número entero por encima de la recta y=1
Gráfico pca variables escaladas
y sin escalar:
- Escaladas (negro)
wss= c()
for(i in 1:15) {
kbd = kmeans(x = scale(df),centers = i,nstart = 25)
wss = c(wss,kbd$tot.withinss)
}
- Sin escalar (rojo)
wss_pca = c()
for(i in 1:15) {
kbd_pca = kmeans(x = df_pca,centers = i,nstart = 25)
wss_pca = c(wss_pca,kbd_pca$tot.withinss)
}
wss_df <- wss %>% enframe()
colnames(wss_df)[2] = "wss"
wss_pca_df <- wss_pca %>% enframe()
colnames(wss_pca_df)[2] = "wss_pca"
- Gráfico
left_join(wss_df, wss_pca_df) %>% ggplot() + geom_point(aes(name,wss)) +
geom_line(aes(name,wss)) + geom_point(aes(name,wss_pca), col = "red") +
geom_line(aes(name,wss_pca), col = "red")
Interpretación: En este caso los resultados son bastante similares. Ambos parecería que
concluyen en 4 clusters, pero puede pasar que la escalada (negra) de un número de cluster
más acertado si en gráficos de orden de magnitud dió como el segundo ejemplo.
Si grafico de orden de magnitud dió así: ¿Qué línea usar?
usar línea roja, pca sin escalar
usar línea negra, pca escalado
PCA datos escalados
Gráfico dimensiones:
→ esto tiene más o menos el mismo orden de magnitud
→ cuando el gráfico se ve así, se nota que estas variables no tiene el mismo orden de
magnitud
Otra forma de hacer los gráficos anteriores:
df_pca = pca$ind$coord[,1:3] %>% as_tibble
df_pca %>% ggplot() + geom_density(aes(Dim.1), fill = "blue", alpha = 0.2)
+ geom_density(aes(Dim.2), fill = "yellow", alpha = 0.2)
+ geom_density(aes(Dim.3), fill = "red", alpha = 0.2)
→ antes de hacer este gráfico hay que hacer el pca y guardarlo en una variables llamada pca
Análisis con k medias escaladas vs PCA sin escalar:
A veces conviene PCA sin escalar porque no es tan sensible a los valores extremos
como k medias
Procedimiento:
● PCA con 2 dimensiones: pca <- PCA( df, scale=FALSE)
● Agrego Dim 1 y Dim 2 al df: df = cbind(df,pca$ind$coord[,1:2]) %>% as_tibble()
● k medias con base original (sin escalar): kmeans = kmeans(x =df ,centers = 4, nstart = 25)
● Agrego clusters al df que tiene PCA: df["c"] = as.factor(kmeans$cluster)
● Gráfico: df %>% ggplot(aes(Dim.1, Dim.2)) + geom_point(aes(col= as.factor(c)))
Atajo flechita de asignación <- : alt + -
Análisis Factorial.pptx
PCA vs Análisis Factorial
● PCA parte de la base de que hay algún componente no observado que es causado por
una combinación lineal de las variables originales. Lo observado “causa” lo
no-observado.
● El Análisis Factorial revierte esta relación y lo que se propone es encontrar factores
latentes (no observados) que afecten a una o más variables observables. Tengo las
variables observadas que dependen de una serie de factores comunes que yo no
observo.
○ El ejemplo clásico es la “Ansiedad” que causa que los individuos respondan un
cuestionario de una forma determinada, es decir el factor “causa” la respuesta.
Es decir lo no-observado “causa” lo observado. Encontrar estos factores
comunes es el propósito de análisis factorial
● PCA busca explicar la variabilidad conjunta de los datos, análisis factorial busca explicar
la covarianza de los datos, no la variabilidad total, sino extraer factores que expliquen la
variabilidad de combinaciones de datos.
● v(1), v(2),…v(m) indica los factor loading, es decir, la importancia del factor
F(1),F(2),…,F(m) en la variable p. Entre v y F se explica la variabilidad común de los
datos, que no es toda la varianza.
El análisis factorial supone que:
1. Los factores comunes están estandarizados, es decir, µ= 0 y S^2 =1
2. Los factores específicos están estandarizados, es decir, E[e(p)] = 0 y Var[e(p)] =1 y son
independientes los unos de los otros Covar[e(pk), e(pj)] = 0 si j!=k
3. Que los factores comunes no están correlacionados a los factores específicos
Covar[F(m), e(p)] = 0
4. Finalmente, los factores comunes pueden estar o no correlacionados entre sí: Si son
independientes, es decir Covar[F(mk), F(mj)] = 0, estamos ante un modelo de factores
ortogonales.
○ Si no son independientes, es decir Covar[F(mk), F(mj)] != 0, estamos ante un
modelo de factores rotado.
○ Las rotaciones pueden ser:
■ Si son independientes, es decir Covar[F(mk), F(mj)] = 0, estamos ante
un modelo de factores ortogonales.
■ Si no son independientes, es decir Covar[F(mk), F(mj)] != 0, estamos
ante un modelo de factores rotado.
Los Métodos de rotación pueden ser:
● Varimax
● Quartimax
● Equamax
● Oblimin
● Promax
Las rotaciones pueden ser:
● Ortogonales: Preservan la independencia de los factores.
● Oblicuas: Introducen correlaciones entre los factores obtenidos
Metodología de Análisis:
1. Formulación del problema (¿Qué tipo de análisis o factor tengo en mente que pueden
surgir de estos datos?)
2. Análisis de la matriz de correlaciones
3. Selección de número de factores:
La función nScree permite recomendar, dada una matriz de correlaciones, el número de
factores usando distintos criterios:
● noc: Optimal Coordinates: Toma la derivada previa y posterior de cada punto.
● naf: Acceleration Factor, toma la derivada en cada punto, y reporta la posición en
la cual el cambio de pendiente es mayor.
● nparallel : Análisis Paralelo Compara, si los datos fueran aleatorios, si existen
diferencias significativas.
● nkaiser: Criterio de Kaiser, selecciona aquellos autovalores mayores que 1.
4. Extracción de factores
5. Rotación de factores:
Una rotación que preserva la ortogonalidad, pero
que cambia las cargas de cada factor a cada
variable es llamada “Varimax”, la cual busca otra
matriz ortogonal que minimiza la carga de unas
variables en un factor y que las maximice en el
otro y viceversa
Completar F: falta completar con F, que es el
valor que los factores subyacentes toman para
dar como resultado las observaciones
efectivamente registradas.
6. Interpretación:
Factor-Scores Interpretabilidad de los factores: Las cargas factoriales permiten interpretar
los factores en términos de las variables originales, más allá de las relaciones con las
variables opcionales. Igualmente, dado que cada factor-score va a estar asociado a cada
observación es posible, por ejemplo, en el caso de las marcas, buscar el promedio de
cada marca para cada factor.
Por ejemplo, las marcas de mejor calidad son B y C.
factorAnalysis.R
Librerías:
library(nFactors)
library(GPArotation)
library(tidyverse)
library(ggcorrplot)
library(RColorBrewer)
library(gplots)
library(semPlot)
Matriz de correlaciones: matrizCorr = cor(df)
Calcular autovectores y autovalores: eigens <- eigen(matrizCorr)
● Ver autovalores: eigens$values
● Ver autovectores: eigens$vectors
Visualización de Correlación: ggcorrplot(matrizCorr)
Elegir cantidad de factores:
a. Autovalores: (eigens$values/sum(eigens$values)) %>% enframe() %>%
ggplot(aes(name,value))+ geom_col()
b. Scree test:
eigendf = enframe(eigens$values)
eigendf$random = eigens$values
nS = nScree(matrizCorr)
nS$Components
plotnScree(nS)
c. guardo la cantidad: nfactors=2 (se suele preferir un número chico)
Función para hacer análisis factorial: factanal(df, factors=, rotacion=, scores=)
Hacer Codigo para ver el “peso” de cada factor:
f <- factanal(brand.sc[, 1:9], factors=2)
f$loadings
Gráfico para ver las cargas factoriales de cada factor:
f2 = factanal(df, factors=nfactors, rotation = 'varimax',scores="Bartlett")
f2$scores[1,1]
semPaths(f2, what="est", residuals=FALSE, cut=0.1, posCol=c("white", "darkgreen"),
negCol=c("white", "red"), edge.label.cex=0.75, nCharNodes=7)
Los valores de este gráfico coinciden con los loadings del código anterior
Gráfico para ver diferencia de rotaciones:
f2oblimin$scores %>% as_tibble() %>% ggplot(aes(Factor1,Factor2))+geom_point()
f2$scores %>% as_tibble() %>% ggplot(aes(Factor1,Factor2))+geom_point()
Guardar la mejor rotación: brand.scores = f2$scores %>% as_tibble()
Gráfico para ver las marcas:
brand.scores = f2$scores %>% as_tibble()
brand.scores["brand"] = brand.ratings[,10]
brand.fa.mean <- aggregate(. ~brand, data=brand.scores, mean)
names(brand.fa.mean)=c("brand","precio","calidad")
rownames(brand.fa.mean)=brand.fa.mean[, 1]
brand.fa.mean %>%
ggplot(aes(precio,calidad,col=brand))+geom_point(size=3)+geom_label(aes(x=precio,y=calidad
,label=brand))
Heat map factores:
brand.fa.mean <- brand.fa.mean[, -1]
heatmap.2(as.matrix(brand.fa.mean),
col=brewer.pal(9, "GnBu"), trace="none", key=FALSE, dend="none",
cexCol=1.2, main="\n\n\n\n\n\nMean factor score by brand")
¿Qué método elegir?
● Si no necesito que sean obligatoriamente independientes las variables uso oblimin
● Si lo necesito, uso varimax
Oblimin: Cuando sabes que las variables son independientes, ejemplo los del depto con los
amenities del edificio
Como que uno no depende o varía con el otro
Y varimax cuando queres eliminar la colinealidad de variables
O al revez, no se, ver que pinta en el momento
PCA vs Análisis factorial
PCA: quiero crear una variable que explique todos mis datos.
Análisis factorial: tengo mis datos y quiero saber cual es el factor latente que está afectando
mis datos. Este factor latente puede ser una sola variable o distintas combinaciones entre ellas.
Una es como explican mis factores una variable (PCA) y la otra como se ven afectadas mis
variables por un factor (Análisis factorial)
Net Promoter Score
Archivo: Presentacion_trab.pptx
Net Promoter Score (NPS)
¿Qué es? NPS, esta probabilidad se mide en una escala del 0 al 10, donde 10 significa que el
cliente recomendaría la marca o la compañía con total seguridad.
¿Cómo se calcula?
Gráfico biplot
Una biplot de un intento inicial en PCA
para las calificaciones de las marcas de los
consumidores.
Vemos agrupaciones de adjetivos en el
flechas de carga variable en rojo y ganancia
algo de información sobre las áreas donde
las calificaciones Clúster (como áreas
densas de observación puntos).
Gráfico con media de las marcas
a, b, c, d, e, f, g, h, i, j
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Las marcas f y g son altas en "valor", por
ejemplo, mientras que a y j son
relativamente altas en "diversión", que es
opuesta en dirección a los adjetivos de
liderazgo ("líder" y "serio").
Archivo: ejemplo4.Rmd
Procedimiento:
1. Importar el dataset
2. Normalizar los datos (excepto la columna de brand): brand.sc[, 1:9] <-
scale(brand.ratings[, 1:9])
3. Corrplot:
library(corrplot)
corrplot(cor(brand.sc[, 1:9]), order="hclust")
4. Calcular la media de todas las variables agrupadas por marca: brand.mean <- brand.sc
%>% group_by(brand) %>% summarise(Mperform=mean(perform),
Mleader=mean(leader), Mlatest=mean(latest), Mfun=mean(fun),
Mserious=mean(serious), Mbargain=mean(bargain), MValue=mean(value),
Mtrendy=mean(trendy), Mrebuy=mean(rebuy))
Esto lo guardo en una variable, lo voy a usar más adelante
5. Hacer PCA con el dataset original:
library(gplots)
library(RColorBrewer)
brand.pc <- prcomp(brand.sc[, 1:9])
6. Elijo cantidad de PC:
plot(brand.pc, type="l")
abline(h =1, col = "red")
Varianza > 1, elijo 3
7. Biplot: biplot(brand.pc)
Lo que tengo que poner como argumento no es el df original sino la variable donde
guardé el PCA
8. Hago PCA con la base que tiene todos los promedios agrupados por marca:
brand.mu.pc <- prcomp(brand.mean[,2:10], scale=TRUE)
9. Biplot: biplot(brand.mu.pc, main="Brand positioning", cex=c(1.5, 1))