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 pour des tableaux de donné. 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 à cette url.
En R, on utilise simplement les fonctions graphiques de base qui forment un ensemble très riches permettant de réaliser de très nombreux graphiques. Comme toujours en R, la documentation est en ligne directement accessible.
Ce TP doit être terminé avant la prochaine séance.
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.
En général, quand on aborde un nouveau jeu de données, l'un des premiers types de graphiques que l'on réalise consiste à visualiser la répartition des valeurs des attributs. Dans cette partie, j'illustre avec Python seulement car R n'a pas les mêmes défauts (encore une fois) que Python. Si vous faites le TP en R, lisez ce qui suit, mais vous n'avez rien à faire ; par contre, les conseils sont valables en Python et en R.
Commençons par :
olives.plot () plt.show()
ce qui donne :
On peut faire des remarques :
En conclusion ce graphique est très mauvais. Malgré cela, on peut s'en servir comme base d'un exercice de réalisation de graphiques 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 :
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 :
On utilise la fonction boxplot() et on obtient :
On peut noter que certaines valeurs d'attribut n'apparaîssent pas sur la figure sur l'axe des abscisses parce que R estime qu'il n'y a pas la place pour toutes les afficher. Si vous agrandissez la fenêtre, elles apparaitront. Ou sinon, vous pouvez les afficher en biais, comme en Python. Je vous laisse chercher comment faire (ce n'est pas du tout évident de trouver !) et obtenir cette 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.
À 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.
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.
À 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. Demandez-vous si ces distributions sont normales et, sinon, pouvez-vous dire de quelle type de distribution il semble s'agir ?
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.
On utilise pour cela la fonction hist (..., breaks = ..., ...). Le paramètre breaks indique la finesse de l'histogramme. Les autres paramètres sont à peu près les mêmes que pour plot.
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.
On utilise la fonction plot.density ().
On utilise la fonction density () qui estime une densité de probabilités et on en fait un plot ().
À 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 correspond aux histogrammes pour chacun des attributs.
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 évident 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.
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.
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.
À faire : faites un scatter plot pour les attributs oleic et palmitic.
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.
On utilise tout simplement la fonction plot ().
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). On obtient :
À noter que la barre sur le côté droit de la figure n'a pas d'intérêt.
Le paramètre col de la fonction plot() peut être spécifié par une liste de couleurs qui indique la couleur à affecter à chaque point. On peut lui passer directement l'attribut olives$region, les valeurs numériques 1, 2 et 3 correspondant respectivement aux couleurs noir, rouge et vert. On peut aussi fournir une liste dont les éléments sont des couleurs. C'est ce que j'ai fait ici en associant le bleu à la région 1, le rouge à la région 2 et le jaune à la région 3, pour obtenir les mêmes couleurs qu'en Python. Par ailleurs, par défaut chaque point est représenté par un petit cercle. En utilisant le paramètre pch de la fonction plot(), j'affiche un petit disque plutôt qu'un petit cercle, c'est plus joli. J'obtiens :