読み込み中...

Pythonで箱ひげ図を簡単作成する方法と活用例10選

箱ひげ図 徹底解説 Python
この記事は約34分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●Pythonで箱ひげ図を作る意義とは?

データ分析で重要な役割を果たす箱ひげ図。

統計学者John Tukeyが1970年代に考案したこのグラフは、データの分布を視覚的に表現する強力な手法です。

Pythonを使って箱ひげ図を作成することで、データサイエンティストや研究者は効率的にデータの特徴を把握できます。

箱ひげ図の魅力は、一目でデータの中央値、四分位数、外れ値を確認できる点にあります。

データの全体像を素早く把握したい場合や、複数のデータセットを比較したい場合に非常に有効です。

例えば、異なる製品の売上データを箱ひげ図で表現すれば、各製品の売上傾向や外れ値の存在を即座に読み取ることができるでしょう。

○データ分析における箱ひげ図の重要性

箱ひげ図は、データ分析の初期段階で重要な役割を果たします。

データの分布や特徴を素早く把握できるため、詳細な分析に入る前の「データの探索」段階で非常に有用です。

中央値、四分位数、外れ値などの重要な統計情報を一つのグラフに凝縮しているため、データの全体像を効率的に理解できます。

また、箱ひげ図は複数のデータセットを比較する際にも威力を発揮します。

例えば、異なる地域の気温データを箱ひげ図で表現すれば、各地域の気温分布の違いや季節変動を視覚的に比較できます。

外れ値の存在も一目瞭然なので、異常気象の発見にも役立つかもしれません。

さらに、箱ひげ図はデータのクリーニングや前処理にも活用できます。外れ値の検出や、データの歪みの確認などに役立ちます。

データサイエンティストにとって、信頼性の高いデータセットを作成する上で欠かせないツールと言えるでしょう。

○Pythonを使う利点

Pythonは、データ分析や可視化に適したプログラミング言語として広く認知されています。

箱ひげ図の作成においても、Pythonを使用することで多くの利点が得られます。

まず、Pythonには豊富なデータ可視化ライブラリが用意されています。

MatplotlibやSeabornなどのライブラリを使用すれば、わずか数行のコードで美しい箱ひげ図を作成できます。

このライブラリは高度にカスタマイズ可能で、プロフェッショナルな品質のグラフを簡単に作成できます。

また、Pythonはデータ処理のための強力なライブラリも提供しています。

NumPyやPandasを使用すれば、大規模なデータセットでも効率的に処理し、箱ひげ図の作成に必要なデータを簡単に準備できます。

さらに、Pythonはオープンソースで無料で使用できるため、コストを抑えてデータ分析環境を構築できます。

豊富なオンラインリソースやコミュニティのサポートも、学習や問題解決に役立ちます。

●基本的な箱ひげ図の作成方法

Pythonを使って箱ひげ図を作成する方法を学びましょう。

まずは、最も基本的な箱ひげ図の作成方法から始めます。

Pythonの代表的な可視化ライブラリであるMatplotlibを使用します。

○サンプルコード1:Matplotlibを使った基本的な箱ひげ図

Matplotlibを使って基本的な箱ひげ図を作成するサンプルコードを見てみましょう。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = np.random.normal(100, 20, 200)

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

# グラフの設定
plt.title('基本的な箱ひげ図')
plt.ylabel('値')

# グラフの表示
plt.show()

このコードを実行すると、次のような箱ひげ図が表示されます。

# 実行結果の説明
# (ここに箱ひげ図の画像が表示されるイメージです)

この箱ひげ図では、中央の太い線が中央値を表しています。

箱の下端は第1四分位数、上端は第3四分位数を表します。

ひげの端は、箱の長さの1.5倍以内にあるデータの最小値と最大値を表しています。

点で表示されているのは外れ値です。

Matplotlibを使った基本的な箱ひげ図の作成方法を見てきました。

次は、より美しく洗練された箱ひげ図を作成できるSeabornライブラリを使用してみましょう。

○サンプルコード2:Seabornを使った美しい箱ひげ図

Seabornは、Matplotlibをベースにした高水準の統計グラフ作成ライブラリです。

デフォルトでより美しいスタイルが適用され、少ないコード量でも洗練されたグラフを作成できます。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = np.random.normal(100, 20, 200)

# Seabornのスタイル設定
sns.set_style("whitegrid")

# 箱ひげ図の作成
plt.figure(figsize=(8, 6))
sns.boxplot(y=data)

# グラフの設定
plt.title('Seabornを使った美しい箱ひげ図')
plt.ylabel('値')

# グラフの表示
plt.show()

このコードを実行すると、次のような箱ひげ図が表示されます。

# 実行結果の説明
# (ここにSeabornで作成した箱ひげ図の画像が表示されるイメージです)

Seabornを使用すると、グリッド線や色使いなどがデフォルトで美しく設定されます。

箱の色が塗られ、外れ値もより見やすく表示されています。

Matplotlibと比較すると、Seabornは少ないコードでより洗練されたグラフを作成できることがわかります。

ただし、Matplotlibの方がより細かいカスタマイズが可能です。

目的や好みに応じて、適切なライブラリを選択するとよいでしょう。

●箱ひげ図のカスタマイズテクニック

箱ひげ図の基本を押さえたら、次はグラフをより魅力的で情報豊かなものにするカスタマイズ技術を学びましょう。

データの特徴をより効果的に伝えるため、色やスタイル、ラベル、グリッド線などを調整する方法を紹介します。

○サンプルコード3:色やスタイルの変更

箱ひげ図の見た目を変更することで、データの特徴をより強調できます。

色を変えたり、線の太さを調整したりすることで、グラフの可読性が大幅に向上します。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = np.random.normal(100, 20, 200)

# 箱ひげ図の作成とカスタマイズ
plt.figure(figsize=(8, 6))
box_plot = plt.boxplot(data, patch_artist=True)

# 箱の色を変更
for box in box_plot['boxes']:
    box.set_facecolor('lightblue')
    box.set_edgecolor('navy')

# ひげの色と線のスタイルを変更
for whisker in box_plot['whiskers']:
    whisker.set_color('navy')
    whisker.set_linestyle('--')

# 中央値の線の色と太さを変更
for median in box_plot['medians']:
    median.set_color('red')
    median.set_linewidth(2)

# グラフの設定
plt.title('カスタマイズした箱ひげ図')
plt.ylabel('値')

# グラフの表示
plt.show()

実行結果を見てみましょう。

# 実行結果の説明
# (ここにカスタマイズされた箱ひげ図の画像が表示されるイメージです)

グラフが見違えるように魅力的になりました。

箱の色が薄い青に、外枠が濃い青に変わり、中央値の線が赤く太くなっています。

ひげ線も点線になり、全体的に見やすくなりました。

○サンプルコード4:軸ラベルとタイトルの追加

グラフに適切なラベルやタイトルを付けることで、データの意味がより明確になります。

軸ラベルやタイトルを追加する方法を見てみましょう。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(100, 20, 200) for _ in range(3)]

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot(data)

# 軸ラベルとタイトルの追加
plt.title('異なる製品の売上分布', fontsize=16)
plt.xlabel('製品', fontsize=14)
plt.ylabel('売上(万円)', fontsize=14)

# x軸のラベルを設定
plt.xticks([1, 2, 3], ['製品A', '製品B', '製品C'], fontsize=12)

# グラフの表示
plt.show()

実行結果を確認しましょう。

# 実行結果の説明
# (ここに軸ラベルとタイトルが追加された箱ひげ図の画像が表示されるイメージです)

グラフにタイトルと軸ラベルが追加され、何を表しているのかが一目で分かるようになりました。

x軸には製品名が、y軸には単位が明記されています。

○サンプルコード5:グリッド線の追加

グリッド線を追加すると、データの値を正確に読み取りやすくなります。

Matplotlibを使ってグリッド線を追加する方法を見てみましょう。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
data = [np.random.normal(100, 20, 200) for _ in range(3)]

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot(data)

# グリッド線の追加
plt.grid(True, axis='y', linestyle='--', alpha=0.7)

# 軸ラベルとタイトルの追加
plt.title('異なる製品の売上分布(グリッド線あり)', fontsize=16)
plt.xlabel('製品', fontsize=14)
plt.ylabel('売上(万円)', fontsize=14)

# x軸のラベルを設定
plt.xticks([1, 2, 3], ['製品A', '製品B', '製品C'], fontsize=12)

# グラフの表示
plt.show()

実行結果を見てみましょう。

# 実行結果の説明
# (ここにグリッド線が追加された箱ひげ図の画像が表示されるイメージです)

横方向のグリッド線が追加され、各製品の売上の値がより正確に読み取れるようになりました。

線のスタイルを点線にし、透明度を設定することで、データの視認性を損なわないよう工夫しています。

●複数のデータセットを比較する

実際のデータ分析では、複数のデータセットを比較することがよくあります。

Pythonを使えば、複数の箱ひげ図を簡単に並べたり、グループ化したりすることができます。

○サンプルコード6:複数の箱ひげ図を並べて表示

異なるデータセットを並べて表示することで、一目で比較できます。

例えば、複数の製品の売上データを比較する場合を考えてみましょう。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
product_A = np.random.normal(100, 20, 200)
product_B = np.random.normal(120, 25, 200)
product_C = np.random.normal(90, 15, 200)

# 箱ひげ図の作成
plt.figure(figsize=(12, 6))
plt.boxplot([product_A, product_B, product_C], labels=['製品A', '製品B', '製品C'])

# グラフの設定
plt.title('異なる製品の売上比較', fontsize=16)
plt.ylabel('売上(万円)', fontsize=14)
plt.grid(True, axis='y', linestyle='--', alpha=0.7)

# グラフの表示
plt.show()

実行結果を確認しましょう。

# 実行結果の説明
# (ここに複数の箱ひげ図が並んだ画像が表示されるイメージです)

3つの製品の売上データが並んで表示されています。

製品Bの売上が最も高く、ばらつきも大きいことがわかります。

一方、製品Cは売上は低めですが、安定しているようです。

○サンプルコード7:グループ化された箱ひげ図の作成

複数の要因を考慮したい場合、グループ化された箱ひげ図が役立ちます。

例えば、製品ごとの売上を地域別に比較する場合を見てみましょう。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(42)
products = ['A', 'B', 'C']
regions = ['東', '西', '南', '北']
data = {product: {region: np.random.normal(100, 20, 50) for region in regions} for product in products}

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

positions = range(1, len(products) * 4, 4)
colors = ['lightblue', 'lightgreen', 'lightpink', 'lightyellow']

for i, product in enumerate(products):
    product_data = [data[product][region] for region in regions]
    bp = ax.boxplot(product_data, positions=[p + i for p in positions], 
                    widths=0.6, patch_artist=True)

    for patch, color in zip(bp['boxes'], colors):
        patch.set_facecolor(color)

# グラフの設定
ax.set_title('製品別・地域別の売上比較', fontsize=16)
ax.set_ylabel('売上(万円)', fontsize=14)
ax.set_xticks([p + 1.5 for p in positions])
ax.set_xticklabels(products)
ax.legend([plt.Rectangle((0,0),1,1, fc=c) for c in colors], regions, loc='upper right')

plt.grid(True, axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

実行結果を見てみましょう。

# 実行結果の説明
# (ここにグループ化された箱ひげ図の画像が表示されるイメージです)

製品ごとに4つの地域の売上データが並んで表示されています。

色分けされているので、地域ごとの傾向が一目で分かります。

例えば、製品Aは東地域での売上が高いようです。

●外れ値の処理と表示

データ分析において、外れ値の扱いは非常に重要です。

外れ値は、データセットの中で他の値から大きく離れた値を指します。

箱ひげ図は外れ値を視覚的に表現するのに適した手法ですが、外れ値の扱い方によって分析結果が大きく変わる可能性があります。

○サンプルコード8:外れ値を含む箱ひげ図

まずは、外れ値を含んだ箱ひげ図を作成してみましょう。

外れ値を含めることで、データの全体像を把握できます。

import matplotlib.pyplot as plt
import numpy as np

# 外れ値を含むデータの生成
np.random.seed(42)
data = np.concatenate([
    np.random.normal(100, 15, 200),
    np.random.normal(100, 15, 10) + 100,  # 外れ値
    np.random.normal(100, 15, 5) - 100    # 外れ値
])

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot(data, whis=1.5)

# グラフの設定
plt.title('外れ値を含む箱ひげ図', fontsize=16)
plt.ylabel('値', fontsize=14)
plt.grid(True, axis='y', linestyle='--', alpha=0.7)

# グラフの表示
plt.show()

実行結果を見てみましょう。

# 実行結果の説明
# (ここに外れ値を含む箱ひげ図の画像が表示されるイメージです)

グラフを見ると、中央の箱から大きく離れた点が見られます。

外れ値は個別の点として表示されており、データセットの中に通常とは異なる値が存在することがわかります。

○サンプルコード9:外れ値を除外した箱ひげ図

次に、外れ値を除外した箱ひげ図を作成します。

外れ値を除外することで、データの中心的な傾向をより明確に把握できます。

import matplotlib.pyplot as plt
import numpy as np

# 外れ値を含むデータの生成
np.random.seed(42)
data = np.concatenate([
    np.random.normal(100, 15, 200),
    np.random.normal(100, 15, 10) + 100,  # 外れ値
    np.random.normal(100, 15, 5) - 100    # 外れ値
])

# 外れ値の除外
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
data_without_outliers = data[(data >= lower_bound) & (data <= upper_bound)]

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot(data_without_outliers)

# グラフの設定
plt.title('外れ値を除外した箱ひげ図', fontsize=16)
plt.ylabel('値', fontsize=14)
plt.grid(True, axis='y', linestyle='--', alpha=0.7)

# グラフの表示
plt.show()

実行結果を確認しましょう。

# 実行結果の説明
# (ここに外れ値を除外した箱ひげ図の画像が表示されるイメージです)

外れ値を除外したことで、データの中心的な分布がより明確になりました。

箱の範囲や中央値がより正確にデータの特徴を表現しています。

○外れ値の検出と除去の方法

外れ値の検出と除去は、データ分析において重要なステップです。

一般的な方法として、四分位範囲(IQR)を使用する方法があります。

  1. 四分位数(Q1, Q3)を計算します。
  2. IQR(四分位範囲)を計算します:IQR = Q3 – Q1
  3. 下限と上限を設定します:
    下限 = Q1 – 1.5 * IQR
    上限 = Q3 + 1.5 * IQR
  4. 下限未満または上限を超える値を外れ値とみなします。

Pythonでは、NumPyやPandasを使って簡単に外れ値の検出と除去ができます。

import numpy as np
import pandas as pd

# データの生成
np.random.seed(42)
data = np.concatenate([
    np.random.normal(100, 15, 200),
    np.random.normal(100, 15, 10) + 100,  # 外れ値
    np.random.normal(100, 15, 5) - 100    # 外れ値
])

# データフレームの作成
df = pd.DataFrame(data, columns=['値'])

# 四分位数の計算
Q1 = df['値'].quantile(0.25)
Q3 = df['値'].quantile(0.75)
IQR = Q3 - Q1

# 外れ値の除去
df_clean = df[(df['値'] >= Q1 - 1.5 * IQR) & (df['値'] <= Q3 + 1.5 * IQR)]

print(f"元のデータ数: {len(df)}")
print(f"外れ値を除いたデータ数: {len(df_clean)}")

実行結果を見てみましょう。

元のデータ数: 215
外れ値を除いたデータ数: 200

外れ値の処理方法を学ぶことで、データの特性をより正確に把握し、適切な分析を行うことができます。

ただし、外れ値の扱いには注意が必要です。

場合によっては、外れ値こそが重要な情報を含んでいることもあるため、安易に除外せず、データの性質や分析の目的に応じて適切に判断することが大切です。

●データフレームを使った箱ひげ図の作成

実際のデータ分析では、多くの場合、データフレームの形式でデータを扱います。

Pythonの代表的なデータ分析ライブラリであるPandasを使用して、データフレームから直接箱ひげ図を作成する方法を学びましょう。

○サンプルコード10:Pandasデータフレームから箱ひげ図を作成

Pandasを使うと、複雑なデータ構造からも簡単に箱ひげ図を作成できます。

例えば、複数の製品の売上データを地域別に比較する場合を考えてみましょう。

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

# データフレームの作成
np.random.seed(42)
data = {
    '製品': ['A', 'B', 'C'] * 100,
    '地域': ['東', '西', '南', '北'] * 75,
    '売上': np.random.randint(50, 150, 300)
}
df = pd.DataFrame(data)

# seabornのスタイル設定
sns.set_style("whitegrid")

# 箱ひげ図の作成
plt.figure(figsize=(12, 6))
sns.boxplot(x='製品', y='売上', hue='地域', data=df, palette='Set3')

# グラフの設定
plt.title('製品別・地域別の売上分布', fontsize=16)
plt.xlabel('製品', fontsize=14)
plt.ylabel('売上(万円)', fontsize=14)

# 凡例の位置調整
plt.legend(title='地域', bbox_to_anchor=(1.05, 1), loc='upper left')

# グラフの表示
plt.tight_layout()
plt.show()

実行結果を確認しましょう。

# 実行結果の説明
# (ここにPandasデータフレームから作成した箱ひげ図の画像が表示されるイメージです)

このグラフでは、3つの製品(A, B, C)の売上データを4つの地域(東、西、南、北)ごとに比較しています。

各製品について4つの箱ひげ図が並んでおり、色分けされているので地域ごとの傾向が一目で分かります。

Pandasデータフレームを使用することで、複雑なデータ構造からも簡単に箱ひげ図を作成できます。

データの整理や前処理もPandasの機能を使って効率的に行えるため、実際のデータ分析作業でとても役立ちます。

例えば、特定の条件でデータをフィルタリングしたり、グループ化して集計したりすることも簡単です。

# 売上が100万円以上のデータのみを抽出
high_sales = df[df['売上'] >= 100]

# 製品と地域でグループ化し、平均売上を計算
avg_sales = df.groupby(['製品', '地域'])['売上'].mean().reset_index()

print(high_sales.head())
print("\n平均売上:")
print(avg_sales)

データフレームを使いこなすことで、データの前処理から可視化まで一貫して効率的に行うことができます。

箱ひげ図は、複数の変数間の関係や分布の違いを簡潔に表現できるため、データフレームと組み合わせることで、より深い洞察を得ることができるでしょう。

●箱ひげ図が表示されない!よくあるトラブルと解決法

Pythonで箱ひげ図を作成しようとしたものの、うまく表示されないことがあります。慌てないでください。

多くの場合、簡単に解決できる問題です。よくあるトラブルとその対処法を見ていきましょう。

○データ型の問題と対処法

箱ひげ図が表示されない原因の一つに、データ型の不一致があります。

数値データを期待しているのに、文字列型のデータが混ざっていると、エラーが発生したり、グラフが正しく描画されなかったりします。

例えば、CSVファイルからデータを読み込む際、数値が文字列として認識されることがあります。

解決策として、データ型を明示的に変換する方法があります。

import pandas as pd
import matplotlib.pyplot as plt

# CSVファイルからデータを読み込む
df = pd.read_csv('data.csv')

# 数値型に変換
df['value'] = pd.to_numeric(df['value'], errors='coerce')

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot(df['value'].dropna())
plt.title('データ型を修正した箱ひげ図')
plt.show()

pd.to_numeric()関数を使用すると、文字列を数値に変換できます。

errors=’coerce’オプションを指定すると、変換できない値はNaNに置き換えられます。

その後、dropna()メソッドでNaN値を除外してグラフを描画します。

○軸の設定ミスと修正方法

軸の設定を間違えると、箱ひげ図が正しく表示されないことがあります。

特に、x軸とy軸を逆に指定してしまうと、予想外の結果になることも。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
data = np.random.randn(100)

# 誤った軸設定
plt.figure(figsize=(10, 6))
plt.boxplot(data, vert=False)  # 水平方向の箱ひげ図
plt.title('軸設定ミスの例')
plt.show()

# 正しい軸設定
plt.figure(figsize=(10, 6))
plt.boxplot(data, vert=True)  # 垂直方向の箱ひげ図
plt.title('正しい軸設定の例')
plt.show()

vert=Trueを指定すると垂直方向の箱ひげ図が、vert=Falseを指定すると水平方向の箱ひげ図が描画されます。

目的に応じて適切な設定を選びましょう。

○ライブラリのバージョン互換性issues

時として、ライブラリのバージョンの不一致が問題を引き起こすことがあります。

特に、MatplotlibとPandasのバージョンが合っていないと、箱ひげ図が正しく表示されないケースがあります。

解決策として、ライブラリのバージョンを確認し、必要に応じてアップデートすることをおすすめします。

import matplotlib
import pandas as pd
import seaborn as sns

print(f"Matplotlib version: {matplotlib.__version__}")
print(f"Pandas version: {pd.__version__}")
print(f"Seaborn version: {sns.__version__}")

バージョンを確認した後、必要に応じて以下のコマンドでライブラリをアップデートしましょう。

pip install --upgrade matplotlib pandas seaborn

ライブラリをアップデートしたら、再度箱ひげ図の作成を試みてください。

多くの場合、問題が解決するはずです。

●箱ひげ図の応用例と実践的なテクニック

箱ひげ図の基本を押さえたら、より高度な応用例に挑戦してみましょう。

実際のデータ分析シーンで役立つ実践的なテクニックを紹介します。

○時系列データの可視化

箱ひげ図は、時系列データの傾向を把握するのにも適しています。

例えば、月ごとの売上データを箱ひげ図で表現してみましょう。

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

# データの生成
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
sales = np.random.randint(100, 1000, size=len(dates)) + np.sin(np.arange(len(dates)) * 2 * np.pi / 365) * 300
df = pd.DataFrame({'date': dates, 'sales': sales})
df['month'] = df['date'].dt.strftime('%B')

# 箱ひげ図の作成
plt.figure(figsize=(12, 6))
sns.boxplot(x='month', y='sales', data=df, order=pd.date_range(start='2023-01-01', periods=12, freq='M').strftime('%B'))

plt.title('月別売上の分布', fontsize=16)
plt.xlabel('月', fontsize=14)
plt.ylabel('売上', fontsize=14)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

実行結果を見ると、月ごとの売上の分布がわかりやすく表示されています。

季節性や特定の月の異常値なども一目瞭然です。

○カテゴリカルデータの比較

箱ひげ図は、カテゴリカルデータの比較にも有効です。

例えば、異なる部門の給与分布を比較してみましょう。

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

# データの生成
np.random.seed(42)
departments = ['営業', '技術', '人事', '経理', 'マーケティング']
data = []
for dept in departments:
    salaries = np.random.normal(loc=50000 + np.random.randint(0, 20000), scale=10000, size=100)
    data.extend([(dept, salary) for salary in salaries])

df = pd.DataFrame(data, columns=['部門', '給与'])

# 箱ひげ図の作成
plt.figure(figsize=(12, 6))
sns.boxplot(x='部門', y='給与', data=df)

plt.title('部門別給与分布', fontsize=16)
plt.xlabel('部門', fontsize=14)
plt.ylabel('給与(円)', fontsize=14)
plt.tight_layout()
plt.show()

出力されたグラフを見ると、各部門の給与分布が一目でわかります。

中央値、四分位数、外れ値など、多くの情報が一つの図で表現されています。

○大規模データセットの効率的な可視化

大規模なデータセットを扱う場合、全てのデータポイントを表示すると処理に時間がかかったり、グラフが見にくくなったりします。

そんな時は、データをサンプリングしたり、バイオリンプロットを組み合わせたりするテクニックが有効です。

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

# 大規模データセットの生成
np.random.seed(42)
n_samples = 1000000
data = pd.DataFrame({
    'group': np.random.choice(['A', 'B', 'C', 'D'], n_samples),
    'value': np.concatenate([
        np.random.normal(100, 10, n_samples // 2),
        np.random.normal(200, 20, n_samples // 2)
    ])
})

# データのサンプリングと可視化
sampled_data = data.sample(n=10000)

plt.figure(figsize=(12, 6))
sns.violinplot(x='group', y='value', data=sampled_data, inner='box', cut=0)

plt.title('大規模データセットの分布(バイオリンプロット + 箱ひげ図)', fontsize=16)
plt.xlabel('グループ', fontsize=14)
plt.ylabel('値', fontsize=14)
plt.tight_layout()
plt.show()

バイオリンプロットと箱ひげ図を組み合わせることで、データの分布形状と代表値を同時に表現できます。

大規模データセットの特徴を効率的に可視化する強力な手法です。

●Pythonの箱ひげ図ライブラリ比較

Pythonで箱ひげ図を作成する際、複数のライブラリから選択できます。

主要なライブラリとして、Matplotlib、Seaborn、Plotlyが挙げられます。各ライブラリには特徴があり、用途に応じて使い分けることが重要です。

ライブラリの選択は、作成するグラフの複雑さ、必要な機能、実行環境などによって決まります。

○Matplotlib vs Seaborn vs Plotly

Matplotlibは、Pythonのデータ可視化の基礎となるライブラリです。

高度にカスタマイズ可能で、柔軟性が高いのが特徴です。

一方で、初心者にとっては複雑に感じることもあります。

Seabornは、Matplotlibをベースにした統計データ可視化ライブラリです。

デフォルトで美しいスタイルが適用され、少ないコード量で洗練されたグラフを作成できます。

統計関数が組み込まれているため、データ分析に特に適しています。

Plotlyは、インタラクティブなグラフを作成できるライブラリです。

ウェブベースの可視化に適しており、ズームやホバー機能など、動的な要素を簡単に追加できます。

それぞれのライブラリを使用して、同じデータから箱ひげ図を作成してみましょう。

Matplotlibの例

import 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)]

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
plt.boxplot(data)
plt.title('Matplotlibでの箱ひげ図')
plt.show()

Seabornの例

import seaborn as sns
import 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)]

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
sns.boxplot(data=data)
plt.title('Seabornでの箱ひげ図')
plt.show()

Plotlyの例

import plotly.graph_objects as go
import numpy as np

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

# 箱ひげ図の作成
fig = go.Figure()
for i, d in enumerate(data):
    fig.add_trace(go.Box(y=d, name=f'Group {i+1}'))

fig.update_layout(title_text='Plotlyでの箱ひげ図')
fig.show()

各ライブラリで作成した箱ひげ図を比較すると、見た目や機能に違いがあることがわかります。

Matplotlibは最もシンプルな見た目ですが、細かいカスタマイズが可能です。

Seabornはデフォルトで美しいデザインが適用されています。

Plotlyは軽量なアニメーションとインタラクティブ機能が特徴です。

○各ライブラリの特徴と使い分け

Matplotlibは、細かい調整が必要な場合や、特殊なグラフを作成する場合に適しています。

研究論文や技術レポートなど、高度にカスタマイズされたグラフが必要な場合に選択されることが多いです。

import 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))
bplot = ax.boxplot(data, patch_artist=True)

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

# タイトルと軸ラベルの設定
ax.set_title('カスタマイズしたMatplotlibの箱ひげ図', fontsize=16)
ax.set_xlabel('グループ', fontsize=14)
ax.set_ylabel('値', fontsize=14)

plt.show()

Seabornは、統計データの可視化に特化しています。

データフレームを直接扱えるため、Pandasと組み合わせた使用が多いです。

短いコードで美しいグラフを作成でき、探索的データ分析(EDA)に適しています。

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

# データの生成
np.random.seed(42)
data = pd.DataFrame({
    'group': np.repeat(['A', 'B', 'C'], 100),
    'value': np.concatenate([np.random.normal(0, std, 100) for std in range(1, 4)])
})

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
sns.boxplot(x='group', y='value', data=data, palette='Set3')
plt.title('Seabornを使った箱ひげ図(データフレーム使用)', fontsize=16)
plt.xlabel('グループ', fontsize=14)
plt.ylabel('値', fontsize=14)
plt.show()

Plotlyは、ウェブアプリケーションやダッシュボードでの使用に適しています。

インタラクティブな要素が必要な場合や、データを動的に探索したい場合に選ばれます。

import plotly.express as px
import pandas as pd
import numpy as np

# データの生成
np.random.seed(42)
data = pd.DataFrame({
    'group': np.repeat(['A', 'B', 'C'], 100),
    'value': np.concatenate([np.random.normal(0, std, 100) for std in range(1, 4)])
})

# インタラクティブな箱ひげ図の作成
fig = px.box(data, x='group', y='value', title='Plotlyを使ったインタラクティブな箱ひげ図')
fig.show()

各ライブラリの特徴を理解し、目的に応じて適切なライブラリを選択することが重要です。

Matplotlibは細かい制御が必要な場合に、Seabornは素早く美しいグラフを作成したい場合に、Plotlyはインタラクティブな要素が必要な場合に使用するのが良いでしょう。

まとめ

Pythonを使用した箱ひげ図の作成と活用について、幅広く深く探究しました。

箱ひげ図は、データの分布や外れ値を効果的に可視化する手法として、データ分析や統計学の分野で重要な役割を果たしています。

本記事が、皆様のデータ可視化スキル向上の参考となれば幸いです。