Cápitulo 4: análisis de correspondencias en R

El análisis de correspondencias (AC) es una extensión del análisis de componentes principales adecuado para explorar las relaciones entre variables cualitativas (o datos categóricos). Al igual que el análisis de componentes principales, proporciona una solución para resumir y visualizar conjuntos de datos en gráficos bidimensionales.

Para empezar se instalan los paquetes y liberías correspondientes.

#install.packages(c("FactoMineR", "factoextra"))
library("FactoMineR")
library("factoextra")
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

También, se cargan los datos necesarios para el análisis.

data(housetasks)
head(housetasks)
##            Wife Alternating Husband Jointly
## Laundry     156          14       2       4
## Main_meal   124          20       5       4
## Dinner       77          11       7      13
## Breakfeast   82          36      15       7
## Tidying      53          11       1      57
## Dishes       32          24       4      53

Gráfico de tablas de contingencia y prueba chi-cuadrado

La tabla de contingencia anterior no es muy grande. Por lo tanto, es fácil inspeccionar e interpretar visualmente los perfiles de fila y columna:

library("gplots")
## 
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
## 
##     lowess
# 1. convert the data as a table
dt <- as.table(as.matrix(housetasks))
# 2. Graph
balloonplot(t(dt), main ="housetasks", xlab ="", ylab="",
            label = FALSE, show.margins = FALSE)

Para una tabla de contingencia pequeña, puede usar la prueba Chi-cuadrado para evaluar si existe una dependencia significativa entre las categorías de fila y columna:

chisq <- chisq.test(housetasks)
chisq
## 
##  Pearson's Chi-squared test
## 
## data:  housetasks
## X-squared = 1944.5, df = 36, p-value < 2.2e-16

Código de R para calcular CA

Se puede utilizar la función CA()[paquete FactoMiner]. Un formato simplificado es:

library("FactoMineR")
res.ca <- CA(housetasks, graph = FALSE)

print(res.ca)
## **Results of the Correspondence Analysis (CA)**
## The row variable has  13  categories; the column variable has 4 categories
## The chi square of independence between the two variables is equal to 1944.456 (p-value =  0 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

Significación estadística

Para interpretar el análisis de correspondencias, el primer paso es evaluar si existe una dependencia significativa entre las filas y las columnas.

Un método riguroso es utilizar el para examinar la asociación entre las variables de fila y columna. Esto aparece en la parte superior del informe generado por una función. Una estadística chi-cuadrado alta significa un fuerte vínculo entre las variables de fila y columna.chi-square statisticsummary(res.ca)print(res.ca)

# Chi-square statistics
chi2 <- 1944.456
# Degree of freedom
df <- (nrow(housetasks) - 1) * (ncol(housetasks) - 1)
# P-value
pval <- pchisq(chi2, df = df, lower.tail = FALSE)
pval
## [1] 0

Valores propios / Varianzas

Los valores propios y la proporción de varianzas retenidas por los diferentes ejes se pueden extraer utilizando una función. Los valores propios son grandes para el primer eje y pequeños para el eje siguiente por lo que se emplea la función .get_eigenvalue()

library("factoextra")
eig.val <- get_eigenvalue(res.ca)
eig.val
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  0.5428893         48.69222                    48.69222
## Dim.2  0.4450028         39.91269                    88.60491
## Dim.3  0.1270484         11.39509                   100.00000

Se realiza un diagrama para la interpretación.

fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 50))

También es posible calcular un valor propio promedio por encima del cual el eje debe mantenerse en la solución.

El código R a continuación, dibuja el diagrama de pedregal con una línea discontinua roja que especifica el valor propio promedio:

fviz_screeplot(res.ca) +
 geom_hline(yintercept=33.33, linetype=2, color="red")

## Biplot La función fviz_ca_biplot() se puede utilizar para dibujar el biplot de las variables de filas y columnas.

# repel= TRUE to avoid text overlapping (slow if many point)
fviz_ca_biplot(res.ca, repel = TRUE)

La distancia entre cualquier punto de fila o punto de columna da una medida de su similitud (o disimilitud). Los puntos de fila con un perfil similar se cierran en el mapa de factores. Lo mismo ocurre con los puntos de columna.

Gráfico de variables de fila

La función get_ca_row() se utiliza para extraer los resultados de las variables de fila. Esta función devuelve una lista que contiene las coordenadas, el cos2, la contribución y la inercia de las variables de fila:

row <- get_ca_row(res.ca)
row
## Correspondence Analysis - Results for rows
##  ===================================================
##   Name       Description                
## 1 "$coord"   "Coordinates for the rows" 
## 2 "$cos2"    "Cos2 for the rows"        
## 3 "$contrib" "contributions of the rows"
## 4 "$inertia" "Inertia of the rows"

Se puede acceder a los diferentes componentes de la siguiente manera:

# Coordinates
head(row$coord)
##                 Dim 1      Dim 2       Dim 3
## Laundry    -0.9918368  0.4953220 -0.31672897
## Main_meal  -0.8755855  0.4901092 -0.16406487
## Dinner     -0.6925740  0.3081043 -0.20741377
## Breakfeast -0.5086002  0.4528038  0.22040453
## Tidying    -0.3938084 -0.4343444 -0.09421375
## Dishes     -0.1889641 -0.4419662  0.26694926
# Cos2: quality on the factore map
head(row$cos2)
##                Dim 1     Dim 2      Dim 3
## Laundry    0.7399874 0.1845521 0.07546047
## Main_meal  0.7416028 0.2323593 0.02603787
## Dinner     0.7766401 0.1537032 0.06965666
## Breakfeast 0.5049433 0.4002300 0.09482670
## Tidying    0.4398124 0.5350151 0.02517249
## Dishes     0.1181178 0.6461525 0.23572969
# Contributions to the principal components
head(row$contrib)
##                 Dim 1    Dim 2    Dim 3
## Laundry    18.2867003 5.563891 7.968424
## Main_meal  12.3888433 4.735523 1.858689
## Dinner      5.4713982 1.321022 2.096926
## Breakfeast  3.8249284 3.698613 3.069399
## Tidying     1.9983518 2.965644 0.488734
## Dishes      0.4261663 2.844117 3.634294

Coordenadas de los puntos de fila

El siguiente código R muestra las coordenadas de cada punto de fila en cada dimensión (1, 2 y 3):

head(row$coord)
##                 Dim 1      Dim 2       Dim 3
## Laundry    -0.9918368  0.4953220 -0.31672897
## Main_meal  -0.8755855  0.4901092 -0.16406487
## Dinner     -0.6925740  0.3081043 -0.20741377
## Breakfeast -0.5086002  0.4528038  0.22040453
## Tidying    -0.3938084 -0.4343444 -0.09421375
## Dishes     -0.1889641 -0.4419662  0.26694926

Esto se gráfica.

fviz_ca_row(res.ca, repel = TRUE)

Es posible cambiar el color y la forma de los puntos de fila utilizando los argumentos y de la siguiente manera.

fviz_ca_row(res.ca, col.row="steelblue", shape.row = 15)

## Calidad de la representación de las filas

El cos2 mide el grado de asociación entre filas/columnas y un eje particular. El cos2 de los puntos de fila se puede extraer de la siguiente manera:

head(row$cos2, 4)
##                Dim 1     Dim 2      Dim 3
## Laundry    0.7399874 0.1845521 0.07546047
## Main_meal  0.7416028 0.2323593 0.02603787
## Dinner     0.7766401 0.1537032 0.06965666
## Breakfeast 0.5049433 0.4002300 0.09482670
# Color by cos2 values: quality on the factor map
fviz_ca_row(res.ca, col.row = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE)

También es posible cambiar la transparencia de los puntos de fila de acuerdo con sus valores cos2 utilizando la opción

# Change the transparency by cos2 values
fviz_ca_row(res.ca, alpha.row="cos2")

Puede visualizar el cos2 de los puntos de fila en todas las dimensiones utilizando el paquete corrplot:

library("corrplot")
## corrplot 0.92 loaded
corrplot(row$cos2, is.corr=FALSE)

También es posible crear un gráfico de barras de filas cos2

# Cos2 of rows on Dim.1 and Dim.2
fviz_cos2(res.ca, choice = "row", axes = 1:2)

Contribuciones de filas a las dimensiones

La contribución de las filas (en %) a la definición de las dimensiones se puede extraer de la siguiente manera:

head(row$contrib)
##                 Dim 1    Dim 2    Dim 3
## Laundry    18.2867003 5.563891 7.968424
## Main_meal  12.3888433 4.735523 1.858689
## Dinner      5.4713982 1.321022 2.096926
## Breakfeast  3.8249284 3.698613 3.069399
## Tidying     1.9983518 2.965644 0.488734
## Dishes      0.4261663 2.844117 3.634294

Esto se gráfica para su práctica interpretación.

library("corrplot")
corrplot(row$contrib, is.corr=FALSE) 

La función fviz_contrib se puede utilizar para dibujar un gráfico de barras de contribuciones de filas. Si los datos contienen muchas filas, puede decidir mostrar solo las filas contribuyentes superiores. El código R a continuación muestra las 10 filas superiores que contribuyen a las dimensiones:

# Contributions of rows to dimension 1
fviz_contrib(res.ca, choice = "row", axes = 1, top = 10)

# Contributions of rows to dimension 2
fviz_contrib(res.ca, choice = "row", axes = 2, top = 10)

La contribución total a las dimensiones 1 y 2 puede obtenerse de la siguiente manera:

# Total contribution to dimension 1 and 2
fviz_contrib(res.ca, choice = "row", axes = 1:2, top = 10)

Los puntos de fila más importantes (o contribuyentes) se pueden resaltar en el gráfico de dispersión de la siguiente manera:

fviz_ca_row(res.ca, col.row = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE)

Se controla la transparencia de los puntos así:

# Change the transparency by contrib values
fviz_ca_row(res.ca, alpha.row="contrib",
             repel = TRUE)

## Gráfico de variables de columna

La función get_ca_col() se utiliza para extraer los resultados de las variables de columna. Esta función devuelve una lista que contiene las coordenadas, el cos2, la contribución y la inercia de las variables de columnas:

col <- get_ca_col(res.ca)
col
## Correspondence Analysis - Results for columns
##  ===================================================
##   Name       Description                   
## 1 "$coord"   "Coordinates for the columns" 
## 2 "$cos2"    "Cos2 for the columns"        
## 3 "$contrib" "contributions of the columns"
## 4 "$inertia" "Inertia of the columns"

Para obtener acceso a los diferentes componentes, se empleea lo siguiente:

# Coordinates of column points
head(col$coord)
##                   Dim 1      Dim 2       Dim 3
## Wife        -0.83762154  0.3652207 -0.19991139
## Alternating -0.06218462  0.2915938  0.84858939
## Husband      1.16091847  0.6019199 -0.18885924
## Jointly      0.14942609 -1.0265791 -0.04644302
# Quality of representation
head(col$cos2)
##                   Dim 1     Dim 2       Dim 3
## Wife        0.801875947 0.1524482 0.045675847
## Alternating 0.004779897 0.1051016 0.890118521
## Husband     0.772026244 0.2075420 0.020431728
## Jointly     0.020705858 0.9772939 0.002000236
# Contributions
head(col$contrib)
##                 Dim 1     Dim 2      Dim 3
## Wife        44.462018 10.312237 10.8220753
## Alternating  0.103739  2.782794 82.5492464
## Husband     54.233879 17.786612  6.1331792
## Jointly      1.200364 69.118357  0.4954991

Parcelas y calidad de aportación

El se utiliza para producir el gráfico de puntos de columna. Para crear una gráfica simple, escriba lo siguiente:

fviz_ca_col(res.ca)

Al igual que los puntos de fila, también es posible colorear los puntos de columna por sus valores cos2:

fviz_ca_col(res.ca, col.col = "cos2", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)

El siguiente código R crea un gráfico de barras de columnas cos2:

fviz_cos2(res.ca, choice = "col", axes = 1:2)

Para visualizar la contribución de las filas a las dos primeras dimensiones, escriba lo siguiente:

fviz_contrib(res.ca, choice = "col", axes = 1:2)

## Opciones de Biplot

Bigráfica simétrica

Como se mencionó anteriormente, la gráfica estándar del análisis de correspondencias es una bigráfica simétrica en la que tanto las filas (puntos azules) como las columnas (triángulos rojos) se representan en el mismo espacio utilizando el . Estas coordenadas representan los perfiles de fila y columna. En este caso, solo se puede interpretar realmente la distancia entre puntos de fila o la distancia entre puntos de columna

fviz_ca_biplot(res.ca, repel = TRUE)

## Bigráfica asimétrica

Para hacer un bigráfico asimétrico, los puntos de filas (o columnas) se trazan a partir de las coordenadas estándar (S) y los perfiles de las columnas (o las filas) se trazan a partir de las coordenadas principales (P).

Para un eje dado, las coordenadas estándar y principal están relacionadas de la siguiente manera:

fviz_ca_biplot(res.ca, 
               map ="rowprincipal", arrow = c(TRUE, TRUE),
               repel = TRUE)

En el siguiente caso las columnas están en coordenadas principales y las filas en coordenadas estándar multiplicadas por la raíz cuadrada de la masa. Para una fila dada, el cuadrado de la nueva coordenada en un eje i es exactamente la contribución de esta fila a la inercia del eje i.

fviz_ca_biplot(res.ca, map ="colgreen", arrow = c(TRUE, FALSE),
               repel = TRUE)

## Descripción de la dimensión Para identificar fácilmente los puntos de fila y columna que están más asociados con las dimensiones principales. Las variables de fila/columna se ordenan por sus coordenadas en la salida.dimdesc()dimdesc()

# Dimension description
res.desc <- dimdesc(res.ca, axes = c(1,2))

Descripción de la dimensión 1:

# Description of dimension 1 by row points
head(res.desc[[1]]$row, 4)
##                 coord
## Laundry    -0.9918368
## Main_meal  -0.8755855
## Dinner     -0.6925740
## Breakfeast -0.5086002
# Description of dimension 1 by column points
head(res.desc[[1]]$col, 4)
##                   coord
## Wife        -0.83762154
## Alternating -0.06218462
## Jointly      0.14942609
## Husband      1.16091847

Descripción de la dimensión 2:

# Description of dimension 2 by row points
res.desc[[2]]$row
##                 coord
## Holidays   -1.4350066
## Finances   -0.6178684
## Insurance  -0.4737832
## Dishes     -0.4419662
## Tidying    -0.4343444
## Shopping   -0.4033171
## Official    0.2536132
## Dinner      0.3081043
## Breakfeast  0.4528038
## Main_meal   0.4901092
## Laundry     0.4953220
## Driving     0.6534143
## Repairs     0.8642647
# Description of dimension 1 by column points
res.desc[[2]]$col
##                  coord
## Jointly     -1.0265791
## Alternating  0.2915938
## Wife         0.3652207
## Husband      0.6019199

Elementos suplementarios

Se usa el el conjunto de datos [en el paquete FactoMineR]. Contiene 18 filas y 8 columnas:

data(children)
head(children)
##               unqualified cep bepc high_school_diploma university thirty fifty
## money                  51  64   32                  29         17     59    66
## future                 53  90   78                  75         22    115   117
## unemployment           71 111   50                  40         11     79    88
## circumstances           1   7    5                   5          4      9     8
## hard                    7  11    4                   3          2      2    17
## economic                7  13   12                  11         11     18    19
##               more_fifty
## money                 70
## future                86
## unemployment         177
## circumstances          5
## hard                  18
## economic              17

Especificación en CA

Como se mencionó anteriormente, las filas y columnas suplementarias no se utilizan para la definición de las dimensiones principales. Sus coordenadas se predicen utilizando solo la información proporcionada por la CA realizada en filas/columnas activas.

res.ca <- CA (children, row.sup = 15:18, col.sup = 6:8,
              graph = FALSE)

Biplot de filas y columnas

fviz_ca_biplot(res.ca, repel = TRUE)

También es posible ocultar filas y columnas suplementarias usando el argumento :invisible

fviz_ca_biplot(res.ca, repel = TRUE,
               invisible = c("row.sup", "col.sup"))

## Filas suplementarias Resultados previstos (coordenadas y cos2) para las filas suplementarias:

res.ca$row.sup
## $coord
##                  Dim 1     Dim 2      Dim 3      Dim 4
## comfort      0.2096705 0.7031677 0.07111168  0.3071354
## disagreement 0.1462777 0.1190106 0.17108916 -0.3132169
## world        0.5233045 0.1429707 0.08399269 -0.1063597
## to_live      0.3083067 0.5020193 0.52093397  0.2557357
## 
## $cos2
##                   Dim 1      Dim 2       Dim 3      Dim 4
## comfort      0.06892759 0.77524032 0.007928672 0.14790342
## disagreement 0.13132177 0.08692632 0.179649183 0.60210272
## world        0.87587685 0.06537746 0.022564054 0.03618163
## to_live      0.13899699 0.36853645 0.396830367 0.09563620

Gráfico de puntos de fila activos y suplementarios:

fviz_ca_row(res.ca, repel = TRUE) 

## Columnas suplementarias Resultados previstos (coordenadas y cos2) para las columnas suplementarias:

res.ca$col.sup
## $coord
##                  Dim 1       Dim 2       Dim 3       Dim 4
## thirty      0.10541339 -0.05969594 -0.10322613  0.06977996
## fifty      -0.01706444  0.04907657 -0.01568923 -0.01306117
## more_fifty -0.17706810 -0.04813788  0.10077299 -0.08517528
## 
## $cos2
##                Dim 1      Dim 2       Dim 3       Dim 4
## thirty     0.1375601 0.04411543 0.131910759 0.060278490
## fifty      0.0108695 0.08990298 0.009188167 0.006367804
## more_fifty 0.2860989 0.02114509 0.092666735 0.066200714

Gráfico de puntos de columna activos y suplementarios:

fviz_ca_col(res.ca, repel = TRUE) 

## Filtrado de resultados

Los resultados pueden ser filtrados con el siguiente procedimiento en las líneas de código a continuación.

# Visualize rows with cos2 >= 0.8
fviz_ca_row(res.ca, select.row = list(cos2 = 0.8))

# Top 5 active rows and 5 suppl. rows with the highest cos2
fviz_ca_row(res.ca, select.row = list(cos2 = 5))

# Select by names
name <- list(name = c("employment", "fear", "future"))
fviz_ca_row(res.ca, select.row = name)

# Top 5 contributing rows and columns
fviz_ca_biplot(res.ca, select.row = list(contrib = 5), 
               select.col = list(contrib = 5)) +
  theme_minimal()