2015-11-01 10 views

risposta

2

I bin sono il numero di intervalli in cui si desidera suddividere tutti i dati in modo che possano essere visualizzati come barre su un istogramma. Un metodo semplice per lavorare su quanti contenitori sono adatti è prendere la radice quadrata del numero totale di valori nella distribuzione.

+0

Grazie mille –

18

Il parametro bins indica il numero di contenitori in cui verranno suddivisi i dati. È possibile specificarlo come numero intero o come elenco di bordi del contenitore.

Per esempio, qui ci chiedono 20 bidoni:

import numpy as np 
import matplotlib.pyplot as plt 

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

enter image description here

E qui chiediamo bin bordi nei punti [-4, -3, -2 ... 3, 4].

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

enter image description here

La tua domanda su come scegliere il "miglior" numero di bidoni è interessante, e c'è in realtà un abbastanza vasta letteratura sull'argomento. Ci sono alcune regole del pollice comunemente usate che sono state proposte (ad esempio lo Freedman-Diaconis Rule, Sturges' Rule, Scott's Rule, the Square-root rule, ecc.) Ognuna delle quali ha i suoi punti di forza e di debolezza.

Se si desidera una buona implementazione di Python di una varietà di queste regole dell'istogramma di autotuning, è possibile controllare la funzionalità dell'istogramma nell'ultima versione del pacchetto AstroPy, described here. Funziona esattamente come plt.hist, ma consente di utilizzare la sintassi come, ad es. hist(x, bins='freedman') per la scelta di contenitori tramite la regola Freedman-Diaconis sopra menzionata.

Il mio preferito è "Blocchi Bayesiani" (bins="blocks"), che risolve per binning ottimale con diseguali larghezze bin. Puoi leggere un po 'di più su quello here.


Modifica, aprile 2017: con matplotlib versione 2.0 o successiva e la versione NumPy 1.11 o successiva, è possibile ora specificare bidoni automaticamente-determinati direttamente in matplotlib, specificando, ad esempio, bins='auto'. Questo utilizza il massimo della scelta bin Sturges e Freedman-Diaconis. Puoi leggere ulteriori informazioni sulle opzioni nello numpy.histogram docs.

+0

Grazie mille! I miei dati sono circa 100 migliaia di punti e ho bisogno di disegnarne una funzione di densità di probabilità. Poiché i miei dati hanno molti piccoli numeri, ho usato questo: bin_size = 0.1; min_edge = -5 .; max_edge = 5. N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1 bins = np.linspace (min_edge, max_edge, Nplus1) –

+0

Sarebbe davvero bello avere il binning automatico non uguale anche in Matplotlib o NumPy o SciPy o Pandas o in uno degli altri pacchetti standard di data science. – Konstantin

0

Hai ragione nel prevedere che il numero di contenitori abbia un impatto significativo sull'approssimazione della vera distribuzione sottostante. Non ho letto il giornale originale me stesso, ma secondo Scott 1979, una buona regola è quello di utilizzare:

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

dove

  • R è l'intervallo di dati (nel caso R = 3 - (- 3) = 6),

  • n è il numero di campioni,

  • σ è la tua deviazione standard.

Problemi correlati