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 :
| Composant | Ce qu'il représente |
|---|---|
| Ligne de médiane | La 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érieure | Le plus petit point de données dans Q1 - 1,5 * IQR |
| Moustache supérieure | Le plus grand point de données dans Q3 + 1,5 * IQR |
| Points aberrants | Points 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ètre | Type | Description |
|---|---|---|
data | DataFrame, tableau ou liste | Structure de données d'entrée |
x, y | str ou tableau | Variables pour les axes |
hue | str | Variable de regroupement pour les sous-groupes codés par couleur |
order | liste de str | Ordre pour tracer les niveaux catégoriels |
hue_order | liste de str | Ordre pour les niveaux de hue |
orient | "v" ou "h" | Orientation du graphique |
color | str | Couleur unique pour tous les éléments |
palette | str, liste ou dict | Couleurs pour différents niveaux |
saturation | float | Proportion de saturation d'origine (0 à 1) |
fill | bool | S'il faut remplir la boîte avec de la couleur (seaborn >= 0.13) |
width | float | Largeur des boîtes (par défaut 0,8) |
dodge | bool | S'il faut décaler les groupes de hue le long de l'axe catégoriel |
fliersize | float | Taille des marqueurs de valeurs aberrantes |
linewidth | float | Largeur des lignes encadrant la boîte |
whis | float ou tuple | Longueur des moustaches en multiple de l'IQR (par défaut 1,5) |
ax | matplotlib Axes | Objet 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éristique | Seaborn sns.boxplot() | Matplotlib ax.boxplot() |
|---|---|---|
| Esthétique par défaut | Soignée, prête pour publication | Basique, style minimal |
| Intégration DataFrame | Support natif pour pandas DataFrames | Nécessite l'extraction manuelle de tableaux |
| Regroupement de hue | Paramètre hue intégré | Positionnement et coloration manuels |
| Palettes | Affectation de palette en une ligne | Gestion manuelle de liste de couleurs |
| Annotations statistiques | Superposition facile avec des graphiques en essaim/bandes | Nécessite des superpositions de dispersion manuelles |
| Profondeur de personnalisation | Modérée (délègue à matplotlib) | Contrôle complet de bas niveau |
| Courbe d'apprentissage | Faible | Moyenne à élevée |
| Verbosité du code | 1-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ère | Boîte à moustaches | Graphique en violon |
|---|---|---|
| Meilleur pour | Statistiques récapitulatives rapides et détection de valeurs aberrantes | Comprendre la forme complète de la distribution |
| Affiche les valeurs aberrantes | Oui, en tant que points individuels | Non (absorbées dans la courbe de densité) |
| Affiche la bimodalité | Non | Oui (visible comme deux bosses) |
| Lisibilité | Élevée, même pour les publics non techniques | Nécessite plus d'explication |
| Efficacité de l'espace | Compact | Plus large, prend plus d'espace horizontal |
| Performance | Rendu rapide | Plus 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 pygwalkerimport 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.