【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の関数についても紹介しました。

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

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

フクロウ

フクロウ

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説