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()
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
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
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()
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()
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