Análisis de Componentes Principales y Análisis Factorial

En una investigación de fenómenos sociales complejos trabajamos con un número importante de variables e indicadores que buscan representar una serie de fenómenos sociales a través de datos cuantitativos. En situaciones nos encontramos con varios indicadores que están correlacionados entre sí.

Un desafío para el análisis es cómo resumir la interrelación que existe entre varios indicadores del mismo fenómeno social. Para ello se utilizan técnicas de reducción de dimensiones como el análisis de componentes principales o el análisis factorial exploratorio.

En esta lección utilizaremos como referencia el texto:

Kabacoff, Robert I. 2011. R in Action: Data Analysis and Graphics with R. Shelter Island, NY: Manning.

Análisis de Componentes Principales (ACP)

El ACP es una técnica de reducción de datos que transforma un número importante de variables correlacionadas en un conjunto más reducido de variables no correlacionadas que se llaman componentes principales (Kabacoff 2011: 331). Por ejemplo, podemos tener un conjunto de 11 ítems que buscan medir actitudes machistas y/u homofóbicas en una encuesta, que podríamos reducir en un número más pequeño de componentes principales - por ejemplo 2 - que reflejan diferentes dimensiones del machismo y la homofobia, pero que a su vez retienen la mayor cantidad posible de información de las variables o indicadores iniciales.

Análisis Factorial Exploratorio (AFE)

De acuerdo con Kabacoff (2011: 332), el AFE es un conjunto de métodos diseñados para descubrir la estructura latente que subyace a un conjunto de variables. Busca un reducido conjunto de constructos subyacentes o latentes que explican la relación entre variables manifiestas u observadas. Por ejemplo, una serie de actitudes hacia el uso de la violencia contra la mujer, la distribución de las tareas domésticas o los roles de hombres y mujeres en la vida social, pueden explicarse por una cultura o creencias subyacentes de tipo machista y patrialcal.

Diferencias entre el ACP y el AFE

Fuente: Kabakoff 2011: 332.

Ejemplo: Encuesta Nancional sobre Roles de Género 2012

En esta lección utilizaremos los datos de la encuesta nacional sobre roles de género realizada por el IOP - PUCP en el 2012. En informe respectivo puede verse en el siguiente enlace: Genero PUCP 2012

La base de datos, ficha técnica y cuestionario pueden descargase desde el siguiente enlace: BD Genero 2012

En dicha encuesta se aplicó una batería de preguntas en una escala de tipo Lickert para medir actitudes la violencia de género y la homofobia, tal y como puede verse en la siguiente diapositiva.

Actitudes hacia la violencia de género y la homofobia

Variables y datos

A continuación podemos ver los estadísticos descriptivos de las variables correspondientes a las preguntas P51A - P51K. Para ello, previamente se ha recodificado las respuestas NS/NR como NA:

## 
## Estadísticos Descriptivos
## ================================================================
## Statistic   N   Mean St. Dev. Min  Pctl(25) Median Pctl(75) Max 
## ----------------------------------------------------------------
## P51A      1,192 3.29   0.55   1.00   3.00    3.00    4.00   4.00
## P51B      1,199 3.33   0.53   1.00   3.00    3.00    4.00   4.00
## P51C      1,186 3.27   0.65   1.00   3.00    3.00    4.00   4.00
## P51D      1,140 2.80   0.71   1.00   2.00    3.00    3.00   4.00
## P51E      1,158 2.55   0.74   1.00   2.00    3.00    3.00   4.00
## P51F      1,161 2.59   0.73   1.00   2.00    3.00    3.00   4.00
## P51G      1,126 2.39   0.76   1.00   2.00    2.00    3.00   4.00
## P51H      1,137 2.26   0.77   1.00   2.00    2.00    3.00   4.00
## P51I      1,131 2.30   0.78   1.00   2.00    2.00    3.00   4.00
## P51J      1,055 2.79   0.72   1.00   2.00    3.00    3.00   4.00
## P51K      1,135 2.84   0.79   1.00   2.00    3.00    3.00   4.00
## ----------------------------------------------------------------

Matriz de correlaciones

La matriz de correlaciones nos permite tener una primera impresión de la interrelación que existe entre las variables:

##       P51A  P51B  P51C  P51D  P51E  P51F P51G  P51H  P51I  P51J P51K
## P51A     1                                                          
## P51B  0.75     1                                                    
## P51C  0.57  0.64     1                                              
## P51D  0.26  0.26  0.29     1                                        
## P51E  0.16  0.15  0.15  0.49     1                                  
## P51F  0.19  0.22   0.2  0.47  0.62     1                            
## P51G  0.12  0.13  0.13  0.37  0.47  0.58    1                       
## P51H   0.1   0.1  0.06  0.34  0.39  0.49 0.73     1                 
## P51I  0.07   0.1  0.09  0.34  0.38  0.45 0.67  0.85     1           
## P51J   0.2  0.24  0.21  0.41  0.41  0.54 0.49  0.42  0.44     1     
## P51K -0.01 -0.03 -0.01 -0.05 -0.08 -0.07 -0.1 -0.03 -0.04 -0.05    1

Pasos en el Análisis de Componentes Principales / Análisis Factorial

De acuerdo con Kabacoff (2011: 333-334), los pasos para realizar un ACP o AFE son:

Componentes principales

El objetivo del ACP es reemplazar un conjunto grande de variables correlacionadas por otro grupo más pequeño de variables no correlacionadas, conservando la mayor cantidad posible de información de las variables originales. Las variables resultantes se llaman componentes principales y son una combinación lineal de las variables originales, así el primer componente será la combinación ponderada de las K variables observadas que dan cuenta de la mayor cantidad de la varianza en el conjunto original de variables:

\[ PC_1 = a_1X_1 + a_2X_2 + ... + a_kX_k\]

El segundo componente principal será lo mismo, bajo la restricción de que sea ortogonal o no correlacionada con el primer componente.

Número de Componentes a Extraer

Teóricamente se puede extraer tantos componentes como variables hay en nuestra matriz de datos (en nuestro ejemplo son 11 ítems). Sin embargo el objetivo es reducir los datos, para ello se pueden emplear diferentes criterios (Kabacoff 2011: 335):

El criterio más común utiliza los autovalores

Autovalores (eigenvalues) y número de componentes

Los autovalores o eigenvalues son un elemento central del análisis de transformaciones lineares. Se utilizan en el álgebra matricial para reescalar vectores en una matriz de datos o en un espacio multimensional.

En el ACP cada componente es representado por un autovalor que reescala la matriz de correlaciones, estandarizando la cantidad de la varianza de la matriz a una unidad por cada variable que forma parte del conjunto de datos.

En nuestro ejemplo tenemos una matriz de 11 x 11 variables, por lo que la suma de los autovalores o eigenvalues debe ser igual a 11. Si un componente tiene un autovalor mayor a 1 significa que captura una cantidad de la varianza mayor que una variable original, lo que nos permite reducir las dimensiones de esa matriz de datos.

Selección de Componentes Principales a Extraer

Lo primero que vamos a hacer pedir una “solución” de componentes principales, considerando tantos componentes como variables tenemos en nuestro conjunto de datos (11 variables). Nos fijaremos en primer lugar en los pesos de cada componente, que equivalen a los autovalores o eigenvalues y que en conjunto suman 11.

Nos interesa seleccionar componentes que “pesen” más que una variable única (eigenvalue > 1), y que expliquen la mayor proporción posible de la varianza compartida.

Solución con 11 CP

Gráfico de eigenvalues

Selección de Componentes Principales

Una forma de ver gráficamente el peso de cada componente principal es usar un gráfico de eigenvalues. Allí notaremos rápidamente cuáles son los componentes que tienen un autovalor mayor a 1.

Analizando el gráfico y la tabla observamos que hay dos componentes principales que tienen autovalores cláramente mayores a 1. El PC1 captura el 38% de la varianza común, mientras que el PC2 el 20%, es decir, dos componentes principales representan el 58% de la varianza colectiva. El PC3 tiene un autovalor ligeramente mayor a 1, por lo que apenas equivale a poco más de una variable individual original.

A partir de este primer análisis notamos que podríamos resumir las 11 variables originales en dos Componentes Principales que capturan el 58% de la varianza del conjunto.

Componentes seleccionados: Matrix de pesos no rotados

A continuación observamos la matriz de componentes principales no rotados. La matriz muestra la correlación que existe entre cada ítem y los componentes extraídos:

## 
## Loadings:
##      PC1    PC2   
## P51A  0.372  0.767
## P51B  0.427  0.766
## P51C  0.406  0.716
## P51D  0.631  0.143
## P51E  0.674       
## P51F  0.770       
## P51G  0.784 -0.332
## P51H  0.748 -0.419
## P51I  0.734 -0.398
## P51J  0.714       
## P51K -0.123       
## 
##                  PC1   PC2
## SS loadings    4.168 2.166
## Proportion Var 0.379 0.197
## Cumulative Var 0.379 0.576

Rotación de Componentes Principales

Las rotaciones son un conjunto de técnicas matemáticas que transforman la matriz de pesos de los componentes en una que sea más facilmente interpretable y haciendo que los componentes extraídos sean lo más diferenciados o “puros” posibles (Kabacoff 2011: 339-340).

Hay diferentes métodos de rotación. Los de tipo ortogonal buscan “separar” lo más posible los componentes extraídos evitando que estén correlacionados entre sí. Otros métodos de rotación oblicua permiten que los componentes tengan algún nivel de correlación. Uno de los métodos más utilizados de rotación ortogonal es la rotación varimax, que es la que emplearemos en nuestro ejemplo.

Obsérvese en el resultado siguiente como la rotación hace que el peso de las variables se afirme más en un componente que en otro.

Componentes Rotados por el Método Varimax

## Principal Components Analysis
## Call: principal(r = df.p51[, -1], nfactors = 2, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
##        RC1   RC2    h2   u2 com
## P51A  0.04  0.85 0.726 0.27 1.0
## P51B  0.09  0.87 0.769 0.23 1.0
## P51C  0.09  0.82 0.678 0.32 1.0
## P51D  0.52  0.38 0.419 0.58 1.8
## P51E  0.65  0.19 0.461 0.54 1.2
## P51F  0.73  0.25 0.597 0.40 1.2
## P51G  0.85  0.00 0.726 0.27 1.0
## P51H  0.85 -0.09 0.735 0.27 1.0
## P51I  0.83 -0.08 0.697 0.30 1.0
## P51J  0.67  0.26 0.510 0.49 1.3
## P51K -0.13 -0.02 0.017 0.98 1.0
## 
##                        RC1  RC2
## SS loadings           3.86 2.48
## Proportion Var        0.35 0.23
## Cumulative Var        0.35 0.58
## Proportion Explained  0.61 0.39
## Cumulative Proportion 0.61 1.00
## 
## Mean item complexity =  1.1
## Test of the hypothesis that 2 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.08 
##  with the empirical chi square  862.56  with prob <  3.5e-159 
## 
## Fit based upon off diagonal values = 0.95

Grafico de Variables y Componentes

Interpretar los Resultados (1)

Para interpretar los resultados debemos fijarnos en la matriz de pesos de componentes rotados y analizar cuáles de las variables están más asociadas a cada uno de los componentes.

La variable P51K queda como algo “descolgada” de las demás.

Veamos los items originales para interpretar mejor nuestros resultados:

Interpretar los resultados (2): Homofobia

RC1 : P51D, P51E, P51F, P51G, P51H, P51I, P51J

Interpretar los resultados (3): Violencia de género

Calcular Puntajes en los Componentes para cada Individuo

Las funciones del R nos permiten calcular un puntaje en los componentes principales extraídos para cada individuo de nuestra base de datos. Es como si le asignáramos un puntaje en la dimensión de “homofobia” y en la de “violencia de género” a cada entrevistado de la encuesta.

Como las opciones de respuesta de los ítems originales van del 1 (“Muy de acuerdo”) al 4 (“Muy en desacuerdo”), en el caso de:

Los puntajes en cada componente se calculan en unidades estándar (valores Z de la curva normal).

Distribución de Puntajes en los Factores

Análisis con Puntajes de Componentes Principales

El calcular los puntajes de los componentes principales nos permite utilizarlos como variables cuantitativas para realizar diversos tipos de análisis descriptivos y multivariables, por ejemplo:

Ejemplos de análisis (2)

Ejemplos de análisis (3)

##                     Df Sum Sq Mean Sq F value   Pr(>F)    
## genero12.b$region1   2   21.3   10.65   10.76 2.41e-05 ***
## Residuals          916  907.2    0.99                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 284 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = genero12.b$RC2 ~ genero12.b$region1)
## 
## $`genero12.b$region1`
##                            diff        lwr         upr     p adj
## Resto Urbano-Lima  -0.316506413 -0.4876927 -0.14532017 0.0000470
## Rural-Lima         -0.311340188 -0.5314508 -0.09122957 0.0026852
## Rural-Resto Urbano  0.005166226 -0.2089232  0.21925564 0.9982323

Ejemplo de Análisis (3)

## 
## =====================================================
##                            Dependent variable:       
##                     ---------------------------------
##                           RC1              RC2       
##                           (1)              (2)       
## -----------------------------------------------------
## sumaNSE              0.002 (0.004)   0.013*** (0.004)
## educ                 0.008 (0.020)    0.045* (0.020) 
## EDAD                -0.007** (0.002) -0.006** (0.002)
## sexMujer            0.281*** (0.065) 0.277*** (0.064)
## region1Resto Urbano -0.157* (0.077)  -0.197* (0.076) 
## region1Rural        -0.331** (0.113)  0.052 (0.111)  
## Constant             0.182 (0.165)   -0.448** (0.162)
## -----------------------------------------------------
## Observations              919              919       
## R2                       0.054            0.093      
## Adjusted R2              0.048            0.087      
## =====================================================
## Note:                   *p<0.05; **p<0.01; ***p<0.001

Sintaxis para esta lección (1)

## CARGA DE DATOS

library(foreign)
genero12 <- read.spss("https://www.dropbox.com/s/kjva39yh3dzb07r/IOP_1212_01_B.sav?dl=1", 
                      to.data.frame = T, use.value.labels = F)

## SELECCIÓN Y RECODIFICACIÓN DE VARIABLES DE ANÁLISIS
## Preguntas P51A - P51K
## Recodificiar 9 por NA 

genero.s <- genero12[, c(1,108:118)]

NRO <- genero.s[, 1]
df <- genero.s[, 2:12]

df[df==9] <- NA

df.p51 <- cbind(NRO, df)

## TABLA DE ESTADÍSTICOS DESCRIPTIVOS

library(stargazer)

stargazer(df.p51[, -1], type = "text", median = TRUE, title = "Estadísticos Descriptivos",
          digits = 2)


## TABLA DE CORRELACIONES

correla1 <- round(cor(df.p51[,-1], use = "complete.obs"),2)
correla1


## Análisis de componentes principales no rotados (1)

library(psych)

pca1 <- principal(df.p51[, -1], nfactors = 11, rotate = "none")
pca1

## Gráfico de eigenvalues

vac <- as.data.frame(t(pca1$Vaccounted))
vac$PC <- row.names(vac)
colnames(vac) <- c("ss_load", "prop.var", "cum.var", "prop.exp", "cum.prop", "PC")

ggplot(vac, aes(x = reorder(PC, -ss_load), y = ss_load), group = 1) +
  geom_bar(stat = "identity", fill = "grey", colour = "black") + 
  geom_line(aes(group = 1)) + geom_point() + geom_hline(yintercept = 1, color = "red") +
  xlab("Componentes Principales") + ylab("Eigenvalues") + 
  ggtitle("Componentes principales: Gráfico de eigenvalues") +
  theme_bw()

## Análisis de componentes principales no rotados (2)

pca2 <- principal(df.p51[, -1], nfactors = 2, rotate = "none")
pca2

## Análisis de componentes principales con rotación varimax

pca3 <- principal(df.p51[, -1], nfactors = 2, rotate = "varimax")
pca3

library(psych)
KMO(df.p51[,-1])

## Cálculo y distribución de puntajes de componentes extraídos

puntajes.pc1 <- as.data.frame(pca3$scores)

dfp51.2 <- cbind(df.p51, puntajes.pc1)

genero12.b <- merge(genero12, dfp51.2, by = "NRO")

curva.rc1 <- ggplot(genero12.b, aes(RC1)) + 
  geom_density(fill="green", alpha=0.2) + 
  ggtitle("Distribución de RC1: Homofobia") + theme_bw()

curva.rc2 <- ggplot(genero12.b, aes(RC2)) + 
  geom_density(fill="green", alpha=0.2) +
  ggtitle("Distribución de RC2: Violencia de género") + theme_bw()

grid.arrange(curva.rc1, curva.rc2, ncol=2)


## Recodificación de variables en la base de datos

genero12.b$sex <- factor(genero12.b$SEXO, labels = c("Hombre", "Mujer"))

genero12.b$region1 <- factor(genero12.b$Ambito, 
                             labels = c("Lima", "Resto Urbano", "Rural"))

genero12.b$educ <- genero12.b$P48

genero12.b$educ[genero12.b$educ == 99] <- NA

## Gráfico de cajas

ggplot(genero12.b, aes(x=sex, y=RC1)) + geom_boxplot() +
  ggtitle("Índice de actitudes hacia la homosexualidad según sexo del entrevistado") +
  xlab("Sexo del entrevistado") + ylab("Indice de actitudes hacia la homosexualidad")+   theme_bw()


## Análisis de la varianza

library(Rmisc)
tab1 <- summarySE(data = genero12.b, measurevar = "RC2", groupvars = "region1", 
                  na.rm=T)

ggplot(tab1, aes(x = region1, y=RC2)) + geom_point() + 
  geom_errorbar(aes(ymin = RC2-ci, ymax=RC2+ci), width = .5) +
  xlab("Ambito de residencia") + ylab("Indice Violencia de Género") +
  ggtitle("Índice de actitudes hacia la violencia de género, según ámbito de residencia, media e IC al 95%") + theme_bw()

anova1 <- aov(genero12.b$RC2~genero12.b$region1)
summary(anova1)
TukeyHSD(anova1)


## Análisis de regresión

m1 <- lm(RC1 ~ sumaNSE + educ + EDAD + sex + region1, data = genero12.b)
m2 <- lm(RC2 ~ sumaNSE + educ + EDAD + sex + region1, data = genero12.b)

stargazer(m1, m2,  type = "text", single.row = TRUE,
         omit.stat=c("ser","f"), 
          star.cutoffs = c(0.05, 0.01, 0.001))