Python でヒストグラムを作成していますが、ビンのエッジを特定の値のパーセンテージ (5-10%) にしたいと考えています。ビンの境界にギャップを残さず、ビンの境界計算のためにいくつかの値を事前に設定する必要がないように、これを行う最善の方法は何でしょうか?
2 に答える
一般に、 numpy.histogramなどの事前定義されたツールを使用してヒストグラムを作成すると便利ですが、新しく投稿されたコメント (matplotlib を使用していることを示唆) もまったく問題ありません。どちらの方法でも、一定数の自動決定された同じ幅のビンを作成できます...
import numpy
data = [0,1,1,1,1,1,1,2,3,3]
hist, edges = numpy.histogram( data , bins = 10)
>>> hist
array([1, 0, 0, 6, 0, 0, 1, 0, 0, 2])
>>> edges
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1, 2.4, 2.7, 3. ])
...または、定義済みのビン (幅が異なる可能性があります) が必要な奇妙なケースでは、ビンのエッジを自分で指定できます (これがどのように機能するかについては、ドキュメントを参照してください)。
>>> hist, edges = numpy.histogram( data , bins = [0,.5,1., 1.5,2,3])
>>> hist
array([1, 0, 6, 0, 3])
>>> edges
array([ 0. , 0.5, 1. , 1.5, 2. , 3. ])
>>>
ただし、大幅に異なるビンサイズの使用には注意してください。多くの場合、この種の粗視化は、比較しようとしている数値間の関係を歪める可能性があります。
あなたの値は+/- 10%の境界ですか?
preferred_bin_centers = [0,1,2,3]
bin_pairs = [ ( 0.9* v , 1.1*v ) for v in preferred_bin_centers ]
>>> [[0.0, 0.0], [0.9, 1.1], [1.8, 2.2], [2.7, 3.3000000000000003]]
または、numpy.histogram で使用できるリスト形式にフラット化されます...
bin_edges = sum( [ [ 0.9* v , 1.1*v ] for v in values ] , [] )
>>> [0.0, 0.0, 0.9, 1.1, 1.8, 2.2, 2.7, 3.3000000000000003]
(上記のリストの最初の 2 つの項目から、ビンの中心の 1 つが 0 の場合、このコードがビンのエッジを混乱させることに注意してください。注意すべき点の例として、これを残しました)
ちなみに、上記で定義したビンのエッジは、目的の範囲外の中間ビンも作成します。たとえば、アイテムを 1、2、および 3 の +/- 10% 以内に分類すると、本質的に、2.5 のような数値が行く。目的のビンの間に値が存在する場合は、それに応じてカットオフまたは視覚化を調整することができます。
多分私はあなたの質問を単純化しすぎていますか?
def bins(data, nbins):
range = max(data) - min(data)
binsize = range / float(nbins)
bins = [x * binsize for x in range(nbins)]