【Python】Matplotlibでヒストグラムを作成しデータの分布を可視化する

目次

概要

Matplotlibの hist メソッドを使用してヒストグラム(度数分布図)を作成するレシピです。

データのばらつきや偏りを把握するために、階級の数(bins)や色、枠線、透明度などを調整して、視認性の高いヒストグラムを描画する方法を解説します。

仕様(入出力)

  • 入力: 1次元の数値データ配列(リストやNumPy配列)、ビンの設定、スタイル設定
  • 出力: ヒストグラムの描画(頻度または確率密度)
  • 要件: matplotlib および numpy ライブラリがインストールされていること

基本の使い方

import matplotlib.pyplot as plt
import numpy as np

# データの準備(例: 正規分布に従う乱数)
data = np.random.randn(1000)

fig, ax = plt.subplots()
# 最もシンプルなヒストグラム
ax.hist(data)

plt.show()

コード全文

平均50、標準偏差10の正規分布データを作成し、棒の境界線を明確にした見やすいヒストグラムを描画する完全なコードです。

import matplotlib.pyplot as plt
import numpy as np

def main():
    # 1. データの生成(例:製品の重量サンプル 2000個)
    # 平均=50.0, 標準偏差=10.0
    np.random.seed(42) # 再現性のためシード固定
    weights = np.random.normal(50.0, 10.0, 2000)

    # 2. 描画領域の作成
    fig, ax = plt.subplots(figsize=(8, 5))

    # 3. ヒストグラムの描画
    # density=TrueにするとY軸が「確率密度」になります(面積の合計が1)
    ax.hist(
        x=weights,              # データ
        bins=25,                # 棒(階級)の数
        density=False,          # Trueなら確率密度、Falseなら度数(件数)
        color='#00AAFF',        # 棒の塗りつぶし色
        ec='black',             # 枠線の色(edgecolorの略)
        alpha=0.6,              # 透明度
        label='Samples'
    )

    # 4. ラベルとタイトルの設定
    ax.set_title("Product Weight Distribution")
    ax.set_xlabel("Weight (g)")
    ax.set_ylabel("Frequency") # density=Trueなら "Probability Density"

    # 平均値を垂直線で表示(オプション)
    mean_val = np.mean(weights)
    ax.axvline(mean_val, color='red', linestyle='--', label=f'Mean: {mean_val:.1f}')

    ax.legend()
    ax.grid(axis='y', alpha=0.5)

    # 5. 表示
    plt.show()

if __name__ == "__main__":
    main()

カスタムポイント

ax.hist() でヒストグラムの形状やスタイルを決定する主要なパラメータです。

パラメータ名説明設定例
xヒストグラムを作成する入力データ(1次元配列)。必須。data
bins柱(階級)の数、または階級の境界値リスト。20 (整数), [0, 10, 20] (リスト)
densityTrueにすると縦軸を確率密度(積分して1)にする。デフォルトはFalse(度数)。True, False
color柱の塗りつぶし色。'skyblue', '#FF5733'
ec (edgecolor)柱の境界線の色。これを指定すると柱同士の区切りが明確になる。'black', 'white'
alpha透明度(0.0〜1.0)。複数の分布を重ねる際に有用。0.5
  • bins の重要性:bins の数が少なすぎると大雑把になり、多すぎるとスカスカになります。データの量に合わせて調整してください(データ数の平方根程度が目安の一つです)。
  • ec (edgecolor):Matplotlibのデフォルトでは枠線がないため、隣り合う棒が同色だと繋がって見えます。ec=’black’ などを指定して境界をはっきりさせるのが推奨されます。

注意点

  1. density=True の意味density=True を設定した場合、Y軸の値は「確率密度」となり、全ての棒の面積の合計が1になります。Y軸の高さの合計が1になるわけではない点に注意してください。
  2. データの欠損データに NaN(欠損値)が含まれているとエラーになるか、意図しない挙動になることがあります。事前に pandas や numpy で欠損を除去しておくことを推奨します。
  3. binsの自動設定bins=’auto’ と指定すると、NumPyがデータの分布に基づいて最適なビンの数を自動計算してくれます。

バリエーション

2つの分布を重ねて比較する

透明度(alpha)を活用して、異なるデータセットの分布状況を比較する例です。

import matplotlib.pyplot as plt
import numpy as np

def compare_histograms():
    # 平均の異なる2つのデータセット生成
    data_a = np.random.normal(40, 5, 1000)
    data_b = np.random.normal(55, 10, 1000)

    fig, ax = plt.subplots()

    # alphaを指定して重なりを見えるようにする
    ax.hist(data_a, bins=30, alpha=0.5, label='Group A', color='blue', ec='blue')
    ax.hist(data_b, bins=30, alpha=0.5, label='Group B', color='orange', ec='orange')

    ax.set_title("Comparison of Two Groups")
    ax.legend()
    plt.show()

if __name__ == "__main__":
    compare_histograms()

まとめ

ヒストグラムはデータの全体像を把握するための基本ツールです。

単に描画するだけでなく、bins の数を適切に調整し、ec(枠線)や alpha(透明度)を設定することで、データの特性をより正確に伝えることができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次