【NumPy入門 np.histogram】ヒストグラムを作成する方法とplt.hist

この記事ではnp.ndarrayからヒストグラムを作成する関数np.histogramを紹介します。

データ解析・機械学習において、データの全体像を俯瞰するのは非常に大切なステップです。

ヒストグラムはデータの全体像を見るときに重要なツールなので、是非覚えて使いこなしましょう。

【基本】np.histogramでヒストグラムを作成
【基本】plt.histでヒストグラムをプロット
【発展】np.histogram/plt.histでbin数の変更やヒストグラムの標準化

目次

np.histogramの使い方

※この記事のコードは、jupyter notebookjuputer labを使って書かれています。
コードを試すときは是非これらやIPythonを使ってみてください。

# コード In [1]:
import numpy as np
import matplotlib.pyplot as plt

基本的なnp.histogramの使い方

np.histogramは、配列からhistogramを作成する関数です。

この関数はbinごとの要素数(度数)bin(階級)の境界の値を配列で返します。

実際にこの関数を使って出力値を確認してみましょう。

# コード In [2]:
# 標準正規分布に従う乱数を1000個生成してaに代入
a = np.random.randn(1000)

# histgramとbinの境界値をa_histとa_binsに代入
a_hist, a_bins = np.histogram(a)

print("オリジナルの配列a (aの先頭100個の要素だけprint):\n", a[:100], "\n")
print("aの度数:\n", a_hist, "\n")
print("a_histのshape:\n", a_hist.shape, "\n")
print("aの階級を区切る値:\n", a_bins, "\n")
print("a_binsのshape:\n", a_bins.shape, "\n")
# 出力結果 [2]:
オリジナルの配列a (aの先頭100個の要素だけprint):
 [ 1.40359326 -0.09107017 -0.70222454 -0.69154174  1.00746289 -1.29444826
 -0.4051456   0.27589838 -0.19342482 -1.03965977  0.29958986  0.36877692
  0.28560059  0.06115003 -0.52473576 -0.05330536  0.2121698   1.08919852
 -0.99183916  0.989039   -1.82295716  0.211349    0.38667401  0.71567032
 -0.35889123  0.25584366 -1.6000845  -1.21105517  2.14720227  0.21357017
 -0.40273383  1.10581592  1.65872923  0.02276412 -0.21102715 -1.06041993
 -1.39724982  0.37385592 -0.00544005  1.02367865 -0.96347618  1.50610189
 -0.27578184 -0.53272795 -0.330013   -1.02940385  0.89334504 -1.2223676
 -0.09373311 -0.29055041 -0.08257971 -0.76857742 -0.68267469  0.85012477
  1.25693121  1.59618945 -0.41102347 -0.29874702  0.22457684 -0.4659283
  0.32884514  0.12333912 -1.08921716 -2.18078513  0.91119611  0.26030972
 -1.28055916 -1.67538201  0.12342149 -0.38635714  0.43704228 -0.58893319
 -0.2152168   1.37031416 -0.67441627  0.33147404 -1.80944471 -0.36292766
 -1.2828725   1.9418853  -0.72268891  0.05362563  1.38053317 -1.23291616
  0.43747315 -1.48471547 -0.22619044 -0.13380173 -0.20752616 -0.10938818
  0.52836161 -0.35618303 -1.32338092 -0.10313023  0.74400153  1.13902877
 -1.30455422 -0.38157293  0.67187669  1.59665266]

aの度数:
 [ 11  55 117 176 247 193 119  61  19   2]

a_histのshape:
 (10,)

aの階級を区切る値:
 [-2.65685307 -2.07874915 -1.50064522 -0.9225413  -0.34443738  0.23366654
  0.81177046  1.38987438  1.9679783   2.54608223  3.12418615]

a_binsのshape:
 (11,)

ヒストグラムをプロット

今作ったhistogramをグラフにしてみましょう。

a_binsにはbinの境界の値(bin同士の区切り目)が入っているので、このままだとa_binsとa_histの要素数が違います

それぞれのbin毎に真ん中の値を計算してX軸の値に使います。

# コード In [3]:
X = []
for i in range(1, len(a_bins)):
    X.append((a_bins[i-1]+a_bins[i])/2)
plt.bar(X,a_hist)
# 出力結果 Out [3]:

matplotlibでもhisgogramが作れる

plt.histの基本的な使い方

実はhistgramはmatplotlibの関数にもあります

plt.hist関数はnp.histogramと同じものを作れるだけでなく、グラフまで作成してくれるので、試してみましょう。

# コード In [4]:
(a_hist2, a_bins2, _) = plt.hist(a)

実際に、numpyで作ったものとmatplotlibで作ったもので、binの境界の値が同じか確認してみましょう。

# コード In [5]:
a_bins==a_bins2
# 出力結果 Out [5]:
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True])

同じ値になっていることがわかりますね。

ヒストグラムはグラフにしたほうがわかりやすいので、ここからはmatplotlibのhist関数を使って紹介していきます。

plt.histで紹介して行きますが、np.histogramでもグラフが作れないだけで同じことができますよ!

グラフが必要ならmatplotlib、いらないのならNumPyを使うといいでしょう。

bins(階級)の数を決める

ヒストグラムの階級数を変えるのは簡単です。binsパラメータに適当な数字を渡しましょう。

指定しないとbins=10になっています。

試しにbins=5にしてみましょう。

# コード In [6]:
#a_hist2, a_bins2 = np.histogram(a, bins=5)
(a_hist2, a_bins2, _) = plt.hist(a, bins=5)

print("aの度数:\n", a_hist2, "\n")
print("a_hist2のshape:\n", a_hist2.shape, "\n")
print("aの階級を区切る値:\n", a_bins2, "\n")
print("a_bins2のshape:\n", a_bins2.shape, "\n")
# 出力結果 [6]:
aの度数:
 [ 66. 293. 440. 180.  21.]

a_hist2のshape:
 (5,)

aの階級を区切る値:
 [-2.65685307 -1.50064522 -0.34443738  0.81177046  1.9679783   3.12418615]

a_bins2のshape:
 (6,)

ヒストグラムを標準化する

ヒストグラムの合計面積が1になるように標準化する必要がある時は、densityパラメータをTrueにします。

「これは縦軸を確率分布関数と思って規格化するオプション※」です。

※ 参考

# コード In [7]:
#a_hist3, a_bins3 = np.histogram(a, density=True)
(a_hist3, a_bins3, _) = plt.hist(a, density=True)

print("aの度数:\n", a_hist3, "\n")
print("a_hist3のshape:\n", a_hist3.shape, "\n")
print("aの階級を区切る値:\n", a_bins3, "\n")
print("a_bins3のshape:\n", a_bins3.shape, "\n")
# 出力結果 [7]:
aの度数:
 [0.01902772 0.0951386  0.20238576 0.30444353 0.42725882 0.33385001
 0.20584534 0.10551736 0.03286606 0.00345959]

a_hist3のshape:
 (10,)

aの階級を区切る値:
 [-2.65685307 -2.07874915 -1.50064522 -0.9225413  -0.34443738  0.23366654
  0.81177046  1.38987438  1.9679783   2.54608223  3.12418615]

a_bins3のshape:
 (11,)

まとめ

この記事ではNumPyを使ったヒストグラムの作り方を紹介し、同様の機能をもったmatplotlibの関数についても紹介しました。

データセットを読み込んだら、まずは特徴ごとにヒストグラムを作成してみてください。

データの分布の様子を確認することで、その特性や分析の方策を立てるのに役立つはずですよ!

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次