matplotlibで箱ひげ図(boxplot)を作成する方法を解説

Python

本記事では、matplotlibで箱ひげ図(boxplot)を作成する方法を解説します。データの分布を視覚的に把握するための箱ひげ図の基本から応用まで、サンプルコードとともに詳しく説明します。

箱ひげ図とは

箱ひげ図は、データの分布を視覚的に表現するための統計的なグラフです。データの四分位数(25%、50%、75%)と外れ値を一目で把握できるため、データ分析において非常に有用なツールです。

箱ひげ図の主な構成要素は以下の通りです:

  • 箱(Box): 第1四分位数(25%)から第3四分位数(75%)までの範囲を表す
  • 中央線: 中央値(第2四分位数、50%)を表す
  • ひげ(Whisker): 箱から伸びる線で、通常は最小値と最大値を表す(外れ値を除く)
  • 外れ値(Outlier): ひげの範囲を超えるデータポイント

箱ひげ図は複数のデータセットを比較する際に特に役立ちます。

基本的な箱ひげ図の作成

最も基本的な箱ひげ図を作成するコードです。

pythonimport matplotlib.pyplot as plt
import numpy as np

# ランダムデータの生成
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# 箱ひげ図の作成
fig, ax = plt.subplots(figsize=(8, 6))
ax.boxplot(data)

# ラベルの設定
ax.set_xticklabels(['Data 1', 'Data 2', 'Data 3'])
ax.set_ylabel('Value')
ax.set_title('Basic Boxplot')

plt.show()
# 出力: 基本的な箱ひげ図が表示される

このコードでは、3つの異なる標準偏差を持つ正規分布データを生成し、それらを箱ひげ図で表示しています。

詳細な設定

箱ひげ図はさまざまなパラメータでカスタマイズできます。主な設定を説明します。

切れ込み(ノッチ)の設定

ノッチ(切れ込み)を表示すると、中央値の信頼区間を視覚的に確認できます。異なるデータセット間で中央値に統計的な差があるかどうかを判断するのに役立ちます。

notch=Trueパラメータを設定することで、箱の中央部分に切れ込みが表示されます。この切れ込みは中央値の95%信頼区間を表しており、2つの箱ひげ図のノッチが重ならない場合、それらの中央値には統計的に有意な差があると考えられます。

pythonimport matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# ノッチ付きの箱ひげ図
fig, ax = plt.subplots(figsize=(8, 6))
ax.boxplot(data, notch=True)

ax.set_xticklabels(['Data 1', 'Data 2', 'Data 3'])
ax.set_title('Boxplot with Notch')

plt.show()
# 出力: 中央に切れ込みのある箱ひげ図が表示される

外れ値のマーカー設定

外れ値のマーカーのスタイルを変更できます。デフォルトでは「+」記号が使用されますが、他のマーカーや色を指定することも可能です。

外れ値のマーカーはsymパラメータでシンボルの種類を指定し、flierpropsパラメータで詳細な設定を行います。flierpropsは辞書形式で以下の設定が可能です:

  • marker: マーカーの形状(’o’, ‘s’, ‘^’, ‘v’, ‘<‘, ‘>’, ‘p’, ‘*’, ‘h’, ‘H’, ‘+’, ‘x’, ‘D’, ‘d’など)
  • markerfacecolor: マーカーの塗りつぶし色
  • markeredgecolor: マーカーの枠線の色
  • markeredgewidth: マーカーの枠線の太さ
  • markersize: マーカーのサイズ
  • linestyle: 線のスタイル(’-‘, ‘–‘, ‘-.’, ‘:’など)
  • linewidth: 線の太さ
  • alpha: 透明度(0.0〜1.0)
pythonimport matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# 外れ値のマーカーをカスタマイズした箱ひげ図
fig, ax = plt.subplots(figsize=(8, 6))
ax.boxplot(data, 
           flierprops={
               'marker': 'o',               # 丸形マーカー
               'markerfacecolor': 'red',    # 塗りつぶし色を赤に
               'markeredgecolor': 'black',  # 枠線を黒に
               'markeredgewidth': 1,        # 枠線の太さ
               'markersize': 8,             # マーカーサイズ
               'alpha': 0.7                 # 透明度70%
           })

ax.set_xticklabels(['Data 1', 'Data 2', 'Data 3'])
ax.set_title('Custom Outlier Markers')

plt.show()
# 出力: カスタマイズされた外れ値マーカーを持つ箱ひげ図

向きの設定

箱ひげ図は縦向き(vertical)だけでなく、横向き(horizontal)にも表示できます。

向きはvertパラメータで設定します。デフォルトはvert=Trueで縦向きの箱ひげ図が表示されます。vert=Falseを設定すると横向きになり、x軸とy軸の役割が入れ替わります。横向きの箱ひげ図は、カテゴリ名が長い場合や、複数の箱ひげ図を比較する際に見やすくなることがあります。

pythonimport matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# 横向きの箱ひげ図
fig, ax = plt.subplots(figsize=(8, 6))
ax.boxplot(data, vert=False)

ax.set_yticklabels(['Data 1', 'Data 2', 'Data 3'])
ax.set_title('Horizontal Boxplot')

plt.show()
# 出力: 横向きの箱ひげ図が表示される

ひげの長さの設定

ひげの長さはwhisパラメータで調整できます。デフォルトでは1.5×IQR(四分位範囲)ですが、異なる値を設定することで外れ値の定義を変更できます。

pythonimport matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# ひげの長さを調整した箱ひげ図
fig, ax = plt.subplots(figsize=(10, 6))

# 標準設定(1.5×IQR)
ax.boxplot(data, positions=[1, 2, 3], widths=0.5)

# ひげを短く設定(1.0×IQR)
ax.boxplot(data, positions=[5, 6, 7], widths=0.5, whis=1.0)

ax.set_xticks([2, 6])
ax.set_xticklabels(['Standard (1.5×IQR)', 'Short Whiskers (1.0×IQR)'])
ax.set_title('Comparison of Whisker Lengths')

plt.show()
# 出力: ひげの長さが異なる2セットの箱ひげ図が表示される

箱の幅の設定

箱の幅はwidthsパラメータで調整できます。データセットごとに異なる幅を設定することも可能です。

pythonimport matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# 箱の幅を調整した箱ひげ図
fig, ax = plt.subplots(figsize=(8, 6))
ax.boxplot(data, widths=[0.3, 0.5, 0.7])

ax.set_xticklabels(['Width 0.3', 'Width 0.5', 'Width 0.7'])
ax.set_title('Boxplot with Different Widths')

plt.show()
# 出力: 異なる幅の箱を持つ箱ひげ図が表示される

色とスタイルのカスタマイズ

箱ひげ図の色やスタイルをカスタマイズして、より視覚的に魅力的なグラフを作成できます。patch_artist=Trueパラメータを設定すると箱を塗りつぶすことができ、boxesmedianswhiskersなどの要素ごとに色やスタイルを個別に設定できます。

pythonimport matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# 色とスタイルをカスタマイズした箱ひげ図
fig, ax = plt.subplots(figsize=(8, 6))

# patch_artist=Trueで箱を塗りつぶし可能に
bp = ax.boxplot(data, patch_artist=True)

# 箱の色を設定
colors = ['lightblue', 'lightgreen', 'lightpink']
for patch, color in zip(bp['boxes'], colors):
    patch.set_facecolor(color)

# 中央線の色と太さを設定
for median in bp['medians']:
    median.set_color('red')
    median.set_linewidth(2)

# ひげの色を設定
for whisker in bp['whiskers']:
    whisker.set_color('gray')
    whisker.set_linestyle('--')

ax.set_xticklabels(['Data 1', 'Data 2', 'Data 3'])
ax.set_title('Customized Boxplot')

plt.show()
# 出力: 色とスタイルがカスタマイズされた箱ひげ図が表示される

複数グループの比較

複数のグループを比較する箱ひげ図を作成できます。これは異なる条件下でのデータ分布を比較する際に役立ちます。positionsパラメータで箱の位置を調整し、patch_artist=Trueと組み合わせて各グループに異なる色を設定できます。また、matplotlib.patches.Patchを使用して凡例を追加することも可能です。

pythonimport matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data1 = [np.random.normal(0, std, 100) for std in range(1, 4)]
data2 = [np.random.normal(1, std, 100) for std in range(1, 4)]

# 複数グループの箱ひげ図
fig, ax = plt.subplots(figsize=(10, 6))

# 位置を調整して2グループを表示
positions = [[1, 2, 3], [4, 5, 6]]
bp1 = ax.boxplot(data1, positions=positions[0], widths=0.5, patch_artist=True)
bp2 = ax.boxplot(data2, positions=positions[1], widths=0.5, patch_artist=True)

# 色の設定
for patch in bp1['boxes']:
    patch.set_facecolor('lightblue')
for patch in bp2['boxes']:
    patch.set_facecolor('lightgreen')

# ラベルとタイトルの設定
ax.set_xticks([2, 5])
ax.set_xticklabels(['Group A', 'Group B'])
ax.set_title('Comparison Between Groups')

# 凡例の追加
from matplotlib.patches import Patch
legend_elements = [
    Patch(facecolor='lightblue', label='Group A'),
    Patch(facecolor='lightgreen', label='Group B')
]
ax.legend(handles=legend_elements, loc='upper right')

plt.show()
# 出力: 2つのグループを比較する箱ひげ図が表示される

まとめ

本記事では、matplotlibを使用した箱ひげ図の作成方法について解説しました。基本的な箱ひげ図の作成から、ノッチ、外れ値のマーカー、向き、ひげの長さ、箱の幅などの詳細な設定まで、さまざまなカスタマイズ方法を紹介しました。

箱ひげ図はデータの分布を視覚的に把握するための強力なツールです。特に複数のデータセットを比較する際に、中央値、四分位数、外れ値などの統計情報を一目で確認できる点が大きな利点です。

matplotlibの豊富なカスタマイズオプションを活用することで、データの特性を最も効果的に伝える箱ひげ図を作成できます。データ分析やレポート作成の際に、ぜひ本記事で紹介した方法を活用してください。

より詳細な設定は公式ドキュメントを参照ください。

タイトルとURLをコピーしました