web-dev-qa-db-ja.com

matplotlibヒストグラムでビンを選択する方法

誰かがヒストグラムの「ビン」とは何かを説明できますか( matplotlib hist 関数)?そして、いくつかのデータの確率密度関数をプロットする必要があると仮定すると、選択したビンはどのように影響しますか?そして、どのようにそれらを選択しますか? (私はすでに matplotlib.pyplot.hist および numpy.histogram ライブラリでそれらについて読んでいますが、私はその考えを知りませんでした)

30
H.H

binsパラメーターは、データが分割されるビンの数を示します。整数またはビンエッジのリストとして指定できます。

たとえば、ここでは20個のビンを要求します。

import numpy as np
import matplotlib.pyplot as plt

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

enter image description here

そして、ここでは、[-4、-3、-2 ... 3、4]の位置でビンのエッジを要求します。

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

enter image description here

「最適な」数のビンを選択する方法についてのあなたの質問は興味深いものであり、実際にはこの主題に関するかなり膨大な文献があります。提案されている一般的な経験則がいくつかあります(例 Freedman-Diaconis RuleSturges 'Rule、Scott's Rule、Square-root rule 、など)それぞれに長所と短所があります。

これらのさまざまな自動チューニングヒストグラムルールのNice Python実装が必要な場合は、AstroPyパッケージの最新バージョン ここで説明 のヒストグラム機能をチェックしてください。これはplt.histと同じように機能しますが、次のような構文を使用できます。 hist(x, bins='freedman')上記のFreedman-Diaconisルールを介してビンを選択するため。

私のお気に入りは「ベイジアンブロック」(bins="blocks")で、unqualビン幅で最適なビニングを解決します。それについてもう少し読むことができます here


編集、2017年4月:matplotlibバージョン2.0以降およびnumpyバージョン1.11以降では、自動的に決定されたビンをmatplotlibで直接指定できるようになりました。 bins='auto'。これは、SturgesとFreedman-Diaconisのビン選択の最大値を使用します。 numpy.histogram docs でオプションの詳細を読むことができます。

43
jakevdp

ビンとは、ヒストグラム上のバーとして表示できるように、すべてのデータを分割する間隔の数です。適切なビンの数を計算する簡単な方法は、分布内の値の総数の平方根を取ることです。

4
Oliver Angelil

ビンの数が、実際の基礎となる分布の近似に大きな影響を与えることを期待するのは正しいことです。私は元の論文を自分で読んでいませんが、 Scott 1979 によれば、良い経験則は以下を使用することです:

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

どこ

  • Rはデータの範囲です(あなたの場合R = 3-(-3)= 6))、

  • nはサンプル数、

  • σは標準偏差です。

1
idnavid

jakes answer を補完するために、実際にヒストグラムを実行せずに最適なビンエッジを計算するだけの場合は numpy.histogram_bin_edges を使用できます。 histogram_bin_edgesは、ビンのエッジを最適に計算するために特別に設計された関数です。最適化のために7つの異なるアルゴリズムを選択できます。

0
gerrit