Analyse des Correspondances, suite

Hier soir, on voyait comment faire une analyse des correspondances à partir du tableau de contingence. Mais on peut avoir le problème autrement, à partir des individus. Certes, ces derniers ne sont pas observés (vraiment), mais peu importe.

> data(HairEyeColor)
> N = HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"]
> Hair = rep(rep(rownames(N),ncol(N)),
+ as.vector(N))
> Eye =  rep(colnames(N),apply(N,2,sum))
> df = data.frame(Ind=1:sum(N),Hair,Eye)
> tail(df)
    Ind  Hair   Eye
587 587 Blond Green
588 588 Blond Green
589 589 Blond Green
590 590 Blond Green
591 591 Blond Green
592 592 Blond Green

On a ici une base classique, mais pas encore une matrice avec laquelle on pourra faire de l’analyse de données. Pour récupérer la matrice, on va disjoncter cette base,

> XH <- model.matrix(Ind~0+Hair,data=df)
> XE <- model.matrix(Ind~0+Eye,data=df)
> X <- cbind(XE,XH)
> tail(X[,1:5])
    EyeBlue EyeBrown EyeGreen EyeHazel HairBlack
587       0        0        1        0         0
588       0        0        1        0         0
589       0        0        1        0         0
590       0        0        1        0         0
591       0        0        1        0         0
592       0        0        1        0         0

On a cette fois une vraie matrice de nombres, avec laquelle on peut faire des calculs. Parmi les représentation usuelles, on peut définir la matrice de Burt, qui est une forme de tableau de contingence en grande dimension (à partir des variables disjonctées).

> Burt <- t(X) %*% X 
> Burt[,1:5]
     EyeBlue EyeBrown EyeGreen EyeHazel HairBlack
EyeBlue  215        0        0        0        20
EyeBrown   0      220        0        0        68
EyeGreen   0        0       64        0         5
EyeHazel   0        0        0       93        15
HairBlack 20       68        5       15       108
HairBlond 94        7       16       10         0
HairBrown 84      119       29       54         0
HairRed   17       26       14       14         0

(etc) Mais on en reparlera.

On avait noté que pour l’Analyse des Correspondances, la distance naturelle était celle du chi-deux. Prenons notre tableau disjonctif. L’écriture classique de la distance du chi-deux entre deux lignes,

https://latex.codecogs.com/gif.latex?d_{\chi^2}^2(i_1,i_2)=\sum_j%20\frac{n}{n_{\cdot,j}}\left[\frac{n_{i_1,j}}{n_{i_1,\cdot}}-\frac{n_{i_2,j}}{n_{i_2,\cdot}}\right]^2donne ici (comme les sommes des lignes donne https://latex.codecogs.com/gif.latex?phttps://latex.codecogs.com/gif.latex?p est le nombre de variables qualitatives – ici 2, mais on espère bien pouvoir intégrer plus de variables qualitatives – et où les nombres qui apparaissent dans la matrice sont les https://latex.codecogs.com/gif.latex?\boldsymbol{x}_{i,j}),

https://latex.codecogs.com/gif.latex?d_{AC}^2(i_1,i_2)=\sum_j\frac{1}{\omega_j}\left[\frac{\boldsymbol{x}_{i_1,j}}{p}-\frac{\boldsymbol{x}_{i_2,j}}{p}\right]^2

avec

https://latex.codecogs.com/gif.latex?\omega_j=\frac{n_j}{np}

Voilà la distance entre deux individus. Si on voulait faire un ACP, on utilisait comme distance entre individus

https://latex.codecogs.com/gif.latex?d_{ACP}^2(i_1,i_2)=\sum_j\frac{1}{\sigma^2_j}[\boldsymbol{x}_{i_1,j}-\boldsymbol{x}_{i_2,j}]^2

Bref, notre analyse des correspondance peut être obtenue en faisant une ACP, avec les bons poids. Étant donné que

https://latex.codecogs.com/gif.latex?\sigma^2_j%20=%20\frac{n_j(n-n_j)}{n^2}

pour voir l’analyse des correspondances comme une ACP (entre des vrais individus, contrairement à hier), on va utiliser les poids suivants, sur les colonnes (i.e. les variables indicatrices disjonctées), i.e. on veut utiliser des distances de la forme

https://latex.codecogs.com/gif.latex?d_{AC}^2(i_1,i_2)=\sum_j%20\tilde\omega_j\left[{\boldsymbol{x}_{i_1,j}}-{\boldsymbol{x}_{i_2,j}}\right]^2

avec ici

https://latex.codecogs.com/gif.latex?%20\tilde\omega_j%20=%20\frac{n-n_j}{np}\cdot%20\frac{1}{\sigma^2_j} Bon, lançons nous… soit on utilise juste le terme de gauche et on demande une ACP sur données normalisées, soit on utilise ce poids, avec une ACP sur données brutes. Essayons le premier.

Pour les poids, on utilise

> n=sum(N)
> (nk=apply(X,2,sum))
  EyeBlue  EyeBrown  EyeGreen  EyeHazel HairBlack
      215       220        64        93       108
> n*p
[1] 1184

On pose alors

> omega=(n-nk)/(n*p)

et on fait ensuite une régression, dont on va chercher à représenter les variables (qui sont ici toutes nos modalités)

> library(FactoMineR)
> PCA(X,col.w = omega)

On retrouve ici – à une symétrie près – la sortie que l’on a quand on fait une analyse des correspondances,

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

On a ici une approche très différente de celle d’hier:

  • hier, on faisait une ACP, en projetant les individus, qui étaient les profils lignes de notre tableau de contingence (puis une analyse des profils colonnes, qu’on superposait ensuite)
  • aujourd’hui, on fait une ACP, on projetant cette fois les variables, dans un tableau disjonctif complet.

L’avantage de cette dernière technique est qu’elle peut se faire avec plus de deux variables qualitatives, contrairement à la première approche.


Leave a Reply

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