この記事ではnp.ndarrayからヒストグラムを作成する関数、np.histogramを紹介します。
データ解析・機械学習において、データの全体像を俯瞰するのは非常に大切なステップです。
ヒストグラムはデータの全体像を見るときに重要なツールなので、是非覚えて使いこなしましょう。
【基本】np.histogramでヒストグラムを作成
【基本】plt.histでヒストグラムをプロット
【発展】np.histogram/plt.histでbin数の変更やヒストグラムの標準化
np.histogramの使い方
※この記事のコードは、jupyter notebookやjuputer 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の関数についても紹介しました。
データセットを読み込んだら、まずは特徴ごとにヒストグラムを作成してみてください。
データの分布の様子を確認することで、その特性や分析の方策を立てるのに役立つはずですよ!