Extrait du cours : Python intermédiaire pour la data science - Matplotlib
Ci-dessous, un extrait — vidéo et transcription — du premier chapitre du cours Intermediate Python for Data Science. Voici le chapitre complet, avec des exercices interactifs.
Graphiques de base avec matplotlib
Bonjour, je m'appelle Filip et je suis data scientist chez DataCamp. Dans ce cours de niveau intermédiaire, vous allez approfondir vos compétences Python pour la data science. Vous apprendrez à visualiser des données et à les stocker dans de nouvelles structures. Au passage, vous prendrez en main les structures de contrôle, indispensables pour adapter le flux de vos scripts et algorithmes. Nous terminerons ce chapitre par une étude de cas, où vous combinerez tout ce que vous avez appris pour résoudre un problème concret.
Ce premier chapitre porte sur la visualisation de données, un volet essentiel de l’analyse de données. D’abord, vous l’utiliserez en continu pour explorer votre jeu de données. Plus vous comprenez vos données, mieux vous en tirez des enseignements. Et une fois ces enseignements trouvés, vous aurez encore besoin de la visualisation pour les partager efficacement. Par exemple, regardez ce magnifique graphique.
Il a été réalisé par le professeur suédois Hans Rosling. Ses conférences sur le développement mondial ont été vues des millions de fois. Ce qui les rend si captivantes, c’est qu’en produisant de superbes visualisations, il laisse les données raconter leur propre histoire. Ici, nous voyons un graphique en bulles, où chaque bulle représente un pays. Plus la bulle est grande, plus la population du pays est élevée ; les deux plus grosses bulles sont donc la Chine et l’Inde.
Il y a deux axes. L’axe horizontal montre le PIB par habitant, en dollars américains. L’axe vertical indique l’espérance de vie. On voit clairement que les populations vivent plus longtemps dans les pays au PIB par habitant plus élevé. Pourtant, de fortes disparités d’espérance de vie subsistent entre des pays de même niveau de revenus.
Pourquoi vous raconter tout cela ? Parce qu’à la fin de ce chapitre, vous serez capable de produire vous‑même ce beau graphique.
Il existe de nombreuses bibliothèques de visualisation en Python, mais la référence, c’est matplotlib. Vous utiliserez son sous-module pyplot. Par convention, on l’importe sous le nom plt, comme ceci.
Pour un premier exemple, tentons de mieux comprendre l’évolution de la population mondiale. J’ai ici une liste d’années, year, et une liste des populations correspondantes, en milliards, pop. En 1970, par exemple, 3,7 milliards d’humains vivaient sur Terre.
Pour tracer ces données en courbe, on appelle plt.plot() avec nos deux listes en arguments. Le premier correspond à l’axe horizontal, le second à l’axe vertical. Vous vous dites peut‑être que le graphique va s’afficher tout de suite, mais Python est plutôt paresseux : il attendra l’appel à la fonction show() pour l’afficher. Cela vous laisse le temps d’ajouter des éléments avant l’affichage, comme un titre ou des étiquettes. Nous y reviendrons. Retenez simplement ceci : la fonction plot() dit à Python quoi tracer et comment, tandis que show() affiche réellement le graphique.
En regardant le graphique, on voit bien les années sur l’axe horizontal et les populations sur l’axe vertical. Il y a quatre points, et Python trace une ligne entre eux. En 1950, la population mondiale était d’environ 2,5 milliards. En 2010, autour de 7 milliards. En soixante ans, la population a donc presque triplé ; c’est assez impressionnant. Et si la population continue d’augmenter ainsi ? La planète sera‑t‑elle surpeuplée ? Vous explorerez cela dans les exercices.
Permettez‑moi d’introduire un autre type de graphique : le nuage de points (scatter plot). Pour le créer, on repart du code précédent, mais on remplace plot par scatter. Le nuage de points trace simplement chaque point individuel ; Python ne relie pas les points. Dans bien des cas, le nuage de points est préférable à la courbe : mémorisez bien cette fonction. On peut même dire que c’est une manière plus « honnête » de présenter les données, car on voit clairement que le graphique repose sur seulement quatre points.
Maintenant que nous avons couvert les bases de matplotlib, à vous de jouer pour créer de superbes visualisations !
# define a simple function
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.plot(year, pop)
plt.show()
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.scatter(year, pop)
plt.show()
L’histogramme
Dans cette vidéo, je vous présente l’histogramme. C’est un type de visualisation très utile pour explorer vos données. Il aide à appréhender la distribution de vos variables. Pour comprendre le principe, imaginez 12 valeurs entre 0 et 6, placées sur une droite graduée. Pour construire un histogramme, on découpe cette droite en intervalles de même taille, appelés « buckets » ou classes (bins). Supposons 3 classes, chacune de largeur 2. Ensuite, on compte combien de points tombent dans chaque classe : 4 dans la première, 6 dans la deuxième et 2 dans la troisième. Enfin, on trace une barre pour chaque classe, dont la hauteur correspond au nombre de points qu’elle contient. On obtient un histogramme, qui donne une vue d’ensemble de la répartition des 12 valeurs. La plupart sont au centre, mais il y en a plus en dessous de 2 qu’au‑dessus de 4.
Bien sûr, matplotlib sait construire des histogrammes. Comme précédemment, on commence par importer le module pyplot de matplotlib. Ensuite, on utilise la fonction hist(). Ouvrons sa documentation : il y a de nombreux arguments possibles, mais les deux premiers sont les plus importants. x doit être la liste des valeurs à représenter. Le second argument, bins, indique en combien de classes répartir les données. À partir de ce nombre, hist() calcule automatiquement des bornes adaptées et le nombre de valeurs dans chaque classe. Si vous ne précisez pas bins, la valeur par défaut est 10.
Pour générer l’histogramme vu plus haut, commençons par créer la liste des 12 valeurs. Appelez ensuite hist() en lui passant cette liste en entrée, liée à l’argument x. Je spécifie aussi bins à 3 pour obtenir trois classes. En appelant enfin show, on obtient un bel histogramme. Les histogrammes sont précieux pour prendre du recul. Par exemple, regardez cette pyramide des âges : la distribution par âge, pour les hommes et les femmes, dans l’Union européenne. Remarquez que les histogrammes sont pivotés de 90 degrés ; les classes sont horizontales. Elles sont les plus larges entre 40 et 44 ans, avec 20 millions d’hommes et 20 millions de femmes : c’est la génération du baby‑boom.
Ces chiffres datent de 2010. Que pensez‑vous qu’il changera en 2050 ? Regardons : la distribution est plus aplatie et la génération du baby‑boom a vieilli. En un clin d’œil, on visualise l’évolution démographique. C’est toute la force des histogrammes ! Passez maintenant aux exercices pour expérimenter par vous‑même.
values = [0,0.6,1.4,1.6,2.2,2.5,2.6,3.2,3.5,3.9,4.2,6]
import matplotlib.pyplot as plt
plt.hist(values,bins=3)
plt.show()
Personnalisation
Créer un graphique, c’est une chose. Produire le bon graphique, qui fait passer le message clairement, c’est là tout l’enjeu. Pour chaque visualisation, vous avez de nombreuses options : d’une part, le type de graphique ; d’autre part, une infinité de personnalisations possibles. Vous pouvez modifier les couleurs, les formes, les étiquettes, les axes, etc. Le choix dépend, un, des données, et deux, de l’histoire que vous souhaitez raconter. Comme les possibilités sont très nombreuses, le mieux est d’apprendre par l’exemple.
Partons du code de ce script pour tracer une simple courbe. Il ressemble à celui du premier module, mais cette fois les listes year et pop contiennent plus de données, avec des projections jusqu’en 2100, publiées par les Nations unies. En l’exécutant, on obtient déjà un joli graphique : il montre que l’explosion démographique en cours devrait ralentir d’ici la fin du siècle.
Mais certains points peuvent être améliorés. D’abord, il faut préciser clairement quelles données sont affichées, surtout pour un œil non averti. Ensuite, le graphique doit attirer l’attention sur l’explosion démographique. Première étape indispensable : étiqueter vos axes. Faisons‑le avec les fonctions xlabel() et ylabel(). En entrée, passez les textes à placer le long des axes. Assurez‑vous d’appeler ces fonctions avant show(), sinon vos personnalisations ne seront pas visibles. En relançant le script, les axes sont désormais annotés. Ajoutons aussi un titre avec la fonction title, à laquelle nous passons « World Population Projections ». Et voici le titre !
Ainsi, avec xlabel, ylabel et title, le lecteur comprend mieux ce qui est représenté. Pour mettre la croissance en perspective, je veux que l’axe des ordonnées commence à zéro. Utilisez pour cela la fonction . Le premier argument est une liste — ici de 0 à 10 par pas de 2. En l’exécutant, la courbe se décale ; on voit bien qu’en 1950, il y avait déjà environ 2,5 milliards d’habitants.yticks()
Ensuite, pour préciser qu’il s’agit de milliards, nous pouvons ajouter un second argument à yticks() : une liste d’étiquettes à afficher. Elle doit avoir la même longueur que la première. Le repère 0 affiche 0, le repère 2 affiche 2B, le repère 4 affiche 4B, etc. Ici, B signifie Billions (milliards en anglais). En relançant le script, les étiquettes s’actualisent : parfait.
Enfin, ajoutons quelques données historiques pour mieux faire ressortir l’accélération des 60 dernières années. Sur Wikipedia, j’ai trouvé la population mondiale pour 1800, 1850 et 1900. Je les écris sous forme de listes et les concatène aux listes pop et year avec l’opérateur plus. En relançant une dernière fois, trois points s’ajoutent au graphique, offrant une vision plus complète. Voilà comment transformer une courbe moyenne en une visualisation qui raconte une histoire claire ! À vous maintenant : passez aux exercices, personnalisez progressivement le graphique de l’évolution mondiale et marchez dans les pas d’Hans Rosling !
import matplotlib.pyplot as plt
import pandas as pd
year = list(range(1950, 2101))
pop = [2.53,2.57,2.62,2.67,2.71,2.76,2.81,2.86,2.92,2.97,3.03,3.08,3.14,3.2,3.26,3.33,3.4,3.47,3.54,3.62,3.69,3.77,3.84,3.92,4.,4.07,4.15,4.22,4.3,4.37,4.45,4.53,4.61,4.69,4.78,4.86,4.95,5.05,5.14,5.23,5.32,5.41,5.49,5.58,5.66,5.74,5.82,5.9,5.98,6.05,6.13,6.2,6.28,6.36,6.44,6.51,6.59,6.67,6.75,6.83,6.92,7.,7.08,7.16,7.24,7.32,7.4,7.48,7.56,7.64,7.72,7.79,7.87,7.94,8.01,8.08,8.15,8.22,8.29,8.36,8.42,8.49,8.56,8.62,8.68,8.74,8.8,8.86,8.92,8.98,9.04,9.09,9.15,9.2,9.26,9.31,9.36,9.41,9.46,9.5,9.55,9.6,9.64,9.68,9.73,9.77,9.81,9.85,9.88,9.92,9.96,9.99,10.03,10.06,10.09,10.13,10.16,10.19,10.22,10.25,10.28,10.31,10.33,10.36,10.38,10.41,10.43,10.46,10.48,10.5,10.52,10.55,10.57,10.59,10.61,10.63,10.65,10.66,10.68,10.7,10.72,10.73,10.75,10.77,10.78,10.79,10.81,10.82,10.83,10.84,10.85]
pop = [1,1.262,1.650] + pop
year = [1800,1850,1900] + year
plt.plot(year, pop)
plt.xlabel('Year')
plt.ylabel('Population')
plt.title('World Population Projections')
plt.yticks([0,2,4,6,8,10],['0','2B','4B','6B','8B','10B'])
plt.show()