Capítulo XV. Análise de correspondência


A análise de correspondência fornece ferramentas para analisar as associações entre linhas e colunas de tabelas de contingência. Uma tabela de contingência é uma tabela de frequência de duas entradas onde são relatadas as frequências conjuntas de duas variáveis qualitativas. Por exemplo, uma tabela \(2\times 2\) pode ser formada observando a partir de uma amostra de \(n\) indivíduos duas variáveis qualitativas: o sexo do indivíduo e se o indivíduo fuma. A tabela relata as frequências articulares observadas. Em geral tabelas \(n\times p\) podem ser consideradas.

A ideia principal da análise de correspondência é desenvolver índices simples que mostrarão as relações entre as categorias de linhas e colunas. Esses índices nos dirão simultaneamente quais categorias de coluna têm mais peso em uma categoria de linha e vice-versa. A análise de correspondência também está relacionada à questão da redução da dimensão da tabela, semelhante à análise de componentes principais e à questão de decompor a tabela em seus fatores. A ideia é extrair os índices em ordem decrescente de importância para que as principais informações da tabela possam ser resumidas em espaços com dimensões menores. Por exemplo, se forem utilizados apenas dois fatores (índices), os resultados podem ser apresentados em gráficos bidimensionais, mostrando a relação entre as linhas e as colunas da tabela.

A Seção XV.1 define a notação básica e motiva a abordagem e a Seção XV.2 dá a teoria básica. Os índices serão usados para descrever as estatísticas \(\chi^2\) que medem as associações na tabela. Vários exemplos na Seção XV.3 mostram como fornecer e interpretar, na prática, os gráficos bidimensionais que mostram a relação entre as linhas e as colunas de uma tabela de contingência.


XV.1. Motivação


O objetivo da análise de correspondência é desenvolver índices simples que mostrem as relações entre a linha e as colunas de uma tabela de contingência. As tabelas de contingência são muito úteis para descrever a associação entre duas variáveis em situações muito gerais. As duas variáveis podem ser qualitativas (nominais), caso em que também são chamadas de variáveis categóricas. Cada linha e cada coluna na tabela representa uma categoria da variável correspondente.

A entrada \(x_{ij}\) na tabela \(X\), com dimensão \(n\times p\) é o número de observações em uma amostra que se enquadram simultaneamente na \(i\)-ésima categoria de linha e na \(j\)-ésima categoria de coluna, para \(i=1,\cdots,n\) e \(j=1,\cdots,p\). Às vezes, uma categoria de uma variável nominal também é chamada de modalidade da variável.

As variáveis de interesse também podem ser variáveis quantitativas discretas, como o número de membros da família ou o número de acidentes que uma seguradora teve que cobrir durante 1 ano, etc. Aqui, cada valor possível que a variável pode ter define uma linha ou um categoria da coluna. As variáveis contínuas podem ser consideradas definindo as categorias em termos de intervalos ou classes de valores que a variável pode assumir. Assim, as tabelas de contingência podem ser usadas em muitas situações, implicando que a análise de correspondência é uma ferramenta muito útil em muitas aplicações.

As relações gráficas entre as linhas e as colunas da tabela \(X\) que resultam da análise de correspondência baseiam-se na ideia de representar todas as categorias de linhas e colunas e de interpretar as posições relativas dos pontos em função dos pesos correspondentes à coluna e à fileira. Isto é conseguido derivando um sistema de índices simples fornecendo as coordenadas de cada linha e cada coluna. Essas coordenadas de linha e coluna são representadas simultaneamente no mesmo gráfico. Fica então claro para ver quais categorias de coluna são mais importantes nas categorias de linha da tabela e vice-versa.

Como já foi iludido, a construção dos índices baseia-se numa ideia semelhante às componentes principais. Usando componentes principais a variância total foi particionada em contribuições independentes provenientes dos componentes principais. A análise de correspondência, por outro lado, decompõe uma medida de associação, normalmente o valor total \(\chi^2\) usado no teste de independência, em vez de decompor a variância total.


Exemplo XV.1

As frequências de bacharéis franceses foram classificadas em regiões e diferentes categorias. Ao todo foram observados \(n= 202,100\) bacharéis. A frequência conjunta da região Ile-de-France e da modalidade Filosofia e letras, por exemplo, é de 9,724. Ou seja, foram 9,724 bacharéis em Ile-de-France e na categoria Filosofia e letras.

bacharelado = read.table(file = "http://leg.ufpr.br/~lucambio/MSM/bacharelado.txt", 
                         header = TRUE, sep = "")
head(bacharelado)
##   Region    A    B    C    D   E    F    G  H
## 1   ILDF 9724 5650 8679 9432 839 3353 5355 83
## 2   CHAM  924  464  567  984 132  423  736 12
## 3   PICA 1081  490  830 1222 118  410  743 13
## 4   HNOR 1135  587  686  904  83  629  813 13
## 5   CENT 1482  667 1020 1535 173  629  989 26
## 6   BNOR 1033  509  553 1063 100  433  742 13

A questão é se certas regiões preferem certos tipos de bacharéis. Se considerarmos, por exemplo, a região de Lorena (Lorraine, LORR), temos as seguintes porcentagens:

(bacharelado[bacharelado$Region=="LORR",2:9]/sum(bacharelado[bacharelado$Region=="LORR",2:9]))*100
##         A        B        C        D        E        F        G         H
## 9 20.5324 7.649107 15.32068 19.55521 3.392115 14.47827 18.90374 0.1684825

As percentagens totais das diferentes modalidades da variável baccalauréat são as seguintes:

(colSums(bacharelado[,2:9])/sum(colSums(bacharelado[,2:9])))*100
##          A          B          C          D          E          F          G 
## 22.5596239 10.6694706 16.1989114 22.7694211  2.6387927  9.7258783 15.2147452 
##          H 
##  0.2231569

Pode-se argumentar que a região Lorena (LORR) parece preferir as modalidades E, F, G e não gosta das especializações A, B, C, D em relação à frequência geral do tipo de bacharéis.

Os dados consistem em observações de 202100 bacharéis franceses em 1976 e fornecem as frequências para diferentes conjuntos de modalidades classificadas em regiões. Para referência, ver Bouroche & Saporta (1980).

As variáveis (modalidades) são:

e as linhas (regiões) são:


Na análise de correspondência tentamos desenvolver um índice para as regiões para que essa super ou sub-representação possa ser medida em apenas um único número. Simultaneamente, tentamos ponderar as regiões para que possamos ver em qual região certos tipos de baccalauréat são preferidos.


Exemplo XV.2

Considere \(n\) tipos de empresas e \(p\) localizações dessas empresas. Existe algum tipo de empresa que prefere um determinado local? Ou existe um índice de localização que corresponde a um determinado tipo de empresa?

Suponha que \(n=3\), \(p=3\) e que as frequências sejam as seguintes: \[ \begin{array}{rcll} X & = & \begin{pmatrix} 4 & 0 & 2 \\ 0 & 1 & 1 \\ 1 & 1 & 4 \end{pmatrix} & \begin{array}{ll} \gets & \mbox{Finanças} \\ \gets & \mbox{Energia} \\ \gets & \mbox{Alta tecnologia} \end{array} \\ \end{array}, \]

e as colunas correspondem a coluna 1 \(\mbox{Frankfurt}\), coluna 2 \(\mbox{Berlin}\) e coluna 3 \(\mbox{Munich}\).

As frequências implicam que quatro empresas do tipo 3, Alta tecnología (HiTech) estão no local 3 (Munique) e assim por diante. Suponha que exista um vetor de peso (empresa) \(r=(r_1,\cdots,r_n)^\top\) tal que um índice de localização \(s_j\) pode ser definido como \[ s_j = c \sum_{i=1}^n r_i \dfrac{x_{ij}}{x_{\bullet j}}, \] onde \(x_{\bullet j}=\sum_{i=1}^n x_{ij}\) é o número de empresas na localização \(j\) e \(c\) é uma constante. \(s_1\), por exemplo, daria a frequência média ponderada por \(r\) das empresas no local \(1\) (Frankfurt).

Dado um vetor de peso de localização \(s^*=(s_1^*,\cdots,s_p^*)^\top\), podemos definir um índice de empresa da mesma forma que \[ r_I^* = c^*\sum_{j=1}^p s_j^* \dfrac{x_{ij}}{x_{i\bullet}}. \]

onde \(c^*\) é uma constante e \(x_{i\bullet}=\sum_{j=1}^p x_{ij}\) é a soma da \(i\)-ésima linha de \(X\), ou seja, o número de empresas do tipo \(i\). Assim, \(r_2^*\), por exemplo, daria a frequência média ponderada por \(s\) das empresas de energia.

Se \(s_j\) e \(r_i^*\) podem ser resolvidos simultaneamente para um vetor de “peso de linha” \(r=(r_1,\cdots,r_n)^\top\) e um vetor de “peso da coluna” \(s=(s_1,\cdots,s_p)^\top\), podemos representar cada categoria de linha por \(r_i\), \(i=1,\cdots,n\) e cada categoria de coluna por \(s_j\), \(j=1,\cdots,p\) em um gráfico unidimensional.

Se neste gráfico \(r_i\) e \(s_j\) estiverem muito próximos e longe da origem, isso indicaria que a \(i\)-ésima categoria de linha tem uma frequência condicional importante \(x_{ij}/x_{\bullet j}\) em \(s_j\) e que a \(j\)-ésima categoria de coluna tem uma importante frequência \(x_{ij}/x_{i\bullet}\) em \(r_i^*\).

Isso indicaria uma associação positiva entre a \(i\)-ésima linha e a \(j\)-ésima coluna. Uma linha de argumento semelhante poderia ser usada se \(r_i\) estivesse muito longe de \(s_j\) e longe da origem. Isso indicaria uma pequena contribuição de frequência condicional ou uma associação negativa entre a \(i\)-ésima linha e a \(j\)-ésima coluna.



XV.2. Decomposição Qui-Quadrado


Uma forma alternativa de medir a associação entre as categorias de linha e coluna é uma decomposição do valor da estatística de teste \(\chi^2\). O conhecido teste \(\chi^2\) para independência em uma tabela de contingência bidimensional consiste em duas etapas. Primeiramente o valor esperado de cada célula da tabela é estimado sob a hipótese de independência. Em segundo lugar, os valores observados correspondentes são comparados com os valores esperados usando a estatística \[ t = \sum_{i=1}^n \sum_{j=1}^p (x_{ij}-E_{ij})^2/E_{ij}, \] onde \(x_{ij}\) é a frequência observada na célula \((i,j)\) e \(E_{ij}\) é o correspondente valor esperado estimado no pressuposto de independência, ou seja, \[ E_{ij} = \dfrac{x_{i\bullet}x_{\bullet j}}{x_{\bullet\bullet}}\cdot \]

Aqui \(x_{\bullet\bullet} =\sum_{i=1}^n x_{i\bullet}\). Sob a hipótese de independência, \(t\) tem distribuição \(\chi^2_{(n-1)(p-1)}\). No exemplo de localização industrial introduzido acima, o valor de \(t=6.26\) é quase significativo ao nível de 5%. Portanto, vale a pena investigar as razões especiais para o afastamento da independência.

O método de decomposição \(\chi^2\) consiste em encontrar a decomposição em valores singulares da matriz \(n\times p\) \(C\) com elementos \[ c_{ij}= (x_{ij}-E_{ij})/E_{ij}^{1/2}\cdot \]

Os elementos \(c_{ij}\) podem ser vistos como medindo o desvio ponderado entre o \(x_{ij}\) observado e os valores teóricos \(E_{ij}\) sob independência. Isso leva às ferramentas fatoriais que descrevem as linhas e as colunas de \(C\).

Para simplificação definamos as matrizes \(A_{n\times n}\) e \(B_{p\times p}\) como \[ A = \mbox{diag}(x_{i\bullet}) \qquad \mbox{e} \qquad B = \mbox{diag}(x_{\bullet j})\cdot \]

Essas matrizes fornecem as frequências marginais das linhas \(a_{n\times 1}\) e as frequências marginais das colunas \(b_{p\times 1}\): \[ a = A\pmb{1}_n \qquad \mbox{e} \qquad b = B\pmb{1}_p\cdot \]

Pode ser verificado que \[ C\sqrt{b}=0 \qquad \mbox{e} \qquad C^\top\sqrt{a}=0, \]

onde a raiz quadrada do vetor é tomada elemento por elemento e \[ R\leq \mbox{posto}(C)\leq \min\big((n-1),(p-1) \big)\cdot \]

Sabemos que a decomposição em valores proprios de \(C\) é \[ C = \Gamma \Lambda \Delta^\top, \] onde \(\Gamma\) contém os autovetores de \(CC^\top\), \(\Delta\) os autovetores de \(C^\top C\) e \[ \Lambda=\mbox{diag}(\lambda_1^{1/2},\cdots\lambda_R^{1/2}), \]

com \(\lambda_1\geq \lambda_2\geq \cdots\geq \lambda_R\), os autovalores de \(CC^\top\).

Isto implica que \[ c_{ij}=\sum_{k=1}^R \lambda_k^{1/2}\gamma_{ik}\delta_{jk}\cdot \]

Observe que \[ \mbox{tr}(CC^\top) = \sum_{k=1}^R \lambda_k = \sum_{i=1}^n\sum_{j=1}^p c_{ij}^2 = t\cdot \]

Esta relação mostra que a decomposição em valores proprios de \(C\) decompõe o valor total \(\chi^2\).

As relações de dualidade entre o espaço linha e coluna agora para \(k=1,\cdots,R\) dadas por \[ \delta_k = \dfrac{1}{\sqrt{\lambda_k}}C^\top \gamma_k \qquad \mbox{e} \qquad \gamma_k = \dfrac{1}{\sqrt{\lambda_k}}C \delta_k\cdot \]

As projeções das linhas e das colunas de \(C\) são dadas por \[ C\delta_k = \sqrt{\lambda_k} \gamma_k \qquad \mbox{e} \qquad C^\top \gamma_k = \sqrt{\lambda_k}\delta_k\cdot \]

Observe que os autovetores satisfazem \[ \delta_k \sqrt{b} = 0 \qquad \mbox{e} \qquad \gamma_k\sqrt{a}=0\cdot \]

De \(c_{ij}=\sum_{k=1}^R \lambda_k^{1/2}\gamma_{ik}\delta_{jk}\) vemos que os autovetores \(\delta_k\) e \(\gamma_k\) são os objetos de interesse ao analisar a correspondência entre as linhas e as colunas. Suponha que o primeiro autovalor em seja dominante de modo que \[ c_{ij} \approx \lambda_1^{1/2} \gamma_{11}\delta_{j1}\cdot \]

Neste caso, quando as coordenadas \(\gamma_{i1}\) e \(\delta_{j1}\) são ambas grandes, com o mesmo sinal, em relação às outras coordenadas, então \(c_{ij}\) também será grande, indicando uma associação positiva entre a \(i\)-ésima linha e a \(j\)-ésima categoria da coluna da tabela de contingência. Se \(\gamma_{i1}\) e \(\delta_{j1}\) fossem ambos grandes com sinais opostos, então haveria uma associação negativa entre a \(i\)-ésima linha e a \(j\)-ésima coluna.

Em muitas aplicações, os dois primeiros autovalores, \(\lambda_1\) e \(\lambda_2\), dominam e a porcentagem do total \(\chi^2\) explicada pelos autovetores \(\gamma_1\) e \(\gamma_2\) e \(\delta_1\) e \(\delta_2\) é grande. Neste caso \((\gamma_1,\gamma_2)\) pode ser usado para obter uma exibição gráfica das \(n\) linhas da tabela, \((\delta_1,\delta_2)\) desempenham um papel semelhante para as \(p\) colunas da tabela. A interpretação da proximidade entre os pontos de linha e coluna será interpretada como acima.

Na análise de correspondência, usamos as projeções de linhas ponderadas de \(C\) e as projeções de colunas ponderadas de \(C\) para exibições gráficas. Sejam \(r_k\) as projeções de \(A^{-1/2}C\) em \(\delta_k\) e \(s_k\) as projeções de \(B^{-1/2}C^\top\) em \(\gamma_k\), \(k=1,\cdots,R\): \[ r_k = A^{-1/2}C \, \delta_k = \sqrt{\lambda_k} A^{-1/2} \gamma_k \qquad \mbox{e} \qquad s_k = B^{-1/2}C^\top \, \gamma_k = \sqrt{\lambda_k} B^{-1/2} \delta_k\cdot \]

Esses vetores têm a propriedade de \[ r_k^\top a = 0 \qquad \mbox{e} \qquad s_k^\top b =0 \cdot \]

As projeções obtidas em cada eixo \(k=1,\cdots,R\) são centrados em zero com os pesos naturais dados por \(a\), as frequências marginais das linhas de \(X\), para as coordenadas de linha \(r_k\) e por \(b\), as frequências marginais das colunas de \(X\), para as coordenadas de coluna \(s_k\). Como resultado, a origem é o centro de gravidade para todas as representações.

Também sabemos da decomposição em valores proprios de \(C\) que \[ r_k^\top A r_k = \lambda_k \qquad \mbox{e} \qquad s_k^\top B s_k = \lambda_k\cdot \]

Da relação de dualidade entre \(\delta_k\) e \(\gamma_k\) obtemos \[ r_k = \dfrac{1}{\sqrt{\lambda_k}}A^{-1/2}C \, B^{1/2} s_k \qquad \mbox{e} \qquad s_k = \dfrac{1}{\sqrt{\lambda_k}} B^{-1/2} C^\top A^{1/2} r_k, \]

que pode ser simplificado para \[ r_k = \sqrt{\dfrac{x_{\bullet\bullet}}{\lambda_k}} A^{-1} X s_k \qquad \mbox{e} \qquad s_k = \sqrt{\dfrac{x_{\bullet\bullet}}{\lambda_k}} B^{-1} X^\top r_k\cdot \]

Os vetores \(r_k\) e \(s_k\) são referidos como fatores, fatores de linha e fatores de coluna, respectivamente. Eles têm as seguintes médias e variãncias: \[ \overline{r}_k = \dfrac{1}{x_{\bullet\bullet}} r_k^\top a = 0 \qquad \mbox{e} \qquad \overline{s}_k = \dfrac{1}{x_{\bullet\bullet}} s_k^\top b = 0, \]

\[ \mbox{Var}(r_k) =\dfrac{1}{x_{\bullet\bullet}} \sum_{i=1}^n x_{i\bullet} r_{ki}^2 =\dfrac{r_k^\top A r_k}{x_{\bullet\bullet}} = \dfrac{\lambda_k}{x_{\bullet\bullet}} \quad \mbox{e} \quad \mbox{Var}(s_k) =\dfrac{1}{x_{\bullet\bullet}} \sum_{j=1}^p x_{\bullet j} s_{kk}^2 =\dfrac{s_k^\top B s_k}{x_{\bullet\bullet}} = \dfrac{\lambda_k}{x_{\bullet\bullet}}\cdot \]

Assim, \(\lambda_k/\sum_{h=1}^j\lambda_h\), que é a parte do \(k\)-ésimo fator na decomposição da estatística \(\chi^2\), também pode ser interpretado como a proporção da variância explicada pelo \(k\)-ésimo fator.

As proporções \[ C_a(j,s_k) = \dfrac{x_{\bullet j} s_{kj}^2}{\lambda_k}, \quad \mbox{para} \quad j=1,\cdots,p, \quad k=1,\cdots,R \]

são chamadas de contribuições absolutas da linha \(i\) para a variância do fator \(r_k\). Eles mostram quais categorias de linha são mais importantes na dispersão dos \(k\) fatores de linha. Da mesma forma, as proporções \[ C_a(i,r_k) = \dfrac{x_{i\bullet} r_{ki}^2}{\lambda_k}, \quad \mbox{para} \quad i=1,\cdots,n, \quad k=1,\cdots,R \]

são chamadas de contribuições absolutas da coluna \(j\) para a variância do fator de coluna \(s_k\). Essas contribuições absolutas podem ajudar a interpretar o gráfico obtido pela análise de correspondência.


XV.3. Análise de correspondência na prática


As representações gráficas nos \(k\) eixos, \(k=1,2,\cdots,R\) das \(n\) linhas e das \(p\) colunas de \(X\) são fornecidos pelos elementos de \(r_k\) e \(s_k\). Normalmente, as exibições bidimensionais geralmente são satisfatórias se a porcentagem acumulada de variância explicada pelos dois primeiros fatores, \[ \Psi_2 = \dfrac{\lambda_1+\lambda_2}{\displaystyle \sum_{h=1}^R \lambda_h}, \] for suficientemente grande.

A interpretação dos gráficos pode ser resumida da seguinte forma:

Para que o significado estatístico (ou natural) puder ser dado às somas sobre linhas e colunas então, todas as variáveis devem ser medidas nas mesmas unidades. Nesse caso, \(x_{\bullet\bullet}\) constitui a frequência total do fenômeno observado e é compartilhada entre os indivíduos (\(n\) linhas) e entre as variáveis (\(p\) colunas). As representações das linhas e colunas de \(X\), \(r_k\) e \(s_k\), possuem propriedades básicas e mostram quais variáveis possuem pesos importantes para cada indivíduo e vice-versa. Este tipo de análise é utilizado como alternativa ao análise de componentes principais. A análise de componentes principais se preocupa principalmente com covariâncias e correlações, enquanto a análise de correspondência analisa um tipo mais geral de associação.


Exemplo XV.3

Uma pesquisa de cidadãos belgas que leem regularmente um jornal foi realizada na década de 1980. Perguntaram onde moravam. As respostas possíveis eram dez regiões: sete províncias Antuérpia (Antw), Flandres Ocidental (OcFl), Flandres Oriental (OrFl), Hainant (Hain), Liège (Li.eg), Limbourg (Limb), Luxemburgo (Luxe) e três regiões em torno de Bruxelas Flemish-Brabant (FlBr), Wallon-Brabant (WaBr) e a cidade de Bruxelas (Brar).

Os cidadão também foram questionados sobre que tipo de jornais que eles leem regularmente. Havia 15 respostas possíveis divididas em três classes: jornais flamengos (rótulo começa com a letra v), jornais franceses (rótulo começa com f) e ambos os idiomas juntos (rótulo começa com b).


jornais = read.table(file = "http://leg.ufpr.br/~lucambio/MSM/Jornais.txt", header = TRUE, sep = "")
jornais
##    Journal WaBr Brar Antw FlBr OcFl OrFl Hain Li.eg Limb Luxe
## 1       va  1.8  7.8  9.1  3.0  4.3  3.9  0.1   0.3  3.3  0.0
## 2       vb  0.1  3.4 17.8  1.0  0.7  4.1  0.0   0.0  0.2  0.0
## 3       vc  0.1  9.4  4.6  7.7  4.4  5.8  1.6   0.1  1.4  0.0
## 4       vd  0.5 15.6  6.1 12.0 10.5 10.2  0.7   0.3  5.4  0.0
## 5       ve  0.1  5.2  3.3  4.8  1.6  1.4  0.1   0.0  3.5  0.0
## 6       ff  5.6 13.7  3.1  2.4  0.5  1.7  1.9   2.3  0.2  0.2
## 7       fg  4.1 16.5  1.9  1.0  1.0  0.9  2.4   3.2  0.1  0.3
## 8       fh  8.3 29.5  1.8  7.3  0.8  0.4  5.1   3.2  0.2  0.3
## 9       fi  0.9  7.8  0.2  2.6  0.1  0.1  5.6   3.8  0.1  0.8
## 10      bj  6.1 18.2 10.8  4.1  4.5  5.3  2.0   2.6  3.4  0.2
## 11      bk  8.3 35.4  6.2 11.0  5.0  6.1  5.5   3.3  1.5  0.3
## 12      bl  4.4  9.9  6.7  3.4  1.1  3.9  2.1   1.5  2.1  0.0
## 13      vm  0.3 11.6 14.2  4.7  5.1  7.9  0.3   0.5  3.0  0.0
## 14      fn  5.1 21.0  1.3  3.4  0.2  0.2  2.3   4.4  0.0  0.4
## 15      f0  2.2  9.8  0.1  0.3  0.0  0.7  2.3   3.0  0.3  1.0


jornais1 = jornais[,2:11]
rownames(jornais1) = jornais[,1]
jornais1
##    WaBr Brar Antw FlBr OcFl OrFl Hain Li.eg Limb Luxe
## va  1.8  7.8  9.1  3.0  4.3  3.9  0.1   0.3  3.3  0.0
## vb  0.1  3.4 17.8  1.0  0.7  4.1  0.0   0.0  0.2  0.0
## vc  0.1  9.4  4.6  7.7  4.4  5.8  1.6   0.1  1.4  0.0
## vd  0.5 15.6  6.1 12.0 10.5 10.2  0.7   0.3  5.4  0.0
## ve  0.1  5.2  3.3  4.8  1.6  1.4  0.1   0.0  3.5  0.0
## ff  5.6 13.7  3.1  2.4  0.5  1.7  1.9   2.3  0.2  0.2
## fg  4.1 16.5  1.9  1.0  1.0  0.9  2.4   3.2  0.1  0.3
## fh  8.3 29.5  1.8  7.3  0.8  0.4  5.1   3.2  0.2  0.3
## fi  0.9  7.8  0.2  2.6  0.1  0.1  5.6   3.8  0.1  0.8
## bj  6.1 18.2 10.8  4.1  4.5  5.3  2.0   2.6  3.4  0.2
## bk  8.3 35.4  6.2 11.0  5.0  6.1  5.5   3.3  1.5  0.3
## bl  4.4  9.9  6.7  3.4  1.1  3.9  2.1   1.5  2.1  0.0
## vm  0.3 11.6 14.2  4.7  5.1  7.9  0.3   0.5  3.0  0.0
## fn  5.1 21.0  1.3  3.4  0.2  0.2  2.3   4.4  0.0  0.4
## f0  2.2  9.8  0.1  0.3  0.0  0.7  2.3   3.0  0.3  1.0


colSums(jornais1)
##  WaBr  Brar  Antw  FlBr  OcFl  OrFl  Hain Li.eg  Limb  Luxe 
##  47.9 214.8  87.2  68.7  39.8  52.6  32.0  28.5  24.7   3.5


library("FactoMineR")
library("factoextra")
chisq = chisq.test(jornais1)
chisq
## 
##  Pearson's Chi-squared test
## 
## data:  jornais1
## X-squared = 287.52, df = 126, p-value = 1.208e-14


Para uma pequena tabela de contingência, você pode usar o teste do qui-quadrado para avaliar se há uma dependência significativa entre as categorias de linha e coluna.

Nesse caso, as variáveis de linha e coluna estão associadas estatisticamente significativamente, \(p\)-valor \(\approx\) 0. O fato de que a aproximação pode estar incorreta é provável porque muitas células têm instâncias muito baixas.

A função CA(), pacote FactoMineR pode ser usada. Um formato simplificado é:

ajuste.CA = CA(jornais1, ncp = 5, graph = TRUE)

print(ajuste.CA)
## **Results of the Correspondence Analysis (CA)**
## The row variable has  15  categories; the column variable has 10 categories
## The chi square of independence between the two variables is equal to 287.5248 (p-value =  1.208196e-14 ).
## *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"


O objeto R que é criado usando a função CA() contém muitas informações encontradas em muitas listas e matrizes diferentes. Esses valores são descritos a seguir.


Visualização e interpretação

As seguintes funções, no pacote factoextra, ajudam na interpretação e visualização da análise de correspondência:


Significado estatístico

Para interpretar a análise de correspondência, o primeiro passo é avaliar se existe uma dependência significativa entre as linhas e colunas. Um método rigoroso é usar a estatística qui-quadrado para examinar a associação entre variáveis de linhas e colunas.

Isso aparece na parte superior do relatório gerado pela função summary(ajuste.CA) print(ajuste.CA). Neste caso, a associação é altamente significativa (qui-quadrado: 287.5248, p=1.208196e-14.

eig.val = get_eigenvalue(ajuste.CA)
eig.val
##         eigenvalue variance.percent cumulative.variance.percent
## Dim.1 0.2902332688       60.5349141                    60.53491
## Dim.2 0.1001933759       20.8976642                    81.43258
## Dim.3 0.0410860331        8.5694500                    90.00203
## Dim.4 0.0192293537        4.0107300                    94.01276
## Dim.5 0.0148660077        3.1006525                    97.11341
## Dim.6 0.0075902300        1.5831194                    98.69653
## Dim.7 0.0033043946        0.6892085                    99.38574
## Dim.8 0.0019918805        0.4154531                    99.80119
## Dim.9 0.0009531811        0.1988081                   100.00000


Os valores próprios correspondem à quantidade de informação retida por cada eixo. As dimensões são ordenadas de forma decrescente 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 acumulada explicada é obtida somando-se as proporções sucessivas de variação explicadas para obter o total acumulado. Portanto, pouco mais do que de 81.4% da variação é explicada pelas duas primeiras dimensões.

Os valores próprios 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 a serem mantidas para a interpretação dos dados. Depende da questão de pesquisa e da necessidade do pesquisador. Por exemplo, se você estiver satisfeito com 80% das variações totais explicadas, use o número de dimensões necessárias para conseguir isso.

Observe que uma boa redução de dimensão é alcançada quando as primeiras dimensões respondem por uma grande proporção da variabilidade. Em nossa análise, os dois primeiros eixos explicam 81.4% da variação. Essa é uma porcentagem aceitavelmente grande.

Um método alternativo para determinar o número de dimensões é observar um gráfico de autovalores/variâncias ordenados do maior para o menor. O número de componentes é determinado no ponto, além do qual os autovalores restantes são todos relativamente pequenos e de tamanho comparável.

O gráfico pode ser produzido usando a função fviz_eig() ou fviz_screeplot(), pacote fatoextra.

fviz_screeplot(ajuste.CA, addlabels = TRUE, ylim = c(0, 70))


Também é possível calcular um autovalor médio acima do qual o eixo deve ser mantido na solução. Nossos dados contêm 15 linhas e 10 colunas. Se os dados fossem aleatórios, o valor esperado do autovalor para cada eixo seria \[ 1/(\mbox{nrow(jornais)}-1) = 1/14 = 0.07142857 \] ou 7.14% em termos de linhas. Da mesma forma, o eixo médio deve representar \[ 1/(\mbox{ncol(jornais[,2:11]})-1) = 1/9 = 0.1111111 \] ou 11.11% em termos das 10 colunas. Qualquer eixo com contribuição maior que o máximo desses dois percentuais deve ser considerado importante e incluído na solução para a interpretação dos dados. O código R abaixo desenha o gráfico com uma linha tracejada vermelha especificando o autovalor médio:

fviz_screeplot(ajuste.CA, ylim = c(0, 70)) + geom_hline(yintercept=11.11, linetype=2, color="red") 


Representações bidimensionais serão bastante satisfatórias, já que os dois primeiros autovalores respondem por 81% da variância.

Como esperado, há uma alta associação entre as regiões e o tipo de jornal que é lido. Em particular, vb (Gazet van Antwerp) é lido quase exclusivamente na província de Antuérpia, este é um ponto extremo no gráfico. Os pontos da esquerda pertencem todos à Flandres, enquanto os da direita pertencem à Wallonia. Observe que o Wallon-Brabant e o Flamengo-Brabant não estão longe de Bruxelas. Bruxelas fica perto do centro (média) e também perto dos jornais bilingues. Ele é deslocado um pouco para a direita da origem devido à maioria das pessoas de língua francesa na área.



XV.3.1 Biplots


O biplot é uma exibição de baixa dimensão de uma matriz de dados \(X\) onde as linhas e colunas são representadas por pontos. A interpretação de um biplot é direcionada especificamente para os produtos escalares de variáveis fatoriais de menor dimensão e é projetada para recuperar aproximadamente os elementos individuais da matriz de dados nesses produtos escalares.

Suponha que tenhamos uma matriz \(10\times 5\) de dados, com elementos \(x_{ij}\). A ideia do biplot é encontrar 10 pontos de linha \(q_i\in\mathbb{R}^k\), \(k < p\), \(i=1,\cdots,10\) e 5 pontos de coluna \(t_j\in\mathbb{R}^k\), \(j=1,\cdots,5\) tais que os 50 produtos escalares entre os vetores linha e coluna aproximam-se muito dos 50 elementos correspondentes da matriz de dados \(X\).

Geralmente escolhemos \(k=2\). Por exemplo, o produto escalar entre \(q_7\) e \(t_4\) deve aproximar o valor dos dados \(x_{74}\), na sétima linha e a quarta coluna. Em geral, o biplot modela os dados \(x_{ij}\) como a soma de um produto escalar em algum subespaço de baixa dimensão e um termo de “erro” residual: \[ x_{ij}=q_i^\top t_j + e_{ij} = \sum_k q_{ik} t_{jk}+e_{ij}\cdot \]

Para entender a ligação entre a análise de correspondência e o biplot, precisamos introduzir uma fórmula que expresse \(x_{ij}\) da matriz de dados original em termos de frequências de linhas e colunas. Uma dessas fórmulas, conhecida como “fórmula de reconstituição” é \[ x_{ij} = E_{ij}\left( 1+\dfrac{\displaystyle \sum_{k=1}^R \lambda_k^{1/2} \gamma_{ik} \,\delta_{jk}}{\sqrt{\dfrac{x_{i\bullet} x_{\bullet j}}{x_{\bullet\bullet}}}}\right)\cdot \]

Considere agora os perfis de linha \(x_{ij}/x_{i\bullet}\), as frequências condicionais e o perfil de linha médio \(x_{i\bullet} /x_{\bullet\bullet}\) Da expressão acima obtemos a diferença entre cada perfil de linha e esta média: \[ \left( \dfrac{x_{ij}}{x_{i\bullet}}-\dfrac{x_{i\bullet}}{x_{\bullet\bullet}}\right) = \sum_{k=1}^R \lambda_k^{1/2} \, \gamma_{ik} \sqrt{\dfrac{x_{\bullet j}}{x_{i\bullet} x_{\bullet \bullet}}} \, \delta_{jk}\cdot \]

Pelo mesmo argumento também podemos obter a diferença entre cada perfil de coluna e o perfil médio de coluna: \[ \left( \dfrac{x_{ij}}{x_{\bullet j}}-\dfrac{x_{\bullet j}}{x_{\bullet\bullet}}\right) = \sum_{k=1}^R \lambda_k^{1/2} \, \gamma_{ik} \sqrt{\dfrac{x_{i\bullet}}{x_{\bullet j} x_{\bullet \bullet}}} \, \delta_{jk}\cdot \]

Agora, se \(\lambda_1\gg \lambda_2\gg \lambda_3\gg \cdots\), podemos aproximar essas somas por um número finito de \(K\) termos, geralmente \(K=2\), para obter \[ \left( \dfrac{x_{ij}}{x_{\bullet j} }-\dfrac{x_{i\bullet}}{x_{\bullet\bullet}}\right) = \sum_{k=1}^R \left( \dfrac{x_{i\bullet}}{\sqrt{\lambda_k x_{\bullet\bullet}}} \, r_{ik} \right)s_{kj} + e_{ij}, \\ \left( \dfrac{x_{ij}}{x_{i\bullet} }-\dfrac{x_{\bullet j}}{x_{\bullet\bullet}}\right) = \sum_{k=1}^R \left( \dfrac{x_{\bullet j}}{\sqrt{\lambda_k x_{\bullet\bullet}}} \, s_{kj} \right)r_{ki} + e_{ij}', \] onde \(e_{ij}\) e \(e_{ij}'\) são termos de erro.

Estas últimas equações mostram que se considerarmos a exibição das diferenças entre os perfis de linha e o perfil médio, então a projeção do perfil de linha \(r_k\) e uma versão redimensionada das projeções da coluna do perfil \(s_k\) constituem um biplot dessas diferenças.


Exemplo XV.4

Continuação do Exemplo XV.3 mostramos diferentes biplots.

fviz_ca_biplot(ajuste.CA, repel = TRUE, ggtheme = theme_minimal())


Este gráfico mostra um padrão global dentro dos dados. As linhas são representadas por pontos azuis e as colunas por triângulos vermelhos. A distância entre quaisquer pontos de linha ou pontos de coluna fornece uma medida de sua semelhança ou dissimilaridade. Os pontos de linha com perfil semelhante são fechados no mapa de fatores. O mesmo vale para os pontos das colunas.

O próximo passo para a interpretação é determinar quais variáveis de linha e coluna contribuem mais na definição das diferentes dimensões retidas no modelo. Com este objetivo a função get_ca_row() em factoextra é usada para extrair os resultados das variáveis de linha. Esta função retorna uma lista contendo as coordenadas, o cos2, a contribuição e a inércia das variáveis de linha:


linhas = get_ca_row(ajuste.CA)
linhas
## 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"


Os componentes da função get_ca_row() podem ser usados no gráfico de linhas da seguinte forma:

  1. linhas$coord: coordenadas de cada ponto de linha em cada dimensão (1, 2 e 3). Usado para criar o gráfico de dispersão.
  2. linhas$cos2: qualidade de representação das linhas.
  3. linhas$contrib: contribuição das linhas (em %) para a definição das dimensões.
  4. linhas$inertia: a inércia para cada linha, cuja soma é igual à soma dos autovalores, ou seja, a inércia total.

Observe que a soma dos autovalores é igual à soma das inércias das linhas. Esta é a inércia total da mesa.

# a soma dos autovalores
eig.val[,1]
##        Dim.1        Dim.2        Dim.3        Dim.4        Dim.5        Dim.6 
## 0.2902332688 0.1001933759 0.0410860331 0.0192293537 0.0148660077 0.0075902300 
##        Dim.7        Dim.8        Dim.9 
## 0.0033043946 0.0019918805 0.0009531811
sum(eig.val[,1])
## [1] 0.4794477
# a soma das inércias das linhas
linhas$inertia
##  [1] 0.022235049 0.102300729 0.021326444 0.054520473 0.025859876 0.013611891
##  [7] 0.020261345 0.037299575 0.057377629 0.005767162 0.010620031 0.005812319
## [13] 0.035715778 0.032109093 0.034630330
sum(linhas$inertia)
## [1] 0.4794477
# a parte de cada linha da inércia total
linhas$inertia/sum(linhas$inertia)
##  [1] 0.04637638 0.21337202 0.04448127 0.11371516 0.05393680 0.02839077
##  [7] 0.04225976 0.07779696 0.11967442 0.01202876 0.02215055 0.01212295
## [13] 0.07449358 0.06697100 0.07222963
round(linhas$inertia/sum(linhas$inertia)*1000, digits=0)
##  [1]  46 213  44 114  54  28  42  78 120  12  22  12  74  67  72

Até agora descrevemos como visualizar apenas pontos de linha. Em seguida, destacamos as linhas de acordo com i) sua qualidade de representação no mapa fatorial ou ii) suas contribuições para as dimensões.

Use a função fviz_ca_row() em factoextra para visualizar apenas pontos de linha:

fviz_ca_row(ajuste.CA, repel = TRUE)


O gráfico acima mostra as relações entre os pontos de linha: as linhas com um perfil semelhante são agrupadas. As linhas negativamente correlacionadas são posicionadas em lados opostos da origem do gráfico (quadrantes opostos).

A distância entre os pontos da linha e a origem mede a qualidade dos pontos da linha no mapa de fatores. Os pontos de linha que estão longe da origem estão bem representados no mapa de fatores. O resultado da análise mostra que a tabela de contingência foi representada com relativo sucesso em espaço de baixa dimensão usando análise de correspondência.

As duas dimensões 1 e 2 são suficientes para reter 81,4% da inércia total (variação) contida nos dados. No entanto, nem todos os pontos são igualmente bem exibidos nas duas dimensões. Lembre-se de que a qualidade da representação das linhas no mapa de fatores é chamada de cosseno quadrado (cos2) ou correlações quadradas. O cos2 mede o grau de associação entre linhas/colunas e um determinado eixo. O cos2 dos pontos de linha pode ser extraído da seguinte forma:

head(linhas$cos2, 10)
##        Dim 1        Dim 2       Dim 3        Dim 4        Dim 5
## va 0.8533695 0.0006885357 0.004920052 1.032918e-01 0.0018025489
## vb 0.4998262 0.4766348508 0.005935589 1.127313e-02 0.0025302997
## vc 0.3948319 0.3527127883 0.048117451 1.944484e-01 0.0002581334
## vd 0.4394640 0.5311145183 0.006580023 4.001387e-04 0.0209029861
## ve 0.3291153 0.2368759554 0.001083316 1.436678e-01 0.2522623484
## ff 0.6333465 0.1228568249 0.173384531 6.307898e-05 0.0016100355
## fg 0.8232946 0.0608058079 0.023155226 6.323432e-03 0.0492856879
## fh 0.8344069 0.0004659098 0.078209015 3.010519e-02 0.0461404394
## fi 0.5197208 0.0025420416 0.453627803 9.177092e-04 0.0117481830
## bj 0.2435076 0.1491120317 0.113246378 3.132274e-01 0.0411902367

Os valores do cos2 estão compreendidos entre 0 e 1. A soma do cos2 para linhas em todas as dimensões do CA é igual a um. A qualidade de representação de uma linha ou coluna em \(n\) dimensões é simplesmente a soma do quadrado do cosseno dessa linha ou coluna sobre as \(n\) dimensões. Se um item de linha é bem representado por duas dimensões, a soma do cos2 é próxima a um. Para alguns dos itens de linha, são necessárias mais de 2 dimensões para representar perfeitamente os dados.

É possível colorir pontos de linha por seus valores de cos2 usando o argumento col.row = “cos2”. Isso produz um gradiente de cores, que pode ser personalizado usando o argumento gradient.cols. Por exemplo, gradient.cols = c(“white”, “blue”, “red”) significa que:

  1. variáveis com valores baixos de cos2 serão coloridas em “branco” (white)
  2. variáveis com valores médios de cos2 serão coloridas em “azul” (blue)
  3. variáveis com valores altos de cos2 serão coloridas em “vermelho” (red)

#Cor por valores de cos2: qualidade no mapa de fatores
fviz_ca_row(ajuste.CA, 
            col.row = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)


Você pode visualizar o cos2 dos pontos de linha em todas as dimensões usando o pacote corrplot:

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


Também é possível criar um gráfico de barras de linhas cos2 usando a função fviz_cos2() em factoextra:

# Cos2 de linhas em Dim.1 e Dim.2
fviz_cos2(ajuste.CA, choice = "row", axes = 1:2)


Observe que apenas os primeiros 3 pontos de linha são bem representados pelas duas primeiras dimensões. Os próximos 4 pontos de linha são relativamente bem representados. O último, bl, deve ser interpretado com alguma cautela. Uma solução dimensional mais alta é provavelmente necessária para os últimos 4 jornais.

A contribuição das linhas (em %) para a definição das dimensões pode ser extraída da seguinte forma:

head(linhas$contrib, 10)
##         Dim 1       Dim 2       Dim 3        Dim 4       Dim 5
## va  6.5377455  0.01528008  0.26626469 11.943713456  0.26960678
## vb 17.6177541 48.66598451  1.47791119  5.997339280  1.74123082
## vc  2.9012387  7.50759163  2.49762277 21.565428603  0.03703124
## vd  8.2553537 28.90072758  0.87315799  0.113450244  7.66608429
## ve  2.9324277  6.11376039  0.06818476 19.320629231 43.88180917
## ff  2.9703846  1.66908616  5.74426696  0.004465175  0.14742108
## fg  5.7474647  1.22962963  1.14188685  0.666279452  6.71729986
## fh 10.7234515  0.01734470  7.10013318  5.839566235 11.57687274
## fi 10.2746134  0.14557481 63.35020899  0.273831238  4.53439078
## bj  0.4838687  0.85829355  1.58961620  9.394143758  1.59794601


As variáveis de linha com maior valor são as que mais contribuem 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. As 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(), pacote corrplot para destacar os pontos de linha que mais contribuem para cada dimensão:

corrplot(linhas$contrib, is.corr=FALSE)


A função fviz_contrib() no pacote fatoextra pode ser usada para desenhar um gráfico de barras de contribuições de linha. Se seus dados contiverem muitas linhas, você poderá decidir mostrar apenas as principais linhas de contribuição. O código R abaixo mostra as 10 principais linhas que contribuem para as dimensões:

# Contribuições de linhas para a dimensão 1
fviz_contrib(ajuste.CA, choice = "row", axes = 1, top = 10)


# Contribuições de linhas para a dimensão 2
fviz_contrib(ajuste.CA, choice = "row", axes = 2, top = 10)


A contribuição total para as dimensões 1 e 2 pode ser obtida da seguinte forma:

# Contribuição total para as dimensões 1 e 2
fviz_contrib(ajuste.CA, choice = "row", axes = 1:2, top = 10)


A linha tracejada vermelha no gráfico acima indica o valor médio esperado, caso as contribuições fossem uniformes, ou seja, o cálculo do valor esperado da contribuição sob a hipótese nula. Os pontos de linha mais importantes (ou contribuintes) podem ser destacados no gráfico de dispersão da seguinte forma:

fviz_ca_row(ajuste.CA, 
            col.row = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)


O gráfico de dispersão dá uma ideia de para qual pólo das dimensões as categorias de linha estão realmente contribuindo. É evidente que os jornais flamencos v tem uma contribuição importante para o pólo negativo da primeira dimensão, enquanto os demais têm uma contribuição importante para o pólo positivo da primeira dimensão. A análise desses gráficos é usada principalmente para determinar a oposição do pólo positivo e do pólo negativo.

A função get_ca_col() em factoextra é usada para extrair os resultados das variáveis de coluna. Esta função retorna uma lista contendo as coordenadas, o cos2, a contribuição e a inércia das variáveis das colunas:

col = get_ca_col(ajuste.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"


O resultado para colunas fornece as mesmas informações descritas para linhas. Por esse motivo, apenas exibiremos o resultado para as colunas com apenas um breve comentário. Para obter acesso aos diferentes componentes, use isto:

# Coordenadas dos pontos da coluna
head(col$coord)
##           Dim 1       Dim 2       Dim 3        Dim 4       Dim 5
## WaBr  0.5560104 -0.17402342 -0.37997385  0.079494796 -0.00508408
## Brar  0.3108357  0.01099522 -0.10574817 -0.018207372  0.01927800
## Antw -0.7624605 -0.57887980  0.03681602 -0.007623843 -0.05534105
## FlBr -0.1331648  0.40760825  0.04325979 -0.145339530 -0.18528478
## OcFl -0.5719013  0.49360743  0.03743505 -0.001785713  0.22556256
## OrFl -0.6010294  0.11996716  0.07377330 -0.091136608  0.17968297
# Qualidade de representação
head(col$cos2)
##           Dim 1       Dim 2       Dim 3        Dim 4        Dim 5
## WaBr 0.58732940 0.057534901 0.274298474 1.200586e-02 4.910669e-05
## Brar 0.84689248 0.001059679 0.098019410 2.905768e-03 3.257545e-03
## Antw 0.63068621 0.363542682 0.001470457 6.305602e-05 3.322564e-03
## FlBr 0.07189241 0.673581808 0.007587055 8.563907e-02 1.391823e-01
## OcFl 0.50967340 0.379676076 0.002183769 4.969046e-06 7.928370e-02
## OrFl 0.81657218 0.032533285 0.012302731 1.877538e-02 7.298220e-02
# Contribuições
head(col$contrib)
##           Dim 1       Dim 2      Dim 3        Dim 4       Dim 5
## WaBr  8.5078543  2.41422565 28.0682075  2.624908546  0.01388775
## Brar 11.9238063  0.04321844  9.7488121  0.617490192  0.89542631
## Antw 29.1252703 48.63178632  0.4796914  0.043950687  2.99559294
## FlBr  0.6999292 18.99632590  0.5217919 12.584196836 26.45500241
## OcFl  7.4790069 16.13887985  0.2263662  0.001100544 22.71374251
## OrFl 10.9168152  1.25990406  1.1618656  3.788547438 19.04895615

A função fviz_ca_col() é usada para produzir o gráfico de pontos de coluna. Assim como os pontos de linha, também é possível colorir os pontos de coluna por seus valores de cos2:

fviz_ca_col(ajuste.CA, 
            col.col = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)


O código R abaixo cria um gráfico de barras de colunas cos2:

fviz_cos2(ajuste.CA, choice = "col", axes = 1:2)


Lembre-se que o valor do cos2 está entre 0 e 1. Um cos2 fechado em 1 corresponde a uma variável coluna/linha que está bem representada no mapa fatorial. Observe que a região de Luxemburgo não está bem exibida com as duas primeiras dimensões. A posição desse item deve ser interpretado com cautela no espaço formado pelas dimensões 1 e 2. Para visualizar a contribuição das linhas para as duas primeiras dimensões, digite isto:

fviz_contrib(ajuste.CA, choice = "col", axes = 1:2)


O biplot é uma exibição gráfica de linhas e colunas em 2 ou 3 dimensões. Descrevemos como criar biplots para análise de correspondência. Agora descreveremos diferentes tipos destes biplots.


Biplot simétrico


Como mencionado acima, o gráfico padrão da análise de correspondência é um biplot simétrico no qual tanto as linhas (pontos azuis) quanto as colunas (triângulos vermelhos) são representadas no mesmo espaço usando as coordenadas principais. Essas coordenadas representam os perfis de linha e coluna. Neste caso, apenas a distância entre os pontos da linha ou a distância entre os pontos da coluna pode ser realmente interpretada. Com um gráfico simétrico, a interdistância entre linhas e colunas não pode ser interpretada. Apenas afirmações gerais podem ser feitas sobre o padrão.

fviz_ca_biplot(ajuste.CA, repel = TRUE)


Biplot assimétrico


Observe que, para interpretar a distância entre os pontos da coluna e os pontos da linha, a maneira mais simples é fazer um gráfico assimétrico. Isso significa que os perfis de coluna devem ser apresentados em espaço de linha ou vice-versa.

Para fazer um biplot assimétrico, os pontos das linhas (ou colunas) são plotados a partir das coordenadas padrão (S) e os perfis das colunas (ou das linhas) são plotados a partir das coordenadas principais (P). Para um determinado eixo, as coordenadas padrão e principais estão relacionadas da seguinte forma:

As opções permitidas para map são:

  1. rowprincipal ou colprincipal - estes são os chamados biplots assimétricos, com linhas em coordenadas principais e colunas em coordenadas padrão ou vice-versa, também conhecido como preservação métrica de linha ou preservação métrica de coluna, respectivamente:
    • rowprincipal: as colunas são representadas no espaço de linha
    • colprincipal: as linhas são representadas no espaço da coluna
  2. symbiplot - linhas e colunas são dimensionadas para ter variâncias iguais aos valores singulares, raízes quadradas de autovalores, o que fornece um biplot simétrico, mas não preserva as métricas de linha ou coluna.
  3. rowgab ou colgab - mapas assimétricos propostos por Gabriel & Odoroff (Gabriel e Odoroff 1990):
    • rowgab: linhas em coordenadas principais e colunas em coordenadas padrão multiplicadas pela massa.
    • colgab: colunas em coordenadas principais e linhas em coordenadas padrão multiplicadas pela massa.
  4. rowgreen ou colgreen - os chamados biplots de contribuição mostrando visualmente os pontos mais contribuintes (Greenacre 2006b).
    • rowgreen: linhas nas coordenadas principais e colunas nas coordenadas padrão multiplicadas pela raiz quadrada da massa.
    • colgreen: colunas em coordenadas principais e linhas em coordenadas padrão multiplicadas pela raiz quadrada da massa.
O código R abaixo desenha um biplot assimétrico padrão:

fviz_ca_biplot(ajuste.CA, map ="rowprincipal", arrow = c(TRUE, TRUE), repel = TRUE)


Usamos, o argumento arrow (setas), que é um vetor de duas lógicas especificando se o gráfico deve conter pontos (FALSO, padrão) ou setas (VERDADEIRO). O primeiro valor define as linhas e o segundo valor define as colunas. Se o ângulo entre duas setas for agudo, então há uma forte associação entre a linha e a coluna correspondentes. Para interpretar a distância entre as linhas e uma coluna, você deve projetar perpendicularmente os pontos das linhas na seta da coluna. Com esse objetivo foi proposto o biplot de contribuição.

No biplot simétrico padrão, mencionado anteriomente, é difícil conhecer os pontos que mais contribuem para a solução da análise de correspondência. Michael Greenacre propôs uma nova escala exibida, chamada biplot de contribuição, que incorpora a contribuição de pontos (M. Greenacre, 2013). Nesta exibição, pontos que contribuem muito pouco para a solução, estão próximos ao centro do biplot e são relativamente sem importância para a interpretação.

Um biplot de contribuição pode ser desenhado usando o argumento map = “rowgreen” ou map = “colgreen”. Em primeiro lugar, você deve decidir se analisa as contribuições de linhas ou colunas para a definição dos eixos. Em nosso exemplo, interpretaremos a contribuição das linhas para os eixos. O argumento map =“colgreen” é usado.

Nesse caso, lembre-se de que as colunas estão nas coordenadas principais e as linhas nas coordenadas padrão multiplicadas pela raiz quadrada da massa. Para uma dada linha, o quadrado da nova coordenada em um eixo \(i\) é exatamente a contribuição desta linha para a inércia do eixo \(i\).

fviz_ca_biplot(ajuste.CA, map ="colgreen", arrow = c(TRUE, FALSE), repel = TRUE)


No gráfico acima, a posição dos pontos do perfil da coluna permanecem quase inalterados em relação à do biplot convencional.

Quanto mais próxima uma seta estiver (em termos de distância angular) de um eixo, maior será a contribuição da categoria de linha nesse eixo em relação ao outro eixo. Se a seta estiver a meio caminho entre os dois, sua categoria de linha contribui para os dois eixos na mesma medida.


Descrição da dimensão


Para identificar facilmente os pontos de linha e coluna mais associados às dimensões principais, você pode usar a função dimdesc() em FactoMineR. As variáveis de linha/coluna são classificadas por suas coordenadas na saída dimdesc().

# Descrição da dimensão
res.desc = dimdesc(ajuste.CA, axes = c(1,2))
res.desc
## $`Dim 1`
## $`Dim 1`$row
##          coord
## vb -1.05982600
## vm -0.64916325
## va -0.58194908
## ve -0.50517201
## vd -0.48414809
## vc -0.37929646
## bj -0.12134067
## bl -0.08007875
## bk  0.20801251
## ff  0.40448593
## fg  0.56443502
## fh  0.57273244
## fn  0.66148314
## f0  0.85218991
## fi  0.90159610
## 
## $`Dim 1`$col
##            coord
## Antw  -0.7624605
## Limb  -0.6511307
## OrFl  -0.6010294
## OcFl  -0.5719013
## FlBr  -0.1331648
## Brar   0.3108357
## WaBr   0.5560104
## Hain   0.7574758
## Li.eg  0.8487042
## Luxe   1.2188614
## 
## 
## $`Dim 2`
## $`Dim 2`$row
##          coord
## vb -1.03494665
## ff -0.17814858
## f0 -0.17485724
## fg -0.15339417
## bl -0.14347565
## vm -0.09676138
## bj -0.09495251
## fn -0.09436032
## fi -0.06305482
## va -0.01653026
## fh  0.01353361
## bk  0.09955540
## vc  0.35849516
## ve  0.42857392
## vd  0.53224388
## 
## $`Dim 2`$col
##             coord
## Antw  -0.57887980
## Luxe  -0.29765040
## Li.eg -0.22480768
## WaBr  -0.17402342
## Hain  -0.05876400
## Brar   0.01099522
## OrFl   0.11996716
## FlBr   0.40760825
## Limb   0.47866297
## OcFl   0.49360743


# Descrição da dimensão 1 por pontos de linha
head(res.desc[[1]]$row, 4)
##         coord
## vb -1.0598260
## vm -0.6491632
## va -0.5819491
## ve -0.5051720


# Descrição da dimensão 1 por pontos de coluna
head(res.desc[[1]]$col, 4)
##           coord
## Antw -0.7624605
## Limb -0.6511307
## OrFl -0.6010294
## OcFl -0.5719013


Descrição da dimensão 2:

# Descrição da dimensão 2 por pontos de linha
res.desc[[2]]$row
##          coord
## vb -1.03494665
## ff -0.17814858
## f0 -0.17485724
## fg -0.15339417
## bl -0.14347565
## vm -0.09676138
## bj -0.09495251
## fn -0.09436032
## fi -0.06305482
## va -0.01653026
## fh  0.01353361
## bk  0.09955540
## vc  0.35849516
## ve  0.42857392
## vd  0.53224388
# Descrição da dimensão 1 por pontos de coluna
res.desc[[2]]$col
##             coord
## Antw  -0.57887980
## Luxe  -0.29765040
## Li.eg -0.22480768
## WaBr  -0.17402342
## Hain  -0.05876400
## Brar   0.01099522
## OrFl   0.11996716
## FlBr   0.40760825
## Limb   0.47866297
## OcFl   0.49360743

XV.4. Exercícios


  1. Mostre que as matrizes \(A^{-1}XB^{-1}X^\top\) e \(b^{-1}X^\top A^{-1}X\) têm autovalor igual a 1 e que os autovetores correspondentes são proporcionais a \((1,\cdots,1)^\top\).

  2. Verifique que \(C\sqrt{b}=0\), \(C^\top\sqrt{a}=0\), \(\delta_k^\top \sqrt{b}=0\), \(\gamma_k^\top \sqrt{a}=0\), \(r_K^\top a =0\) e \(s_k^\top b=0\).

  3. Faça uma análise de correspondência para os dados de marcas de carros CarMarks, Exercício 4, Seção XI.8. Explique como essa tabela pode ser considerada uma tabela de contingência.

  4. Prove que \(C=A^{-1/2}(X-E)B^{-1/2}\sqrt{x_{\bullet\bullet}}\), \(E=ab^\top/x_{\bullet\bullet}\) e verifique que \(r_k=\sqrt{x_{\bullet\bullet}/\lambda_k} \, A^{-1}X s_k\) e \(s_k=\sqrt{x_{\bullet\bullet}/\lambda_k} \, B^{-1}X^\top r_k\).