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
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
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"
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
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.
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
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)
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
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
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
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
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)
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()