1
Importation des donn es, description
DONN ES
2
Objectif de l tude
Classification automatique de fromages
Objectifs de l tude
Ce document retranscrit une d marche de classification automatique dun ensemble de fromages (29
observations) d crits par leurs propri t s nutritives (ex. prot ines, lipides, etc. ; 9 variables). Lobjectif
est didentifier des groupes de fromages homog nes, partageant des caract ristiques similaires.
Nous utiliserons essentiellement deux approches en nous appuyant sur deux proc dures des packages
sp cialis s pour Python : la classification ascendante hi rarchique (CAH Package SciPy) ; la m thode des
centres mobiles (k-Means Package Scikit-Learn).
Le fichier fromage.txt provient de la page de cours de Marie Chavent de lUniversit de Bordeaux. Les
excellents supports et exercices corrig s que lon peut y trouver compl teront profit ce tutoriel qui se
veut avant tout un guide simple pour une premi re prise en main de Python dans le contexte de la
classification automatique.
Traitements r alis s
"
"
"
"
Chargement et description des donn es
Classification automatique
Pistes pour la d tection du nombre ad quat de classes
Description interpr tation des groupes
Donn es
disponibles
Label des observations
Variables actives
3
FromagescaloriessodiumcalciumlipidesretinolfolatesproteinescholesterolmagnesiumCarredelEst314353.572.626.351.630.3217020Babybel314238209.825.163.76.422.67027Beaufort401112259.433.354.91.226.612041Bleu342336211.128.937.127.520.29027Camembert264314215.919.510336.423.46020Cantal36725626428.848.85.7239030Chabichou34419287.227.990.136.319.58036Chaource292276132.925.4116.432.517.87025Cheddar406172182.332.576.44.92611028Comte39992220.532.455.91.329.212051Coulomniers30822279.225.663.621.120.58013Edam327148272.224.765.75.524.78044Emmental37860308.229.456.32.429.411045Fr.chevrepatemolle20616072.818.5150.53111.15016Fr.fondu.45292390168.52477.45.516.87020Fr.frais20nat.8041146.33.550208.31011Fr.frais40nat.1152594.87.864.322.673010Maroilles338311236.729.146.73.620.49040Morbier34728521929.557.65.823.68030Parmesan381240334.627.5905.235.78046Petitsuisse401422278.210.463.420.49.42010PontlEveque300223156.723.453421.17022Pyrenees355232178.92851.56.822.49025Reblochon309272202.324.673.18.119.78030Rocquefort37043216231.283.513.318.710025SaintPaulin29820526123.360.46.723.37026Tome321252125.527.362.36.221.88020Vacherin32114021829.349.23.717.68030Yaourtlaitent.nat.7091215.73.442.92.94.11314Fichier de donn es
Importation, statistiques descriptives et graphiques
#modification du dossier par d faut
import os
os.chdir("&")
#importation des donn es
import pandas
fromage = pandas.read_table("fromage.txt",sep="\t",header=0,index_col=0)
#dimension des donn es
print(fromage.shape)
#statistiques descriptives
print(fromage.describe())
#graphique - croisement deux deux des variables
from pandas.tools.plotting import scatter_matrix
scatter_matrix(fromage,figsize=(9,9))
Ce type de graphique nest
jamais anodin. Nous
constatons par exemple que
(1) lipides est fortement
corr l avec calories et
cholest rol (sans trop de
surprises) (remarque : la
m me information va peser
3 fois dans lanalyse) ; (2)
dans certaines
configurations, des groupes
semblent appara tre
naturellement (ex.
croisement de prot ines
et cholest rol , avec une
corr lation inter-groupes
assez marqu e).
4
Classification ascendante hi rarchique
CAH
Publicité
5
Classification ascendante hi rarchique
Utilisation du package scipy
#librairies pour la CAH
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
#g n rer la matrice des liens
Z = linkage(fromage_cr,method='ward',metric='euclidean')
#affichage du dendrogramme
plt.title("CAH")
dendrogram(Z,labels=fromage.index,orientation='left',color_threshold=0)
plt.show()
Le dendrogramme sugg re un d coupage en 4 groupes. On
note quune classe de fromages, les fromages frais (tout
gauche), se d marque fortement des autres au point quon
aurait pu envisager aussi un d coupage en 2 groupes seulement.
Nous y reviendrons plus longuement lorsque nous mixerons
lanalyse avec une analyse en composantes principales (ACP).
6
Classification ascendante hi rarchique
D coupage en classes Mat rialisation des groupes
#mat rialisation des 4 classes (hauteur t = 7)
plt.title('CAH avec mat rialisation des 4 classes')
dendrogram(Z,labels=fromage.index,orientation='left',color_threshold=7)
plt.show()
#d coupage la hauteur t = 7 ==> identifiants de 4 groupes obtenus
groupes_cah = fcluster(Z,t=7,criterion='distance')
print(groupes_cah)
#index tri s des groupes
import numpy as np
idg = np.argsort(groupes_cah)
#affichage des observations et leurs groupes
print(pandas.DataFrame(fromage.index ,groupes_cah ))
Le 1er groupe est constitu de fromages frais.
Le 2nd de fromages p te molle.
Le 3 me de fromages durs .
Le 4 me est un peu fourre-tout (de mon point de vue).
Mes comp tences en fromage sarr tent l (merci
Wikip dia). Pour une caract risation laide des variables
de l tude, il faut passer par des techniques statistiques
univari es (simples lire) ou multivari es (tenant compte
des relations entre les variables).
R.R. Universit Lyon 2
7
GroupeFromage1Yaourtlaitent.nat.1Fr.frais20nat.1Petitsuisse401Fr.frais40nat.2Fr.chevrepatemolle2Camembert2Chabichou2Chaource3Emmental3Parmesan3Beaufort3Comte4Pyrenees4PontlEveque4Rocquefort4SaintPaulin4Tome4Reblochon4CarredelEst4Maroilles4Vacherin4Edam4Coulomniers4Cheddar4Cantal4Bleu4Babybel4Morbier4Fr.fondu.45M thode des centres mobiles
K-MEANS
8
Groupes issus du clustering
M thode des centres mobiles
Utilisation du package scikit-learn
#k-means sur les donn es centr es et r duites
from sklearn import cluster
kmeans = cluster.KMeans(n_clusters=4)
kmeans.fit(fromage_cr)
#index tri s des groupes
idk = np.argsort(kmeans.labels_)
#affichage des observations et leurs groupes
print(pandas.DataFrame(fromage.index ,kmeans.labels_ ))
#distances aux centres de classes des observations
print(kmeans.transform(fromage_cr))
#correspondance avec les groupes de la CAH
pandas.crosstab(groupes_cah,kmeans.labels_)
Correspondance CAH K-Means
Le groupe 1 de la CAH co ncide avec
le groupe 1 des K-Means. Apr s, il y a
certes des correspondances, mais
Publicité
elles ne sont pas exactes.
Distances aux centres de classes pour chaque individu
(avec en couleur les min. respectifs)
R.R. Universit Lyon 2
9
Groupe0123CarredelEst2.225.535.222.92Babybel3.025.192.790.74Beaufort5.167.511.152.86Bleu3.246.123.902.11Camembert1.935.405.103.54Cantal4.026.302.201.19Chabichou1.785.934.533.39Chaource1.035.555.093.46Cheddar3.756.822.291.95Comte5.447.841.353.42Coulomniers1.964.844.752.49Edam4.236.131.342.25Emmental5.537.480.903.40Fr.chevrepatemolle3.105.017.095.54Fr.fondu.452.845.284.451.89Fr.frais20nat.5.330.687.616.00Fr.frais40nat.4.551.017.325.61Maroilles4.206.462.451.53Morbier3.476.062.500.65Parmesan5.237.942.113.60Petitsuisse404.381.217.135.40PontlEveque3.084.693.521.26Pyrenees3.285.712.810.71Reblochon2.745.312.940.81Rocquefort3.026.814.222.18SaintPaulin3.475.122.671.37Tome2.735.253.671.26Vacherin3.795.272.631.50Yaourtlaitent.nat.6.091.937.465.94ClasseFromages0CarredelEst0Camembert0Fr.chevrepatemolle0Chabichou0Chaource0Coulomniers1Petitsuisse401Fr.frais40nat.1Fr.frais20nat.1Yaourtlaitent.nat.2Parmesan2Edam2Emmental2Beaufort2Comte3Tome3SaintPaulin3Rocquefort3Reblochon3Pyrenees3PontlEveque3Cheddar3Morbier3Maroilles3Bleu3Vacherin3Cantal3Babybel3Fr.fondu.45M thode des centres mobiles
Aide la d tection du nombre ad quat de groupes
K-MEANS, la diff rence de la CAH, ne fournit pas doutils daide la d tection du nombre de
classes. Nous devons les programmer sous Python ou utiliser des proc dures propos es par
des packages d di s. Le sch ma est souvent le m me : on fait varier le nombre de groupes et
on surveille l volution dun indicateur de qualit de la solution c.- -d. laptitude des individus
tre plus proches de ses cong n res du m me groupe que des individus des autres groupes.
Dans ce qui suit, on calcule la m trique silhouette pour diff rents nombres de groupes issus
de la m thode des centres mobiles.
#librairie pour valuation des partitions
from sklearn import metrics
#utilisation de la m trique "silhouette"
#faire varier le nombre de clusters de 2 10
res = np.arange(9,dtype="double")
for k in np.arange(9):
km = cluster.KMeans(n_clusters=k+2)
km.fit(fromage_cr)
res = metrics.silhouette_score(fromage_cr,km.labels_)
print(res)
#graphique
import matplotlib.pyplot as plt
plt.title("Silhouette")
plt.xlabel("# of clusters")
plt.plot(np.arange(2,11,1),res)
plt.show()
La partition en k = 2
groupes semble la
meilleure au sens de la
m trique silhouette .
10
Analyses univari es et multivari es
INTERPR TATION DES
CLASSES
11
Interpr tation des classes
Statistiques comparatives
Lid e est de comparer les moyennes des variables actives conditionnellement aux groupes. Il
est possible de quantifier globalement lamplitude des carts avec la proportion de variance
expliqu e (carr du rapport de corr lation). La d marche peut tre tendue aux variables
illustratives. Pour les cat gorielles, nous confronterions les distributions conditionnelles.
Lapproche est simple et les r sultats faciles lire. Rappelons cependant que nous ne tenons
pas compte des liaisons entre les variables dans ce cas.
#moyenne par variable
m = fromage.mean()
#TSS
TSS = fromage.shape[0]*fromage.var(ddof=0)
print(TSS)
#data.frame conditionnellement aux groupes
gb = fromage.groupby(kmeans.labels_)
#effectifs conditionnels
nk = gb.size()
print(nk)
#moyennes conditionnelles
mk = gb.mean()
print(mk)
#pour chaque groupe cart la moyenne par
variable
EMk = (mk-m)**2
#pond r par les effectifs du groupe
EM = EMk.multiply(nk,axis=0)
#somme des valeurs => BSS
Publicité
BSS = np.sum(EM,axis=0)
print(BSS)
#carr du rapport de corr lation
#variance expliqu e par l'appartenance aux groupes
#pour chaque variable
R2 = BSS/TSS
print(R2)
Effec. Cond.
4
0
5
1
6
2
14
3
Carr Rapport de corr.
calories
sodium
calcium
lipides
retinol
folates
proteines
cholesterol
magnesium
0.863799
0.599117
0.620108
0.851983
0.382815
0.760722
0.810316
0.797596
0.796207
La d finition des groupes est avant
tout domin e par les teneurs en
graisses (lipides, cholest rol et
calories rel vent de la m me id e) et
en prot ines.
Le groupe n 0 est fortement
d termin par ces variables, les
moyennes conditionnelles sont tr s
diff rentes.
Moyennes conditionnelles
calories sodium calcium
lipides
retinol
folates
0 101.750000 44.750000 133.75 6.275000 55.150000 16.475000
1 377.200000 130.400000 278.98 29.460000 64.560000 3.120000
2 288.000000 252.916667 110.10 23.866667 95.866667 31.266667
3 334.285714 267.428571 199.70 27.500000 60.050000 7.728571
cholesterol
proteines
0 7.200000
18.250000 11.250000
1 29.120000 102.000000 45.400000
68.333333 21.666667
2 18.883333
83.571429 27.142857
3 21.228571
magnesium
12
Interpr tation des classes
Analyse en composantes principales (ACP)
Publicité
Avec lACP, nous tenons compte des liaisons entre les variables. Lanalyse est
plus riche. Mais il faut savoir lire correctement les sorties de lACP.
#ACP
from sklearn.decomposition import PCA
acp = PCA(n_components=2).fit_transform(fromage_cr)
#projeter dans le plan factoriel
#avec un code couleur diff rent selon le groupe
#remarquer le r le de zip() dans la boucle
for couleur,k in zip(['red','blue','lawngreen','aqua'],[0,1,2,3]):
plt.scatter(acp ,acp ,c=couleur)
plt.show()
Il y a un probl me. Le groupe des fromages frais (n de groupe = 0)
crase linformation disponible et tasse les autres fromages dans un
bloc qui soriente diff remment.
De fait, si lon comprend bien la nature du groupe n 0 des fromages
frais, les autres sont plus compliqu s comprendre lorsquils sont
replac s dans le premier plan factoriel.
13
A la lumi re des r sultats de lACP
COMPL TER LANALYSE
14
Approfondir lanalyse
Retirer les fromages frais du jeu de donn es
Les fromages frais sont tellement particuliers loign s de lensemble des autres observations
quils masquent des relations int ressantes qui peuvent exister entre ces produits. Nous
reprenons lanalyse en les excluant des traitements.
#retirer des observations le groupe n 0 du k-means pr c dent
fromage_subset = fromage.iloc
print(fromage_subset.shape)
#centrer et r duire
fromage_subset_cr = preprocessing.scale(fromage_subset)
#g n rer la matrice des liens
Z_subset = linkage(fromage_subset_cr,method='ward',metric='euclidean')
#cah et affichage du dendrogramme
plt.title("CAH")
dendrogram(Z_subset,labels=fromage_subset.index,orientation='left',color_threshold=7)
plt.show()
#groupes
groupes_subset_cah = fcluster(Z_subset,t=7,criterion='distance')
print(groupes_subset_cah)
3 groupes se distinguent. On a
moins le ph nom ne d crasement
constat dans lanalyse pr c dente.
15
Approfondir lanalyse
Retirer les fromages frais du jeu de donn es (2/2)
#ACP
acp_subset = PCA(n_components=2).fit_transform(fromage_subset_cr)
#projeter dans le plan factoriel
#avec un code couleur selon le groupe
#remarquer le r le de zip()
plt.figure(figsize=(10,10))
for couleur,k in zip(['blue','lawngreen','aqua'],[1,2,3]):
plt.scatter(acp_subset ,acp_subset ,c=couleur)
#mettre les labels des points
#remarquer le r le de enumerate()
for i,label in enumerate(fromage_subset.index):
plt.annotate(label,(acp_subset ,acp_subset ))
plt.show()
Les groupes sont constitu s essentiellement sur le 1er facteur.
Quelques fromages ont chang de camp par rapport lanalyse
pr c dente.
16
17