web-dev-qa-db-fra.com

Comment choisir les bacs dans l'histogramme matplotlib

Quelqu'un peut-il m'expliquer ce que sont les "bacs" dans l'histogramme (fonction matplotlib hist )? Et en supposant que je doive tracer la fonction de densité de probabilité de certaines données, comment les bacs que je choisis influencent-ils cela? et comment puis-je les choisir? (J'ai déjà lu à leur sujet dans les bibliothèques matplotlib.pyplot.hist et numpy.histogram mais je n'ai pas eu l'idée)

22
H.H

Le paramètre bins vous indique le nombre de bacs dans lesquels vos données seront divisées. Vous pouvez le spécifier sous la forme d'un entier ou d'une liste d'arêtes bin.

Par exemple, ici nous demandons 20 bacs:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000)
plt.hist(x, bins=20)

enter image description here

Et ici nous demandons des bords de bacs aux emplacements [-4, -3, -2 ... 3, 4].

plt.hist(x, bins=range(-4, 5))

enter image description here

Votre question sur la manière de choisir le "meilleur" nombre de bacs est intéressante. Il existe en fait une littérature assez vaste sur le sujet. Certaines règles empiriques couramment utilisées ont été proposées (par exemple, la règle de Freedman-Diaconis , règle de Sturges, règle de Scott, règle de la racine carrée , etc. ) dont chacun a ses forces et ses faiblesses.

Si vous voulez une implémentation Nice Python d’une variété de ces règles d’histogramme à réglage automatique, vous pouvez vérifier la fonctionnalité de l’histogramme dans la dernière version du paquet AstroPy, décrit ici ..__ plt.hist, mais vous permet d'utiliser une syntaxe telle que, par exemple hist(x, bins='freedman') pour choisir les bacs via la règle Freedman-Diaconis mentionnée ci-dessus.

Mon favori personnel est "Bayesian Blocks" (bins="blocks"), qui résout pour un binning optimal avec des largeurs de bacs inégales. Vous pouvez en lire un peu plus à ce sujet ici .


Édition, avril 2017: avec matplotlib version 2.0 ou ultérieure et numpy version 1.11 ou ultérieure, vous pouvez désormais spécifier des emplacements déterminés automatiquement, directement dans matplotlib, en spécifiant, par exemple: bins='auto'. Ceci utilise au maximum le choix de bin Sturges et Freedman-Diaconis. Vous pouvez en savoir plus sur les options dans la numpy.histogram docs .

32
jakevdp

Les bacs correspondent au nombre d'intervalles dans lesquels vous souhaitez diviser toutes vos données, afin qu'ils puissent être affichés sous forme de barres sur un histogramme. Une méthode simple pour déterminer le nombre de casiers appropriés consiste à prendre la racine carrée du nombre total de valeurs de votre distribution.

4
Oliver Angelil

Vous avez raison de penser que le nombre de bacs a un impact significatif sur l'approximation de la vraie distribution sous-jacente. Je n'ai pas lu le document original moi-même, mais selon Scott 1979 , une bonne règle à suivre est d'utiliser: 

R (n ^ (1/3))/(3.49σ)

où 

  • R est la plage de données (dans votre cas, R = 3 - (- 3) = 6), 

  • n est le nombre d'échantillons, 

  • σ est votre écart type. 

0
idnavid

Pour compléter jakes répondre , vous pouvez utiliser numpy.histogram_bin_edges si vous souhaitez simplement calculer les bords des bacs optimaux, sans utiliser l'histogramme. histogram_bin_edges est une fonction spécialement conçue pour le calcul optimal des bords des bacs. Vous pouvez choisir sept algorithmes différents pour l'optimisation. 

0
gerrit