ヒストグラムの作成に戸惑っていませんか?データの分布やパターンを理解するために,正確なヒストグラムを作成することが重要です
縦軸に度数,横軸に階級をとる統計グラフの1種で,柱状図,度数分布図とも呼ばれます
この記事では,Matplotlibのhist,hist2d,PercentFormatterなどの機能を使って,正確なヒストグラムを簡単に作成する方法を解説します。
読み終えた後は,自身のデータに合わせてヒストグラムを作成できるようになります。データの頻度や密度の傾向を把握し,重要な特性を発見することができます。
一般的なヒストグラム (Axes.hist)
ヒストグラムの描画にはAxes.hist関数の第1引数に1次元配列を指定します
- 引数
-
- x (配列) : 入力値.データの座標を配列で指定します
- bins (int or 配列) : intであれば範囲内の同じ幅のビンの数を定義.配列であれば左端と右端を含むようにビンの数を定義
- range (配列) : ビンの下限と上限の範囲
- density (bool) : True の場合,確率密度を描画
- bottom (数値 or 配列) : 各ビンの底の位置
- histtype (文字列) : ‘bar‘, ‘barstacked‘, ‘step’, ‘stepfilled’のいずれかでグラフの種類が変化.詳しくは下記を参照してください
- align (文字列) : ‘left’, ‘mid’, ‘right’のいずれかでヒストグラムの水平方向の並びを指定します
- orientation (文字列) : ‘vertical’, ‘horizontal’のいずれかでヒストグラムの方向を垂直か水平に変更します
- stacked (bool) : True の場合,複数のデータを重ねて表示します
- 返値
-
- n (配列) : ヒストグラムのビンの値
- bins (配列) : ビンのエッジ.長さは nbins + 1.常に1つの配列です
- patches (BarContainer or Polygonのリスト) : ヒストグラムを作成するために使用されるオブジェクト
- 公式ドキュメント
下記のタブにコードとフローチャートの解説をしています
# step1 再現性のある乱数発生器を作成
rng = np.random.default_rng(19680801)
# step2 データの生成
N_points = 100000
n_bins = 20
dist1 = rng.standard_normal(N_points)
# step3 グラフフレームを作成
fig, ax = plt.subplots()
# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins)
ax.set_xlabel('X label')
ax.set_ylabel('Y label')
ax.set_title(r'A Simple Histogram')
plt.show()
度数ごとに色分けされたヒストグラム
ヒストグラムを度数に応じて色分けを行い,わかりやすくします
下記のタブにコードとフローチャートの解説をしています
# step4 ヒストグラムを描画
# Nは各ビン数,binsはビンの下限値
N, bins, patches = ax.hist(dist1, bins=n_bins)
# step5 色設定のための準備
# 高さで色分け
fracs = N / N.max()
# カラーマップの全範囲でデータを0〜1に正規化
norm = colors.Normalize(fracs.min(), fracs.max())
# step6 色の設定
# オブジェクトをループして,それぞれの色を設定
for thisfrac, thispatch in zip(fracs, patches):
color = plt.cm.viridis(norm(thisfrac))
thispatch.set_facecolor(color)
plt.show()
2次元のヒストグラム (Axes.hist2d)
Axes.hist2d関数を用いると,2つのデータセットを使った,2次元のヒストグラムを表示できます
Axes.hist2dには配列を2つ指定します
- 引数
-
- x (配列) : 入力値.データの座標を配列で指定します
- bins (int or 配列) : intであれば範囲内の同じ幅のビンの数を定義.配列であれば左端と右端を含むようにビンの数を定義
- range (配列) : ビンの下限と上限の範囲
- density (bool) : True の場合,確率密度を描画
- 返値
-
- h (2次元配列) : xとyの2次元ヒストグラムオブジェクト.xの値は1次元に,yの値は2次元にヒストグラム化される
- xedges (1次元配列) : X軸に沿ったビンの端
- yedges (1次元配列) : Y軸に沿ったビンの端
- image (QuadMesh) : 四辺形メッシュを効率的に描画するためのクラス
- 公式ドキュメント
# 2つ目の正規分布データを生成する
dist2 = 0.4 * rng.standard_normal(N_points) + 5
# step4 2次元のヒストグラムを描画
ax.hist2d(dist1, dist2)
plt.show()
縦軸をパーセントにしたヒストグラム (density)
縦軸を度数からパーセント表示にしたヒストグラムの表示方法です
Axes.hist関数でdensityをTrueにすると,確率密度となり,最大値が1になります
matplotlib.ticker.PercentFormatterでy軸をパーセント表示に置き換えています
- 引数
-
- xmax (float) : パーセンテージは,x / xmax * 100として計算されます
- decimals (int) : 小数点以下の桁数を指定
- symbol (文字列) : ラベルに付加される文字列
- is_latex (bool) : Falseの場合,symbolに含まれるLaTeX文字が使われます
- 公式ドキュメント
# step4 ヒストグラムを描画
# density=Trueにすると確率密度になります
ax.hist(dist1, bins=n_bins, density=True)
# Y軸をパーセンテージ表示にフォーマット
ax.yaxis.set_major_formatter(PercentFormatter(xmax=1))
plt.show()
階段状のヒストグラム (histtype=step)
Axes.histの引数であるhisttypeに’step’を使うと階段状のヒストグラムを作成できます
データが1次元配列の場合は,histtypeにbar, barstacked, stepfilledのいずれも同じになります
# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins, histtype='step')
plt.show()
複数のデータセットを持つヒストグラム
複数のデータセット(2次元配列)を指定した際のヒストグラムを描画することも可能です
グラフを積み上げるか,横に並べるかの2つの方法で表現できます
2次元配列のデータには下記を使用しました
# 100000行3列の2次元配列
dist1 = rng.standard_normal(size=(N_points, 3))
データセットを横に並べる (histtype=bar)
histtypeにbarを指定(デフォルト)すると,横にデータセットが並びます
# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins)
plt.show()
塗りつぶしてデータを積み重ねる (histtype=barstacked)
histtypeにbarstackedを指定すると,データセットが積み重なります
# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins, histtype='barstacked')
plt.show()
塗りつぶさずにデータセットを積み重ねる (stacked)
histtypeにstepを指定してstacked=Trueとすると,塗りつぶさずにデータセットが積み重なります
# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins, histtype='step', stacked=True)
plt.show()
参考文献
ヒストグラムの基本
ヒストグラムの種類の設定(histtype)
複数のデータを持ったヒストグラム
コメント