• 15 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 01/02/2019

TP : Partitionnez vos données

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Appliquons la classification hiérarchique et l'algorithme k-means sur 2 de nos échantillons : bag_of_words.csv, ainsi que notre chat mystery.csv.

L'échantillon en bag of words

Nous allons ici réaliser une classification hiérarchique sur l'échantillon en bag of words, que vous pouvez télécharger à ce chapitre.

La particularité de cet échantillon est qu'il contient énormément de variables : plus de 9 000 !

Partitionner, c'est regrouper les individus similaires. Dans cet échantillon, les individus sont des cours OpenClassrooms. Chacun est décrit par plus de 9 000 variables, qui correspondent chacune à un mot. Ainsi, deux cours seront similaires si leurs textes contiennent beaucoup de mots en commun.

Voici le code de la classification hiérarchique :

import pandas as pd
from functions import plot_dendrogram
from scipy.cluster.hierarchy import linkage, fcluster
from sklearn import preprocessing

# import de l'échantillon et des informations relatives aux cours
data = pd.read_csv('bag_of_words.csv', index_col = 0)
courses_info = pd.read_csv('courses_info.csv',index_col = 0)

# Theme du ou des parcours auxquels appartient le cours (data, developpement, marketing, etc.)
theme = [courses_info.loc[course_id, "theme"] for course_id in data.index]

# préparation des données pour le clustering
X = data.values
names = data.index

# Centrage et Réduction
std_scale = preprocessing.StandardScaler().fit(X)
X_scaled = std_scale.transform(X)

# Clustering hiérarchique
Z = linkage(X_scaled, 'ward')

# Affichage du dendrogramme
plot_dendrogram(Z, names)

Voici le dendrogramme obtenu (cliquez sur l'image pour zoomer) :

On peut ensuite couper l'arbre de manière à obtenir 12 clusters. À partir de ces 12 clusters, il peut être intéressant, par curiosité, de voir si les cours regroupés en un même cluster ont tendance à appartenir à une même thématique ou non. La thématique des cours est connue, et elle est stockée dans la variable theme. Pour ceci, nous afficherons le tableau de contingence entre la variable cluster et theme :

# Coupage du dendrogramme en 12 clusters
clusters = fcluster(Z, 12, criterion='maxclust')
#clusters = fcluster(Z, 159, criterion='distance') # ligne équivalente à la précédente

# Comparaison des clusters trouvés avec les classification des cours en différents thèmes
courses = pd.DataFrame({"theme": theme, "cluster": clusters, "title": names})
print(courses)
print(courses.pivot_table(index="theme", columns="cluster", aggfunc=len, fill_value=0))

Voici le tableau de contingence, affiché grâce à la ligne de code n° 8 :

Tout d'abord, on y voit que le cluster 1 a "capté" la grande majorité des cours de RH et de marketing : en effet, il en contient 30 (14 + 6 + 10) alors qu'il y a au total 51 cours de marketing et de RH. Et, surprise, un cours de data s'est glissé dans ce cluster ! À y regarder de plus près , on voit qu'il s'agit du cours Réalisez des rapports statistiques clairs et impactants. Sur le dendrogramme, on voit qu'il est proche de cours tels que Rédigez des écrits professionnels ou Améliorez l'impact de vos présentations, qui sont des cours destinés aux formation RH et marketing. Finalement, c'est assez compréhensible : le cours Réalisez des rapports statistiques clairs et impactants, même s'il est destiné aux data analysts, est plus similaire aux cours de communication écrite ou orale qu'aux cours de statistiques purement mathématiques. J'en profite au passage pour vous conseiller vivement de le suivre, car si vous ne savez pas rendre compte de vos analyses, vous aurez presque travaillé pour rien. ;)

Ensuite, on voit que le reste des cours de data sont répartis entre les clusters 6, 7 et 9. En regardant de plus près, le cluster 7 est composé exclusivement de cours du parcours Data Architect. Ils parlent donc bien de data, mais plus sous un angle logiciel que mathématique, et sont donc bien distincts des cours du cluster 6, qui appartiennent aux parcours Data Analyst et Data Scientist. Quant au cluster 9, il contient également des cours de développement informatique. En fait, ceux-ci parlent de thématiques qui sont à mi-chemin entre la data et le développement : bases de données, librairies Python adaptées à la data science, algorithmes, etc.

Le chat

Appliquons maintenant l'algorithme k-means sur notre chat, en demandant 6 clusters :

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import decomposition

# Nombre de clusters souhaités
n_clust = 6

# import de l'échantillon
data = pd.read_csv('mystery.csv')

# préparation des données pour le clustering
X = data.values

# Réduire n'est ici pas nécessaire car les variables sont exprimées dans la même unité
# X_scaled = preprocessing.StandardScaler().fit_transform(X)

# Clustering par K-means
km = KMeans(n_clusters=n_clust)
km.fit(X)

# Récupération des clusters attribués à chaque individu
clusters = km.labels_

# Affichage du clustering par projection des individus sur le premier plan factoriel
pca = decomposition.PCA(n_components=3).fit(X)
X_projected = pca.transform(X)
plt.scatter(X_projected[:, 0], X_projected[:, 1], c=clusters.astype(np.float), cmap = 'jet', alpha=.2)
plt.title("Projection des {} individus sur le 1e plan factoriel".format(X_projected.shape[0]))
plt.show(block=False)

Voici le résultat :

Ici, le k-means a identifié les parties du corps du chat : on a un cluster correspondant à la queue, un autre aux 2 pattes avant, un aux 2 pattes arrière, etc.

Remarquons qu'ici, nous avons affiché les données sur le premier plan factoriel, puis coloré les points en fonction de leur cluster.

OK, mais que fait-on avec cela ?

Sur un jeu de données qui représente un "objet" géométrique, le k-means peut par exemple  servir à faire de la quantification. Ici, nous avons un chat composé de 5 000 points. Il peut y avoir des applications pour lesquelles les 5 000 points ne sont pas requis, et pour lesquelles on veut réduire intelligemment le nombre de points de l'objet sans en perdre la forme.

On peut donc faire un k-means en 500 clusters, ce qui donne ceci :

 

Ensuite, on ne garde que le centre de chaque cluster, et on reconstitue un nouvel échantillon à partir de ces 500 centres. On obtient un échantillon de 500 individus, on a donc réduit les dimensions des données. Avec ces 500 points, la forme reste (plus ou moins) inchangée :

# Affichage des positions des centres de classes
plt.figure()
centroids = km.cluster_centers_
centroids_projected = pca.transform(centroids)
plt.scatter(centroids_projected[:,0],centroids_projected[:,1])
plt.title("Projection des {} centres sur le 1e plan factoriel".format(len(centroids)))
plt.show()

 

Annexe : les fonctions outils

Voici la définition des fonctions utilisées dans ce chapitre, disponible dans le fichier functions.py :

import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram

 plot_dendrogram(Z, names):
    plt.figure(figsize=(10,25))
    plt.title('Hierarchical Clustering Dendrogram')
    plt.xlabel('distance')
    dendrogram(
        Z,
        labels = names,
        orientation = "left",
    )
    plt.show()

Exemple de certificat de réussite
Exemple de certificat de réussite