ヒストグラムはデータの分布を大雑把に把握するために非常に重要な手段の一つです。ここではNumPy配列であるndarrayの要素をヒストグラムで表示させることでデータを要約する方法を見ていきましょう。
開発環境
- matplotlib 3.3.4
- numpy 1.19.2
- Python 3.7.9
ヒストグラムとは
ヒストグラムとは、与えられた数値の範囲を等間隔に区切ったもの(=階級)を横軸として、その階級の中に含まれる個数(=度数)を縦軸としたグラフです。
例えば小学校のあるクラスのテストの点数が
Aくん:85点、Bくん:68点、Cさん:78点、Dくん:76点、Eさん:88点 ...
のように与えられているときに、次のように点数ごとに区切ってその人数を表すのがヒストグラムです。
ndarrayの要素をヒストグラムで表示させる方法
それではndarrayの要素をヒストグラムで表示させる方法を見ていきましょう。ここでは標準正規分布に従う1000個の要素を持つndarrayの要素をヒストグラムで表示させてみます。
サンプルとして用いるndarrayは次の通りです。
import numpy as np
generator = np.random.default_rng()
rnd_arr = generator.normal(size=1000)
print(rnd_arr.mean(), rnd_arr.var())
0.049113466295874375 0.96922956558611
標準正規分布は平均0、分散1の正規分布ですが、ここで用いるサンプル(rnd_arr)の平均・分散もそれに近い値となっていることが分かります。
なお、乱数の生成については次の記事もご覧ください。
方法1:numpyの関数を用いてヒストグラムを表示させる方法
NumPyのhistogram関数にndarrayを指定することで、その要素のヒストグラムを取得することができます。第2引数(bins引数)で度数を集計する区間の数、もしくはリストでその区間を直接指定します。デフォルトではbinsは10となっているので、要素の値の範囲を10等分して、その個数をカウントしてhistとして返します。また、10等分した区間の境界もbin_edgeとして取得します。
import numpy as np
generator = np.random.default_rng()
rnd_arr = generator.normal(size=1000)
hist, bin_edge = np.histogram(rnd_arr)
print(hist)
print(bin_edge)
[ 5 19 76 143 236 238 181 82 16 4] [-3.27030313 -2.6292511 -1.98819906 -1.34714703 -0.70609499 -0.06504295 0.57600908 1.21706112 1.85811315 2.49916519 3.14021723]
これをグラフで表す場合は、bin_edgeが集計区間の境界を表しているので、histとbin_edgeの要素数が異なることに注意が必要です。bin_edgeをその区間の中央値に変換するためにroll関数を用いて次の処理を加えましょう。
bin_center = ((bin_edge + np.roll(bin_edge, -1))/2)[:-1]
bin_centerとhistが得られたらそれを棒グラフで表せばよいだけなので、matplotlibを用いて棒グラフを作成しましょう。なお、棒グラフの作成方法は次のページもご覧ください。
import numpy as np
import matplotlib.pyplot as plt
generator = np.random.default_rng()
rnd_arr = generator.normal(size=1000)
hist, bin_edge = np.histogram(rnd_arr)
bin_center = ((bin_edge + np.roll(bin_edge, -1))/2)[:-1]
fig, ax = plt.subplots()
ax.bar(bin_center, hist)
plt.show()
これでヒストグラムを可視化することができました。
ただし、この方法は集計区間(bin)の境界をその中央に変換したりする必要があり、ヒストグラムを描くには煩雑な方法となっています。そのため、ヒストグラムを描画するための関数がNumPyではなくmatplotlibに用意されているので、次の「方法2」ではmatplotlibの関数を用いた方法を見ていきましょう。
方法2:matplotlibの関数を用いてヒストグラムを表示させる方法
matplotlibのAxesオブジェクトのhistメソッドにヒストグラムを表示したいndarrayを指定するだけでヒストグラムを表示させることができます。
import numpy as np
import matplotlib.pyplot as plt
generator = np.random.default_rng()
rnd_arr = generator.normal(size=1000)
fig, ax = plt.subplots()
ax.hist(rnd_arr)
plt.show()
デフォルトでは集計区間(bin)の数が10に設定されているので、これで「方法1」と同じグラフを描画することができます。
「方法1」と比較して非常に簡単にヒストグラムを描画することができています。なお、8行目のhistメソッドは戻り値としてそれぞれの集計区間のカウント数や境界を返すので、numpy.histogram関数と同様にそれらを取得することもできます。
なお、pyplotスタイルで描画する場合はpyplotのhist関数を用いるので、以下のようにさらに簡略化することができます。
plt.hist(rnd_arr)
plt.show()
ヒストグラムの値だけを取得する場合は「方法1」のnumpy.histogram関数で十分ですが、グラフ化までする場合は「方法2」の方法を用いましょう。
コメント