Pythonによるデータ分析をする際にグラフなどの可視化でよく利用されるmatplotlibでヒストグラムを描画する方法について解説します。
Contents
ヒストグラムの描画方法
matplotlibでヒストグラムを描画する際のメソッドとしては、hist, hist2d, hexbinといったメソッドがあります。それぞれの使い方を以降で解説します。
histによるヒストグラムの描画
基本的な使い方
histメソッドを用いてヒストグラムを表示する場合には、以下の例のように使用します。
import numpy as np import matplotlib.pyplot as plt plt.style.use('seaborn-whitegrid') # 正規分布に従うデータの生成 d = np.random.randn(1000) # ヒストグラムの表示 plt.hist(d) plt.show()
この例では、標準正規分布に従うデータ点をnp.random.randnメソッドで1,000点用意して、当該データに対するヒストグラムを表示しています。以降正規分布をベースに紹介しますが、データの種類はどういった入力でも構いません。
ヒストグラムのカスタマイズ
一般的な使い方では、各値の階級(これをビン(bins)と言います。)の数などは自動で設定されます。これらの値を設定したい場合には、histの引数として以下の例のように各値を入れることでヒストグラムの描画の見た目を変えることができます。
import numpy as np import matplotlib.pyplot as plt plt.style.use('seaborn-whitegrid') # 正規分布に従うデータの生成 d = np.random.randn(1000) # ヒストグラムの表示(各種設定) plt.hist(d, bins=30, color='red', edgecolor='k', alpha=0.5) plt.show()
この例では、階級(bins)の数を30と設定し、色(color)を赤、枠線(edgecolor)を黒、色の透過度(alpha)を0.5として表示してみています。色々なパラメータについては、histメソッドのドキュメントを確認してみてください。
histメソッドの公式ドキュメントはこちらを参照してください。
複数のヒストグラムを同時に描画
色々なデータの分析をしていると、複数のデータセットを重ねて描画して、各分布の違いを比較したい場合があります。複数のヒストグラムを同時に描画したい場合には以下の例のように実行することができます。
import numpy as np import matplotlib.pyplot as plt plt.style.use('seaborn-whitegrid') # 正規分布に従うデータを複数生成 # 平均0, 標準偏差1 d1 = np.random.normal(0, 1, 1000) # 平均-2, 標準偏差0.5 d2 = np.random.normal(-2, 0.5, 1000) # 平均5, 標準偏差3 d3 = np.random.normal(5, 3, 1000) # 設定値の作成 kwargs = dict(bins=30, alpha=0.5, histtype='stepfilled', edgecolor='k') # ヒストグラムの表示 plt.hist(d1, **kwargs) plt.hist(d2, **kwargs) plt.hist(d3, **kwargs) plt.show()
この例では、平均や標準偏差が異なるランダムなデータを生成して各ヒストグラムを表示しています。
結局やっていることは連続でhistメソッドを実行しているだけです。ただ、透過率(alpha)を指定しないと各グラフが見えなくなってしまうため、透過度を設定して各グラフの重なりが分かるようにしています。
設定値を毎回同じような記載するのが面倒なのでkwargsという辞書にまとめて、histメソッドの引数として渡しています。各ヒストグラムでそれぞれ見た目を変えたい場合は、histメソッドにそれぞれパラメータを設定してください。
hist2dによる2次元ヒストグラムの描画
2次元のヒストグラムを描画したい場合には、hist2dメソッドを使用します。hist2dメソッドを用いて2次元ヒストグラムを表示する場合には、以下の例のように使用します。
import numpy as np import matplotlib.pyplot as plt plt.style.use('seaborn-whitegrid') # 2次元正規分布の平均と共分散を定義 # 平均 m = [0, 0] # 共分散 cov = [[1, 1], [1, 2]] # データの生成 x, y = np.random.multivariate_normal(m, cov, 1000).T # 2次元ヒストグラムの表示 plt.hist2d(x, y, bins=30, cmap='Purples') plt.colorbar() plt.show()
この例では、2次元正規分布に従うデータをnp.random.multivariate_normalメソッドで生成しています。生成するために、平均(m)と共分散(cov)を定義して引数として渡しています。
2次元ヒストグラムは色の濃いところが数が多いことを表していて、イメージとしては画面の手前側にバーが伸びているようなイメージをしてもらえると分かるかと思います。
hist2dメソッドの公式ドキュメントはこちらを参照してください。
hexbinによる2次元の六角形ヒストグラム描画
hist2dによる2次元ヒストグラムでは、各グリッドを四角形で表現していました。もう一つの表現方法として各グリッドを六角形で表現する方法があります。六角形で2次元ヒストグラムを表示するには、hexbinメソッドを使用します。
hexbinメソッドを用いて2次元ヒストグラムを表示する場合には、以下の例のように使用します。
import numpy as np import matplotlib.pyplot as plt plt.style.use('seaborn-whitegrid') # 2次元正規分布の平均と共分散を定義 # 平均 m = [0, 0] # 共分散 cov = [[1, 1], [1, 2]] # データの生成 x, y = np.random.multivariate_normal(m, cov, 1000).T # 六角形での2次元ヒストグラムの表示 plt.hexbin(x, y, gridsize=30, cmap='Purples') plt.colorbar() plt.show()
hexbinメソッドの公式ドキュメントはこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。