Análisis de Correspondencias (CA)

Análisis Multivariado

Autor/a
Afiliación
Freddy Hernández-Barajas

Universidad Nacional de Colombia

1 Introducción

Es común en los estudios tener variables cualitativas y una forma de relacionar esas variables cualitativas es por medio de las tablas de contingencia.

Ejemplos:

2 ¿Que es el análisis de correspondencias (CA)?

  • El análisis de correspondencias es una técnica descriptiva para representar tablas de contingencia. Los datos de partida para el análisis de correspondencias es una matriz \(X\) de dimensiones \(n \times p\) que representa las frecuencias absolutas observadas en una tabla de contingencia de dos variables.

  • El análisis de correspondencias busca obtener un número de dimensiones (factores), de tal forma que la primera dimensión explique la mayor parte de la asociación total entre filas y columnas, la segunda dimensión explique la mayor parte del residuo de la asociación no explicada por la primera componente y así sucesivamente con el resto de las dimensiones.

3 Jean-Paul Benzecri

Jean-Paul Benzecri es un estadístico francés. Estudió en la Ecole Normale Supérieure y ha sido profesor en la Universidad Pierre-et-Marie-Curie de París. Es más famoso por el desarrollo del análisis de correspondencia, una técnica estadística para analizar tablas de contingencia. Es ampliamente utilizado en estudios sociológicos de datos categóricos.

4 Librerías a usar

Para hacer análisis de correspondencias se puede usar la función ca del paquete ca. Las funciones de factoextra para ayudar en la interpretación y visualización del análisis de correspondencia son:

  • get_eigenvalue: extrae los valores propios/varianzas retenidas por cada dimensión (eje)
  • fviz_eig: Visualiza los valores propios
  • get_ca_row y get_ca_col: extrae los resultados para filas y columnas, respectivamente.
  • fviz_ca_row y fviz_ca_col: muestra los resultados para filas y columnas, respectivamente.
  • fviz_ca_biplot: hace un biplot de filas y columnas.

5 Análisis de correspondencias simples

Se usa cuando se tienen 2 variables cualitativas.

6 Matriz de datos \(X\) en el caso de 2 variables

\[\begin{equation} X=\begin{bmatrix} n_{11} & n_{12} & \cdots & n_{1p}\\ n_{21} & n_{22} & \cdots & n_{2p}\\ \vdots & \vdots & \ddots & \vdots \\ n_{n1} & n_{n2} & \cdots & n_{np} \end{bmatrix} \end{equation}\]

El subíndice \(n\) representa el número de niveles fila y el subíndice \(p\) representa el número de niveles columna. La letra grande \(n\) es la frecuencia absoluta de cada casilla.

7 Prueba \(\chi^2\) para independencia

Esta prueba de hipótesis se puede utilizar para saber si dos variables cualitativas son independientes o no.

Las hipotesis en esta prueba son:

  • \(H_0\): las variables son independientes.
  • \(H_1\): las variables NO son independientes.

Consultar el video en este enlace.

A continuación se muestra la forma de replicar el ejemplo del video anterior en R. En este caso tenemos que

  • \(H_0\): las variables sexo y preferencia son independientes.
  • \(H_1\): las variables sexo y preferencia NO son independientes.
tabla <- matrix(c(23, 4, 10,
                  10, 14, 35), byrow=T, ncol=3)
chisq.test(tabla) 

    Pearson's Chi-squared test

data:  tabla
X-squared = 20.606, df = 2, p-value = 3.353e-05

De la salida anterior se tiene que el valor-p = 3.353e-05, por lo tanto hay evidencias para rechazar \(H_0\).

8 Ejemplo 1

En este ejemplo se muestra como usar CA para un estudio de relación entre color de ojos y color de cabello.

8.1 Matriz de contingencia \(X\)

A continuación se muestra la tabla de frecuencias para el estudio de color de ojos y color de cabello.

Para una tabla o matriz \(X\) se pueden definir totales asociados de la siguiente manera:

Tabla de frecuencias con totales para el estudio de color del cabello y color de ojos.

8.2 Frecuencias relativas y marginales por fila

Las expresiones para obtener las frecuencias son:

\[\begin{equation} \begin{array}{ll} f_{ij} &= \frac{n_{ij}}{N} \\ f_{j|i} &= \frac{n_{ij}}{n_{i.}} \\ f_{.j} &= \sum_{i=1}^{n}f_{ij}=\frac{n_{.j}}{N} \end{array} \end{equation}\]

Ejemplo:

8.3 Gráfico perfiles fila

A partir de la tabla perfil fila se puede construir el Gráfico de perfiles. Para el ejemplo tenemos:

X <- matrix(c(688,116,584,188, 4,
              326, 38,241,110, 3,
              343, 84,909,412,26,
              98, 48,403,681,85), nrow=4, byrow=T)

#Nombres de las filas y las columnas de la tabla.

dimnames(X) <- list(col.ojos=c("Claros","Azules",
                               "Medios","Oscuros"),
                    col.cabello=c("Rubio","Rojo",
                                  "Medio","Oscuro",
                                  "Negro"))
f.fila <- prop.table(X, 1)
par(oma=c(0, 0, 0, 5))
barplot(t(f.fila), beside=T, las=1,
        ylab='Frecuencia', xlab='Color de ojos',
        col=hcl(h=c(30, 70, 120, 240, 300)))
legend(par('usr')[2], par('usr')[4], xpd=NA,
       legend=colnames(X), bty='n',
       fill=hcl(h=c(30, 70, 120, 240, 300)))

En esta figura se puede ver como se comporta el color del cabello para cada uno de los colores de ojos.

  • Para ojos claros y azules, es más frecuente observar cabellos rubios y medios.
  • Para ojos medios y oscuros, es más frecuente observar cabellos medios y oscuros.

8.4 Frecuencias relativas y marginales por columna

Las expresiones para obtener las frecuencias relativas son:

\[\begin{equation} \begin{array}{ll} f_{ij} &= \frac{n_{ij}}{N} \\ f_{i|j} &= \frac{n_{ij}}{n_{.j}} \\ f_{i.} &= \sum_{j=1}^{p}f_{ij}=\frac{n_{i.}}{N} \end{array} \end{equation}\]

Ejemplo:

8.5 Gráfico perfiles columna

A partir de la tabla perfil columna se puede construir el Gráfico de perfiles. Para el ejemplo tenemos:

f.colum <- prop.table(X, 2)
par(oma=c(0, 0, 0, 5))
barplot(f.colum, beside=T, las=1,
        ylab='Frecuencia', xlab='Color del pelo',
        col=hcl(h=c(30, 70, 120, 240)))
legend(par('usr')[2], par('usr')[4], xpd=NA,
       legend=rownames(X), bty='n',
       fill=hcl(h=c(30, 70, 120, 240)))

En esta figura se puede ver como se comporta el color de ojos para cada uno de los colores de cabello.

  • Para cabellos rubio y rojo, es más frecuente observar ojos claros.
  • Para cabellos oscuro y negro, es más frecuente observar ojos oscuros.

A continuación se muestra la forma de realizar la prueba \(\chi^2\) para independencia sobre cabellos y ojos en R. En este caso tenemos que

  • \(H_0\): las variables color ojos y color cabellos son independientes.
  • \(H_1\): las variables color ojos y color cabellos NO son independientes.
X <- matrix(c(688, 116, 584, 188, 4,
              326, 38, 241, 110, 3,
              343, 84, 909, 412, 26,
              98, 48, 403, 681, 85), nrow=4, byrow=T)

dimnames(X) <- list(col_ojos=c("Claros","Azules", "Medios","Oscuros"),
                    col_cabello=c("Rubio","Rojo", "Medio","Oscuro", "Negro"))

chisq.test(X) 

    Pearson's Chi-squared test

data:  X
X-squared = 1240, df = 12, p-value < 2.2e-16

De la salida anterior se tiene que el valor-p < 2.2e-16, por lo tanto hay evidencias para rechazar \(H_0\).

8.6 Análisis de correspondencias manualmente

n <- sum(X)
P <- X / n
column.masses <- colSums(P)
row.masses <- rowSums(P)
E <- row.masses %o% column.masses
R <- P - E
I <- R / E
Z <- I * sqrt(E)
SVD <- svd(Z)
rownames(SVD$u) <- rownames(P)
rownames(SVD$v) <- colnames(P)
eigenvalues <- SVD$d^2
round(eigenvalues, digits=4)
[1] 0.1992 0.0301 0.0009 0.0000

8.7 Análisis de correspondencias en R

Para hacer análisis de correspondencias se puede usar la función ca del paquete ca.

require(ca)
res_ca <- ca(X)

Para ver la contribución de cada dimensión en la explicación de la varianza total hacemos lo siguiente:

library(factoextra)
Loading required package: ggplot2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
get_eigenvalue(res_ca)
        eigenvalue variance.percent cumulative.variance.percent
Dim.1 0.1992447520       86.5562709                    86.55627
Dim.2 0.0300867741       13.0703516                    99.62662
Dim.3 0.0008594814        0.3733775                   100.00000

La tabla anterior nos indica que la primera dimensión explica el 86.6% de la varianza y que la segunda dimensión explica el 13.1% de la varianza, entre ambas, explican el 99.6% de la varianza, es decir, las dos primeras dimensiones explican la totalidad de la varianza observada.

Es posible mostrar estos resultados de forma gráfica así:

library(factoextra)
fviz_screeplot(res_ca)

La representación de los diferentes niveles de ambas variables en el plano bidimensional se obtiene así:

fviz_ca_biplot(res_ca, repel = TRUE)

De la figura anterior podemos ver lo siguiente:

  • Los ojos azules y claros están más relacionados con cabellos rubios y rojos.
  • Los ojos oscuros están más relacionados con cabellos oscuros y negros.

Para ver el aporte que tiene cada nivel de la variable FILA en las dimensiones hacemos lo siguiente:

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"      
head(row$coord)
              Dim.1       Dim.2        Dim.3
Claros  -0.44070764 -0.08846303 -0.031773257
Azules  -0.40029985 -0.16541100  0.064157519
Medios   0.03361434  0.24500190  0.005552885
Oscuros  0.70273880 -0.13391383 -0.004345377

De la tabla anterior se puede concluir que:

  • Los ojos claros, azules y oscuros aportan a la dimensión 1.
  • Los ojos medios son los que más aportan a la dimensión 2.

Para ver como aportan los niveles de la variable FILA en las dos primeras dimensiones hacemos lo siguiente:

fviz_ca_row(res_ca, repel = TRUE)

Nota

El gráfico anterior muestra las relaciones entre los puntos de fila:

  • Las filas con un perfil similar se agrupan.
  • Las filas con correlación negativa se colocan en lados opuestos del origen del gráfico (cuadrantes opuestos).
  • La distancia entre los puntos de fila y el origen mide la calidad de los puntos de fila en el mapa de factores.
  • Los puntos de fila que están alejados del origen están bien representados en el mapa de factores.

Para ver el aporte que tiene cada nivel de la variable COLUMNA en las dimensiones hacemos lo siguiente:

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"      
head(col$coord)
             Dim.1       Dim.2        Dim.3
Rubio  -0.54399533 -0.17384449  0.012522082
Rojo   -0.23326097 -0.04827895 -0.118054940
Medio  -0.04202412  0.20830421  0.003236468
Oscuro  0.58870853 -0.10395044  0.010116315
Negro   1.09438828 -0.28643670 -0.046135954

De la tabla anterior se puede concluir que:

  • Los cabellos rubio y negro son los que más aportan a la dimensión 1.
  • Los cabellos medios son los que más aportan a la dimensión 2.

Para ver como aportan los niveles de la variable COLUMNA en las dos primeras dimensiones hacemos lo siguiente:

fviz_ca_col(res_ca, repel = TRUE)

9 Ejemplo 2

En este ejemplo vamos a utilizar los datos de una tabla de frecuencias de tareas del hogar y quién las realiza.

Abajo la matriz a utilizar.

X <- structure(c(156L, 124L, 77L, 82L, 53L, 32L, 33L, 12L, 10L, 13L, 
8L, 0L, 0L, 14L, 20L, 11L, 36L, 11L, 24L, 23L, 46L, 51L, 13L, 
1L, 3L, 1L, 2L, 5L, 7L, 15L, 1L, 4L, 9L, 23L, 75L, 21L, 53L, 
160L, 6L, 4L, 4L, 13L, 7L, 57L, 53L, 55L, 15L, 3L, 66L, 77L, 
2L, 153L), dim = c(13L, 4L), dimnames = list(c("Lavandería", "Almuerzo", 
"Comida", "Desayuno", "Ordenar", "Platos", "Compras", "Oficial", 
"Conducción", "Finanzas", "Seguros", "Reparaciones", "Vacaciones"), c("Esposa", 
"Alternado", "Esposo", "Juntos")), class = "table")

Para ver los datos.

X
             Esposa Alternado Esposo Juntos
Lavandería      156        14      2      4
Almuerzo        124        20      5      4
Comida           77        11      7     13
Desayuno         82        36     15      7
Ordenar          53        11      1     57
Platos           32        24      4     53
Compras          33        23      9     55
Oficial          12        46     23     15
Conducción       10        51     75      3
Finanzas         13        13     21     66
Seguros           8         1     53     77
Reparaciones      0         3    160      2
Vacaciones        0         1      6    153

Para hacer el CA usamos el siguiente código:

require(ca)
res_ca <- ca(X)

Para ver la contribución de cada dimensión en la explicación de la varianza total hacemos lo siguiente:

library(factoextra)
get_eigenvalue(res_ca)
      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

La tabla anterior nos indica que la primera dimensión explica el 48.69% de la varianza y que la segunda dimensión explica el 39.91% de la varianza, entre ambas, explican el 88.60% de la varianza, es decir, las dos primeras dimensiones explican gran parte de la varianza observada.

Es posible mostrar estos resultados de forma gráfica así:

library(factoextra)
fviz_screeplot(res_ca)

La representación de los diferentes niveles de ambas variables en el plano bidimensional se obtiene así:

fviz_ca_biplot(res_ca, repel = TRUE)

De la figura anterior podemos ver lo siguiente:

  • El esposo está más relacionado con reparaciones y conducción.
  • La esposa está más relacionada con lavandería, almuerzo y comida.
  • Las actividades que hacen juntos son planeación de vacaciones y finanzas.

Para ver el aporte que tiene cada nivel de la variable FILA en las dimensiones hacemos lo siguiente:

row <- get_ca_row(res_ca)
row$coord
                  Dim.1      Dim.2       Dim.3
Lavandería   -0.9918368 -0.4953220 -0.31672897
Almuerzo     -0.8755855 -0.4901092 -0.16406487
Comida       -0.6925740 -0.3081043 -0.20741377
Desayuno     -0.5086002 -0.4528038  0.22040453
Ordenar      -0.3938084  0.4343444 -0.09421375
Platos       -0.1889641  0.4419662  0.26694926
Compras      -0.1176813  0.4033171  0.20261512
Oficial       0.2266324 -0.2536132  0.92336416
Conducción    0.7417696 -0.6534143  0.54445849
Finanzas      0.2707669  0.6178684  0.03479681
Seguros       0.6470759  0.4737832 -0.28936051
Reparaciones  1.5287787 -0.8642647 -0.47208778
Vacaciones    0.2524863  1.4350066 -0.12958665

De la tabla anterior se puede concluir que:

  • Lavandería, almuerzo, comida y reparaciones aportan a la dimensión 1.
  • Vacaciones aporta más a la dimensión 2.

Para ver como aportan los niveles de la variable FILA en las dos primeras dimensiones hacemos lo siguiente:

fviz_ca_row(res_ca, repel = TRUE)

Nota

El gráfico anterior muestra las relaciones entre los puntos de fila:

  • Las filas con un perfil similar se agrupan.
  • Las filas con correlación negativa se colocan en lados opuestos del origen del gráfico (cuadrantes opuestos).
  • La distancia entre los puntos de fila y el origen mide la calidad de los puntos de fila en el mapa de factores.
  • Los puntos de fila que están alejados del origen están bien representados en el mapa de factores.

Para ver el aporte que tiene cada nivel de la variable COLUMNA en las dimensiones hacemos lo siguiente:

col <- get_ca_col(res_ca)
col$coord
                Dim.1      Dim.2       Dim.3
Esposa    -0.83762154 -0.3652207 -0.19991139
Alternado -0.06218462 -0.2915938  0.84858939
Esposo     1.16091847 -0.6019199 -0.18885924
Juntos     0.14942609  1.0265791 -0.04644302

De la tabla anterior se puede concluir que:

  • Esposa y esposo aportan de forma contraria a la dimensión 1.
  • Juntos es lo que más aporta a la dimensión 2.

Para ver como aportan los niveles de la variable COLUMNA en las dos primeras dimensiones hacemos lo siguiente:

fviz_ca_col(res_ca, repel = TRUE)

10 Lectura adicional

Se recomienda leer esta publicación para profundizar más en CA.