Skip to content
Thèmes
Seaborn
Seaborn Boxplot: How to Create and Customize Box Plots in Python

Seaborn Boxplot : Comment créer et personnaliser des boîtes à moustaches en Python

Updated on

Comprendre comment vos données sont distribuées est l'une des tâches les plus fondamentales de l'analyse de données. Vous devez repérer les valeurs aberrantes, comparer les groupes et identifier l'asymétrie avant d'exécuter un modèle ou de tirer des conclusions. Pourtant, fixer des nombres bruts dans un DataFrame vous donne rarement l'image complète. Un seaborn boxplot résout ce problème en condensant une distribution entière en un graphique compact et lisible qui montre la médiane, la dispersion et les valeurs aberrantes en un coup d'œil.

Dans ce guide, vous apprendrez comment créer, personnaliser et interpréter des boîtes à moustaches en utilisant la bibliothèque seaborn de Python. Chaque exemple de code utilise des jeux de données réels intégrés dans seaborn afin que vous puissiez les exécuter immédiatement dans un notebook Jupyter.

📚

Qu'est-ce qu'une boîte à moustaches ?

Une boîte à moustaches (également appelée diagramme en boîte) est une méthode standardisée pour afficher une distribution basée sur cinq statistiques récapitulatives :

ComposantCe qu'il représente
Ligne de médianeLa valeur médiane de l'ensemble de données (50e percentile)
Boîte (IQR)L'écart interquartile, s'étendant de Q1 (25e percentile) à Q3 (75e percentile)
Moustache inférieureLe plus petit point de données dans Q1 - 1,5 * IQR
Moustache supérieureLe plus grand point de données dans Q3 + 1,5 * IQR
Points aberrantsPoints de données individuels qui se situent en dehors de la plage des moustaches

La boîte capture les 50 % centraux de vos données. Une boîte haute signifie une forte variabilité ; une boîte courte signifie que vos valeurs se regroupent étroitement. Lorsque la ligne médiane est décentrée à l'intérieur de la boîte, la distribution est asymétrique. Les points au-delà des moustaches signalent des valeurs aberrantes potentielles qui méritent une investigation.

Les boîtes à moustaches sont particulièrement efficaces lorsque vous devez comparer des distributions sur plusieurs catégories côte à côte, ce qui en fait un pilier de l'analyse exploratoire des données.

Syntaxe de base de Seaborn Boxplot

Créer un boxplot dans seaborn ne nécessite qu'une seule fonction : sns.boxplot(). Au minimum, vous transmettez les données et spécifiez quelle variable tracer.

import seaborn as sns
import matplotlib.pyplot as plt
 
# Charger un jeu de données intégré
tips = sns.load_dataset("tips")
 
# Boxplot vertical de base
sns.boxplot(data=tips, y="total_bill")
plt.title("Distribution de l'addition totale")
plt.show()

Cela produit une seule boîte montrant la distribution des valeurs de total_bill. La fonction calcule automatiquement les quartiles, les moustaches et les valeurs aberrantes pour vous.

Pour diviser les données par une variable catégorielle, ajoutez le paramètre x :

sns.boxplot(data=tips, x="day", y="total_bill")
plt.title("Addition totale par jour de la semaine")
plt.show()

Maintenant, vous voyez quatre boîtes côte à côte, une pour chaque jour, ce qui facilite la comparaison des modèles de dépenses au cours de la semaine.

Création de boxplots à partir de différents formats de données

Seaborn gère plusieurs formats de données avec élégance. Voici les scénarios les plus courants.

DataFrame au format long (données ordonnées)

La plupart des fonctions seaborn fonctionnent mieux avec des données au format long (ordonnées) où chaque ligne est une observation unique et les colonnes représentent des variables. Le jeu de données tips est déjà dans ce format :

# Format long : chaque ligne est une visite au restaurant
sns.boxplot(data=tips, x="day", y="total_bill")
plt.show()

DataFrame au format large

Si vos données ont une colonne par groupe (format large), seaborn peut toujours produire des boxplots directement :

import pandas as pd
import numpy as np
 
# Créer des données au format large
np.random.seed(42)
wide_df = pd.DataFrame({
    "Group A": np.random.normal(50, 10, 100),
    "Group B": np.random.normal(60, 15, 100),
    "Group C": np.random.normal(45, 8, 100),
})
 
sns.boxplot(data=wide_df)
plt.title("Comparaison de trois groupes (données au format large)")
plt.ylabel("Valeur")
plt.show()

Seaborn traite automatiquement chaque colonne comme une catégorie distincte et les trace côte à côte.

Sélection de colonnes spécifiques du DataFrame

Lorsque vous souhaitez uniquement visualiser certaines colonnes numériques d'un DataFrame plus grand, filtrez-les d'abord :

iris = sns.load_dataset("iris")
 
# Sélectionner uniquement les colonnes de mesure
measurement_cols = iris[["sepal_length", "sepal_width", "petal_length", "petal_width"]]
sns.boxplot(data=measurement_cols)
plt.title("Distributions des caractéristiques d'Iris")
plt.xticks(rotation=15)
plt.show()

Personnalisation de votre Seaborn Boxplot

Seaborn fournit des options étendues pour adapter l'apparence et le comportement de vos boîtes à moustaches.

Couleurs et palettes

Changez le schéma de couleurs en utilisant le paramètre palette ou définissez une couleur unique pour toutes les boîtes :

# Utiliser une palette nommée
sns.boxplot(data=tips, x="day", y="total_bill", palette="Set2")
plt.title("Palette personnalisée")
plt.show()
# Couleur unique pour toutes les boîtes
sns.boxplot(data=tips, x="day", y="total_bill", color="skyblue")
plt.title("Couleur uniforme")
plt.show()

Les options de palette populaires incluent "Set2", "pastel", "muted", "deep", "husl" et "coolwarm".

Orientation horizontale vs verticale

Échangez les axes pour créer un boxplot horizontal. C'est utile lorsque les étiquettes de catégorie sont longues :

sns.boxplot(data=tips, x="total_bill", y="day", orient="h")
plt.title("Boxplot horizontal")
plt.show()

Boxplots groupés avec le paramètre hue

Le paramètre hue divise chaque catégorie en sous-groupes, ajoutant une deuxième dimension à votre comparaison :

sns.boxplot(data=tips, x="day", y="total_bill", hue="sex")
plt.title("Addition totale par jour et par sexe")
plt.legend(title="Sexe")
plt.show()

Chaque jour affiche maintenant deux boîtes (une par sexe), ce qui facilite la comparaison des modèles de dépenses masculines et féminines chaque jour de la semaine.

Contrôle de la taille de la figure

Les graphiques Seaborn héritent de la taille de figure de matplotlib. Définissez-la avant d'appeler sns.boxplot() :

plt.figure(figsize=(12, 6))
sns.boxplot(data=tips, x="day", y="total_bill", hue="smoker", palette="muted")
plt.title("Addition totale par jour et statut de fumeur")
plt.show()

Ajout de superpositions de graphiques en essaim ou en bandes

Un boxplot résume la distribution, mais il cache les points de données individuels. Superposez un graphique en essaim ou en bandes pour afficher chaque observation :

plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x="day", y="total_bill", palette="pastel")
sns.stripplot(data=tips, x="day", y="total_bill", color="0.3", size=3, jitter=True, alpha=0.5)
plt.title("Boxplot avec superposition de graphique en bandes")
plt.show()
plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x="day", y="total_bill", palette="pastel")
sns.swarmplot(data=tips, x="day", y="total_bill", color="0.25", size=3, alpha=0.6)
plt.title("Boxplot avec superposition de graphique en essaim")
plt.show()

Le graphique en essaim organise les points de manière à ce qu'ils ne se chevauchent pas, donnant une meilleure idée de la densité des données. Utilisez des graphiques en bandes lorsque vous avez de nombreux points de données et des graphiques en essaim lorsque vous en avez moins (les graphiques en essaim peuvent devenir lents avec des milliers de points).

Référence des paramètres de Seaborn Boxplot

Voici une référence rapide pour les paramètres les plus couramment utilisés dans sns.boxplot() :

ParamètreTypeDescription
dataDataFrame, tableau ou listeStructure de données d'entrée
x, ystr ou tableauVariables pour les axes
huestrVariable de regroupement pour les sous-groupes codés par couleur
orderliste de strOrdre pour tracer les niveaux catégoriels
hue_orderliste de strOrdre pour les niveaux de hue
orient"v" ou "h"Orientation du graphique
colorstrCouleur unique pour tous les éléments
palettestr, liste ou dictCouleurs pour différents niveaux
saturationfloatProportion de saturation d'origine (0 à 1)
fillboolS'il faut remplir la boîte avec de la couleur (seaborn >= 0.13)
widthfloatLargeur des boîtes (par défaut 0,8)
dodgeboolS'il faut décaler les groupes de hue le long de l'axe catégoriel
fliersizefloatTaille des marqueurs de valeurs aberrantes
linewidthfloatLargeur des lignes encadrant la boîte
whisfloat ou tupleLongueur des moustaches en multiple de l'IQR (par défaut 1,5)
axmatplotlib AxesObjet Axes sur lequel dessiner le graphique

Comparaison de distributions

Plusieurs colonnes côte à côte

Lors de la comparaison de distributions de plusieurs caractéristiques numériques, transformez votre DataFrame en format long :

iris = sns.load_dataset("iris")
 
# Transformer du format large au format long
iris_long = iris.melt(id_vars="species", var_name="measurement", value_name="cm")
 
plt.figure(figsize=(12, 6))
sns.boxplot(data=iris_long, x="measurement", y="cm", palette="Set3")
plt.title("Comparaison des mesures d'Iris")
plt.show()

Comparaisons groupées avec hue

Combinez à la fois une catégorie et une variable de regroupement pour comparer les distributions sur deux dimensions :

plt.figure(figsize=(14, 6))
sns.boxplot(data=iris_long, x="measurement", y="cm", hue="species", palette="husl")
plt.title("Mesures d'Iris par espèce")
plt.legend(title="Espèce", bbox_to_anchor=(1.05, 1), loc="upper left")
plt.tight_layout()
plt.show()

Cela produit un boxplot groupé où chaque type de mesure affiche trois boîtes (une par espèce), rendant la comparaison inter-espèces immédiate.

Seaborn Boxplot vs Matplotlib Boxplot

Seaborn et matplotlib peuvent tous deux produire des boîtes à moustaches, mais ils diffèrent considérablement en termes de facilité d'utilisation et de qualité visuelle.

CaractéristiqueSeaborn sns.boxplot()Matplotlib ax.boxplot()
Esthétique par défautSoignée, prête pour publicationBasique, style minimal
Intégration DataFrameSupport natif pour pandas DataFramesNécessite l'extraction manuelle de tableaux
Regroupement de hueParamètre hue intégréPositionnement et coloration manuels
PalettesAffectation de palette en une ligneGestion manuelle de liste de couleurs
Annotations statistiquesSuperposition facile avec des graphiques en essaim/bandesNécessite des superpositions de dispersion manuelles
Profondeur de personnalisationModérée (délègue à matplotlib)Contrôle complet de bas niveau
Courbe d'apprentissageFaibleMoyenne à élevée
Verbosité du code1-2 lignes pour un graphique groupé10-20 lignes pour équivalent

Verdict : Utilisez seaborn pour une analyse exploratoire rapide et des visuels propres. Revenez à matplotlib lorsque vous avez besoin d'un contrôle au pixel près sur chaque élément.

# Boxplot Matplotlib (plus verbeux)
import matplotlib.pyplot as plt
 
fig, ax = plt.subplots(figsize=(8, 5))
data_by_day = [tips[tips["day"] == d]["total_bill"].values for d in ["Thur", "Fri", "Sat", "Sun"]]
bp = ax.boxplot(data_by_day, labels=["Thur", "Fri", "Sat", "Sun"], patch_artist=True)
for patch, color in zip(bp["boxes"], ["#8dd3c7", "#ffffb3", "#bebada", "#fb8072"]):
    patch.set_facecolor(color)
ax.set_title("Boxplot Matplotlib (style manuel)")
ax.set_ylabel("Addition totale")
plt.show()
# Équivalent Seaborn (concis)
sns.boxplot(data=tips, x="day", y="total_bill", palette="Set3",
            order=["Thur", "Fri", "Sat", "Sun"])
plt.title("Boxplot Seaborn (une ligne)")
plt.show()

Boîte à moustaches vs Graphique en violon : quand utiliser lequel

Seaborn offre également sns.violinplot(), qui montre la forme complète de la densité de la distribution plutôt que juste les statistiques récapitulatives. Voici quand choisir chacun :

CritèreBoîte à moustachesGraphique en violon
Meilleur pourStatistiques récapitulatives rapides et détection de valeurs aberrantesComprendre la forme complète de la distribution
Affiche les valeurs aberrantesOui, en tant que points individuelsNon (absorbées dans la courbe de densité)
Affiche la bimodalitéNonOui (visible comme deux bosses)
LisibilitéÉlevée, même pour les publics non techniquesNécessite plus d'explication
Efficacité de l'espaceCompactPlus large, prend plus d'espace horizontal
PerformanceRendu rapidePlus lent avec de grands ensembles de données (calcul KDE)

Règle d'or : Commencez par un boxplot pour des vérifications rapides. Passez à un graphique en violon si vous soupçonnez que la distribution a plusieurs pics ou une forme inhabituelle.

fig, axes = plt.subplots(1, 2, figsize=(14, 5))
 
sns.boxplot(data=tips, x="day", y="total_bill", palette="Set2", ax=axes[0])
axes[0].set_title("Boîte à moustaches")
 
sns.violinplot(data=tips, x="day", y="total_bill", palette="Set2", ax=axes[1])
axes[1].set_title("Graphique en violon")
 
plt.tight_layout()
plt.show()

Alternative interactive : explorez les distributions avec PyGWalker

Les boîtes à moustaches statiques fonctionnent bien pour les rapports et les notebooks, mais lorsque vous êtes dans la phase d'exploration précoce, vous voulez souvent faire glisser différentes variables dans et hors d'un graphique sans réécrire du code à chaque fois.

PyGWalker (opens in a new tab) est une bibliothèque Python open source qui transforme n'importe quel pandas DataFrame en une interface d'exploration visuelle interactive de type Tableau directement dans Jupyter Notebook. Vous pouvez créer des boîtes à moustaches, des graphiques en violon, des histogrammes, des graphiques de dispersion et plus encore en faisant simplement glisser des champs sur les axes. Aucun changement de code nécessaire.

pip install pygwalker
import pandas as pd
import pygwalker as pyg
 
tips = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv")
walker = pyg.walk(tips)

Une fois l'interface utilisateur chargée, faites glisser day vers l'axe X et total_bill vers l'axe Y, puis sélectionnez le type de marque boxplot. Vous pouvez instantanément passer à un graphique en violon, ajouter des dimensions de couleur ou filtrer par n'importe quelle colonne, le tout sans écrire une seule ligne de code supplémentaire.

Ceci est particulièrement précieux pour les équipes où tout le monde n'écrit pas Python. Partagez le notebook et laissez les parties prenantes explorer les données elles-mêmes.

Exécuter PyGWalker dans Kaggle (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)PyGWalker sur GitHub (opens in a new tab)

FAQ

Comment supprimer les valeurs aberrantes d'un seaborn boxplot ?

Définissez le paramètre whis sur une valeur plus grande (par exemple, whis=3.0) pour étendre les moustaches et réduire le nombre de points affichés comme valeurs aberrantes. Alternativement, définissez flierprops={"marker": ""} pour masquer complètement les marqueurs de valeurs aberrantes tout en gardant le calcul des moustaches inchangé.

Puis-je tracer un seaborn boxplot sans utiliser de DataFrame ?

Oui. Vous pouvez passer des tableaux ou des listes brutes directement : sns.boxplot(x=["A"]*50 + ["B"]*50, y=np.random.randn(100)). Cependant, l'utilisation d'un DataFrame avec des colonnes nommées est recommandée car elle génère automatiquement des étiquettes d'axe.

Comment changer le style de marqueur de valeurs aberrantes dans sns.boxplot ?

Passez un dictionnaire au paramètre flierprops : sns.boxplot(data=tips, x="day", y="total_bill", flierprops={"marker": "D", "markerfacecolor": "red", "markersize": 5}). Cela change les marqueurs de valeurs aberrantes en diamants rouges.

Quelle est la différence entre hue et x dans seaborn boxplot ?

Le paramètre x définit le regroupement catégoriel principal sur l'axe horizontal. Le paramètre hue ajoute un regroupement secondaire dans chaque catégorie, affiché comme des boîtes colorées côte à côte. Utilisez x seul pour des comparaisons simples et ajoutez hue lorsque vous souhaitez décomposer chaque catégorie par une deuxième variable comme le sexe ou le statut.

Comment enregistrer un seaborn boxplot dans un fichier ?

Après avoir créé le graphique, appelez plt.savefig("boxplot.png", dpi=300, bbox_inches="tight"). Les graphiques Seaborn sont des figures matplotlib sous le capot, donc toutes les méthodes de sauvegarde matplotlib fonctionnent. Les formats pris en charge incluent PNG, PDF, SVG et EPS.

Conclusion

Le seaborn boxplot est l'un des moyens les plus rapides pour comprendre comment vos données sont distribuées, repérer les valeurs aberrantes et comparer les groupes. Avec sns.boxplot(), vous passez d'un DataFrame brut à une visualisation de qualité publication en une seule ligne de code. Le paramètre hue ajoute des comparaisons groupées sans effort supplémentaire, et la superposition de graphiques en bandes ou en essaim remplit les détails des points de données individuels que les boîtes à moustaches résument.

Pour l'analyse statique dans les notebooks et les rapports, les boxplots seaborn sont difficiles à battre. Lorsque vous avez besoin d'une couche d'exploration interactive au-dessus de vos données pandas, des outils comme PyGWalker (opens in a new tab) vous permettent de construire et d'itérer sur des visualisations sans changements de code.

Commencez avec les exemples de base ci-dessus, expérimentez avec les palettes et les superpositions, et vous aurez une boîte à outils visuelle fiable pour toute question de distribution de données qui se présente à vous.

📚