Python >> Tutoriel Python >  >> Python Tag >> Matplotlib

Histogramme Matplotlib - Un guide illustré simple

L'histogramme est l'un des tracés les plus importants à connaître. Vous l'utiliserez chaque fois que vous explorerez un jeu de données. C'est le tracé de référence pour tracer une variable.

Dans cet article, vous apprendrez les bases et quelques idées intermédiaires. Vous tracerez des histogrammes comme un pro en un rien de temps en utilisant Python et matplotlib.

Essayez-le vous-même  :Avant de commencer à lire cet article, essayez de tracer vous-même votre premier histogramme dans notre shell Python interactif :

Exercice  :Changez le nombre de points de données à 2000 et la moyenne à 160. Exécutez à nouveau le code et regardez votre nouvel histogramme !

Vous en apprendrez plus sur cet exemple plus tard, mais répondons d'abord à une question très importante :

Qu'est-ce qu'un histogramme ?

Avant de coder quoi que ce soit, nous devons comprendre ce que sont les histogrammes en général. Regardons quelques-uns.

L'histogramme ci-dessus trace la taille de 10 000 femmes américaines. L'axe des abscisses est la hauteur en cm. Nous avons regroupé les hauteurs en plages de 2 cm de large, c'est-à-dire 140 cm-142 cm, 142 cm-144 cm, etc. et nous appelons ces plages bins .

Puisque quelqu'un peut être n'importe quel hauteur, on dit que la hauteur est une variable continue. Il est numérique, ordonné et il y a un nombre illimité de valeurs. En théorie, vous ne pouvez tracer que des variables continues à l'aide d'un histogramme. Mais si vous tracez des variables numériques discrètes, par ex. les résultats d'un lancer de dé, il est plus facile de coder un histogramme qu'un graphique à barres.

Notez qu'il n'y a pas d'espace entre les bacs. Les lignes blanches sont purement esthétiques. De plus, les bacs sont des intervalles semi-ouverts. Le bac 140cm-142cm est [140, 142). Cela signifie qu'il comprend 140 cm et exclut 142 cm. La seule exception est le casier final qui est inclusif des deux côtés.

L'axe des ordonnées est le nombre total de fois où nous avons observé une hauteur particulière. Nous appelons cela la fréquence .

Les histogrammes peuvent également afficher la probabilité sur l'axe des ordonnées. La somme de la surface totale sous un histogramme est 1. Nous voyons que la probabilité d'une femme américaine mesurer entre 158 et 160 cm représente un peu plus de 0,05. Alors, peut-on dire que 5 % des femmes américaines que nous avons mesurées ont cette taille ? Malheureusement non. Pour obtenir la probabilité qu'une valeur se trouve dans un bac particulier, nous calculons la surface de la barre en utilisant bin_width x height . Dans ce cas, c'est 2 cm x 0,05 =0,1. Ainsi, 10 % des femmes mesurées mesurent entre 158 et 160 cm.

Modifions la taille du bac à 1 cm.

Notez que la forme du graphique est similaire et que les probabilités sur l'axe des ordonnées sont les mêmes.

Il y a maintenant 2 barres dans la plage 158cm-160cm. Chaque barre a une hauteur d'environ 0,05. Donc la probabilité d'être dans chaque barre est :

  • 158cm-159cm :1 x 0,05 =0,05
  • 159cm-160cmL 1 x 0,05 =0,05

Par conséquent, la probabilité combinée est de 0,05 + 0,05 =0,1. C'est la même chose que ci-dessus.

Il vaut mieux ne pas se fier aux probabilités sur l'axe des ordonnées. Ils seront toujours "corrects", mais la probabilité réelle d'être dans un bac particulier est bin_width x hauteur .

Cela devient plus déroutant si nous utilisons des bacs de taille variable.

La probabilité du casier 160cm-180cm est de 0,03 mais la probabilité réelle d'être dans ce casier est de 20 x 0,03 =0,6.

Ceci est un histogramme "légal". Mais il est préférable d'utiliser des bacs de même taille. Pourquoi ?

Les histogrammes nous montrent la distribution de nos données en un coup d'œil. C'est incroyablement précieux. Les scientifiques ont étudié de nombreuses distributions de manière approfondie. Si nos données correspondent à l'une de ces distributions, nous en savons instantanément beaucoup à ce sujet. La forme des histogrammes ci-dessus est la distribution normale et vous le verrez partout.

Résumons ce que nous avons appris sur les histogrammes. Si vous comprenez ces points, les tracer sera un jeu d'enfant.

Un histogramme est :

  • Un tracé d'une variable continue, par ex. hauteur en cm
    • Nous pouvons facilement voir la distribution
  • axe des abscisses – données continues regroupées en groupes
    • Pas d'espace vide entre les bacs
    • Les bacs ne doivent pas nécessairement avoir la même largeur (mais c'est généralement le cas)
  • Axe des ordonnées :fréquence ou probabilité
  • Pour calculer la probabilité qu'une valeur se trouve dans un bac, faites bin_width x probabilité . Ne vous fiez pas aux probabilités de l'axe y !

Maintenant que vous connaissez la théorie derrière les histogrammes, traçons-les en Python avec matplotlib.pyplot.

Histogramme Matplotlib - Tracé de base

Tout d'abord, nous avons besoin de quelques données.

Je suis allé sur ce site pour connaître la taille moyenne et l'écart type des femmes américaines. Il est de notoriété publique que la hauteur est normalement distribuée. J'ai donc utilisé le module aléatoire de Python pour créer 10 000 échantillons

import random

# data obtained online
mean = 162
std = 7.1

# set seed so we can reproduce our results
random.seed(1)

# use list comprehension to generate 10,000 samples
us_female_heights = [random.normalvariate(mean, std) for i in range(10000)]

Étape facultative :les tracés par défaut de Seaborn sont meilleurs que ceux de matplotlib, alors utilisons-les.

import seaborn as sns

sns.set()

L'histogramme le plus basique dans matplotlib.pyplot est vraiment facile à faire

import matplotlib.pyplot as plt

plt.hist(us_female_heights)
plt.show()

Pas mal pour les réglages de base. La forme générale est nette. Nous voyons que la plupart des données sont concentrées au milieu - 155cm-170cm. Nous pouvons également voir les comptes de fréquence.

Parce que nous connaissons nos données, nous savons que l'axe des x est la taille en cm et l'axe des y est la fréquence. Mais vous devez toujours étiquetez vos haches. Les autres ne savent pas ce que ce graphique montre. L'ajout d'étiquettes rend cela clair. Écrivez ces trois lignes de code pour donner au tracé un titre et des étiquettes d'axe.

plt.hist(us_female_heights)
plt.title('Height of 10,000 US Females')
plt.xlabel('Height (cm)')
plt.ylabel('Frequency')
plt.show()

Bien mieux !

Pour économiser de l'espace, nous n'inclurons pas les lignes de code qui étiquettent les axes. Mais assurez-vous de les inclure.

C'est une bonne idée d'utiliser d'abord les paramètres de base. Cela vous donne un aperçu général des données. Commençons maintenant à modifier notre histogramme pour extraire plus d'informations.

Histogramme Matplotlib - Tracé de densité de base

Connaître la fréquence des observations est agréable. Mais si nous avons un milliard d'échantillons, il devient difficile de lire l'axe des ordonnées. Nous préférons donc la probabilité.

En mathématiques, une fonction de densité de probabilité renvoie la probabilité d'une variable continue. Si la variable est discrète, elle s'appelle une fonction de masse de probabilité . J'ai trouvé cette terminologie très confuse quand je l'ai entendue pour la première fois. Découvrez cette incroyable réponse Stack Exchange pour la comprendre plus en détail.

Un histogramme avec probabilité sur l'axe des ordonnées est donc une fonction de densité de probabilité. Nous avons donc défini le mot-clé de densité dans plt.hist() à Vrai .

plt.hist(us_female_heights, density=True)
plt.show()

Il est très facile de basculer entre les tracés de fréquence et de densité. Comme les diagrammes de densité sont plus utiles et plus faciles à lire, nous garderons density=True à partir de maintenant.

Examinons plus en détail nos données en modifiant la taille de la corbeille.

Bacs d'histogramme Matplotlib

Décider du nombre optimal de bacs pour un histogramme est un sujet très débattu. Vous pouvez affecter la façon dont vos données sont perçues en modifiant cela. Ainsi, de nombreux mathématiciens ont créé des formules pour optimiser la taille des bacs.

On modifie le nombre de bins à l'aide des bins mot clé en plt.hist( ). Il accepte un entier, une liste ou une chaîne.

Bacs d'entiers

Pour spécifier un nombre particulier de bacs, transmettez un entier à l'argument du mot-clé bins.

# 5 bins
plt.hist(us_female_heights, density=True, bins=5)
plt.show()

La définition de bacs sur une valeur très faible vous donne un aperçu général des données.

# 40 bins
plt.hist(us_female_heights, density=True, bins=40)
plt.show()

La définition de bacs sur un nombre élevé vous donne une vue plus détaillée des données.

Même si nous définissons bins=40 , vous ne pouvez pas voir 40 bacs sur le tracé. C'est parce que les bacs restants sont trop petits pour être vus.

>>> min(us_female_heights)
131.67453350862354

>>> max(us_female_heights)
191.1310915602654

Après avoir vérifié les valeurs min/max de nos données, nous voyons qu'il doit y avoir des bacs jusqu'à 131 et jusqu'à 192. Ceux-ci ne contiennent qu'un petit nombre d'échantillons, leur probabilité est donc très faible. Nous ne pouvons donc pas les voir dans l'intrigue.

Définir les bacs sur une valeur entière est un bon raccourci, mais nous ne le recommandons pas. Pourquoi? Parce que matplotlib ne choisit jamais une belle largeur de bac. Sur le bins=5 graphique, la plus grande classe commence à ~155 et se termine à ~167. Cela rend notre histogramme difficile à lire si nous voulons réellement extraire des informations.

Il est préférable de régler vous-même les bords du bac. Pour ce faire, nous transmettons à bins une liste ou un tableau NumPy. Si vous avez besoin d'un rappel sur la bibliothèque NumPy, consultez notre tutoriel NumPy complet qui vous apprend tout ce dont vous avez besoin pour démarrer avec la science des données.

Liste des bacs

Une fois que nous avons une idée de nos données, nous pouvons définir les bacs manuellement. Nous, les humains, aimons travailler avec des nombres entiers. Nous aimerions donc que nos bords de bac soient également des nombres entiers.

Une situation idéale commencerait à 130, se terminerait à 192 et monterait par pas de 2 cm

ideal_bins = [130, 132, 134, ..., 192]

Nous utilisons la fonction np.arange pour créer ceci.

ideal_bins = np.arange(130, 194, 2)

La valeur maximale est 191,1… nous voulons donc que notre dernier bord de bac soit 192 (rappelez-vous que la valeur d'arrêt est exclusive dans np.arange ). Pour une explication complète de np.arange, consultez notre article.

Passons ceci à plt.hist() :

plt.hist(us_female_heights, density=True, bins=ideal_bins)
plt.show()

Il est beaucoup plus facile de lire cet histogramme car nous savons où se trouve chaque bord de bac.

Nous pouvons le rendre plus détaillé en définissant la taille du pas sur 1 dans np.arange() .

plt.hist(us_female_heights, density=True, bins=np.arange(130, 193, 1))
plt.show()

Agréable! Nous avons maintenant un aperçu encore plus détaillé.

Pour définir des bacs de différentes tailles, passez une liste/un tableau avec les bords de bac souhaités.

my_bin_edges = [130, 140, 142, 155, 158, 160, 180, 190]
plt.hist(us_female_heights, density=True, bins=my_bin_edges)
plt.show()

La plupart du temps, vous souhaiterez tracer des histogrammes avec une largeur de bac uniforme. Mais il est bon de savoir comment les changer en ce que vous voulez.

Fichiers à cordes

Vous pouvez utiliser plusieurs formules mathématiques pour calculer la taille de bac optimale. Nous allons lister les options qui s'offrent à vous. Si vous souhaitez une explication plus détaillée de chacun, veuillez lire la documentation numpy. Chacun produit une bonne sortie et ils sont tous meilleurs que les paramètres par défaut de matplotlib.

  • auto
  • fd – Estimateur de Freedman Diaconis
  • doane
  • scott
  • pierre
  • riz
  • poussées
  • carré

Voici nos données en utilisant bins='auto'.

Voici notre intrigue en utilisant 'scott'.

Nous ne plongerons pas dans les mathématiques derrière eux ou leurs avantages et inconvénients. Veuillez les expérimenter dans votre IDE. Passez chaque option à l'argument bins pour voir les différences.

Une grande partie de l'apprentissage consiste à essayer de nouvelles choses. Ainsi, pour vos premiers projets d'analyse de données, tracez vos données d'autant de façons que possible. Au fil du temps, vous aurez une « idée » de la meilleure méthode.

Résumé

Nous avons couvert les choses les plus importantes que vous devez savoir pour tracer de superbes histogrammes.

Vous comprenez maintenant ce que sont les histogrammes et pourquoi ils sont importants . Vous pouvez faire des tracés de densité qui montrent la probabilité sur l'axe des ordonnées. Et vous pouvez modifier la taille de la corbeille à tout ce que vous voulez pour mieux comprendre vos données.

Nous pouvons faire beaucoup plus avec les histogrammes. Par exemple, tracer plusieurs histogrammes les uns sur les autres, créer des tracés horizontaux ou cumulatifs. Mais nous les laisserons pour un autre article.