Les histogrammes en Python avec pandas

Hello, petit article pour montrer la génération d’histogrammes avec en Python avec pandas et matplotlib.

Avant tout il faut savoir les histogrammes sont intéressants pour visualiser la distribution d’une variable dans un dataset parce que ça aide à identifier des tendances (par exemple).

Trouvons un exemple sur wiki :

Source : wiki

Normalement on a les données sous cette forme, à savoir un tableau. On peut donc plus ou moins identifier le min, le max, le nombre total d’éléments … on pourrait même imaginer avoir la moyenne. MAIS c’est difficile d’analyser avec un tableau. C’est pas visuel. Ça requiert plus d’effort.

C’est à ce moment qu’intervient un histogramme.

Source : wiki

Il permet de représenter visuellement cette information et d’un coup, comme par magie, on identifie qu’il y a plusieurs groupes de valeurs, qu’il y a une baisse à partir d’un certain poids, etc.

Génération d’histogrammes depuis une Serie

Commençons par la génération d’un histogramme depuis une Serie et on verra ensuite depuis un DataFrame.

Pour rappel, pour la lib pandas en Python, une Serie est une structure de données à une dimension. Comme une liste. Tandis qu’un DataFrame c’est deux dimensions. Donc chaque colonne d’un DataFrame peut être convertie en Serie.

Dans sa forme la plus simple un histogramme avec pandas tient en 3 lignes :

data = np.array([4,50,100,200])
df = pd.Series(data)
df.hist()

Premièrement je crée les données. Puis je crée une Serie pandas que j’initialise avec les données. Puis je crée l’histogramme avec pandas.

Pour avoir une meilleure idée de ce que ça peut donner, on peut générer la série aléatoirement

data = np.random.randn(500)

Et si je veux soigner l’affichage :

df.hist(grid=False)

Ce paramètre est utile lorsqu’on souhaite utiliser le graphe dans une présentation.

Ensuite il y a un truc chiant parce que le cran, c’est-à-dire le nombre de bâtonnets que le graphe va afficher est paramétré à 10 par défaut. Donc s’il y a peu de valeurs, la barres seront épaisses et ça fausse l’interprétation. On ne sait pas trop combien vaut la barre. On peut ajuster l’intervalle avec le param bins :

df.hist(bins=500)

Et on peut donner aussi les limites des intervalles explicitement plutôt qu’un nombre d’intervalles :

pyplot.hist(x, bins = range(11))

Génération d’histogrammes depuis un DataFrame

Maintenant si j’utilise un DataFrame plutôt qu’une Serie, c’est à dire que s’il y a plusieurs colonnes dans mon tableau :

df = pd.DataFrame(np.array([[0, 10, 20],
                             [100, 200, 300],
                             [750, 700, 800]]),
                   columns=['2001', '2002', '2003'])
df.hist()

Pandas génère un graphe par colonne. Car le but d’un histogramme est de visualiser une Serie. On verra après comment s’en sortir lorsqu’il y a plusieurs Series.

On peut grouper les résultats via le paramètre by :

df.hist(by='2002')

De cette manière je peux analyser les données pour une colonne spécifique.

Bon le problème c’est que ce graphe reste non valide donc non présentable, il manque des informations.

Génération d’histogrammes avec matplotlib

Cette lib est vraiment orientée graphe.

Pas de grande différence, toujours les mêmes étapes dans la création du graphe. Si ce n’est d’ajouter l’import adéquat.

import matplotlib.pyplot as plt
data = np.random.randn(500)
plt.hist(data, bins=100)
plt.show()

L’avantage de cette lib est qu’elle nous permet de labelliser les axes, d’ajouter un titre, etc.

plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.title('Number of something')

Maintenant imaginons qu’on ait deux Series, jouons avec les params supplémentaires.

kwargs = dict(histtype='bar', alpha=0.3)

data = np.random.randn(500)
df = pd.Series(data)
df.hist(grid=False)

data = np.random.randn(500)
df = pd.Series(data)
df.hist(grid=False)

Ce bricolage n’est pas beaucoup mieux en fait.

Le problème fondamental de notre histogramme est qu’il ne permet pas d’afficher plus d’une distribution sur un axe.

Si on a plusieurs distribution, on parle de DataFrame et pour les affichages des tableaux multidimensionnels on utilise un hist2D.

Génération d’histogrammes 2D

df2 = pd.DataFrame(np.array([[0, 100, 200],
                             [10, 120, 220],
                             [20, 130, 240]]),
                   columns=['2001', '2002', '2003'])
plt.hist2d(df2.pop('2001'), df2.pop('2002'), cmap='hot')

Cet hist 2D va colorier les zones où il y a des données. De cette manière je peux représenter en un graphe plusieurs Series.

Pour récapituler

On a vu l’affichage d’un graphe de manière basique avec pandas. Que ce soir une Serie ou un DataFrame. Mais pandas n’est pas suffisant, matplotlib apporte des fonctionnalités supplémentaires pour avoir un graphe homologué.

En revanche un hist permet d’afficher une série sur un axe. Donc il existe des histogramme 2D.