Analyse des Correspondances

Lors du dernier cours d’analyse des données, on était parti sur l’analyse (simple) des correspondance, à partir d’un tableau de contingence, pour deux variables qualitatives,

On définit alors les effets marginaux,

pour les lignes, et pour les colonnes,

Prenons la matrice du tableau de contingence des variables couleurs des yeux / couleurs des cheveux,

> data(HairEyeColor) 
> N = HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"]
> N
       Eye
Hair    Brown Blue Hazel Green
  Black    68   20    15     5
  Brown   119   84    54    29
  Red      26   17    14    14
  Blond     7   94    10    16

On peut ajouter les totaux par marges, car on en aura besoin par la suite

> addmargins(N)
       Eye
Hair    Brown Blue Hazel Green Sum
  Black    68   20    15     5 108
  Brown   119   84    54    29 286
  Red      26   17    14    14  71
  Blond     7   94    10    16 127
  Sum     220  215    93    64 592

Au lieu de travailler avec les comptages, on peut considérer les probabilités empiriques, appelées aussi fréquences empiriques,

La matrice des profils lignes est ici

> L = N / apply(N,1,sum)
> L
       Eye
Hair         Brown      Blue      Hazel     Green
  Black 0.62962963 0.1851852 0.13888889 0.0462963
  Brown 0.41608392 0.2937063 0.18881119 0.1013986
  Red   0.36619718 0.2394366 0.19718310 0.1971831
  Blond 0.05511811 0.7401575 0.07874016 0.1259843

où chaque ligne est une mesure de probabilité, dans l’espace de la couleur des yeux.

> addmargins(L)
       Eye
Hair        Brown     Blue     Hazel    Green Sum
  Black 0.6296296 0.185185 0.1388888 0.046296   1
  Brown 0.4160839 0.293706 0.1888111 0.101398   1
  Red   0.3661971 0.239436 0.1971831 0.197183   1
  Blond 0.0551181 0.740157 0.0787401 0.125984   1

(il y a une ligne en plus, mais qui ne sert à rien) Unne autre commande pour avoir la même sortie est

> addmargins(prop.table(N,1))

Aussi, tous les profils lignes sont dans le simplexe de . On peut aussi définir le profil ligne moyen

> Lbar <- apply(N,2,sum)/sum(N)
> Lbar 
    Brown      Blue     Hazel     Green 
0.3716216 0.3631757 0.1570946 0.1081081

Si les deux couleurs (yeux et cheveux) étaient indépendantes, les lignes de la matrice précédente seraient égales à cette dernière.

Un peu d’algèbre matricielle permet de noter que

avec . Et on notera que l’on peut aussi écrire

https://latex.codecogs.com/gif.latex?\overline{\boldsymbol%20L}=\frac{1}{n}[\Delta_L^{-1}%20\boldsymbol%20N]^{\text{\sffamily%20T}}\Delta_L\boldsymbol{1}

En cas d’indépendance, , et tous les profils lignes sont alors égaux.

La distance entre profils ligne sera ici inspirée de la distance du chi-deux,

Ce n’est alors plus la métrique euclidienne standard…  En reprenant des notations classiques d’algèbre linéaire, on notera

https://latex.codecogs.com/gif.latex?d(\boldsymbol%20L_{i_1}%2C\boldsymbol%20L_{i_2})%3D\Vert%20\boldsymbol%20L_{i_1}-\boldsymbol%20L_{i_2}%20\Vert^2_{n\Delta_C^{-1}}

où ici , histoire de récupérer les probabilités conditionnelles.

Si je me permets une petite digression, de manière générale, étant donnée une matrice diagonale de , on peut définir un produit scalaire

et on a une sorte de norme euclidienne associée,

La “sphère unité” pour cette nouvelle norme est alors un ellipsoïde. On peut montrer assez facilement que munir l’espace d’une telle métrique est équivalent à attribuer des poids aux différentes composantes, et à utiliser la métrique usuelle (dite canonique).

Aussi, en analyse en composante principale, on avait noté qu’il valait souvent mieux “normaliser” les données, pour éviter les problèmes d’unités. Lorsque nous avions vu l’analyse en composante principale en cours, nous avions utilisé la distance euclidienne sur la matrice normalisée, mais en fait, il aurait été équivalent de faire une analyse en composantes principales sur avec comme métrique .

Lorsque l’on projette le nuage de points (ici nos lignes) sur une droite de vecteur directeur , l’inertie est alors

Considérons l’analyse spectrale de la matrice : on note les valeurs propres (ordonnées de manière décroissante) et les vecteurs propres. La contribution (absolue) du point est alors

Le facteur permet de normaliser, en quelque sorte: la somme des contributions de tous mes individus est ici 1.

Mais revenons à nos moutons. Travaillons sur la matrice des profils lignes centrés,

> n = sum(N)
> X = t(t(L)-Lbar)

Si on regarde les valeurs propres, effectivement, la quatrième est nulle (car on est sur le simplexe, ce qui impose une contrainte)

> eigen(X%*%t(X))
$values
[1] 3.550530e-01 2.718039e-02 1.652334e-03 1.659651e-17

On va effectuer ici un ACP du nuage des lignes, avec la métrique https://latex.codecogs.com/gif.latex?\Vert%20\cdot%20\Vert^2_{n\Delta_C^{-1}}, avec une matrice de poids https://latex.codecogs.com/gif.latex?n^{-1}\Delta_L (car certes, on a normalisé, mais on n’avait pas autant d’individus sur toutes les lignes). Bref, la première partie de l’analyse des correspondance revient à faire une ACP sur la matrice des profils lignes, avec pour métrique https://latex.codecogs.com/gif.latex?\Vert%20\cdot%20\Vert^2_{n\Delta_C^{-1}}, avec comme matrice de poids https://latex.codecogs.com/gif.latex?n^{-1}\Delta_L. Autrement dit, on calcule

> acp = PCA(X,scale.unit=FALSE,row.w=(apply(N,1,sum)/n),col.w=1/(apply(N,2,sum)/n))

Si on visualise nos individus, on obtient

> plot(acp,choix="ind")

On a fait ici la première moitié. Car ensuite, de manière parfaitement symétrique on ne fait plus l’ACP sur les profils lignes, mais les profils colonnes (autrement dit sur la matrice https://latex.codecogs.com/gif.latex?\boldsymbol{C}=\Delta_C^{-1}\boldsymbol{N}^{\text{\sffamily%20T}} au lieu de la matrice https://latex.codecogs.com/gif.latex?\boldsymbol{L}=\Delta_L^{-1}\boldsymbol{N}), avec maintenant comme métrique https://latex.codecogs.com/gif.latex?\Vert%20\cdot%20\Vert^2_{n\Delta_L^{-1}}, avec une matrice de poids https://latex.codecogs.com/gif.latex?n^{-1}\Delta_C. Bref, pour faire cette ACP, on utilise

> tN=t(N)
> C = tN / apply(tN,1,sum)
> Cbar = apply(tN,2,sum)/sum(N)
> Y = t(t(C)-Cbar)
> acp = PCA(Y,scale.unit=FALSE,row.w=(apply(N,2,sum)/n),col.w=1/(apply(N,1,sum)/n))

et pour visualiser

Quelque part, on peut projet les deux nuages (les profils lignes d’un côté, et les profils colonnes de l’autre) sur la même représentation (un peu comme en ACP). Si on visualise simultanément (à un soucis de signe près car si on considère des vecteurs propres de norme 1, il restera toujours une indétermination quand on signe), on obtient l’analyse des correspondances.

> library(FactoMineR)
> acm=CA(N)

Autant l’analyse des profils lignes (les points bleus, correspondant aux couleurs des cheveux) permet de voir des profils proches en terme de distribution de couleurs d’yeux, l’analyse des profils colonnes (ici les points rouges) permet de voir les proximités entre les distributions des couleurs de cheveux, pour différentes couleurs d’yeux. Mais surtout, cette double projection permet de voir des corrélations fortes entre modalités des deux variables, ici la couleurs des yeux et la couleur des cheveux. On retrouve ici l’idée de la représentation simultanée dans le schéma

Un test du chi-deux, permettant de tester l’indépendance entre la couleur des yeux et la couleur des cheveux donne les résidus suivants

> chisq.test(N)$residuals
       Eye
Hair         Brown     Blue     Hazel     Green
  Black  4.3983985 -3.06937 -0.477352 -1.953683
  Brown  1.2334581 -1.94947  1.353284 -0.345099
  Red   -0.0749779 -1.73012  0.852252  2.282736
  Blond -5.8509974  7.04959 -2.227844  0.612698

Autrement dit, on a une fort résidus (plus que sous hypothèse d’indépendance) entre les yeux bleus et les cheveux blond (c’est la plus forte valeur). Il serait donc normal que blond et blue soient proches. Pareil pour black et brown (pour les yeux). En revanche, blond et brown doivent être très éloignés. C’est finalement ce qu’on retrouve sur cette double projection. Un autre outils est la matrice d’attraction-répulsion, qui présente les résidus non pas de manière absolue (en tant que différence) mais relative, avec un ratio

> N/chisq.test(N)$expected
       Eye
Hair        Brown      Blue     Hazel     Green
  Black 1.6942761 0.5099053 0.8841099 0.4282407
  Brown 1.1196440 0.8087169 1.2018949 0.9379371
  Red   0.9854033 0.6592859 1.2551870 1.8239437
  Blond 0.1483178 2.0380150 0.5012277 1.1653543

Mais on verra… il y a d’autres techniques pour arriver à la même représentation, basées non pas sur le tableau de contingence, mais sur le tableau disjonctif… à suivre donc.


Leave a Reply

Your email address will not be published. Required fields are marked *