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
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
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 , avec une matrice de poids (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 , avec comme matrice de poids . 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 au lieu de la matrice ), avec maintenant comme métrique , avec une matrice de poids . 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.
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (January 26, 2015). Analyse des Correspondances. Freakonometrics. Retrieved October 4, 2024 from https://doi.org/10.58079/ouy9