try:
import seaborn numpy matplotlib pandas mca
except ModuleNotFoundError:
!pip3 install --quiet seaborn numpy matplotlib pandas mca
Cell In[1], line 2
import seaborn numpy matplotlib pandas mca
^
SyntaxError: invalid syntax
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
TP AFC / ACM#
Exercice 1 : Analyse Factorielle des Correspondances#
Le fichier de données est un tableau d’effectifs, croisant l’origine sociale des sondés (CSP, version simplifiée) avec les médias d’informations utilisés
media = pd.read_table("./data/mediaCSP.txt", header=0, index_col=0, delimiter="\t", encoding="utf-8")
print(media)
Radio Tel. Quot.Nat. Quot.Reg. Press.Mag. Press.TV
Prof
Agriculteur 96 118 2 71 50 17
Petit.Patr. 122 136 11 76 49 41
Prof.Cad.Sup 193 184 74 63 103 79
Prof.Int. 360 365 63 145 141 184
Employe 511 593 57 217 172 306
Ouvr.Qualif. 385 457 42 174 104 220
Ouvr.Non-Qual. 156 185 8 69 42 85
Inactif 1474 1931 181 852 642 782
===== Votre travail : =====#
Vous avez à disposition un fichier ca.py, permettant de réaliser les calculs relatifs à une analyse factorielle des correspondances. L’objectif est de répondre aux questions suivantes :
Quelle est la structure des moyens d’information choisis selon la CSP ? (profils lignes).
La structure est-elle différente d’une CSP à l’autre ?
Les médias sont-ils différents en termes de CSP ? (profils colonnes)
Existe-t-il des relations entre CSP et médias (des CSP ont-elles une préférences pour certains médias ? Certains médias attirent-ils des catégories particulières de CSP ?)
Analyse Factorielle des correspondances#
On créé une instance de l’objet CA, que l’on applique sur le tableau des valeurs
from ca import CA
afc = CA(row_labels=media.index,col_labels=media.columns)
afc.fit(media.values)
CA(col_labels=Index(['Radio', 'Tel.', 'Quot.Nat.', 'Quot.Reg.', 'Press.Mag.', 'Press.TV'], dtype='object'),
row_labels=Index(['Agriculteur', 'Petit.Patr.', 'Prof.Cad.Sup', 'Prof.Int.', 'Employe',
'Ouvr.Qualif.', 'Ouvr.Non-Qual.', 'Inactif'],
dtype='object', name='Prof'))
Valeurs propres#
En utilisant l’attribut \(eig\_\) et la fonction plot_eigenvalues (ligne 294 du fichier \(base.py\)),afficher et interpréter les valeurs propres issues de l’analyse factorielle (nombre, contribution des facteurs…)
#TODO
[[1.38572868e-02 7.21068498e-03 8.24731391e-04 3.03851641e-04
8.26930155e-05]
[6.21981806e+01 3.23650288e+01 3.70179190e+00 1.36383258e+00
3.71166101e-01]
[6.21981806e+01 9.45632094e+01 9.82650013e+01 9.96288339e+01
1.00000000e+02]]
#TODO
![_images/42bd7b84ffcde9d77295d810fde02aa8bd5d527266600ed763bfd2d4984a7649.png](_images/42bd7b84ffcde9d77295d810fde02aa8bd5d527266600ed763bfd2d4984a7649.png)
Analyse des profils lignes#
On affiche ici, pour chaque modalité ligne, la distribution des individus colonnes
data = np.apply_along_axis(arr=media.values,axis=1,func1d=lambda x:x/np.sum(x))
data_cum = data.cumsum(axis=1)
labels = list(media.index)
colors = plt.get_cmap('RdYlGn')(np.linspace(0.15, 0.85, data.shape[1]))
fig, ax = plt.subplots(figsize=(9.2, 5))
ax.invert_yaxis()
ax.xaxis.set_visible(False)
ax.set_xlim(0, np.sum(data, axis=1).max())
for i, (colname, color) in enumerate(zip(list(afc.col_labels_short_.values), colors)):
widths = data[:,i]
starts = data_cum[:,i] - widths
ax.barh(labels, widths, left=starts, height=0.5,label=colname, color=color)
xcenters = starts + widths / 2
r, g, b, _ = color
text_color = 'white' if r * g * b < 0.5 else 'darkgrey'
for y, (x, c) in enumerate(zip(xcenters, widths)):
ax.text(x, y, str(float(round(c,2))), ha='center', va='center',
color=text_color)
ax.legend(ncol=len(afc.col_labels_short_.values), bbox_to_anchor=(0, 1),
loc='lower left', fontsize='small')
plt.show()
![_images/4545bdb0be5a1371e48c6425debbe3743cbeff5e03b1b3b1696b7624379e48b0.png](_images/4545bdb0be5a1371e48c6425debbe3743cbeff5e03b1b3b1696b7624379e48b0.png)
En utilisant l’attribut row_coord_, afficher les coordonnées des modalités lignes par facteur. Calculer la moyenne pondérée et la variance des coordonnées des modalités lignes sur le premier facteur. Qu’obtenez-vous ?
#TODO
0 1 2 3 4
Prof
Agriculteur 0.166150 0.309612 -0.071838 -0.014433 0.021440
Petit.Patr. 0.068377 0.143151 -0.064422 0.020370 -0.025687
Prof.Cad.Sup -0.429976 0.060873 -0.003021 0.016811 0.011233
Prof.Int. -0.106603 -0.032597 -0.030898 -0.025333 -0.011955
Employe 0.015729 -0.095469 -0.005087 -0.020294 0.003462
Ouvr.Qualif. 0.043713 -0.101379 -0.019323 0.035411 -0.001730
Ouvr.Non-Qual. 0.117797 -0.094864 -0.039728 0.003493 0.022484
Inactif 0.032584 0.033395 0.025968 0.000553 -0.000935
#TODO
Moyenne : 1.3877787807814457e-17
Variance : 0.013857286816774693
Moyenne : 1.3877787807814457e-17 égale à 0
Variance : 0.013857286816774693 égale à la valeur propre associée
En utilisant la fonction mapping_row (ligne 389, ficher base.py), représenter les individus lignes dans le premier plan factoriel (qui restitue 94.5% de l’information disponible). Analyser le résultat
#TODO
![_images/ae0397e4131663dae0d3e8a087717e6862b8b680f2a979c66623e11992a6c9ad.png](_images/ae0397e4131663dae0d3e8a087717e6862b8b680f2a979c66623e11992a6c9ad.png)
Calcul de la distance du \(\chi^2\)#
La distance du \(\chi^2\) entre les modalités lignes dans l’espace initial devient distance euclidienne dans l’espace factoriel. Comme en ACP, la restitution est parfaite lorsque tous les facteurs sont pris en compte, et approchée si une partie est utilisée. La précision dépend alors d’une part de la qualité de restitution du repère factoriel choisi, d’autre part de la qualité de représentation des modalités impliquées dans le calcul (les \(cos^2\)).
f,ax = plt.subplots(1, 2,figsize=(10,4))
for l in range(0,2):
# Distances entre modalités sur le l-eme facteur
plt.subplot(1,2,l+1)
distPairesLigF1 = np.zeros(shape=(data.shape[l],data.shape[l]))
for i in range(data.shape[l]-1):
for j in range(i+1,data.shape[l]):
distPairesLigF1[i,j] = np.sum((afc.row_coord_[i,0]-afc.row_coord_[j,0])**2)
sns.heatmap(distPairesLigF1,vmin=0,vmax=np.max(distPairesLigF1),linewidth=0.1,cmap= 'Greens',xticklabels=media.index,yticklabels=media.index)
plt.title("Distance sur le facteur "+str(l+1))
f.subplots_adjust(wspace=0.9)
![_images/78d435f0f57df72a489f4298556cb8e3a6296e842cdd7c42cca3d8200b8bd8e1.png](_images/78d435f0f57df72a489f4298556cb8e3a6296e842cdd7c42cca3d8200b8bd8e1.png)
Analyse des profils colonnes#
Faire la même analsye sur les profils colonnes. Interpréter les résultats
#TODO
![_images/ef61a517ba9a6c53d347d3a7c3b35affb324ab74240b48c203c56b87e95a1fca.png](_images/ef61a517ba9a6c53d347d3a7c3b35affb324ab74240b48c203c56b87e95a1fca.png)
Analyse de l’association lignes-colonnes#
Au-delà de la comparaison des profils, l’intérêt majeur de l’AFC est d’identifier les associations entre les modalités lignes et colonnes : est ce que les agriculteurs s’informent plus par la radio que les autres ? Est ce que la presse magazine attire plus les cadres ?
Avant de s’intéresser aux relations entre les modalités, il faut déjà vérifier qu’il existe bien une liaison exploitable entre les variables en ligne et colonne du tableau de contingence. La statistique du \(\chi^2\) de l’écart à l’indépendance permet de le faire
Faire un test du \(\chi^2\) (voir le cours statistiques bivariées), en utilisant la fonction \(scipy.stats.chi2.cdf\) du module \(scipy\). Conclure.
#TODO
p= 0.0
Le test conduit au rejet de l’hypothèse nulle : les variables lignes et colonnes sont donc manifestement fortement liées.
Pour approfondir la nature des relations entre les modalités lignes et colonnes du tableau, on peut calculer l’indice d’attraction / répulsion, défini par $\(\frac{P(Y=y_k, X=x_l)}{P(Y=y_k)P(X=x_l)}\)$
où \(x_l\) et \(y_k\) sont les profils ligne et colonne. En pratique, cet indice est calculé comme le rapport entre les effectifs observés et théoriques : s’il est supérieur à 1, il y a une attraction ; sinon il y a répulsion entre les modalités.
Calculer cet indice, effectuer uin test du \(\chi^2\) et conclure.
#TODO
p= 0.0
Représentation simultanée lignes/colonnes#
En utilisant la fonction \(mapping\) (ligne 329 du fichier base.py), projeter sur le premier plan factoriel les individus ligne et colonne. Interpreter.
#TODO
![_images/21960d4d559c664630814aac4988f6d78da34593eb90b4fe308fcbecf807b65d.png](_images/21960d4d559c664630814aac4988f6d78da34593eb90b4fe308fcbecf807b65d.png)
Comme en ACP où il est possible de reconstituer approximativement les données originelles à partir des coordonnées factorielles des individus, on peut approcher le tableau des indices d’attraction-répulsion \(i_{kl}\) à partir des coordonnées factorielles des modalités lignes et colonnes : en reconstruisant à partir des \(P\) premiers facteurs, si \(F_{kp}\) ett \(G_{lp}\) sont les coordonnées factorielles des modalités lignes et colonnes
\(i_{kl} = 1+\displaystyle\sum_{p=1}^P \frac{F_{kp}G_{lp}}{\sqrt{\lambda_p}}\)
Ainsi :
Deux modalités s’attirent (resp. se repoussent) si leurs coordonnées sont de même signe (resp. de signe contraire) sur les axes factoriels.
Le trait est d’autant plus marqué que les valeurs des coordonnées sont élevées (en valeur absolue) c.-à-d. que les points sont situés aux extrémités des facteurs.
Les coordonnées doivent être relativisées par le pouvoir de restitution du facteur (\(\lambda_h\)).
Calculer l’approximation des inices d’attraction-répulsion à parit des données du premier facteur (P=1). Interpréter.
#TODO
Radio Tel. Quot.Nat. Quot.Reg. Press.Mag. Press.TV
Prof
Agriculteur 1.018944 1.040396 0.159792 1.490461 1.342838 0.347085
Petit.Patr. 1.053787 0.975820 0.715205 1.298344 1.070936 0.681216
Prof.Cad.Sup 1.041910 0.825142 3.007112 0.672662 1.406970 0.820367
Prof.Int. 1.075237 0.905591 1.416404 0.856550 1.065603 1.057128
Employe 1.034487 0.997233 0.868608 0.868855 0.881064 1.191609
Ouvr.Qualif. 1.046731 1.032115 0.859544 0.935636 0.715455 1.150549
Ouvr.Non-Qual. 1.075500 1.059486 0.415165 0.940845 0.732672 1.127231
Inactif 0.944787 1.028150 0.873293 1.080089 1.041228 0.964165
Radio Tel. Quot.Nat. Quot.Reg. Press.Mag. Press.TV
Prof
Agriculteur 0.978913 1.075205 0.236872 1.153604 0.866178 1.013767
Petit.Patr. 0.991322 1.030950 0.685943 1.063214 0.944927 1.005665
Prof.Cad.Sup 1.054571 0.805378 2.974881 0.602491 1.346314 0.964374
Prof.Int. 1.013530 0.951748 1.489626 0.901447 1.085861 0.991167
Employe 0.998004 1.007119 0.927759 1.014541 0.987332 1.001303
Ouvr.Qualif. 0.994452 1.019786 0.799228 1.040412 0.964793 1.003622
Ouvr.Non-Qual. 0.985050 1.053319 0.458958 1.108902 0.905123 1.009760
Inactif 0.995865 1.014749 0.850343 1.030123 0.973756 1.002700
Exercice 2 : Analyse des Correspondances Multiples#
Ici on s’intéresse à 6 traits de caractères de 27 races de chien, et on souhaite analyser le tableau par ACM
chiens = pd.read_table("./data/chiens.txt", header=0, index_col=0, delimiter="\t", encoding="utf-8")
print(chiens)
Taille Poids Velocite Intelligence Affection Agressivite
Chien
Beauceron Taille++ Poids+ Veloc++ Intell+ Affec+ Agress+
Basset Taille- Poids- Veloc- Intell- Affec- Agress+
Berger All Taille++ Poids+ Veloc++ Intell++ Affec+ Agress+
Boxer Taille+ Poids+ Veloc+ Intell+ Affec+ Agress+
Bull-Dog Taille- Poids- Veloc- Intell+ Affec+ Agress-
Bull-Mastif Taille++ Poids++ Veloc- Intell++ Affec- Agress+
Caniche Taille- Poids- Veloc+ Intell++ Affec+ Agress-
Chihuahua Taille- Poids- Veloc- Intell- Affec+ Agress-
Cocker Taille+ Poids- Veloc- Intell+ Affec+ Agress+
Colley Taille++ Poids+ Veloc++ Intell+ Affec+ Agress-
Dalmatien Taille+ Poids+ Veloc+ Intell+ Affec+ Agress-
Doberman Taille++ Poids+ Veloc++ Intell++ Affec- Agress+
Dogue-All Taille++ Poids++ Veloc++ Intell- Affec- Agress+
Epag.-Breton Taille+ Poids+ Veloc+ Intell++ Affec+ Agress-
Epag.-Français Taille++ Poids+ Veloc+ Intell+ Affec- Agress-
Fox-Hound Taille++ Poids+ Veloc++ Intell- Affec- Agress+
Fox-Terrier Taille- Poids- Veloc+ Intell+ Affec+ Agress+
Gd-Bleu-Gasc Taille++ Poids+ Veloc+ Intell- Affec- Agress+
Labrador Taille+ Poids+ Veloc+ Intell+ Affec+ Agress-
Levrier Taille++ Poids+ Veloc++ Intell- Affec- Agress-
Mastiff Taille++ Poids++ Veloc- Intell- Affec- Agress+
Pekinois Taille- Poids- Veloc- Intell- Affec+ Agress-
Pointer Taille++ Poids+ Veloc++ Intell++ Affec- Agress-
St-Bernard Taille++ Poids++ Veloc- Intell+ Affec- Agress+
Setter Taille++ Poids+ Veloc++ Intell+ Affec- Agress-
Teckel Taille- Poids- Veloc- Intell+ Affec+ Agress-
Terre-Neuve Taille++ Poids++ Veloc- Intell+ Affec- Agress-
On récupère les variables actives : on s’intéresse à un sous-ensemble de cardinal \(k\) de variables du jeu de données (vous pouvez changer les variables utilisées).
var_chiens = chiens[['Taille','Velocite','Affection']]
print(var_chiens)
Taille Velocite Affection
Chien
Beauceron Taille++ Veloc++ Affec+
Basset Taille- Veloc- Affec-
Berger All Taille++ Veloc++ Affec+
Boxer Taille+ Veloc+ Affec+
Bull-Dog Taille- Veloc- Affec+
Bull-Mastif Taille++ Veloc- Affec-
Caniche Taille- Veloc+ Affec+
Chihuahua Taille- Veloc- Affec+
Cocker Taille+ Veloc- Affec+
Colley Taille++ Veloc++ Affec+
Dalmatien Taille+ Veloc+ Affec+
Doberman Taille++ Veloc++ Affec-
Dogue-All Taille++ Veloc++ Affec-
Epag.-Breton Taille+ Veloc+ Affec+
Epag.-Français Taille++ Veloc+ Affec-
Fox-Hound Taille++ Veloc++ Affec-
Fox-Terrier Taille- Veloc+ Affec+
Gd-Bleu-Gasc Taille++ Veloc+ Affec-
Labrador Taille+ Veloc+ Affec+
Levrier Taille++ Veloc++ Affec-
Mastiff Taille++ Veloc- Affec-
Pekinois Taille- Veloc- Affec+
Pointer Taille++ Veloc++ Affec-
St-Bernard Taille++ Veloc- Affec-
Setter Taille++ Veloc++ Affec-
Teckel Taille- Veloc- Affec+
Terre-Neuve Taille++ Veloc- Affec-
Analyse des individus#
Dans la suite, on travaille sur le tableau disjonctif complet des données (variables transformées en indicatrices 0/1).
#codage en 0/1 des propriétés des chiens : tableau disjonctif complet
X = pd.get_dummies(var_chiens,prefix='',prefix_sep='')
n,p = X.shape
print(X)
Taille+ Taille++ Taille- Veloc+ Veloc++ Veloc- Affec+ \
Chien
Beauceron 0 1 0 0 1 0 1
Basset 0 0 1 0 0 1 0
Berger All 0 1 0 0 1 0 1
Boxer 1 0 0 1 0 0 1
Bull-Dog 0 0 1 0 0 1 1
Bull-Mastif 0 1 0 0 0 1 0
Caniche 0 0 1 1 0 0 1
Chihuahua 0 0 1 0 0 1 1
Cocker 1 0 0 0 0 1 1
Colley 0 1 0 0 1 0 1
Dalmatien 1 0 0 1 0 0 1
Doberman 0 1 0 0 1 0 0
Dogue-All 0 1 0 0 1 0 0
Epag.-Breton 1 0 0 1 0 0 1
Epag.-Français 0 1 0 1 0 0 0
Fox-Hound 0 1 0 0 1 0 0
Fox-Terrier 0 0 1 1 0 0 1
Gd-Bleu-Gasc 0 1 0 1 0 0 0
Labrador 1 0 0 1 0 0 1
Levrier 0 1 0 0 1 0 0
Mastiff 0 1 0 0 0 1 0
Pekinois 0 0 1 0 0 1 1
Pointer 0 1 0 0 1 0 0
St-Bernard 0 1 0 0 0 1 0
Setter 0 1 0 0 1 0 0
Teckel 0 0 1 0 0 1 1
Terre-Neuve 0 1 0 0 0 1 0
Affec-
Chien
Beauceron 0
Basset 1
Berger All 0
Boxer 0
Bull-Dog 0
Bull-Mastif 1
Caniche 0
Chihuahua 0
Cocker 0
Colley 0
Dalmatien 0
Doberman 1
Dogue-All 1
Epag.-Breton 0
Epag.-Français 1
Fox-Hound 1
Fox-Terrier 0
Gd-Bleu-Gasc 1
Labrador 0
Levrier 1
Mastiff 1
Pekinois 0
Pointer 1
St-Bernard 1
Setter 1
Teckel 0
Terre-Neuve 1
===== Votre travail : =====#
Vous avez à disposition un fichier mca.py, permettant de réaliser les calculs relatifs à une analyse des correspondances multiples Faire une analyse en composantes multiples de ces données et plus précisément :
Déterminer l’importance des axes principaux calculés lors de l’ACP (attribut \(eig\_\), descripion ligne 74 de mca.py).
Déterminer les contributions des points lignes à la variance des axes (attribut r\(ow\_contrib\_\), descripion ligne 86 de mca.py)
Déterminer les contributions des points colonnes à la variance de l’axe (attribut \(col\_contrib\_\), descripion ligne 90 de mca.py)
Déterminer la qualité de représentation des des points lignes et colonnes (attributs \(row\_cos2\_\) et \(col\_cos2\_\), descripion lignes 94 et 97 de mca.py)
Tracer la projection des points lignes et colonnes (fonctions \(mapping\), \(mapping\_row\) et \(mapping\_col\) de mca.py) sur les plans princpaux
Commenter l’ensemble de vos analyses
Calculer la distance entre individus : on utilise dans ce cas la distance du Chi2 sur modalités catégorielles (voir chapitre 1 du cours) qui met en valeur les différences entre les modalités rares
#profil individu moyen
ind_moy = np.sum(X.values,axis=0)/(n*p)
distchi2 = np.zeros(shape=(n,n))
#TODO : calcul de la distance
plt.figure(figsize=(10,10))
sns.heatmap(distchi2,vmin=0,vmax=np.max(distchi2),linewidth=0.1,cmap= 'Greens',xticklabels=chiens.index,yticklabels=chiens.index)
<AxesSubplot:>
![_images/2402ce1fcfdc98b7005fb78244b6985a35df363bba0d5e82ce18eeded7935ccd.png](_images/2402ce1fcfdc98b7005fb78244b6985a35df363bba0d5e82ce18eeded7935ccd.png)
Ainsi, par exemple, le Basset a plus de caractères en commun avec le Caniche qu’avec le Beauceron.
Calculer la distance à l’origine (profil moyen). Interpréter
#profil moyen des variables-modalités
moda_moy = np.ones(X.shape[0])/n
distO = np.zeros(shape=(1,n))
#TODO : calcul de la distance
sns.heatmap(distO,vmin=0,vmax=np.max(distO),linewidth=0.1,cmap= 'Greens',xticklabels=X.index)
<AxesSubplot:>
![_images/fb72482e02244508a5d08b7d76d5c019899a7d33fe2684e853270cb5eea3f4eb.png](_images/fb72482e02244508a5d08b7d76d5c019899a7d33fe2684e853270cb5eea3f4eb.png)
Ainsi par exemple, le Pointer est plus proche du chien moyen que le Cocker.
Analyse des colonnes#
L’analyse des associations entre les modalités revient à travailler sur les profils colonnes. Le tableau de données est normalisé par les sommes en colonne. Le profil moyen est égal au poids des observations
#somme en colonne
somme_col = np.sum(X.values,axis=0)
n,p = X.shape
#On utilise la distance du Chi2 sur modalités catégorielles qui met en valeur les différences entre les modalités rares
dist = np.zeros(shape=(p,p))
for i in range(p-1):
for j in range(i,p):
dist[i,j] = dist[j,i] = np.sum(n*((X.values[:,i]/somme_col[i]-X.values[:,j]/somme_col[j])**2))
plt.figure(figsize=(10,10))
sns.heatmap(dist,vmin=0,vmax=np.max(dist),linewidth=0.1,cmap= 'Greens',xticklabels=X.columns,yticklabels=chiens.columns)
<AxesSubplot:>
![_images/00401304859daf5d82e105b8162accb07257115dd066290123476d099bc44d43.png](_images/00401304859daf5d82e105b8162accb07257115dd066290123476d099bc44d43.png)
Calculer la distance à l’origine, qui donne une information sur la fréquence de la modalité dans la base. Elle est définie par la disance du \(\chi^2\) au profil moyen. Interpréter
#profil moyen des variables-modalités
moda_moy = np.ones(X.shape[0])/n
distO = np.zeros(shape=(1,p))
#TODO calcul distance
sns.heatmap(distO,vmin=0,vmax=np.max(distO),linewidth=0.1,cmap= 'Greens',xticklabels=X.columns)
<AxesSubplot:>
![_images/0a8c59129bf8781d39cb54f68a45e2a82d51e409d21efbd555e7ecc74a102c46.png](_images/0a8c59129bf8781d39cb54f68a45e2a82d51e409d21efbd555e7ecc74a102c46.png)
Ainsi, Veloc+ est moins présent que Veloc- dans les exemples.
ACM#
On créé une instance de l’objet MCA (défini dans mca.py) et on estime le modèle des correspondances multiples sur les données \(X\)
from mca import MCA
acm = MCA(row_labels=var_chiens.index, var_labels=var_chiens.columns)
acm.fit(var_chiens.values)
MCA(row_labels=Index(['Beauceron', 'Basset', 'Berger All', 'Boxer', 'Bull-Dog', 'Bull-Mastif',
'Caniche', 'Chihuahua', 'Cocker', 'Colley', 'Dalmatien', 'Doberman',
'Dogue-All', 'Epag.-Breton', 'Epag.-Français', 'Fox-Hound',
'Fox-Terrier', 'Gd-Bleu-Gasc', 'Labrador', 'Levrier', 'Mastiff',
'Pekinois', 'Pointer', 'St-Bernard', 'Setter', 'Teckel', 'Terre-Neuve'],
dtype='object', name='Chien'),
var_labels=Index(['Taille', 'Velocite', 'Affection'], dtype='object'))
Analyse des valeurs propres#
L’objectif de l’Analyse des Correspondances Multiples est de décomposer l’information sur une succession d’axes factoriels orthogonaux. Le nouveau système de représentation est calculé pour préserver au mieux les distances entre individus. L nombre maximum de facteurs est \(p-k\), où \(p\) est la somme du nombre de modalités des variables (le nombre de colonnes de \(X\)), et \(k\) le nombre de variables initiales.
De même que pour l’analyse facrtorielle, calculer les valeurs propres et interpréter les facteurs.
#TODO
![_images/aa86ecd84c85f2f95ac47c618ac346c5c403bf164d1a16734dedce0334072666.png](_images/aa86ecd84c85f2f95ac47c618ac346c5c403bf164d1a16734dedce0334072666.png)
Représentation graphique#
2 types de graphiques peuvent être réalisés :
Les mappings classiques qui représentent les points lignes et colonnes sur un plan factoriel
Des graphiques qui permettent d’interpréter rapidement les axes : on choisit un axe factoriel et on observe quels sont les points lignes et colonnes qui présentent les plus fortes contributions et cos2 pour cet axe
f, (ax1, ax2,ax3) = plt.subplots(1, 3,figsize=(16,4))
acm.mapping(ax1,num_x_axis=1, num_y_axis=2)
acm.mapping_row(ax2,num_x_axis=1, num_y_axis=2)
acm.mapping_col(ax3,num_x_axis=1, num_y_axis=2)
f.subplots_adjust(wspace=0.52)
plt.tight_layout()
![_images/81b894bdcce507d43e11d755c068b3193015776f5ec0548060b8319de6142c19.png](_images/81b894bdcce507d43e11d755c068b3193015776f5ec0548060b8319de6142c19.png)
f, (ax1, ax2,ax3) = plt.subplots(1, 3,figsize=(16,4))
acm.mapping(ax1,num_x_axis=1, num_y_axis=3)
acm.mapping_row(ax2,num_x_axis=1, num_y_axis=3)
acm.mapping_col(ax3,num_x_axis=1, num_y_axis=3)
f.subplots_adjust(wspace=0.52)
plt.tight_layout()
![_images/8a7f9dac5c1992a48952e870e19448e7040c5cab9788638186d734daacba22f9.png](_images/8a7f9dac5c1992a48952e870e19448e7040c5cab9788638186d734daacba22f9.png)
Analyse du 1er axe#
On utilise les formules de \(cos^2\) pour mesurer la qualité de la projection des individus et des modalités sur les axes factoriels. En pratique, si deux individus sont bien projetés alors s’ils sont proches en projections, ils sont effectivement proches dans leur espace d’origine et on peut alors interprèter leur proximité :
— La proximité entre deux individus s’interprète en terme de distance (du \(\chi^2\)) : deux individus se ressemblent s’ils ont choisis les mêmes modalités.
— La proximité entre deux modalités de deux variables différentes s’interprète en terme de distance (du \(\chi^2\)) : deux modalités se ressemblent si elles sont possédées par les mêmes individus.
On peut exhiber les coordonnées des individus sur les facteurs. Par exemple sur le premier facteur
print(pd.DataFrame(acm.row_coord_[:,0],index=var_chiens.index))
0
Chien
Beauceron -0.410650
Basset 0.049305
Berger All -0.410650
Boxer 1.207263
Bull-Dog 0.689967
Bull-Mastif -0.598234
Caniche 0.991235
Chihuahua 0.689967
Cocker 0.905995
Colley -0.410650
Dalmatien 1.207263
Doberman -1.051312
Dogue-All -1.051312
Epag.-Breton 1.207263
Epag.-Français -0.296967
Fox-Hound -1.051312
Fox-Terrier 0.991235
Gd-Bleu-Gasc -0.296967
Labrador 1.207263
Levrier -1.051312
Mastiff -0.598234
Pekinois 0.689967
Pointer -1.051312
St-Bernard -0.598234
Setter -1.051312
Teckel 0.689967
Terre-Neuve -0.598234
et de même pour les modalités
print(pd.DataFrame(acm.col_coord_[:,0],index=X.columns))
0
Taille+ 1.357789
Taille++ -0.830741
Taille- 0.810311
Veloc+ 0.920019
Veloc++ -0.991708
Veloc- 0.156521
Affec+ 0.781744
Affec- -0.841878
\begin{tabular}{lrrr}
\toprule
{} & 0 & 1 & 2 \\
\midrule
Taille+ & 1.357789 & -1.208698 & 0.511177 \\
Taille++ & -0.830741 & -0.183303 & 0.043597 \\
Taille- & 0.810311 & 1.256148 & -0.458548 \\
Veloc+ & 0.920019 & -0.854578 & 0.301665 \\
Veloc++ & -0.991708 & -0.433463 & -0.855715 \\
Veloc- & 0.156521 & 1.073779 & 0.528811 \\
Affec+ & 0.781744 & -0.020376 & -0.484442 \\
Affec- & -0.841878 & 0.021943 & 0.521706 \\
\bottomrule
\end{tabular}
Calculer la moyenne des coordonnées pour chaque variable. Qu’observez-vous ?
#TODO
3.469446951953614e-18
-3.1803263726241462e-18
-6.938893903907228e-18
En utillisant les fonctions plot_row_contrib et plot_row_cos2 (voir fichier base.py), interpréter la contribution des individus aux deux premiers facteurs.
#TODO
Analyse du deuxième axe#
#TODO