Histogrammes, kernel density, boîtes à moustaches et camemberts

en langage python

1- Histogrammes en langage python

  • Réaliser un histogramme avec python

# Exemple de valeurs simulées avec numpy

from numpy.random import normal as norm

x = norm(50,20,57)

# Tracé de l'histogramme

import matplotlib.pyplot as plt

plt.hist(x,color="red",edgecolor='black', linewidth=1.2,bins=20)

plt.show()

# edgecolor et linewidth permettent de jouer sur les lignes bordant l'histogramme # bins sur le nombre de barres, la fréquence de découpe de l'échantillon
  • Histogramme avec courbe de densité - density plot

import seaborn as sns # Importer le module seaborn

sns.distplot(x, hist=True, kde=True,

bins=int(180/5), color = 'darkblue', # bins : épaisseur des bopites

hist_kws={'edgecolor':'black'},

kde_kws={'linewidth': 4}) # kde_kws = épaisseur de la courbe

plt.show()

Courbes de densité en python

from numpy.random import normal as norm

x = norm(40,20,57) ; sx = ["F"]*57

sns.distplot(x, hist = False, kde = True,

kde_kws = {'shade': True, 'linewidth': 3},

label = 'F')

x = norm(50,20,65) ; sx = ["M"]*65

sns.distplot(x, hist = False, kde = True,rug=True,

kde_kws = {'shade': True, 'linewidth': 3},

label = 'M',rug_kws={'color': 'black'} )

plt.show()

Le paramètre rug, ici pour les Mâles, permet de voir les données sous formes de bâtons noirs.

Calcul manuel de la densité en python :

  • équivalant de la fonction density() de R en python

from numpy.random import normal as norm

import numpy as np

sx = ["F"]*57 ; x = norm(40,20,57) ;

# Création d'un maillage qui correspondra aux 1000 valeurs x de la ligne.

x_plot = np.linspace(min(x),max(x), 1000)[:, np.newaxis]


from sklearn.neighbors import KernelDensity

# instantiate and fit the KDE model

kde = KernelDensity(bandwidth=(max(x)-min(x))/20, kernel='gaussian').fit(x[:,None])

log_dens = kde.score_samples(x_plot)

# Conversion des données de la courbe en dataframe (optionnel)

import pandas as df

myline= df.DataFrame({"X":list(x_plot),"Y":np.exp(log_dens)})

#

plt.plot(myline.X,myline.Y) # Tracer la ligne

plt.plot(x, np.full_like(x, -0.01), '|k', markeredgewidth=1) # Tracer les marques

plt.show()

# fill_between pour tracer l'aire entre la courbe...

plt.fill_between(x=myline.X,y1=myline.X, alpha=0.5)

plt.plot(x, np.full_like(x, -0.01), '|k', markeredgewidth=1) # Tracer les marques

plt.show()

2- Boîtes à moustaches en langage python

  • Dans cette partie boîte à moustaches (boxplot), nous prendrons l'exemple d'un jeu de données à simuler (code à copier-coller ci-dessous) :

sx = ["M"]*5 + ["F"] * 5 + ["M"]

age = [50,60,62,30,40,51,18,74,68,57,35]

taille = [163,167,165,170,171,177,180,190,176,178,173]

# Voir comment simuler des valeurs

import pandas as pd

mydata = pd.DataFrame({"age":age,"sx":sx,'taille':taille})

age sx taille

0 50 M 163

1 60 M 167

2 62 M 165

3 30 M 170

4 40 M 171

5 51 F 177

6 18 F 180

7 74 F 190

8 68 F 176

9 57 F 178

10 35 M 173

1- Boîte à moustaches simple

import matplotlib.pyplot as plt

plt.boxplot(mydata.age) ; plt.title("Boxplot des âges") ;

plt.gca().xaxis.set_ticklabels(['A']) ; plt.show()

# Cette dernière ligne plt.gca() permet d'ajouter des étiquettes aux boîtes

2- Multiples boîtes à moustaches

  • Exemple avec des données numpy

x = [1,2,4,6,4,3,5,4] ; y = [6,5,7,8,4,9,5,6,6]

plt.boxplot(x, positions = [1], widths = 0.6) ;

plt.boxplot(y, positions = [2], widths = 0.6) ; plt.gca().xaxis.set_ticklabels(['X','Y']) ;

plt.show()

  • Première exemple à partir de données pandas

import matplotlib.pyplot as plt

plt.subplot(121)

plt.boxplot(mydata.age)

plt.title("boxplot des âges")

plt.ylabel('Âges en années')

plt.subplot(122)

plt.boxplot(mydata.taille)

plt.ylim(150, 200)

plt.title("boxplot des tailles")

plt.ylabel('Tailles en cm')

plt.show()

On observe un "bug", les marges ne s'adaptent pas automatiquement et les titres des axes peuvent chevaucher le graphique voisin, il faut donc envisager de faire dans la subtilité en faisant des combinaisons graphiques (exemple ci-dessous).

  • Deuxième exemple pandas : mieux adapté

import matplotlib.pyplot as plt

figure = plt.figure(figsize = (10, 10))

plt.gcf().subplots_adjust(left = 0.2, bottom = 0.2,

right = 0.9, top = 0.9,

wspace = 0.5, hspace = 2)

# wspace : joue sur la marge horizontale qui sépare les graphiques

axes = figure.add_subplot(1, 2, 1)

plt.boxplot(mydata.age)

plt.title("boxplot des âges")

plt.ylabel('Âges en années')

axes = figure.add_subplot(1, 2, 2)

plt.boxplot(mydata.taille)

plt.ylim(150, 200)

plt.title("boxplot des tailles")

plt.ylabel('Tailles en cm')

plt.show()

3- Tracer automatiquement des boîtes à moustaches par catégories en utilisant les modules seaborn ou pandas.plotting

  • Avec seaborn

import seaborn as sns

ax = sns.boxplot(y="age", x="sx", data=mydata) ; plt.show()

# Si on inverse x et y, les barres deviennent horizontales

plt.show()

  • Avec pandas

import pandas.plotting

mydata.boxplot(column="taille",by="sx")

plt.show()

Liens externes (pour aller plus loin)

3- Diagramme en camembert en langage python

  • 1- Prenons un jeu de données (une dataframe pandas) - code à copier-coller

sx = ["M"]*5 + ["F"] * 5 + ["M"]

taille = [174,167,170,170,171,177,155,150,176,178,173]

import pandas as pd

mydata = pd.DataFrame({"sx":sx,'taille':taille})


  • Pour pouvoir réaliser le diagramme en camembert de répartitions des filles-garçons, il va falloir les comptabiliser automatiquement

effectif = mydata.sx.value_counts()

import matplotlib.pyplot as plt

plt.pie(effectif,labels=effectif.index)

plt.show()

.value_counts() : réalise automatiquement un comptage des effectifs