Graphiques pour la science des données

Parce qu'un dessin vaut mieux qu'un long discours, la réalisation de graphiques est une activité très importante en science des données pour voir des caractéristiques des données.
Ce TP a donc pour objectif de réaliser des graphiques simples permettant de visualiser différentes caractéristiques d'un jeu de données. On utilisera le paquetage matplotlib. Souvent, on le renomme plt au chargement : import matplotlib.pyplot as plt.

Remarque : il y a deux manières de réaliser des graphiques avec matplotlib. Dans un premier temps, nous allons présenter la méthode la plus simple qui permet de réaliser des graphiques simples. Nous verrons ensuite une autre méthode, à peine plus compliquée, qui permet de réaliser des graphiques bien plus riches et complexes.

La documentation est en-ligne :

Pré-requis

Ce TP est la suite du TP sur les tableaux de données. Celui-ci doit avoir été réalisé avant de commencer ce TP.
Il faut donc charger le jeu de données dans un tableau de données avant de commencer.

Répartition des valeurs d'un attribut

Premier essai

L'un des premiers types de graphiques que l'on réalise consiste à visualiser la répartition des valeurs des attributs.
Commençons par

olives.plot ()
plt.show()

ce qui donne :

figure

On peut faire des remarques :

  1. on ne sait pas ce que cela représente, ni la figure dans son ensemble, ni les axes des abscisses et des ordonnées. Il faut ajouter des légendes.
  2. Ce graphique représente la valeur de chaque donnée pour chacun des attributs. L'abscisse est le numéro de la donnée. Chaque attribut est représenté avec une couleur différente et une légende indique la correspondance entre couleur et attribut.
  3. On voit un attribut dont les valeurs sont très élevées (oleic), deux autres intermédiaires (palmitic et linoleic) et tous les autres mélangés tout en bas : on ne voit pas grand chose !
  4. Pour chaque attribut on voit une ligne qui zigzague. Traditionnellement, un graphique qui a cet aspect-là représente l'évolution au fil du temps de la valeur d'un attribut. Or, ce graphique ne représente pas du tout cela : comme dit ci-dessus, l'axe des abscisses représente l'indice de la donnée dans le tableau et en aucun cas ne représente une information temporelle. Ce graphique nous induit donc en erreur. C'est un énorme défaut pour un graphique que de ne pas représenter ce à quoi l'on s'attend. Un graphique est là pour aider à comprendre et donc, la dernière chose qu'il doit faire est de nous induire en erreur !

En conclusion ce graphique est très mauvais. Malgré cela, on peut s'en servir comme base d'un exercice de réalisation de graphique en Python. En regardant la documentation, transformez-le dans le graphique ci-dessous auquel on a ajouté un titre général et des titres aux axes des abscisses et des ordonnées :

figure

Boîtes à moustaches (Boxplots)

Une manière d'obtenir une représentation qui a du sens, c'est-à-dire qui montre bien l'information que l'on veut montrer, consiste à utiliser une boîte à moustaches.

olives.plot.box (title = "Répartition des valeurs des attributs\n du jeu de données olives", xlabel = "Attribut", ylabel = "Répartition des valeurs de l'attribut")
plt.show()

qui donne :

figure

On retrouve le même problème que précédemment, oleic ayant des valeurs bien supérieures aux autres attributs, et palmitic et linoleic étant eux-aussi bien plus grands que tous les autres attributs. Le plus simple est de faire trois graphiques.

figure figure figure

À faire : réalisez ces trois graphiques. Que représentent les barres, les moustaches et les petits cercles ? Calculez-les et confirmez le sens de ces éléments graphiques.

Histogrammes

Un histogramme fournit beaucoup d'information sur la répartition des valeurs d'un attribut. Dans certains cas, on peut juger d'un coup d'œil que les valeurs ne sont pas distribuées uniformément ou normalement, ce qui est une information importante.
On utilise pour cela la méthode plot.hist (bins = ..., ...). Le paramètre bins indique la finesse de l'histogramme. Les autres paramètres sont à peu près les mêmes que pour plot.box.

À faire : regardez la documentation et réalisez ces 8 graphiques ci-dessous. Utilisez une boucle pour générer les 8 graphiques d'un coup.
Là encore, prenez-le temps d'observer ces graphiques et de les interpréter.

figure figure figure figure figure figure figure figure

Estimation de la densité

Un histogramme représente une version discrétisée d'une distribution de probabilités continue. Plutôt qu'un histogramme, on peut obtenir une estimation d'une distribution de probabilités avec la fonction plot.density ().

figure figure figure figure figure figure figure figure

À faire : regardez la documentation et réalisez ces 8 graphiques ci-dessous. Utilisez une boucle pour générer les 8 graphiques d'un coup.
Là encore, prenez-le temps d'observer ces graphiques et de les interpréter.
On voit bien que le tracé obtenu par plot.density() correspond aux histogrammes pour chacun des attributs.

Remarques sur les histogrammes et l'estimation de la densité

Ces deux visualisations produisent des résultats qui se ressemblent : on retrouve les mêmes pics et creux. Néanmoins, elles sont à utiliser avec prudence : ni l'une ni l'autre ne représente une information parfaite. Si on peut se dire que les 4 premiers couples (histogramme, densité) se ressemblent, c'est beaucoup moins évidents pour les 4 suivants. Les histogrammes montrent des pics qui n'apparaissent pas dans les densités estimées. Ces pics isolés dans les histogrammes sont lissés dans les densités et disparaissent : existent-ils ? Quelle méthode donne la visualisation la plus fidèle des données ?

L'allure de l'histogramme dépend fortement de la discrétisation utilisée (le paramètre bins), notamment si le nombre de données est faible par rapport à la discrétisation.
Par ailleurs, il existe plusieurs manières de réaliser un histogramme, chacune donnant une certaine représentation de la distribution des valeurs d'un attribut.

De même, la forme de la densité estimée varie selon les paramètres utilisés. Ici, on a utilisé les paramètres par défaut. Dans une application réelle, il faut ajuster les paramètres.

À faire : refaire les histogrammes en utilisant différentes valeurs pour l'attribut bins.

Visualisation de deux attributs

Une part très importante de la science des données consiste à trouver des relations entre des attributs. Pour cela, on peut s'aider de visualisations graphiques.

Scatter plots

Un scatter plot est un graphique en 2 dimensions : chaque axe correspond à un attribut : on représente chaque donnée par un point défini par ces deux attributs.
La méthode plot.scatter() s'applique à un data frame et crée un tel graphique : elle prend au moins deux paramètres : x et y qui indique les deux attributs à utiliser. On peut ajouter un titre et d'autres informations.
À faire : faites un scatter plot pour les attributs oleic et palmitic. Vous devez obtenir ceci :

figure

Il est courant de donner des couleurs différentes aux données selon la valeur de l'un de leurs attributs. Par exemple, on pourrait donner des couleurs différentes en fonction de la région d'origine de l'olive, en utilisant pour cela l'attribut region.
Le paramètre c indique l'attribut à utiliser (son nom ou son numéro) et le paramètre colormap indique la palette de couleur à utiliser (voir les palettes pré-définies sur cette page).

figure