Introdução à Análise de Correspondência
Análise Correspondência
Variáveis nominais
Análise Multivariada
Introdução
Você não precisa usar o R… pode usar o Python também.
Análise de Correspondência
A análise de correspondência (CA) é uma técnicas multivariadas que nos ajudam a resumir os padrões sistemáticos de variações nos dados. A concepção geral é semelhante à análise de componentes principais, diferenciando-se desta, entre outros aspectos, por permitir a inclusão de variáveis qualitativas (ou dados categóricos). Como a análise de componentes principais, ela fornece uma solução para resumir e visualizar o conjunto de dados em gráficos de duas dimensões.
Como no análise de componentes principais, os autovalores fornecem informações sobre a variabilidade nos dados. As coordenadas da linha fornecem informações sobre a estrutura das linhas na tabela analisada. As coordenadas da coluna fornecem informações sobre a estrutura das colunas na tabela analisada.
Os dados
Usaremos o banco de dados author que já vem com o pacote “ca”. É uma matriz de dados que contém as contagens das 26 letras do alfabeto (colunas da matriz) para 12 romances diferentes (linhas da matriz). Cada linha contém contagens de letras em uma amostra de texto de cada obra, excluindo nomes próprios.
library(ca)
package ‘ca’ was built under R version 4.0.2
# apply ca
data(author)
head(author)
## a b c d e f g h i j k l m
## three daughters (buck) 550 116 147 374 1015 131 131 493 442 2 52 302 159
## drifters (michener) 515 109 172 311 827 167 136 376 432 8 61 280 146
## lost world (clark) 590 112 181 265 940 137 119 419 514 6 46 335 176
## east wind (buck) 557 129 128 343 996 158 129 571 555 4 76 291 247
## farewell to arms (hemingway) 589 72 129 339 866 108 159 449 472 7 59 264 158
## sound and fury 7 (faulkner) 541 109 136 228 763 126 129 401 520 5 72 280 209
## n o p q r s t u v w x y z
## three daughters (buck) 534 516 115 4 409 467 632 174 66 155 5 150 3
## drifters (michener) 470 561 140 4 368 387 632 195 60 156 14 137 5
## lost world (clark) 403 505 147 8 395 464 670 224 113 146 13 162 10
## east wind (buck) 479 509 92 3 413 533 632 181 68 187 10 184 4
## farewell to arms (hemingway) 504 542 95 0 416 314 691 197 64 225 1 155 2
## sound and fury 7 (faulkner) 471 589 84 2 324 454 672 247 71 160 11 280 1
Para fazer o Análise de Correspondência, precisamos:
# apply ca
ca1 <-ca(author)
# sqrt of eigenvalues
ca1$sv
## [1] 0.08754348 0.06073157 0.04910398 0.03718655 0.03164900 0.02689484
## [7] 0.02566321 0.02132718 0.01933685 0.01621904 0.01063892
plot(ca1)
Podemos usar também o pacote amap
library(amap)
# apply CA
ca2 <- afc(author)
# eigenvalues
ca2$eig
## [1] 0.1841506355308312 0.1345567686719785 0.1035679129627933 0.0874399854189873
## [5] 0.0620715229449494 0.0346987842026542 0.0346987842026542 0.0298474931530984
## [9] 0.0298474931530984 0.0241898038331218 0.0177074035132544 0.0042882697696728
## [13] 0.0000000020341526 0.0000000004690142 0.0000000004690142 0.0000000009408433
## [17] 0.0000000006619892 0.0000000006619892 0.0000000003302806 0.0000000003302806
## [21] 0.0000000007660766 0.0000000003776303 0.0000000003776303 0.0000000001918946
## [25] 0.0000000001918946 0.0000000001337226
# column coordinates
head(ca2$loadings)
## Comp 1 Comp 2 Comp 3 Comp 4 Comp 5 Comp 6
## a 0.003021805 0.020612471 0.061491650 0.06195169 0.05277265 0.043411228
## b -0.092480077 0.008900985 -0.091344746 -0.07466805 -0.08659821 -0.022568685
## c -0.178709976 0.055824156 0.098703814 0.13197550 0.15376077 0.064301539
## d 0.073137989 0.003039285 0.156073522 -0.34173594 -0.29959159 0.269559733
## e -0.019220675 0.012044163 -0.002028131 -0.02438577 -0.18620776 0.007124395
## f -0.106716718 0.055965712 -0.071859158 0.04725359 -0.06634236 -0.096594194
## Comp 7 Comp 8 Comp 9 Comp 10 Comp 11 Comp 12
## a 0.043411228 -0.06499409 -0.06499409 0.07583377 0.06867065 -0.09411071
## b -0.022568685 -0.03961747 -0.03961747 0.08500085 0.10155707 0.28316254
## c 0.064301539 -0.15065932 -0.15065932 0.26829725 0.40200772 -0.01904581
## d 0.269559733 -0.19360223 -0.19360223 0.08524852 0.15203209 0.26842013
## e 0.007124395 0.04881236 0.04881236 -0.17417766 -0.11241046 -0.13982175
## f -0.096594194 0.07173540 0.07173540 0.19381495 0.06159557 0.28308605
## Comp 13 Comp 14 Comp 15 Comp 16 Comp 17 Comp 18
## a 0.20567775 0.4721497 0.4721497 -0.28537432 0.2721303 0.2721303
## b -0.03666870 -0.2146803 -0.2146803 0.11343296 -0.1243297 -0.1243297
## c 0.35904377 0.1226989 0.1226989 0.01781606 0.1082090 0.1082090
## d 0.03421843 -0.2049718 -0.2049718 -0.34190986 -0.3788812 -0.3788812
## e -0.07566568 0.1210939 0.1210939 -0.07270544 0.1265331 0.1265331
## f 0.02289783 -0.1099741 -0.1099741 -0.38805643 -0.2324474 -0.2324474
## Comp 19 Comp 20 Comp 21 Comp 22 Comp 23 Comp 24
## a -0.4497326 -0.4497326 -0.76830645 -0.42052797 -0.42052797 -0.17788618
## b 0.1913499 0.1913499 0.22611294 0.10290472 0.10290472 0.01092377
## c -0.1314393 -0.1314393 -0.01929074 -0.08109856 -0.08109856 -0.01783082
## d 0.3926394 0.3926394 0.11444973 0.22803928 0.22803928 -0.03366907
## e -0.1754112 -0.1754112 -0.06054662 -0.18622533 -0.18622533 -0.04366527
## f 0.2252146 0.2252146 0.04041559 0.21550164 0.21550164 0.15195986
## Comp 25 Comp 26
## a -0.17788618 0.24033710
## b 0.01092377 -0.07016318
## c -0.01783082 0.11983643
## d -0.03366907 -0.17323723
## e -0.04366527 0.09777100
## f 0.15195986 -0.16993857
# plot
plot(ca2)
O pacote FactoMineR faz o mesmo procedimento. Esse pacote fornece muitos resultados mais detalhados e ferramentas de avaliação.
# CA with function CA
library(FactoMineR)
# apply CA
ca3 <- CA(author, graph = FALSE)
# matrix with eigenvalues
ca3$eig
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.0076638606 40.9070362 40.90704
## dim 2 0.0036883237 19.6869956 60.59403
## dim 3 0.0024112012 12.8701577 73.46419
## dim 4 0.0013828392 7.3811169 80.84531
## dim 5 0.0010016592 5.3465103 86.19182
## dim 6 0.0007233324 3.8608981 90.05271
## dim 7 0.0006586002 3.5153798 93.56809
## dim 8 0.0004548486 2.4278243 95.99592
## dim 9 0.0003739137 1.9958218 97.99174
## dim 10 0.0002630573 1.4041087 99.39585
## dim 11 0.0001131866 0.6041507 100.00000
Visualização e interpretação
Vamos usar as seguintes funções [do pacote fatoextra] para ajudar na interpretação e na visualização da análise de correspondência:
- get_eigenvalue(res.ca): Extract the eigenvalues/variances retained by each dimension (axis)
- fviz_eig(res.ca): Visualize the eigenvalues
- get_ca_row(res.ca), get_ca_col(res.ca): Extract the results for rows and columns, respectively.
- fviz_ca_row(res.ca), fviz_ca_col(res.ca): Visualize the results for rows and columns, respectively.
- fviz_ca_biplot(res.ca): Make a biplot of rows and columns.
library("factoextra")
package ‘factoextra’ was built under R version 4.0.2
Carregando pacotes exigidos: ggplot2
package ‘ggplot2’ was built under R version 4.0.2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
eig.val <- get_eigenvalue(ca3)
eig.val
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 0.0076638606 40.9070362 40.90704
## Dim.2 0.0036883237 19.6869956 60.59403
## Dim.3 0.0024112012 12.8701577 73.46419
## Dim.4 0.0013828392 7.3811169 80.84531
## Dim.5 0.0010016592 5.3465103 86.19182
## Dim.6 0.0007233324 3.8608981 90.05271
## Dim.7 0.0006586002 3.5153798 93.56809
## Dim.8 0.0004548486 2.4278243 95.99592
## Dim.9 0.0003739137 1.9958218 97.99174
## Dim.10 0.0002630573 1.4041087 99.39585
## Dim.11 0.0001131866 0.6041507 100.00000
Os autovalores correspondem à quantidade de informações retidas por cada eixo. As dimensões são ordenadas decrescentemente e listadas de acordo com a quantidade de variação explicada na solução. A dimensão 1 explica a maior variação na solução, seguida pela dimensão 2 e assim por diante.
A porcentagem cumulativa explicada é obtida adicionando as proporções sucessivas de variação explicadas para obter o total corrente. Por exemplo, 40,9% mais 19,6% é igual a 60,59% e assim por diante. Portanto, cerca de 73,46% da variação é explicada pelas três primeiras dimensões.
Os autovalores podem ser usados para determinar o número de eixos a serem retidos. Não existe uma “regra de ouro” para escolher o número de dimensões. Depende da pergunta da pesquisa e da necessidade do pesquisador. Por exemplo, se você estiver satisfeito com 70% do total de variações explicadas, use o número de dimensões necessárias para conseguir isso.
Um método alternativo para determinar o número de dimensões é examinar o gráfico Screeplot, que é o gráfico de autovalores ordenados do maior para o menor. O número de componentes é determinado no ponto, além do qual os valores próprios restantes são todos relativamente pequenos e de tamanho comparável.
O gráfico screeplot pode ser produzido usando a função fviz_eig() ou fviz_screeplot().
fviz_screeplot(ca3, addlabels = TRUE, ylim = c(0, 50))
Vou colocar uma linha horizontal para sugerir um corte.
fviz_screeplot(ca3) +
geom_hline(yintercept=10, linetype=2, color="red")
Biplot
A função fviz_ca_biplot() pode ser usada para desenhar o biplot de variáveis de linhas e colunas.
fviz_ca_biplot(ca3, repel = TRUE)
As linhas são representadas por pontos azuis e colunas por triângulos vermelhos.
A distância entre quaisquer pontos de linha ou pontos de coluna fornece uma medida de sua similaridade (ou dissimilaridade). Pontos de linha com perfil semelhante são próximos. O mesmo vale para pontos da coluna.
O som e a fúria do Faulkner, é próximo do y e o Hemingway está próximo do d. A interpretação é que o William Faulkner utiliza mais o y que o Hemingway.
Gráfico de variáveis de linha
A função get_ca_row() é usada para extrair os resultados para variáveis de linha. Esta função retorna uma lista contendo o cos2 (the squared cosine):
row <- get_ca_row(ca3)
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"
O cos2 mede o grau de associação entre linhas / colunas e um eixo específico. O cos2 dos pontos da linha pode ser extraído da seguinte maneira:
head(row$cos2)
## Dim 1 Dim 2 Dim 3 Dim 4
## three daughters (buck) 0.007285862 0.2435634733 0.266510444 0.060512923
## drifters (michener) 0.140312868 0.0674815766 0.232179622 0.061914615
## lost world (clark) 0.622830707 0.0001194593 0.018430579 0.094884079
## east wind (buck) 0.016461980 0.0494450450 0.745992597 0.008787674
## farewell to arms (hemingway) 0.351196925 0.0045496036 0.142188292 0.149054018
## sound and fury 7 (faulkner) 0.023380529 0.9043122585 0.002655727 0.023020619
## Dim 5
## three daughters (buck) 0.1350531089
## drifters (michener) 0.0008024716
## lost world (clark) 0.1088446102
## east wind (buck) 0.0656781316
## farewell to arms (hemingway) 0.0827136472
## sound and fury 7 (faulkner) 0.0031149913
Os valores do cos2 são compreendidos entre 0 e 1. A soma do cos2 para linhas em todas as dimensões da CA é igual a um.
A qualidade da representação de uma linha ou coluna em n dimensões é simplesmente a soma do cosseno quadrado dessa linha ou coluna sobre as n dimensões.
Se um item de linha estiver bem representado por duas dimensões, a soma do cos2 será próxima de um. Para alguns itens de linha, são necessárias mais de duas dimensões para representar perfeitamente os dados.
# Color by cos2 values: quality on the factor map
fviz_ca_row(ca3, col.row = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)
Você pode visualizar o cos2 dos pontos da linha em todas as dimensões usando o pacote corrplot:
library("corrplot")
package ‘corrplot’ was built under R version 4.0.2
corrplot 0.84 loaded
corrplot(row$cos2, is.corr=FALSE)
Também é possível criar um gráfico de barras das linhas cos2 usando a função fviz_cos2()
# Cos2 of rows on Dim.1 and Dim.2
fviz_cos2(ca3, choice = "row", axes = 1:2)
Contribuições de linhas para as dimensões
A contribuição das linhas (em%) para a definição das dimensões pode ser extraída da seguinte forma:
head(row$contrib)
## Dim 1 Dim 2 Dim 3 Dim 4
## three daughters (buck) 0.07770951 5.397889536 9.0348645 3.5769867
## drifters (michener) 1.31224289 1.311355730 6.9016824 3.2091191
## lost world (clark) 11.37829682 0.004534671 1.0701887 9.6067507
## east wind (buck) 0.27039557 1.687558588 38.9462974 0.7999584
## farewell to arms (hemingway) 5.68952570 0.153150170 7.3215552 13.3827381
## sound and fury 7 (faulkner) 0.75082630 60.342337137 0.2710708 4.0971142
## Dim 5
## three daughters (buck) 11.02111308
## drifters (michener) 0.05742143
## lost world (clark) 15.21394286
## east wind (buck) 8.25402749
## farewell to arms (hemingway) 10.25250852
## sound and fury 7 (faulkner) 0.76536675
As variáveis de linha com o valor maior contribuem mais para a definição das dimensões.
As linhas que mais contribuem para Dim.1 e Dim.2 são as mais importantes para explicar a variabilidade no conjunto de dados.
Linhas que não contribuem muito para nenhuma dimensão ou que contribuem para as últimas dimensões são menos importantes.
É possível usar a função corrplot() para destacar os pontos de linha que mais contribuem para cada dimensão:
corrplot(row$contrib, is.corr=FALSE)
A função fviz_contrib() pode ser usada para desenhar um gráfico de barras de contribuições de linha. Se seus dados contiverem muitas linhas, você pode optar por mostrar apenas as principais linhas que contribuem:
# Contributions of rows to dimension 1
fviz_contrib(ca3, choice = "row", axes = 1, top = 10)
# Contributions of rows to dimension 2
fviz_contrib(ca3, choice = "row", axes = 2, top = 10)
Attaching package: ‘gridExtra’
The following object is masked from ‘package:dplyr’:
combine
Pode ser visto que William Faulkner e o Hemingway são os que mais contribuem para a dimensão 2.
fviz_ca_row(ca3, col.row = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)
O gráfico de dispersão fornece uma idéia de para qual pólo das dimensões as categorias de linha estão realmente contribuindo.
Por exemplo, a dimensão 2 é definida principalmente pela oposição ao Hemingway (polo negativo) e pelo Faulkner (polo positivo).
Gráfico de variáveis de colunas
A função get_ca_col() é usada para extrair os resultados para variáveis de coluna. Esta função retorna uma lista contendo as variáveis de coordenadas e cos2() (the squared cosine) das colunas:
col <- get_ca_col(ca3)
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"
# Coordinates of column points
head(col$coord)
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## a 0.001542787 -0.01945057 0.01327806 -0.02408824 0.014040445
## b 0.086183340 -0.02417310 -0.05642131 0.06025018 0.012791777
## c 0.185156960 -0.08341168 0.05553300 0.03547341 0.034391884
## d -0.168576481 -0.06895233 -0.01440512 0.00888620 0.005075891
## e 0.007591921 -0.04158806 -0.04929204 -0.01359512 0.004840620
## f 0.111751535 -0.04451333 0.01898018 0.01639602 -0.049298987
# Quality of representation
head(col$cos2)
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## a 0.00101434 0.16122650 0.075134803 0.247275878 0.0840104680
## b 0.33844582 0.02662607 0.145053719 0.165409048 0.0074559717
## c 0.69074434 0.14018161 0.062135450 0.025353804 0.0238313801
## d 0.78771817 0.13178766 0.005751891 0.002188815 0.0007141697
## e 0.01150240 0.34516139 0.484884805 0.036885124 0.0046761330
## f 0.45626270 0.07239159 0.013161594 0.009821659 0.0887940717
# Contributions
head(col$contrib)
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## a 0.002479849 0.8190244 0.5838444 3.3504221 1.5714583
## b 1.520136212 0.2484958 2.0707914 4.1174519 0.2562272
## c 10.198418003 4.3005607 2.9158761 2.0746008 2.6921068
## d 17.044817011 5.9253607 0.3955909 0.2624862 0.1182362
## e 0.095564773 5.9586834 12.8044888 1.6983872 0.2972515
## f 3.167594402 1.0442904 0.2904272 0.3778987 4.7165689
fviz_ca_col(ca3, col.col = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)
fviz_cos2(ca3, choice = "col", axes = 1:2)
Se você usar o código ou as informações deste guia em um trabalho publicado, solicito que cite-o como uma fonte nas referências bibliográficas.
DUTT-ROSS,Steven Introdução à Análise de Correspondência. Rio de Janeiro. 2020. mimeo. Disponível em: https://blog.metodosquantitativos.com/AF_variaveis_nominais/
Outras referências desse texto.
1. https://www.gastonsanchez.com/visually-enforced/how-to/2012/07/19/Correspondence-Analysis/
2. http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/113-ca-correspondence-analysis-in-r-essentials/
Para saber sobre outras funções no R e no Python, você pode acessar o meu blog https://blog.metodosquantitativos.com/ ou o meu site pessoal https://steven.metodosquantitativos.com/