Matplotlibでboxplotを使いこなそう!データ分析の基本をマスター

※本サイトにはプロモーション・広告が含まれています。

今回は、Pythonのデータ可視化ライブラリMatplotlibの中でも、特に重要な「boxplot(箱ひげ図)」について詳しく解説していきます。

データ分析や統計処理において必須のスキルを、わかりやすく身につけていきましょう。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

1.boxplotとは?データの分布を一目で理解しよう

boxplot(箱ひげ図)は、データの分布を視覚的に表現する強力なツールです。
この図を理解することで、データの中央値、四分位数、外れ値などの重要な統計情報を簡単に把握できるようになります。

・1.1 boxplotの基本的な構造を理解しよう
・1.2 Matplotlibでboxplotを作成する方法
・1.3 boxplotのカスタマイズ方法

2. Matplotlibでboxplotを実装しよう

ここでは、実際のコードを使ってboxplotの作成方法を解説していきます。
サンプルデータを使って実践することで、確実にスキルを身につけることができます。

・2.1 基本的なboxplotの作成手順
・2.2 複数のデータセットの比較
・2.3 見やすいグラフにするためのテクニック

2.1 基本的なboxplotの作成手順

最も基本的なboxplotの作成方法を紹介します。以下のコードを使えば、すぐに実装することができます。

import matplotlib.pyplot as plt
import numpy as np

# サンプルデータの作成
data = np.random.randn(100)

# 箱ひげ図の作成
plt.figure(figsize=(8, 6))
plt.boxplot(data)
plt.title('Basic Boxplot')
plt.ylabel('Values')
plt.show()

このコードを実行すると、シンプルな箱ひげ図が表示されます。データの分布が一目でわかるようになっています。

2.2 複数のデータセットの比較

異なるグループのデータを比較する場合、以下のように実装します。

# 複数のデータセット作成
data1 = np.random.normal(100, 10, 200)
data2 = np.random.normal(90, 20, 200)
data3 = np.random.normal(110, 15, 200)

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot([data1, data2, data3], labels=['Group 1', 'Group 2', 'Group 3'])
plt.title('Comparison of Multiple Groups')
plt.ylabel('Values')
plt.grid(True)
plt.show()

複数のデータを並べて表示することで、グループ間の違いを簡単に比較することができます。

2.3 見やすいグラフにするためのテクニック

boxplotをより見やすくするためのカスタマイズ方法を紹介します。

# データの準備
data = [np.random.normal(100, 10, 200) for _ in range(3)]

# スタイリッシュな箱ひげ図の作成
plt.figure(figsize=(10, 6))
box_props = dict(color='blue', linewidth=2)
whisker_props = dict(color='black', linewidth=2)
cap_props = dict(color='black', linewidth=2)
median_props = dict(color='red', linewidth=2)

plt.boxplot(data,
            labels=['A', 'B', 'C'],
            boxprops=box_props,
            whiskerprops=whisker_props,
            capprops=cap_props,
            medianprops=median_props)

plt.title('Styled Boxplot', fontsize=14)
plt.ylabel('Values', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

色や線の太さを調整することで、よりプロフェッショナルな見た目のグラフを作成できます。

3. 実践的な使用例とよくあるエラー対処法

ここでは、実際の現場でboxplotを使う際の実践的なテクニックとトラブルシューティングについて解説していきます。
これらの知識があれば、実務でも安心してboxplotを活用できます。

・3.1 実データを使った分析例
・3.2 よくあるエラーとその解決方法
・3.3 効果的なデータ表現のコツ

これらの内容をマスターすることで、データ分析の幅が大きく広がります。次の章から具体的な実装方法を見ていきましょう。

3.1 実データを使った分析例

実際のビジネスシーンで使用する例として、売上データの分析方法を紹介します。

import pandas as pd
import matplotlib.pyplot as plt

# サンプルの売上データを作成
sales_data = {
    '1月': [100, 150, 130, 120, 140, 110, 160],
    '2月': [120, 140, 150, 160, 130, 120, 170],
    '3月': [150, 170, 160, 180, 150, 140, 190]
}

# DataFrameに変換
df = pd.DataFrame(sales_data)

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot([df['1月'], df['2月'], df['3月']], 
           labels=['1月', '2月', '3月'],
           patch_artist=True,  # 箱の中を塗りつぶす
           boxes=dict(facecolor='lightblue'))  # 箱の色を設定

plt.title('月別売上の分布分析', fontsize=14)
plt.ylabel('売上金額(万円)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

このように実データを使用することで、月ごとの売上の傾向や外れ値を簡単に把握することができます。

3.2 よくあるエラーとその解決方法

boxplotを使用する際によく遭遇するエラーとその対処法を解説します。

  1. データ形式に関するエラー
# エラーが出るケース
data = {'A': [1,2,3], 'B': [4,5]}  # 長さの異なるデータ

# 正しい対処法
import numpy as np
data_fixed = {
    'A': [1,2,3],
    'B': [4,5,np.nan]  # 欠損値を追加して長さを揃える
}
  1. 外れ値の処理
# 外れ値の表示をカスタマイズ
plt.figure(figsize=(10, 6))
plt.boxplot(data, 
           flierprops=dict(marker='o',  # 外れ値のマーカー
                          markerfacecolor='red',  # マーカーの色
                          markersize=8))  # マーカーのサイズ
plt.show()

3.3 効果的なデータ表現のコツ

より効果的なboxplotを作成するためのテクニックを紹介します。

# 高度なカスタマイズ例
import matplotlib.pyplot as plt
import numpy as np

# データ準備
np.random.seed(42)
data = [np.random.normal(loc=100*i, scale=20, size=100) for i in range(1, 4)]

# プロットの作成
fig, ax = plt.subplots(figsize=(12, 7))

# カスタマイズされたboxplot
bp = ax.boxplot(data,
                patch_artist=True,  # 箱を塗りつぶす
                labels=['Group A', 'Group B', 'Group C'],
                medianprops=dict(color="red", linewidth=1.5),
                flierprops=dict(marker='o', markerfacecolor='gray'),
                boxprops=dict(facecolor='lightblue', color='black'),
                whiskerprops=dict(color='black'),
                capprops=dict(color='black'))

# グラフの装飾
ax.set_title('Advanced Boxplot Customization', pad=20, fontsize=14)
ax.set_ylabel('Values', fontsize=12)
ax.grid(True, linestyle='--', alpha=0.3)
ax.spines['top'].set_visible(False)  # 上部の枠線を消す
ax.spines['right'].set_visible(False)  # 右部の枠線を消す

plt.show()

4. boxplotを使った高度な分析手法

ここでは、より進んだboxplotの活用方法について解説していきます。
統計的な分析と組み合わせることで、より深い洞察を得ることができます。

・4.1 統計検定との組み合わせ
・4.2 異常値検出への応用
・4.3 時系列データの分析手法

4.1 統計検定との組み合わせ

boxplotと統計検定を組み合わせることで、より正確なデータ分析が可能になります。

from scipy import stats

# データ準備
group1 = np.random.normal(100, 15, 100)
group2 = np.random.normal(110, 15, 100)

# t検定の実施
t_stat, p_value = stats.ttest_ind(group1, group2)

# 結果の可視化
fig, ax = plt.subplots(figsize=(10, 6))
bp = ax.boxplot([group1, group2], labels=['Group 1', 'Group 2'])

# p値の追加
plt.title(f'Comparison with t-test (p-value: {p_value:.4f})')
plt.ylabel('Values')
plt.grid(True, alpha=0.3)
plt.show()

この例では、boxplotによる視覚的な比較と統計的検定を組み合わせることで、より信頼性の高い分析が可能になります。

4.2 異常値検出への応用

boxplotは異常値(外れ値)の検出に非常に効果的です。

以下のコードでは、自動で異常値を検出し、マークする方法を紹介します。

import numpy as np
import matplotlib.pyplot as plt

def detect_outliers(data):
    q1 = np.percentile(data, 25)
    q3 = np.percentile(data, 75)
    iqr = q3 - q1
    lower_bound = q1 - (1.5 * iqr)
    upper_bound = q3 + (1.5 * iqr)
    outliers = data[(data < lower_bound) | (data > upper_bound)]
    return outliers

# サンプルデータの作成
np.random.seed(42)
normal_data = np.random.normal(100, 15, 100)
# 意図的に外れ値を追加
outlier_data = np.append(normal_data, [180, 20])

# 外れ値の検出
outliers = detect_outliers(outlier_data)

# プロット作成
plt.figure(figsize=(10, 6))
plt.boxplot(outlier_data)

# 外れ値を赤い点でマーク
plt.plot([1] * len(outliers), outliers, 'ro', label='Outliers')

plt.title('Outlier Detection using Boxplot')
plt.ylabel('Values')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

print(f'検出された外れ値: {outliers}')

この方法を使うことで、データセット内の異常値を効率的に特定し、可視化することができます。

4.3 時系列データの分析手法

時系列データの分析にboxplotを活用する方法を紹介します。季節性や周期性を視覚的に理解することができます。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 1年分の日次データを生成
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
np.random.seed(42)
values = np.random.normal(100, 15, len(dates))
# 季節性を追加
values += np.sin(np.linspace(0, 2*np.pi, len(dates))) * 20

# DataFrameの作成
df = pd.DataFrame({'date': dates, 'value': values})
df['month'] = df['date'].dt.month

# 月別のboxplot作成
plt.figure(figsize=(15, 7))
monthly_data = [df[df['month'] == month]['value'] for month in range(1, 13)]

bp = plt.boxplot(monthly_data, 
                patch_artist=True,
                labels=['1月', '2月', '3月', '4月', '5月', '6月', 
                       '7月', '8月', '9月', '10月', '11月', '12月'])

# グラフの装飾
plt.title('月別データ分布の推移', fontsize=14)
plt.ylabel('値', fontsize=12)
plt.xticks(rotation=45)
plt.grid(True, linestyle='--', alpha=0.3)

# 箱の色付け
colors = ['lightblue'] * 12
for patch, color in zip(bp['boxes'], colors):
    patch.set_facecolor(color)

plt.show()

5. 実務での活用事例と tips

ここでは、実際のビジネスシーンでboxplotを活用する方法について解説していきます。

適切な可視化は、意思決定の質を大きく向上させることができます。

・5.1 売上データの分析事例
・5.2 品質管理での活用方法
・5.3 レポート作成のベストプラクティス

5.1 売上データの分析事例

実際の売上データを使って、部門別や商品別の比較分析を行う方法を紹介します。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# サンプルの売上データ作成
departments = ['営業部', '企画部', 'マーケティング部']
data = {
    'department': [],
    'sales': []
}

np.random.seed(42)
for dept in departments:
    # 各部門の売上データをシミュレート
    sales = np.random.normal(1000000, 200000, 50)
    data['department'].extend([dept] * 50)
    data['sales'].extend(sales)

df = pd.DataFrame(data)

# seabornを使用したスタイリッシュなboxplot
plt.figure(figsize=(12, 7))
sns.boxplot(x='department', y='sales', data=df, palette='Set3')

plt.title('部門別売上分布', fontsize=14, pad=20)
plt.xlabel('部門', fontsize=12)
plt.ylabel('売上(円)', fontsize=12)

# Y軸を見やすい形式に
plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: format(int(x), ',')))

plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

このようなグラフを使うことで、各部門の売上分布の違いや特徴を簡単に把握することができます。

次回は、品質管理での活用方法について詳しく解説していきます。

5.2 品質管理での活用方法

製造業などにおける品質管理でのboxplotの活用方法を紹介します。

製品の品質データを効果的に分析する方法を見ていきましょう。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 品質管理データのシミュレーション
np.random.seed(42)

# 3つの製造ラインのデータ作成
line_a = np.random.normal(100, 2, 100)  # 標準的な製造ライン
line_b = np.random.normal(100, 3, 100)  # ばらつきが大きい製造ライン
line_c = np.random.normal(98, 1, 100)   # 若干規格外れの製造ライン

# 規格上限・下限の設定
usl = 105  # Upper Specification Limit
lsl = 95   # Lower Specification Limit

# プロットの作成
fig, ax = plt.subplots(figsize=(12, 7))

# boxplotの作成
bp = ax.boxplot([line_a, line_b, line_c], 
                labels=['ライン A', 'ライン B', 'ライン C'],
                patch_artist=True)

# 規格限界線の追加
ax.axhline(y=usl, color='r', linestyle='--', label='上限規格値')
ax.axhline(y=lsl, color='r', linestyle='--', label='下限規格値')

# グラフの装飾
plt.title('製造ライン別 品質管理図', fontsize=14, pad=20)
plt.ylabel('測定値', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.3)
plt.legend()

# 箱の色付け
colors = ['lightgreen', 'lightblue', 'pink']
for patch, color in zip(bp['boxes'], colors):
    patch.set_facecolor(color)

plt.show()

# 基本統計量の計算と表示
lines = {'ライン A': line_a, 'ライン B': line_b, 'ライン C': line_c}
stats_df = pd.DataFrame({
    'mean': {line: np.mean(data) for line, data in lines.items()},
    'std': {line: np.std(data) for line, data in lines.items()},
    'out_of_spec': {line: np.sum((data < lsl) | (data > usl)) for line, data in lines.items()}
})

print("\n品質管理統計:\n", stats_df)

この例では、各製造ラインの品質データを視覚化し、規格値との関係を明確に示しています。

5.3 レポート作成のベストプラクティス

効果的なレポート作成のためのboxplotの活用方法を紹介します。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.gridspec import GridSpec

# データ準備
np.random.seed(42)
before_improvement = np.random.normal(100, 15, 100)
after_improvement = np.random.normal(110, 10, 100)

# レポート用の複合グラフ作成
fig = plt.figure(figsize=(15, 10))
gs = GridSpec(2, 2, figure=fig)

# 1. boxplot比較
ax1 = fig.add_subplot(gs[0, :])
bp = ax1.boxplot([before_improvement, after_improvement],
                 labels=['改善前', '改善後'],
                 patch_artist=True)
ax1.set_title('改善前後の比較', pad=20)
ax1.grid(True, linestyle='--', alpha=0.3)

# 箱の色付け
colors = ['lightcoral', 'lightgreen']
for patch, color in zip(bp['boxes'], colors):
    patch.set_facecolor(color)

# 2. ヒストグラム(改善前)
ax2 = fig.add_subplot(gs[1, 0])
ax2.hist(before_improvement, bins=20, color='lightcoral', alpha=0.7)
ax2.set_title('改善前の分布')
ax2.grid(True, linestyle='--', alpha=0.3)

# 3. ヒストグラム(改善後)
ax3 = fig.add_subplot(gs[1, 1])
ax3.hist(after_improvement, bins=20, color='lightgreen', alpha=0.7)
ax3.set_title('改善後の分布')
ax3.grid(True, linestyle='--', alpha=0.3)

plt.tight_layout()
plt.show()

# 改善効果の統計的分析
improvement_stats = pd.DataFrame({
    '指標': ['平均値', '標準偏差', '中央値', 'IQR'],
    '改善前': [np.mean(before_improvement),
             np.std(before_improvement),
             np.median(before_improvement),
             np.percentile(before_improvement, 75) - np.percentile(before_improvement, 25)],
    '改善後': [np.mean(after_improvement),
             np.std(after_improvement),
             np.median(after_improvement),
             np.percentile(after_improvement, 75) - np.percentile(after_improvement, 25)]
})

print("\n改善効果の分析:\n", improvement_stats)

6. まとめと発展的な使用方法

ここまでMatplotlibのboxplotの基本から応用まで見てきました。

実務での活用方法を理解することで、より効果的なデータ分析が可能になります。

・6.1 学んだことの総まとめ
・6.2 さらなる学習リソース
・6.3 次のステップ

6.1 学んだことの総まとめ

これまでに学習した主要なポイントを整理します。

  1. 基本的な使い方
  • データの分布を視覚化する方法
  • 基本的なカスタマイズ方法
  • 複数データセットの比較方法
  1. 実践的な応用
  • 異常値の検出と処理
  • 時系列データの分析
  • 品質管理への活用
  1. 効果的な表現方法
  • 適切な色使い
  • 見やすいレイアウト
  • 統計情報の追加

これらの知識を組み合わせることで、より効果的なデータ分析が可能になります。

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