Considérons les données suivantes, correspondant à des professions au sein d’un couple. On dispose du tableau de contingence suivant
> base=read.table( "http://freakonometrics.free.fr/epoux.csv", sep=";",header=TRUE) > rownames(base)=base$Nom
Classiquement, avec ce genre de données, on est habitué à utiliser la distance du chi-deux, et les contributions au chi-deux pour voir les modalités qui correspondent fortement
> M=base[1:9,2:10] > CT=chisq.test(M)
On peut le visualiser de la manière suivante,
> mosaicplot(t(M),main="",las=2,shade=TRUE)
avec les maris en ligne, et les épouses en colonnes. Les contribution importantes sont en bleu ou rouge foncé, les couleurs correspondant respectivement à un lien ‘positif’ (probabilité jointe plus importante que le cas indépendant) ou un lien ‘négatif’ (probabilité jointe moins importante que le cas indépendant)
ou dans l’autre sens
> mosaicplot(M,main="",las=2,shade=TRUE)
mais avec la même conclusion que précédemment: il y a de fortes valeurs bleues sur la diagonale.
Autrement dit, les couples sont relativement homogènes en terme de professions.
En analyse des correspondance, on va regarder notre tableau de contingence, en ligne ou en colonne. Par exemple, on peut définir les profils lignes, qui sont des vecteurs de probabilité \boldsymbol{L}_i=\left(\frac{p_{i1}}{p_{i\cdot}},\cdots,\frac{p_{iJ}}{p_{i\cdot}}\right)\in\mathbb{R}^J
> N=M > L=N/apply(N,1,sum)
En notant \boldsymbol{D}_I=\text{diag}(p_{1\cdot},\cdots,p_{I\cdot}), on peut écrire \boldsymbol{L}=\boldsymbol{D}_I^{-1}\boldsymbol{N}Le barycentre de nos vecteurs de lignes est ici\overline{\boldsymbol{L}}=\left(p_{\cdot 1},\cdots,p_{\cdot J}\right)\in\mathbb{R}^J
Là encore, en notant \boldsymbol{D}_J=\text{diag}(p_{\cdot 1},\cdots,p_{\cdot J}), on peut écrire ce barycentre de manière matricielle, \overline{\boldsymbol{L}}=\mathbb{I}_{IJ}\boldsymbol{D}_J.\boldsymbol{L}_{0,i}=\boldsymbol{L}_i-\overline{\boldsymbol{L}}
> Lbar=apply(N,2,sum)/sum(N) > matL0=t(t(L)-Lbar)
A chaque point, on a associé la fréquence (relative) comme poids, p_{i\cdot}, ce qui correspond à utiliser la matrice \boldsymbol{D}_I. Pour mesurer la distance entre deux points, on va pondérer la distance euclidienne par l’inverse des des probabilités, p_{\cdot j}, ce qui revient à utiliser la matrice \boldsymbol{D}_J^{-1}. La distance entre deux lignes estd(\boldsymbol{L}_{i_1},\boldsymbol{L}_{i_2})=\sum_{j=1}^J\frac{1}{p_{\cdot j}}\left(\frac{p_{i_1j}}{p_{i_1\cdot}}-\frac{p_{i_2j}}{p_{i_2\cdot}}\right)^2
On va alors faire une analyse en composantes principales avec ces différents poids. D’un point de vue matriciel, on va alors l’analyse spectrale de\boldsymbol{H}=\boldsymbol{D}_J^{-1/2}\boldsymbol{L}_0^{\text{T}}\boldsymbol{D}_I\boldsymbol{L}_0\boldsymbol{D}_J^{-1/2}
En particulier, on note \boldsymbol{U}_1,\cdots,\boldsymbol{U}_k les vecteurs propres, et on défini les composantes principales\boldsymbol{C}=\boldsymbol{L}_0\boldsymbol{D}_J^{-1/2}\boldsymbol{U}
La projection sur les deux premières composantes des lignes donne ici
> library(FactoMineR) > acpL=PCA(matL0,scale.unit=FALSE, + row.w=(apply(N,1,sum)), + col.w=1/(apply(N,2,sum)))
L’idée est de visualiser le nuage des individus correspondants aux lignes. Dans un second temps, on va faire exactement pareil, mais sur les colonnes\boldsymbol{C}_j=\left(\frac{p_{1j}}{p_{\cdot j}},\cdots,\frac{p_{jI}}{p_{\cdot j}}\right)\in\mathbb{R}^I
> C=t(t(N)/apply(N,2,sum))
Le barycentre est ici\overline{\boldsymbol{C}}=\left(p_{1\cdot},\cdots,p_{I\cdot}\right)\in\mathbb{R}^I
> Cbar=apply(N,1,sum)/sum(N) > matC0=C-Cbar
et on peut alors faire une analyse en composante principale
> acpC=PCA(t(matC0),scale.unit=FALSE, + row.w=(apply(N,2,sum)), + col.w=1/(apply(N,1,sum)))
ce qui donne, en regardant le nuage des individus,
La magie de l’analyse des correspondances est qu’on ‘peut’ représenter les deux projections des individus sur le même plan,
> matC=acpC$ind$coord > matL=acpL$ind$coord > plot(matC[,1:2],col="red",xlim=c(-.002,.015)) > text(matC[,1:2],rownames(matC),col="red",pos=4) > points(matL[,1:2],col="blue") > text(matL[,1:2],rownames(matL),col="blue")
C’est exactement ce que fait la fonction
> afc=CA(N)
Note: en réalité, si on regarde les coordonnées des lignes par ACP on obtient
acpL$ind$coord Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Agriculteur (M) -0.000056 -0.000414 0.002940 0.000150 0.000011 Artisan (M) -0.000014 0.000152 -0.000057 0.000323 0.001279 Cadres (M) -0.000262 0.001734 -0.000015 0.000359 -0.000219 Prof_Int (M) -0.000194 0.000450 -0.000003 -0.000504 0.000041 Employe (M) -0.000104 -0.000317 -0.000083 -0.000188 0.000011 Ouvrier (M) -0.000052 -0.000764 -0.000080 0.000133 -0.000141 Retraite (M) 0.007771 0.000502 -0.000001 -0.000089 -0.000065 Inactif (M) -0.000018 -0.000150 -0.000163 0.000751 -0.000007 Inconnu(M) 0.000261 -0.000492 -0.000554 0.000398 0.000648 |
alors que
CA(M, graph = FALSE)$row$coord Dim 1 Dim 2 Dim 3 Dim 4 Dim 5 Agriculteur (M) -0.028 -0.209 1.481 0.076 0.005 Artisan (M) -0.007 0.077 -0.029 0.163 0.644 Cadres (M) -0.132 0.873 -0.007 0.181 -0.110 Prof_Int (M) -0.098 0.227 -0.001 -0.254 0.020 Employe (M) -0.053 -0.160 -0.042 -0.095 0.006 Ouvrier (M) -0.026 -0.385 -0.040 0.067 -0.071 Retraite (M) 3.914 0.253 -0.001 -0.045 -0.033 Inactif (M) -0.009 -0.075 -0.082 0.378 -0.004 Inconnu(M) 0.132 -0.248 -0.279 0.201 0.327 |
ce qui donne un ratio constant,
acpL$ind$coord/CA(M, graph = FALSE)$row$coord Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Agriculteur (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Artisan (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Cadres (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Prof_Int (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Employe (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Ouvrier (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Retraite (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Inactif (M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 Inconnu(M) 0.001985182 0.001985182 0.001985182 0.001985182 0.001985182 |
qui correspond à 1/\sqrt{n}
1/sqrt(sum(M)) [1] 0.001985182 |
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (January 20, 2016). Analyse des Correspondances et ACP. Freakonometrics. Retrieved September 16, 2024 from https://doi.org/10.58079/ov2e