El análisis de correspondencia múltiple ( MCA ) es una extensión del análisis de correspondencia simple para resumir y visualizar una tabla de datos que contiene más de dos variables categóricas . También puede verse como una generalización del análisis de componentes principales cuando las variables a analizar son categóricas en lugar de cuantitativas (Abdi y Williams 2010) .

La MCA se usa generalmente para analizar un conjunto de datos de una encuesta. El objetivo es identificar:

Un grupo de personas con perfil similar en sus respuestas a las preguntas. Las asociaciones entre categorías de variables Anteriormente, describimos cómo calcular e interpretar el análisis de correspondencia simple. Mostraremos cómo revelar las variables más importantes que más contribuyen a explicar las variaciones en el conjunto de datos.

Cargaremos lo paquetes necesarios.

library("FactoMineR")
library("factoextra")

Usaremos los conjuntos de datos de demostración poisondisponibles en el paquete FactoMineR :

data(poison)
head(poison)
##   Age Time   Sick Sex   Nausea Vomiting Abdominals   Fever   Diarrhae   Potato
## 1   9   22 Sick_y   F Nausea_y  Vomit_n     Abdo_y Fever_y Diarrhea_y Potato_y
## 2   5    0 Sick_n   F Nausea_n  Vomit_n     Abdo_n Fever_n Diarrhea_n Potato_y
## 3   6   16 Sick_y   F Nausea_n  Vomit_y     Abdo_y Fever_y Diarrhea_y Potato_y
## 4   9    0 Sick_n   F Nausea_n  Vomit_n     Abdo_n Fever_n Diarrhea_n Potato_y
## 5   7   14 Sick_y   M Nausea_n  Vomit_y     Abdo_y Fever_y Diarrhea_y Potato_y
## 6  72    9 Sick_y   M Nausea_n  Vomit_n     Abdo_y Fever_y Diarrhea_y Potato_y
##     Fish   Mayo Courgette   Cheese   Icecream
## 1 Fish_y Mayo_y   Courg_y Cheese_y Icecream_y
## 2 Fish_y Mayo_y   Courg_y Cheese_n Icecream_y
## 3 Fish_y Mayo_y   Courg_y Cheese_y Icecream_y
## 4 Fish_y Mayo_n   Courg_y Cheese_y Icecream_y
## 5 Fish_y Mayo_y   Courg_y Cheese_y Icecream_y
## 6 Fish_n Mayo_y   Courg_y Cheese_y Icecream_y

Estos datos son el resultado de una encuesta realizada a niños de la escuela primaria que sufrieron intoxicación alimentaria. Se les preguntó sobre sus síntomas y sobre lo que comían.

Los datos contienen 55 filas (individuos) y 15 columnas (variables). Usaremos solo algunos de estos individuos (niños) y variables para realizar el análisis de correspondencia múltiple. Las coordenadas de los individuos y variables restantes en el mapa de factores se predecirán a partir de los resultados anteriores de la MCA.

En terminología MCA , nuestros datos contienen:

Individuos activos (filas 1:55): individuos que se utilizan en el análisis de correspondencia múltiple. Variables activas (columnas 5:15): Variables que se utilizan en el MCA. Variables complementarias : No participan del MCA. Se predecirán las coordenadas de estas variables. Variables cuantitativas complementarias (cuanti.sup): Columnas 1 y 2 correspondientes a las columnas edad y tiempo , respectivamente. Variables cualitativas complementarias (cuali.sup .: Columnas 3 y 4 correspondientes a las columnas Enfermo y Sexo , respectivamente. Estas variables de factor se utilizarán para colorear los individuos por grupos.

Subconjunto solo de individuos activos y variables para análisis de correspondencia múltiple:

poison.active <- poison[1:55, 5:15]
head(poison.active, 3)
##     Nausea Vomiting Abdominals   Fever   Diarrhae   Potato   Fish   Mayo
## 1 Nausea_y  Vomit_n     Abdo_y Fever_y Diarrhea_y Potato_y Fish_y Mayo_y
## 2 Nausea_n  Vomit_n     Abdo_n Fever_n Diarrhea_n Potato_y Fish_y Mayo_y
## 3 Nausea_n  Vomit_y     Abdo_y Fever_y Diarrhea_y Potato_y Fish_y Mayo_y
##   Courgette   Cheese   Icecream
## 1   Courg_y Cheese_y Icecream_y
## 2   Courg_y Cheese_n Icecream_y
## 3   Courg_y Cheese_y Icecream_y

Resumen de datos

La función de base R summary()se puede utilizar para calcular la frecuencia de categorías de variables. Como la tabla de datos contiene una gran cantidad de variables, mostraremos solo los resultados de las primeras 4 variables.

summary(poison.active)
##       Nausea      Vomiting   Abdominals     Fever          Diarrhae 
##  Nausea_n:43   Vomit_n:33   Abdo_n:18   Fever_n:20   Diarrhea_n:20  
##  Nausea_y:12   Vomit_y:22   Abdo_y:37   Fever_y:35   Diarrhea_y:35  
##       Potato       Fish        Mayo      Courgette       Cheese  
##  Potato_n: 3   Fish_n: 1   Mayo_n:10   Courg_n: 5   Cheese_n: 7  
##  Potato_y:52   Fish_y:54   Mayo_y:45   Courg_y:50   Cheese_y:48  
##        Icecream 
##  Icecream_n: 4  
##  Icecream_y:51

Las funciones de resumen () devuelven el tamaño de cada categoría de variable.

También es posible trazar la frecuencia de las categorías de variables. El código R a continuación, traza las primeras 4 columnas:

for (i in 1:4) {
  plot(poison.active[,i], main=colnames(poison.active)[i],
       ylab = "Conteo", col="steelblue", las = 2)
  }

## Correspondencias simples

MCA(X, ncp = 5, graph = TRUE)

En el código R a continuación, el MCA se realiza solo en los individuos / variables activos:

res.mca <- MCA(poison.active, graph = FALSE)

La salida de la función MCA () es una lista que incluye:

print(res.mca)
## **Results of the Multiple Correspondence Analysis (MCA)**
## The analysis was performed on 55 individuals, described by 11 variables
## *The results are available in the following objects:
## 
##    name              description                       
## 1  "$eig"            "eigenvalues"                     
## 2  "$var"            "results for the variables"       
## 3  "$var$coord"      "coord. of the categories"        
## 4  "$var$cos2"       "cos2 for the categories"         
## 5  "$var$contrib"    "contributions of the categories" 
## 6  "$var$v.test"     "v-test for the categories"       
## 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"           "intermediate results"            
## 12 "$call$marge.col" "weights of columns"              
## 13 "$call$marge.li"  "weights of rows"

Visualización e interpretación

Usaremos el paquete factoextra R para ayudar en la interpretación y visualización del análisis de correspondencia múltiple. Independientemente de la función que decida utilizar [FactoMiner :: MCA (), ade4 :: dudi.mca ()], puede extraer y visualizar fácilmente los resultados de análisis de correspondencia múltiple utilizando las funciones R proporcionadas en el paquete factoextra R.

Estas funciones factoextra incluyen:

En las siguientes secciones, ilustraremos cada una de estas funciones.

Valores propios / Varianzas

La proporción de variaciones retenidas por las diferentes dimensiones (ejes) se puede extraer utilizando la función get_eigenvalue()[ paquete de factoextra ] de la siguiente manera:

library("factoextra")
eig.val <- get_eigenvalue(res.mca)

Para visualizar los porcentajes de inercia explicados por cada dimensión de MCA, use la función fviz_eig()o fviz_screeplot()[ paquete factoextra ]:

fviz_screeplot(res.mca, addlabels = TRUE, ylim = c(0, 45))

Biplot

La función fviz_mca_biplot()[ paquete factoextra ] se usa para dibujar el biplot de individuos y categorías de variables:

fviz_mca_biplot(res.mca, 
               repel = TRUE, # Avoid text overlapping (slow if many point)
               ggtheme = theme_minimal())

El gráfico anterior muestra un patrón global dentro de los datos. Las filas (individuos) están representadas por puntos azules y las columnas (categorías variables) por triángulos rojos.

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

Gráfica de variables

Resultados

La función get_mca_var()[in factoextra ] se utiliza para extraer los resultados de las categorías de variables. Esta función devuelve una lista que contiene las coordenadas, el cos2 y la contribución de las categorías de variables:

var <- get_mca_var(res.mca)
var
## Multiple Correspondence Analysis Results for variables
##  ===================================================
##   Name       Description                  
## 1 "$coord"   "Coordinates for categories" 
## 2 "$cos2"    "Cos2 for categories"        
## 3 "$contrib" "contributions of categories"

Los componentes de get_mca_var()se pueden utilizar en el gráfico de filas de la siguiente manera:

  • var$coord: coordenadas de variables para crear un diagrama de dispersión
  • var$cos2: representa la calidad de la representación de las variables en el mapa de factores.
  • var$contrib: contiene las contribuciones (en porcentaje) de las variables a la definición de las dimensiones.

Correlación entre variables y dimensiones principales

Para visualizar la correlación entre las variables y las dimensiones principales de MCA, escriba esto:

fviz_mca_var(res.mca, choice = "mca.cor", 
            repel = TRUE, # Avoid text overlapping (slow)
            ggtheme = theme_minimal())

Coordenadas de categorías de variables

El código R a continuación muestra las coordenadas de cada categoría de variable en cada dimensión (1, 2 y 3):

head(round(var$coord, 2), 4)
##          Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Nausea_n  0.27  0.12 -0.27  0.03  0.07
## Nausea_y -0.96 -0.43  0.95 -0.12 -0.26
## Vomit_n   0.48 -0.41  0.08  0.27  0.05
## Vomit_y  -0.72  0.61 -0.13 -0.41 -0.08

Utilice la función fviz_mca_var()[in factoextra ] para visualizar solo categorías de variables:

fviz_mca_var(res.mca, 
             repel = TRUE, # Avoid text overlapping (slow)
             ggtheme = theme_minimal())

Es posible cambiar el color y la forma de los puntos variables usando los argumentos col.vary de la shape.varsiguiente manera:

fviz_mca_var(res.mca, col.var="black", shape.var = 15,
             repel = TRUE)

El gráfico anterior muestra las relaciones entre las categorías de variables. Se puede interpretar de la siguiente manera:

Las categorías de variables con un perfil similar se agrupan. Las categorías de variables correlacionadas negativamente se colocan en lados opuestos del origen de la trama (cuadrantes opuestos). La distancia entre los puntos de categoría y el origen mide la calidad de la categoría de variable en el mapa de factores. Los puntos de categoría que están lejos del origen están bien representados en el mapa de factores.

Calidad de representación de categorías de variables

Las dos dimensiones 1 y 2 son suficientes para retener el 46% de la inercia total (variación) contenida en los datos. No todos los puntos se muestran igualmente bien en las dos dimensiones.

La calidad de la representación se denomina coseno al cuadrado (cos2), que mide el grado de asociación entre categorías de variables y un eje en particular. El cos2 de las categorías de variables se puede extraer de la siguiente manera:

head(var$cos2, 4)
##              Dim 1      Dim 2      Dim 3       Dim 4       Dim 5
## Nausea_n 0.2562007 0.05280258 0.25274850 0.004084375 0.019466197
## Nausea_y 0.2562007 0.05280258 0.25274850 0.004084375 0.019466197
## Vomit_n  0.3442016 0.25116039 0.01070855 0.112294813 0.004126898
## Vomit_y  0.3442016 0.25116039 0.01070855 0.112294813 0.004126898

Si una categoría de variable está bien representada por dos dimensiones, la suma del cos2 se cierra a uno. Para algunos de los elementos de la fila, se requieren más de 2 dimensiones para representar perfectamente los datos.

Es posible colorear las categorías de variables por sus valores de cos2 usando el argumento col.var = “cos2”. Esto produce un degradado de colores, que se puede personalizar mediante el argumento gradient.cols. Por ejemplo, gradient.cols = c(“white”, “blue”, “red”)significa que:

  • las categorías de variables con valores bajos de cos2 se colorearán en “blanco”
  • las categorías de variables con valores medios de cos2 se colorearán en “azul”
  • las categorías de variables con valores altos de cos2 se colorearán en “rojo”
# Color by cos2 values: quality on the factor map
fviz_mca_var(res.mca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE, # Avoid text overlapping
             ggtheme = theme_minimal())

Tenga en cuenta que también es posible cambiar la transparencia de las categorías de variables de acuerdo con sus valores de cos2 usando la opción alpha.var = “cos2”. Por ejemplo, escriba esto:

# Change the transparency by cos2 values
fviz_mca_var(res.mca, alpha.var="cos2",
             repel = TRUE,
             ggtheme = theme_minimal())

Puede visualizar el cos2 de las categorías de filas en todas las dimensiones usando el paquete corrplot:

library("corrplot")
corrplot(var$cos2, is.corr=FALSE)

También es posible crear un diagrama de barras de la variable cos2 usando la función fviz_cos2()[in factoextra ]:

# Cos2 of variable categories on Dim.1 and Dim.2
fviz_cos2(res.mca, choice = "var", axes = 1:2)

Contribución de las categorías de variables a las dimensiones

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

head(round(var$contrib,2), 4)
##          Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Nausea_n  1.52  0.81  4.67  0.08  0.49
## Nausea_y  5.43  2.91 16.73  0.30  1.76
## Vomit_n   3.73  7.07  0.36  4.26  0.19
## Vomit_y   5.60 10.61  0.54  6.39  0.29

Las categorías de variables con mayor valor son las que más contribuyen a la definición de las dimensiones. Las categorías de variables que más contribuyen a Dim.1 y Dim.2 son las más importantes para explicar la variabilidad en el conjunto de datos.

La función fviz_contrib()[paquete factoextra] se puede utilizar para dibujar un diagrama de barras de la contribución de las categorías de variables. El código R a continuación muestra las 15 categorías de variables principales que contribuyen a las dimensiones:

# Contributions of rows to dimension 1
fviz_contrib(res.mca, choice = "var", axes = 1, top = 15)

# Contributions of rows to dimension 2
fviz_contrib(res.mca, choice = "var", axes = 2, top = 15)

Las contribuciones totales a las dimensiones 1 y 2 se obtienen de la siguiente manera:

# Total contribution to dimension 1 and 2
fviz_contrib(res.mca, choice = "var", axes = 1:2, top = 15)

La línea roja discontinua en el gráfico anterior indica el valor promedio esperado, si las contribuciones fueran uniformes. El cálculo del valor de contribución esperado, bajo hipótesis nula, se ha detallado en el capítulo de análisis de componentes principales.

Se puede ver que:

las categorías Abdo_n, Diarrhea_n, Fever_n y Mayo_n son las más importantes en la definición de la primera dimensión. - Las categorías Courg_n, Potato_n, Vomit_y y Icecream_n contribuyen más a la dimensión 2 - Las categorías de variables más importantes (o contribuyentes) se pueden resaltar en el diagrama de dispersión de la siguiente manera:

fviz_mca_var(res.mca, col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE, # avoid text overlapping (slow)
             ggtheme = theme_minimal()
             )

La gráfica de arriba da una idea de a qué polo de las dimensiones están contribuyendo realmente las categorías.

Es evidente que las categorías Abdo_n, Diarrea_n, Fiebre_n y Mayo_n tienen una contribución importante al polo positivo de la primera dimensión, mientras que las categorías Fiebre_y y Diarrea_y tienen una mayor contribución al polo negativo de la primera dimensión; etc,….

Tenga en cuenta que también es posible controlar la transparencia de las categorías de variables de acuerdo con sus valores de contribución usando la opción alpha.var = “contrib”. Por ejemplo, escriba esto:

# Change the transparency by contrib values
fviz_mca_var(res.mca, alpha.var="contrib",
             repel = TRUE,
             ggtheme = theme_minimal())

Gráfica de individuos

La función get_mca_ind()[in factoextra ] se utiliza para extraer los resultados de los individuos. Esta función devuelve una lista que contiene las coordenadas, el cos2 y las contribuciones de los individuos:

ind <- get_mca_ind(res.mca)
ind
## Multiple Correspondence Analysis Results for individuals
##  ===================================================
##   Name       Description                       
## 1 "$coord"   "Coordinates for the individuals" 
## 2 "$cos2"    "Cos2 for the individuals"        
## 3 "$contrib" "contributions of the individuals"

Parcelas: calidad y contribución

La función fviz_mca_ind()[in factoextra ] se usa para visualizar solo individuos. Al igual que las categorías de variables, también es posible colorear a los individuos por sus valores de cos2:

fviz_mca_ind(res.mca, col.ind = "cos2", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE, # Avoid text overlapping (slow if many points)
             ggtheme = theme_minimal())

El siguiente código R crea gráficos de barras de los individuos cos2 y contribuciones:

# Cos2 of individuals
fviz_cos2(res.mca, choice = "ind", axes = 1:2, top = 20)

# Contribution of individuals to the dimensions
fviz_contrib(res.mca, choice = "ind", axes = 1:2, top = 20)

Colorea a los individuos por grupos

El siguiente código R colorea a los individuos por grupos usando los niveles de la variable Vomiting. El argumento habillagese utiliza para especificar la variable de factor para colorear a los individuos por grupos. También se puede agregar una elipse de concentración alrededor de cada grupo usando el argumento addEllipses = TRUE. Si desea una elipse de confianza alrededor del punto medio de las categorías, use ellipse.type = “confidence”El argumento palettese usa para cambiar los colores del grupo.

fviz_mca_ind(res.mca, 
             label = "none", # hide individual labels
             habillage = "Vomiting", # color by groups 
             palette = c("#00AFBB", "#E7B800"),
             addEllipses = TRUE, ellipse.type="convex",
             ggtheme = theme_minimal()) 

Tenga en cuenta que, para especificar el valor del argumento habillage, también es posible utilizar el índice de la columna como sigue ( habillage = 2). Además, puede proporcionar una variable de agrupación externa de la siguiente manera: habillage = poison$Vomiting. Por ejemplo:

# habillage = index of the column to be used as grouping variable
fviz_mca_ind(res.mca, habillage = 2, addEllipses = TRUE)

Si desea colorear individuos usando múltiples variables categóricas al mismo tiempo, use la función fviz_ellipses () [in factoextra ] de la siguiente manera:

fviz_ellipses(res.mca, c("Vomiting", "Fever"),
              geom = "point")

Alternativamente, puede especificar índices de variables categóricas:

fviz_ellipses(res.mca, 1:4, geom = "point")

Descripción de la dimensión

La función dimdesc()[en FactoMineR] se puede utilizar para identificar las variables más correlacionadas con una dimensión determinada:

res.desc <- dimdesc(res.mca, axes = c(1,2))
# Description of dimension 1
res.desc[[1]]
## $quali
##                   R2      p.value
## Abdominals 0.8451157 4.055640e-23
## Diarrhae   0.7994680 3.910776e-20
## Fever      0.7846788 2.600566e-19
## Mayo       0.3829749 4.756234e-07
## Vomiting   0.3442016 2.510738e-06
## Nausea     0.2562007 8.062777e-05
## Cheese     0.1944181 7.534834e-04
## 
## $category
##                       Estimate      p.value
## Abdominals=Abdo_n    0.5671866 4.055640e-23
## Diarrhae=Diarrhea_n  0.5380920 3.910776e-20
## Fever=Fever_n        0.5330918 2.600566e-19
## Mayo=Mayo_n          0.4644981 4.756234e-07
## Vomiting=Vomit_n     0.3466915 2.510738e-06
## Nausea=Nausea_n      0.3547892 8.062777e-05
## Cheese=Cheese_n      0.3830043 7.534834e-04
## Cheese=Cheese_y     -0.3830043 7.534834e-04
## Nausea=Nausea_y     -0.3547892 8.062777e-05
## Vomiting=Vomit_y    -0.3466915 2.510738e-06
## Mayo=Mayo_y         -0.4644981 4.756234e-07
## Fever=Fever_y       -0.5330918 2.600566e-19
## Diarrhae=Diarrhea_y -0.5380920 3.910776e-20
## Abdominals=Abdo_y   -0.5671866 4.055640e-23
## 
## attr(,"class")
## [1] "condes" "list"
# Description of dimension 2
res.desc[[2]]
## $quali
##                  R2      p.value
## Courgette 0.4464145 2.500166e-08
## Potato    0.3957543 2.690662e-07
## Vomiting  0.2511604 9.728027e-05
## Icecream  0.1409011 4.743927e-03
## 
## $category
##                       Estimate      p.value
## Courgette=Courg_n    0.4176013 2.500166e-08
## Potato=Potato_y      0.4977523 2.690662e-07
## Vomiting=Vomit_y     0.1838104 9.728027e-05
## Icecream=Icecream_n  0.2597197 4.743927e-03
## Icecream=Icecream_y -0.2597197 4.743927e-03
## Vomiting=Vomit_n    -0.1838104 9.728027e-05
## Potato=Potato_n     -0.4977523 2.690662e-07
## Courgette=Courg_y   -0.4176013 2.500166e-08
## 
## attr(,"class")
## [1] "condes" "list"

Para más información consultar Aquí