Aller au contenu principal

Module 8 — Visualisation avec Matplotlib et Seaborn

Un describe() dit que la moyenne vaut 48 ; il ne dit pas que la distribution a deux bosses, un trou au milieu et douze valeurs aberrantes. La visualisation est un outil de diagnostic avant d'être un outil de présentation : on trace pour voir ce que les statistiques résument trop bien. Ce module donne la mécanique (Matplotlib), les raccourcis statistiques (Seaborn) et les règles de choix.

Matplotlib : figure, axes, et l'interface explicite

Matplotlib a deux styles d'écriture. Le style plt.plot(...) convient aux tracés jetables ; dès qu'un graphique compte, le style orienté objet est plus clair et plus contrôlable :

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(9, 5))
ax.plot(ca_mensuel.index, ca_mensuel.values, marker="o")
ax.set_title("Chiffre d'affaires mensuel 2026")
ax.set_xlabel("Mois")
ax.set_ylabel("CA (k$)")
ax.grid(alpha=0.3)
fig.savefig("ca_mensuel.png", dpi=150, bbox_inches="tight")

La figure est la toile ; les axes (ax) sont un graphique dessus. Cette distinction paie dès qu'on compose plusieurs vues :

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].hist(df["montant"], bins=40)
axes[1].boxplot(df["montant"])

Toutes les bibliothèques de l'écosystème (pandas .plot(), Seaborn) produisent des axes Matplotlib : savoir les retoucher (ax.set_...) sert donc partout.

Les quatre questions et leurs graphiques

Le choix du graphique découle de la question posée — pas de l'inventaire des types disponibles.

QuestionGraphiqueCommande type
Comment se distribue une variable ?Histogrammeax.hist(x, bins=40) / sns.histplot
Comment évolue-t-elle dans le temps ?Courbeax.plot(dates, y)
Comment deux variables sont-elles liées ?Nuage de pointsax.scatter(x, y) / sns.scatterplot
Comment des groupes se comparent-ils ?Barres ou boîtesax.bar / sns.boxplot

Deux précisions d'expérience. L'histogramme dépend du nombre de classes : essayez plusieurs bins avant de conclure sur la forme. Le nuage de points sature au-delà de quelques dizaines de milliers de points : alpha=0.1 ou un échantillon (df.sample(5000)) rendent la densité lisible.

Seaborn : la couche statistique

Seaborn parle DataFrame nativement — data=, x=, y=, hue= — et trace en une ligne ce qui demanderait dix lignes de Matplotlib :

import seaborn as sns

sns.histplot(data=df, x="montant", hue="segment", bins=40) # distributions par groupe
sns.boxplot(data=df, x="segment", y="montant") # comparaisons de groupes
sns.scatterplot(data=df, x="anciennete", y="panier", hue="pays", alpha=0.4)
sns.heatmap(df[num_cols].corr(), annot=True, cmap="coolwarm", center=0) # corrélations

Le paramètre hue — une troisième variable encodée en couleur — est le grand apport quotidien : comparer les segments dans chaque graphique sans multiplier les figures. La carte de chaleur des corrélations est le passage obligé de l'exploration avant modèle : elle révèle les variables redondantes et les liaisons inattendues (en se souvenant que la corrélation mesure les liens linéaires — un lien en U lui échappe, raison de plus pour tracer les nuages).

L'honnêteté visuelle : quatre règles

Un graphique peut mentir plus vite qu'un tableau. Les règles qui maintiennent l'honnêteté — envers les autres et envers soi-même :

L'axe des barres commence à zéro. Une barre coupée à 95 transforme un écart de 2 % en falaise. Pour les courbes, un axe resserré se justifie parfois — le signaler alors explicitement.

Les échelles se comparent à échelles égales. Deux graphiques côte à côte avec des axes différents suggèrent des conclusions que les données ne portent pas.

Le titre énonce le constat, pas la variable : « Le panier moyen premium a doublé en 2026 » informe ; « Montant par segment » décore. Ajoutez la source et la période — un graphique voyage toujours plus loin que son contexte.

La couleur porte du sens ou n'existe pas. Douze couleurs pour douze barres n'encodent rien ; une couleur pour le segment mis en avant et du gris pour le reste guide l'œil vers le message.

Le graphique de diagnostic vs le graphique de présentation

Les graphiques d'exploration peuvent rester bruts — leur seul lecteur est vous, leur seul but est de voir. Le graphique montré à autrui suit les quatre règles, porte un titre-constat et des axes étiquetés avec unités. Confondre les deux gaspille du temps dans un sens (peaufiner l'exploratoire) et de la crédibilité dans l'autre (présenter du brut).

Ce qu'il faut retenir

  • Tracer est un geste de diagnostic : les distributions à deux bosses et les aberrants n'apparaissent pas dans describe().
  • Style orienté objet : fig, ax = plt.subplots() puis ax.set_... ; tout l'écosystème produit des axes Matplotlib retouchables.
  • Quatre questions, quatre graphiques : distribution → histogramme, temps → courbe, relation → nuage, groupes → barres/boîtes.
  • Seaborn + hue pour les comparaisons de groupes en une ligne ; heatmap de corrélations avant tout modèle.
  • Honnêteté : barres depuis zéro, échelles comparables, titre-constat, couleur porteuse de sens.

Au module suivant : les environnements virtuels et la gestion des dépendances — ce qui rend votre travail installable ailleurs que sur votre machine.