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'échantillonHistogramme 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