ヒストグラムと密度

データをヒストグラム化するときにつまづいたのでメモ。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)

data = np.random.randn(1000)
plt.hist(data, bins=10, color='red' , alpha=0.5)
plt.hist(data, bins=30, color='blue', alpha=0.5)
plt.show()

f:id:yubais:20180908171250p:plain

matplotlib のヒストグラムはデフォルトでは個数を表示する。このため bins の数を増やすと、ひとつの bin あたりの個数が減るため、全体の面積が減少する。これは当たり前のことで、解決するためには density=True にする。

f:id:yubais:20180908171550p:plain

まあこれは当たり前なんだが、先日わけあってヒストグラムの幅をランダムにするということをしたところ、density を使わないと同じデータにも関わらず全く概形の異なるヒストグラムができてしまうことに気づいた。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1)

data = np.random.randn(1000)

bins = np.random.random(31) * 6 - 3
bins.sort()
print(bins)

plt.hist(data, bins=bins, color='red' , alpha=0.5, density=True)
plt.hist(data, bins=30,   color='blue', alpha=0.5, density=True)
plt.show()

f:id:yubais:20180908171854p:plain f:id:yubais:20180908171933p:plain

あるデータが理論的な確率分布とどれだけ一致するかを調べる時は density を使わないといけない、というきわめて初歩的なミスを犯した。