Chapter 7

Análisis de factores múltiples

7.1 Introducción

El análisis factorial múltiple (MFA) (J. Pagès 2002) es un método de análisis de datos multivariante para resumir y visualizar una tabla de datos compleja en la que los individuos se describen mediante varios conjuntos de variables (cuantitativas y/o cualitativas) estructuradas en grupos. Tiene en cuenta la contribución de todos los grupos activos de variables para definir la distancia entre individuos.

El número de variables en cada grupo puede diferir y la naturaleza de las variables (cualitativas o cuantitativas) puede variar de un grupo a otro, pero las variables deben ser de la misma naturaleza en un grupo determinado (Abdi y Williams 2010).

En el capítulo actual, mostramos cómo calcular y visualizar el análisis de factores múltiples en el software R utilizando FactoMineR (para el análisis) y factoextra (para la visualización de datos). Además, mostraremos cómo revelar las variables más importantes que más contribuyen a explicar las variaciones en el conjunto de datos.

8.2 Cálculo

8.2.1 Paquetes R

Instale FactoMineR y factoextra de la siguiente manera:

install.packages(c("FactoMineR", "factoextra"))
## Installing packages into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)

Cargue los paquetes:

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

7.2.2 Formato de datos

Usaremos los conjuntos de datos de demostración disponibles en el paquete FactoMineR. Este conjunto de datos se trata de una evaluación sensorial de los vinos por parte de diferentes jueces.

library("FactoMineR")
data(wine)
colnames(wine)
##  [1] "Label"                         "Soil"                         
##  [3] "Odor.Intensity.before.shaking" "Aroma.quality.before.shaking" 
##  [5] "Fruity.before.shaking"         "Flower.before.shaking"        
##  [7] "Spice.before.shaking"          "Visual.intensity"             
##  [9] "Nuance"                        "Surface.feeling"              
## [11] "Odor.Intensity"                "Quality.of.odour"             
## [13] "Fruity"                        "Flower"                       
## [15] "Spice"                         "Plante"                       
## [17] "Phenolic"                      "Aroma.intensity"              
## [19] "Aroma.persistency"             "Aroma.quality"                
## [21] "Attack.intensity"              "Acidity"                      
## [23] "Astringency"                   "Alcohol"                      
## [25] "Balance"                       "Smooth"                       
## [27] "Bitterness"                    "Intensity"                    
## [29] "Harmony"                       "Overall.quality"              
## [31] "Typical"

7.2.3 Código R

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

El siguiente código R realiza el MFA en los datos de los vinos utilizando los grupos: olor, visual, olor después de agitar y sabor. Estos grupos se denominan grupos activos. El grupo restante de variables - origen (el primer grupo) y juicio general (el sexto grupo) - se denominan grupos complementarios; num.grupo.sup = c(1, 6):

library(FactoMineR)
data(wine)
res.mfa <- MFA(wine,
              group = c(2, 5, 3, 10, 9, 2),
              type = c("n", "s", "s", "s", "s", "s"),
              name.group = c("origin","odor","visual", "odor.after.shaking", "taste", "overall"),
              num.group.sup = c(1, 6),
              graph = FALSE)

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

print(res.mfa)
## **Results of the Multiple Factor Analysis (MFA)**
## The analysis was performed on 21 individuals, described by 31 variables
## *Results are available in the following objects :
## 
##    name                 description                                           
## 1  "$eig"               "eigenvalues"                                         
## 2  "$separate.analyses" "separate analyses for each group of variables"       
## 3  "$group"             "results for all the groups"                          
## 4  "$partial.axes"      "results for the partial axes"                        
## 5  "$inertia.ratio"     "inertia ratio"                                       
## 6  "$ind"               "results for the individuals"                         
## 7  "$quanti.var"        "results for the quantitative variables"              
## 8  "$quanti.var.sup"    "results for the quantitative supplementary variables"
## 9  "$quali.var.sup"     "results for the categorical supplementary variables" 
## 10 "$summary.quanti"    "summary for the quantitative variables"              
## 11 "$summary.quali"     "summary for the categorical variables"               
## 12 "$global.pca"        "results for the global PCA"

7.3 Visualización e interpretación

Usaremos el paquete factoextra R para ayudar en la interpretación y visualización del análisis de múltiples factores. Se utilizarán las siguientes funciones [en paquete factoextra]: get_eigenvalue(res.mfa): extrae los valores propios/varianzas retenidos por cada dimensión (eje). fviz_eig(res.mfa): Visualiza los valores propios/varianzas. get_mfa_ind(res.mfa): extrae los resultados para individuos. get_mfa_var(res.mfa): Extrae los resultados para variables cuantitativas y cualitativas, así como para grupos de variables. fviz_mfa_ind(res.mfa), fviz_mfa_var(res.mfa): Visualice los resultados para individuos y variables, respectivamente. En las siguientes secciones, ilustraremos cada una de estas funciones.

8.3.1 Valores propios / Varianzas

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

library("factoextra")
eig.val <- get_eigenvalue(res.mfa)
head(eig.val)
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  3.4619504        49.378382                    49.37838
## Dim.2  1.3667683        19.494446                    68.87283
## Dim.3  0.6154291         8.777969                    77.65080
## Dim.4  0.3721997         5.308747                    82.95954
## Dim.5  0.2703825         3.856511                    86.81605
## Dim.6  0.2024033         2.886912                    89.70297

La función fviz_eig() o fviz_screeplot() [paquete factoextra] se puede utilizar para dibujar el gráfico de pantalla:

fviz_screeplot(res.mfa)

Figura 1: Lo anterior representa un gráfico de sedimentación en el cual podemos ver que en la dimension # 1 se tuvo el porcentaje mas alto (50%), asimismo, el mas bajo fue en la dimension # 10 en la cual fue de aproximadamente de 3%. Ademas de que la figura va decreciendo.

7.3.2 Gráfico de variables

7.3.2.1 Grupos de variables

La función get_mfa_var() [de facto extra] se utiliza para extraer los resultados de grupos de variables. Esta función devuelve una lista que contiene las coordenadas, el cos2 y la contribución de los grupos, así como la

group <- get_mfa_var(res.mfa, "group")
group
## Multiple Factor Analysis results for variable groups 
##  ===================================================
##   Name           Description                                          
## 1 "$coord"       "Coordinates"                                        
## 2 "$cos2"        "Cos2, quality of representation"                    
## 3 "$contrib"     "Contributions"                                      
## 4 "$correlation" "Correlation between groups and principal dimensions"

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

# Coordinates of groups
head(group$coord)
##                        Dim.1      Dim.2      Dim.3      Dim.4      Dim.5
## odor               0.7820738 0.61977283 0.37353451 0.17260092 0.08553276
## visual             0.8546846 0.04014481 0.01438360 0.04550736 0.02966750
## odor.after.shaking 0.9247734 0.46892047 0.18009116 0.10139051 0.11589439
## taste              0.9004187 0.23793016 0.04741982 0.05270088 0.03928784
# Cos2: quality of representation on the factore map
head(group$cos2)
##                        Dim.1       Dim.2        Dim.3       Dim.4        Dim.5
## odor               0.3799491 0.238613517 0.0866745169 0.018506155 0.0045445922
## visual             0.7284016 0.001607007 0.0002062976 0.002065011 0.0008776492
## odor.after.shaking 0.6245535 0.160582210 0.0236855692 0.007507471 0.0098089810
## taste              0.7222292 0.050429542 0.0020031144 0.002474125 0.0013749986
# Contributions to the dimensions
head(group$contrib)
##                       Dim.1     Dim.2     Dim.3    Dim.4    Dim.5
## odor               22.59055 45.345861 60.694972 46.37321 31.63399
## visual             24.68795  2.937207  2.337166 12.22660 10.97242
## odor.after.shaking 26.71250 34.308703 29.262699 27.24089 42.86313
## taste              26.00900 17.408230  7.705163 14.15930 14.53047

Para trazar los grupos de variables, escriba esto:

fviz_mfa_var(res.mfa, "group")

Figura 2: -color rojo = grupos activos de variables -color verde = grupos suplementarios de variables El gráfico anterior ilustra la correlación entre grupos y dimensiones. Las coordenadas de los cuatro grupos activos en la primera dimensión son casi idénticas. Esto significa que contribuyen de manera similar a la primera dimensión. Con respecto a la segunda dimensión, los dos grupos -olor y olor después del batido- tienen las coordenadas más altas que indican una contribución más alta a la segunda dimensión.

Para dibujar un gráfico de barras de la contribución de los grupos a las dimensiones, use la función fviz_contrib():

# Contribution to the first dimension
fviz_contrib(res.mfa, "group", axes = 1)

# Contribution to the second dimension
fviz_contrib(res.mfa, "group", axes = 2)

Figura 3: esta figura representa un diagrama de barras en el cual podemos ver las contribuciones en porcentajes de diferentes cosas, tales como: odor.after.shaking o odor… entre otro. Ademas, podemos decir que la primera ftuvo de 25%, mientras que la ultima fue de 21% aproximadamente y que solo dos barras passaron la linea roja.

7.3.2.2 Variables cuantitativas

La función get_mfa_var() [de facto extra] se utiliza para extraer los resultados de las variables cuantitativas. Esta función devuelve una lista que contiene las coordenadas, el cos2 y la contribución de las variables:

quanti.var <- get_mfa_var(res.mfa, "quanti.var")
quanti.var
## Multiple Factor Analysis results for quantitative variables 
##  ===================================================
##   Name       Description                      
## 1 "$coord"   "Coordinates"                    
## 2 "$cos2"    "Cos2, quality of representation"
## 3 "$contrib" "Contributions"

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

# Coordinates
head(quanti.var$coord)
##                                   Dim.1       Dim.2       Dim.3      Dim.4
## Odor.Intensity.before.shaking 0.5908036  0.66723783 -0.02326175  0.3287015
## Aroma.quality.before.shaking  0.8352510 -0.07539908 -0.35417877  0.1414425
## Fruity.before.shaking         0.7160259 -0.15069626 -0.53748761  0.2517063
## Flower.before.shaking         0.4387181 -0.40937751  0.63731284  0.4029075
## Spice.before.shaking          0.0380525  0.86501993  0.12795122 -0.1822298
## Visual.intensity              0.8811873  0.23833245  0.14099033 -0.2128871
##                                     Dim.5
## Odor.Intensity.before.shaking  0.05786231
## Aroma.quality.before.shaking   0.04992114
## Fruity.before.shaking          0.18981578
## Flower.before.shaking          0.12200773
## Spice.before.shaking           0.36741971
## Visual.intensity              -0.17676282
# Cos2: quality on the factore map
head(quanti.var$cos2)
##                                     Dim.1       Dim.2       Dim.3      Dim.4
## Odor.Intensity.before.shaking 0.349048863 0.445206325 0.000541109 0.10804466
## Aroma.quality.before.shaking  0.697644264 0.005685021 0.125442602 0.02000597
## Fruity.before.shaking         0.512693037 0.022709361 0.288892928 0.06335608
## Flower.before.shaking         0.192473567 0.167589944 0.406167661 0.16233443
## Spice.before.shaking          0.001447992 0.748259477 0.016371514 0.03320769
## Visual.intensity              0.776491025 0.056802358 0.019878273 0.04532093
##                                     Dim.5
## Odor.Intensity.before.shaking 0.003348047
## Aroma.quality.before.shaking  0.002492121
## Fruity.before.shaking         0.036030029
## Flower.before.shaking         0.014885886
## Spice.before.shaking          0.134997242
## Visual.intensity              0.031245096
# Contributions to the dimensions
head(quanti.var$contrib)
##                                    Dim.1      Dim.2       Dim.3     Dim.4
## Odor.Intensity.before.shaking 4.49733206 14.5296787  0.03921898 12.948424
## Aroma.quality.before.shaking  8.98882147  0.1855354  9.09194110  2.397581
## Fruity.before.shaking         6.60581103  0.7411389 20.93864000  7.592798
## Flower.before.shaking         2.47993227  5.4694372 29.43858302 19.454686
## Spice.before.shaking          0.01865671 24.4200703  1.18658923  3.979718
## Visual.intensity              7.91221841  1.4660681  1.13941864  4.295418
##                                    Dim.5
## Odor.Intensity.before.shaking  0.5523351
## Aroma.quality.before.shaking   0.4111309
## Fruity.before.shaking          5.9439566
## Flower.before.shaking          2.4557588
## Spice.before.shaking          22.2708049
## Visual.intensity               4.0764862

Correlación entre variables cuantitativas y dimensiones. El siguiente código R traza variables cuantitativas coloreadas por grupos. La paleta de argumentos se usa para cambiar los colores del grupo (consulte ?ggpubr::ggpar para obtener más información sobre la paleta). Las variables cuantitativas complementarias están en flecha discontinua y color violeta. Usamos repel = TRUE, para evitar la superposición de texto.

fviz_mfa_var(res.mfa, "quanti.var", palette = "jco",
col.var.sup = "violet", repel = TRUE)

Figura 4 : la figura es una variable cuantitativa donde logramos ver las dimensiones de unos porcentajes de diferentes grupos

Para que la trama sea más legible, podemos usar geom = c(“punto”, “texto”) en lugar de geom = c(“flecha”, “texto”). Cambiaremos también la posición de la leyenda de “derecha” a “abajo”, usando el argumento leyenda = “abajo”:

fviz_mfa_var(res.mfa, "quanti.var", palette = "jco",
col.var.sup = "violet", repel = TRUE,
geom = c("point", "text"), legend = "bottom")

Figura 5: Brevemente, el gráfico de variables (círculo de correlación) muestra la relación entre variables, la calidad de la representación de las variables, así como, la correlación entre las variables y las dimensiones: Las variables correlacionadas positivas se agrupan, mientras que las negativas se colocan en lados opuestos del origen del gráfico (cuadrantes opuestos). La distancia entre los puntos de la variable y el origen mide la calidad de la variable en el mapa de factores. Los puntos variables que están alejados del origen están bien representados en el mapa de factores. Para una dimensión dada, las variables más correlacionadas con la dimensión están cerca de la dimensión. Por ejemplo, la primera dimensión representa los sentimientos positivos sobre los vinos: “intensidad” y “armonía”. Las variables más correlacionadas a la segunda dimensión son:

  1. Especia antes de agitar e Intensidad de olor antes de agitar para el grupo de olores;
  2. Intensidad de especia, planta y olor para el grupo de olor después de agitar y
  3. Amargor para el grupo de sabor. Esta dimensión representa esencialmente el “picante” y la característica vegetal debida al olfato. La contribución de las variables cuantitativas (en %) a la definición de las dimensiones se puede visualizar mediante la función fviz_contrib() [paquete factoextra]. Las variables están coloreadas por grupos.

El siguiente código R muestra las 20 principales categorías de variables que contribuyen a las dimensiones:

# Contributions to dimension 1
fviz_contrib(res.mfa, choice = "quanti.var", axes = 1, top = 20,
palette = "jco")

Figura 6: Es una variable cuantitativa donde cada color es un grupo diferente mostrando el porcentaje de contribucion, logramos observar una disminucion.

# Contributions to dimension 2
fviz_contrib(res.mfa, choice = "quanti.var", axes = 2, top = 20,
palette = "jco")

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

Las variables cuantitativas que más contribuyen se pueden resaltar en el diagrama de dispersión usando el argumento col.var = “contrib”. Esto produce colores degradados, que se pueden personalizar usando el argumento gradiente.cols

fviz_mfa_var(res.mfa, "quanti.var", col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
col.var.sup = "violet", repel = TRUE,
geom = c("point", "text"))

Figura 8: El diagrama anterior representa una variable cuantitativa, asimismo, tenemos los datos expresados en porcentajes de diferentes cosas. Cada color representa el numero de contribuciones y el lugar donde esten posicionados tambien influye.

De manera similar, puede resaltar variables cuantitativas utilizando sus valores cos2 que representan la calidad de representación en el mapa de factores. Si una variable está bien representada por dos dimensiones, la suma de los cos2 se cierra a uno. Para algunos de los elementos de la fila, es posible que se requieran más de 2 dimensiones para representar perfectamente los datos.

# Color by cos2 values: quality on the factor map
fviz_mfa_var(res.mfa, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
col.var.sup = "violet", repel = TRUE)

Figura 9: El diagrama anterior representa una variable cuantitativa, asimismo, tenemos los datos expresados en porcentajes de diferentes cosas. Cada color representa el numero de contribuciones y el lugar donde esten posicionados tambien influye.

Para crear un gráfico de barras de variables cos2, escriba esto:

fviz_cos2(res.mfa, choice = "quanti.var", axes = 1)

Figura 10: se muestra un diagrama de co2 de variables cuantitativas que esta disminuyendo , logramos observar un cos2 de representacion de cualidad mayor para surface.feeling y el menor es spice .before .shaking

7.3.3 Gráfica de individuos

Para obtener los resultados de las personas, escriba esto:

ind <- get_mfa_ind(res.mfa)
ind
## Multiple Factor Analysis results for individuals 
##  ===================================================
##   Name                      Description                      
## 1 "$coord"                  "Coordinates"                    
## 2 "$cos2"                   "Cos2, quality of representation"
## 3 "$contrib"                "Contributions"                  
## 4 "$coord.partiel"          "Partial coordinates"            
## 5 "$within.inertia"         "Within inertia"                 
## 6 "$within.partial.inertia" "Within partial inertia"

Para graficar individuos, use la función fviz_mfa_ind() [de hecho extra]. De forma predeterminada, las personas se colorean en azul. Sin embargo, al igual que las variables, también es posible colorear a los individuos por sus valores de cos2:

fviz_mfa_ind(res.mfa, col.ind = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)

Figura 11: muestra las dimensiones individuales del mfa del cos , el 0.75 tuvo un porcentaje mayor al 3 y positivo y entre el 0,50 tuvo un porcentaje negativo menor a -1

Los individuos con perfiles similares están cerca unos de otros en el mapa de factores. El primer eje, contrapone principalmente el vino 1DAM y, los vinos 1VAU y 2ING. Como se ha descrito en el apartado anterior, la primera dimensión representa la armonía y la intensidad de los vinos. Así, el vino 1DAM (coordenadas positivas) fue evaluado como el más “intenso” y “armonioso” a diferencia de los vinos 1VAU y 2ING (coordenadas negativas) que son los menos “intensos” y “armoniosos”. El segundo eje está esencialmente asociado con los dos vinos T1 y T2 caracterizados por un fuerte valor de las variables Spice.before.shaking y En el gráfico anterior, las categorías de variables cualitativas complementarias se muestran en negro. Env1, Env2, Env3 son las categorías del suelo. Saumur, Bourgueuil y Chinon son las categorías de la Etiqueta del vino. Si no desea mostrarlos en el gráfico, use el argumento invisible = “quali.var”.

Intensidad.del.olor.antes.de.agitar. La mayoría de las categorías de variables cualitativas complementarias están cerca del origen del mapa Este resultado indica que las categorías en cuestión no están relacionadas con el primer eje (vino “intensidad” y “armonía”) o el segundo eje (vino T1 y T2). La categoría Env4 tiene coordenadas altas en el segundo eje relacionado con T1 y T2. Se sabe que la categoría “Referencia” está relacionada con un excelente productor de vino.

suelo. Como era de esperar, nuestro análisis demuestra que la categoría “Referencia” tiene coordenadas altas en el primer eje, lo que se correlaciona positivamente con la “intensidad” y la “armonía” de los vinos.

fviz_mfa_ind(res.mfa,
habillage = "Label", # color by groups
palette = c("#00AFBB", "#E7B800", "#FC4E07"),
addEllipses = TRUE, ellipse.type = "confidence",
repel = TRUE # Avoid text overlapping
)

Figura 12: En el grafico anterior podemos ver diferentes figuras con diversos colores que representan una etiqueta, es decir, que por ejemplo: La figura que tenga el color naranja representara a “Chinon”, ademas de que podemos obtener datos de ellas.

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

fviz_ellipses(res.mfa, c("Label", "Soil"), repel = TRUE)
## Warning: `gather_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `gather()` instead.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Figura 13: Los graficos anteiores representan mapas de factores pero el que se encuentra a la izquierda es para “etiqueta” y el segundo en cambio es para “suelo”.

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

7.3.4 Gráfico de individuos parciales

Los resultados para individuos obtenidos del análisis realizado con un solo grupo se denominan individuos parciales. En otras palabras, un individuo considerado desde el punto de vista de un solo grupo se llama individuo parcial. En la gráfica fviz_mfa_ind() predeterminada, para un individuo dado, el punto corresponde al individuo medio o al centro de gravedad de los puntos parciales del individuo. Es decir, el individuo visto por todos los grupos de variables. Para un individuo dado, hay tantos puntos parciales como grupos de variables. La gráfica de individuos parciales representa cada vino visto por cada grupo y su baricentro. Para trazar los puntos parciales de todos los individuos, escriba esto:

fviz_mfa_ind(res.mfa, partial = "all")

Figura 14: El color rojo representa los vinos vistos solo por las variables de olor; el color violeta representa los vinos vistos solo por las variables visuales, y así sucesivamente.

fviz_mfa_ind(res.mfa, partial = c("1DAM", "1VAU", "2ING"))

Figura 15: El color rojo representa los vinos vistos solo por las variables de olor; el color violeta representa los vinos vistos solo por las variables visuales, y así sucesivamente. El vino 1DAM ha sido descrito en el apartado anterior como especialmente “intenso” y “armonioso”, en particular por el grupo olfativo: Tiene una coordenada alta en el primer eje desde el punto de vista del grupo de variables olfativas respecto al punto de vista de los otros grupos. Desde el punto de vista del grupo de olor, 2ING fue más “intenso” y “armonioso” que 1VAU pero desde el punto de vista del grupo de sabor, 1VAU fue más “intenso” y “armonioso” que 2ING.

7.3.5 Gráfico de ejes parciales

El gráfico de ejes parciales muestra la relación entre los ejes principales del MFA y los que se obtienen al analizar cada grupo mediante un PCA (para grupos de variables continuas) o un MCA (para variables cualitativas).

fviz_mfa_axes(res.mfa)

Figura 16: El grafico anterior representa ejes parciales, en el cual se tiene un plano cartesiano que tiene en el centro una figura circular, la cual contiene adentro diferentes flechas ue son grupos y puntas hacia una direccion (positiva o negativa), la cual les arrojara su valor (en porcentaje).

7.4 Resumen

El análisis factorial múltiple (MFA) hace posible analizar individuos caracterizados por múltiples conjuntos de variables. En este artículo, describimos cómo realizar e interpretar MFA utilizando los paquetes FactoMineR y factoextra R.