PE – Python numérique – Annexe : des données au graphique, avec seaborn

Des données au graphique, avec seaborn 🎨

Annexe · le notebook 3-05-seaborn-intro-nb, puis comment choisir sa représentation

PE – Python numérique – Annexe : des données au graphique, avec seaborn

Au programme 🎯

La séance 5 est allée vite sur les figures : nous reprenons en trois temps, bien séparés.

🖐️ 0. Hands-on seaborn, tout de suite : le notebook 3-05-seaborn-intro-nb du cours (dépôt numerique), que nous faisons ensemble, en direct.

🎨 1. Choisir sa représentation. Quel graphique pour quelles données ? La réponse ne dépend pas de l'outil : elle dépend du type de chaque colonne.

🐍 2. Retour sur seaborn : ce qu'il faut retenir du notebook, à la lumière des types.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🖐️ 0. Hands-on : seaborn en direct

On ouvre le notebook, on exécute, on modifie. Je montre au tableau, vous faites sur votre machine.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🖐️ Hands-on

Le notebook 3-05-seaborn-intro-nb, ensemble

  1. Récupérer le cours : git pull dans votre dépôt numerique, puis ouvrir notebooks/3-05-seaborn-intro-nb.md dans JupyterLab (cf. l'annexe « Le cours sur votre machine »).
  2. relplot : le nuage total_bill / tip, puis on ajoute une dimension à la fois avec hue=, col=, size=… jusqu'à 7.
  3. displot : la distribution des additions, en histogramme, en densité, en cumulé.
  4. catplot : une catégorie en abscisse, une valeur en ordonnée (strip, box, violin, bar).

À chaque cellule, changez une colonne ou un argument et regardez ce qui bouge. Posez-vous déjà la question : de quel type est cette colonne ? On y répond juste après.

💡 sns.load_dataset télécharge les données : il faut une connexion la première fois.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🎨 1. Choisir sa représentation

Le type des données d'abord, le graphique ensuite : vrai pour seaborn, matplotlib, un tableur ou un crayon.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🎨 Choisir sa représentation

Un exemple : 244 additions d'un restaurant

total_bill tip sex smoker day time size
16.99 1.01 Female No Sun Dinner 2
10.34 1.66 Male No Sun Dinner 3
21.01 3.50 Male No Sun Dinner 3

C'est le jeu tips du notebook : des montants (total_bill, tip), un nombre de convives (size), des oui/non (smoker), des étiquettes (sex, time) et des jours (day).

Pouvez-vous deviner lesquelles se rangent dans un ordre naturel ?

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🎨 Choisir sa représentation

Quatre types de colonnes

type ce qu'elle contient dans l'exemple ce qui a un sens
quantitative continue une mesure, toute valeur possible total_bill, tip moyenne, écart, axe gradué
quantitative discrète un comptage, des entiers size moyenne… et comptage par valeur
qualitative ordinale des catégories rangées day (jeu. < ven. < sam. < dim.) ordre, médiane ; pas de moyenne
qualitative nominale des catégories sans ordre sex, smoker, time effectifs, proportions

En clair : quantitatif = on peut calculer avec ; qualitatif = on ne peut que compter et, s'il y a un ordre, ranger.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🎨 Choisir sa représentation

Trois questions pour trancher

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🎨 Choisir sa représentation

⚠️ Un nombre n'est pas forcément quantitatif

  • un code postal, un numéro de département : nominal. La moyenne de 75 et de 13 ne veut rien dire ;
  • la classe du Titanic (1, 2, 3), une note de satisfaction de 1 à 5 : ordinale. On peut ranger, pas faire de moyenne ;
  • une année : quantitative sur un axe du temps, mais qualitative si on en fait des groupes (« avant / après 2010 »).

À l'inverse, un oui/non se code souvent 1/0 : c'est une nominale, dont la moyenne donne une proportion.

Le réflexe : regarder ce que la colonne veut dire, pas comment elle est écrite.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🎨 Choisir sa représentation

Quel graphique pour quel croisement ?

ce qu'on croise représentation
une quantitative seule histogramme, courbe de densité
une qualitative seule barres d'effectifs : dans l'ordre naturel si ordinale, triées si nominale
deux quantitatives nuage de points ; une courbe si l'une est le temps
une qualitative et une quantitative une boîte (ou un violon) par catégorie, barres de moyennes
deux qualitatives barres groupées ou empilées, carte de chaleur du tableau croisé

Une troisième variable s'ajoute par la couleur, la taille des points ou des facettes (une petite figure par catégorie).

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🎨 Choisir sa représentation

La couleur suit le type, elle aussi

Un dégradé dit « plus ou moins » : il convient à une ordinale ou à une quantitative, jamais à une nominale (fumeur n'est pas « plus » que non-fumeur).

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🌟 Des visualisations qui ont fait date · 1/4

1786 : William Playfair invente la courbe

Exportations et importations de l'Angleterre avec le Danemark et la Norvège, 1700-1780 : deux quantitatives dans le temps, et l'aire entre les courbes montre la balance commerciale. Playfair invente aussi le diagramme en barres, puis le camembert (1801).

Domaine public, via Wikimedia Commons.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🌟 Des visualisations qui ont fait date · 2/4

1854 : John Snow trouve la source du choléra

Londres, quartier de Soho : chaque décès est un petit trait noir, posé à l'adresse du malade. Les traits s'agglutinent autour d'une pompe, celle de Broad Street : le choléra passe par l'eau. On démonte la poignée, l'épidémie recule.

Domaine public, via Wikimedia Commons.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🌟 Des visualisations qui ont fait date · 3/4

1858 : Florence Nightingale et la rose des morts

Guerre de Crimée, un secteur par mois : en bleu, les morts de maladies évitables ; en rouge, de blessures ; en noir, d'autres causes. Les soldats meurent bien plus à l'hôpital qu'au combat. Ici, c'est l'aire de chaque secteur qui suit le nombre de morts, comme il se doit.

Domaine public, via Wikimedia Commons.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🌟 Des visualisations qui ont fait date · 4/4

1869 : Charles Minard et la campagne de Russie

Six variables sur une seule image : effectif de l'armée (épaisseur), position, sens de marche (couleur), dates et température du retour. « Probablement le meilleur graphique statistique jamais dessiné » (Edward Tufte).

Domaine public, via Wikimedia Commons.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 2. Retour sur seaborn

Ce qu'il faut retenir du notebook, à la lumière des types.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn

seaborn en bref

seaborn est une brique au-dessus de matplotlib qui parle DataFrame : on lui nomme des colonnes, il choisit les axes, les couleurs et la légende… d'après leur type.

import seaborn as sns
tips = sns.load_dataset("tips")
tips.dtypes                            # sex, smoker, day, time : category

Les trois familles du notebook :

  • sns.relplot : les relations entre deux quantitatives ;
  • sns.displot : les distributions ;
  • sns.catplot : une variable catégorielle contre une autre.
PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn

Dire le type à pandas et à seaborn

tips["day"].cat.categories                          # ['Thur', 'Fri', 'Sat', 'Sun'] : l'ordre retenu

# rendre une colonne catégorielle, et ordonnée
df["mention"] = pd.Categorical(df["mention"], ordered=True,
                               categories=["passable", "assez bien", "bien", "très bien"])
df["Pclass"] = df["Pclass"].astype("category")      # 1, 2, 3 : des classes, plus des nombres
  • order= / hue_order= imposent l'ordre des catégories sur l'axe ou dans la légende ;
  • palette= choisit les couleurs : séquentielle ("rocket_r", "Blues"), qualitative ("Set2", "tab10"), divergente ("vlag").
PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn

Chaque représentation, sa fonction

représentation seaborn
histogramme, densité sns.displot(kind="hist"), kind="kde"
nuage de points, courbe sns.relplot(kind="scatter"), kind="line"
boîtes, violons, barres de moyennes sns.catplot(kind="box"), "violin", "bar"
barres d'effectifs sns.catplot(kind="count")
carte de chaleur sns.heatmap(pd.crosstab(…))

La troisième variable : hue= (couleur), size= (taille), col= / row= (facettes).

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn · deux quantitatives

Un nuage, et une nominale en couleur

sns.relplot(data=tips, x="total_bill", y="tip",
            hue="time", palette="Set2")

time (déjeuner, dîner) est nominale : une palette qualitative, aux teintes bien distinctes.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn · une ordinale et une quantitative

Une boîte par jour, dans l'ordre des jours

sns.catplot(data=tips, x="day", y="total_bill",
            kind="box", color="#7fb3d5")

day est une catégorie ordonnée : l'axe suit jeudi → dimanche, et non l'ordre alphabétique.

Pour une colonne texte, c'est à vous de le donner : order=["Thur", "Fri", "Sat", "Sun"].

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn · une quantitative seule

La distribution des additions

sns.displot(data=tips, x="total_bill",
            hue="time", kind="hist", palette="Set2")

hue= superpose les déjeuners et les dîners ; kind="kde" donne une courbe lissée.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn · deux qualitatives

Compter, puis croiser

sns.catplot(data=tips, x="day", hue="sex",
            kind="count", palette="Set2")

Rien à mesurer : on compte les additions par jour, puis par sexe du payeur.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn · le piège

size est un nombre : seaborn choisit un dégradé

sns.relplot(data=tips, x="total_bill", y="tip",
            hue="size", palette="rocket_r")

Du clair (1 convive) au foncé (6) : c'est juste, 6 convives c'est « plus » que 1.

Avec hue="smoker", seaborn prend une palette qualitative : c'est le type de la colonne qui décide.

PE – Python numérique – Annexe : des données au graphique, avec seaborn

🐍 seaborn

Le coder : des galeries avec leur code

Pour toute question, vous pouvez me contacter par email : raphael@imagine-app.fr.

fig: img-seaborn/relplot.svg

fig: img-seaborn/catplot-box.svg

fig: img-seaborn/displot.svg

fig: img-seaborn/count.svg

fig: img-seaborn/hue-size.svg