📋 このステップで学ぶこと
- boxplot()(箱ひげ図)でデータの分布を比較
- violinplot()(バイオリン図)で密度を可視化
- swarmplot()(スウォームプロット)で全データ点を表示
- barplot()(棒グラフ)で平均値を比較
- countplot()でカテゴリの頻度を集計
- 実践的なカテゴリカルデータ分析
📊 1. カテゴリカルデータとは
カテゴリカルデータの基本概念
カテゴリカルデータとは、グループや区分を表すデータのことです。数値ではなく、「何に属するか」を示します。
例えば、「性別(男性/女性)」「曜日(月〜日)」「血液型(A/B/O/AB)」などがカテゴリカルデータです。これらのデータを可視化することで、グループ間の違いを比較できます。
📦 カテゴリカルデータの2つの種類
| 種類 |
特徴 |
具体例 |
| 名義尺度 |
順序がない(どれが上/下ではない) |
性別、色、地域、血液型 |
| 順序尺度 |
順序がある(大小・優劣がある) |
学年、満足度(低/中/高)、サイズ(S/M/L) |
カテゴリカルデータの可視化パターン
カテゴリカルデータを可視化する目的は、グループ間の違いを比較することです。何を見たいかによって、使うグラフが変わります。
【カテゴリカルデータの可視化パターン】
カテゴリ × 数値データ の分析
↓
┌─────────────────────────────────────────┐
│ 何を見たいか? │
├─────────────────────────────────────────┤
│ ・平均値を比較したい → 棒グラフ │
│ ・分布全体を比較したい → 箱ひげ図 │
│ ・分布の形を見たい → バイオリン図 │
│ ・全データ点を見たい → スウォームプロット│
│ ・件数を集計したい → カウントプロット │
└─────────────────────────────────────────┘
💡 このステップで使うサンプルデータ
Seabornに内蔵されているtipsデータセットを使います。これはレストランでのチップに関するデータです。
- total_bill:食事代(ドル)
- tip:チップ(ドル)
- sex:性別(Male/Female)
- day:曜日(Thur/Fri/Sat/Sun)
- time:時間帯(Lunch/Dinner)
- size:人数
📦 2. boxplot()(箱ひげ図)
箱ひげ図とは何か
箱ひげ図(Box Plot)は、データの分布を5つの統計値で表現するグラフです。中央値、四分位数、そして外れ値を一目で把握できます。
箱ひげ図は特に外れ値(異常値)の発見に優れています。複数のグループのデータ分布を並べて比較するのに最適です。
📊 箱ひげ図の読み方
箱ひげ図は5つの統計値で構成されています。図と一緒に理解しましょう。
【箱ひげ図の構造】
○ ← 外れ値(ひげの範囲外のデータ)
│
┬ ← 最大値(ひげの上端)
│ ※外れ値を除いた最大値
│
┌──┴──┐
│ │ ← 第3四分位数(Q3):上位25%の境界
│ │
───┼─────┤ ← 中央値(Median):データの真ん中
│ │
│ │ ← 第1四分位数(Q1):下位25%の境界
└──┬──┘
│
┴ ← 最小値(ひげの下端)
│ ※外れ値を除いた最小値
○ ← 外れ値
【各部分の意味】
・箱(Box):データの50%が含まれる範囲(Q1〜Q3)
・箱の中の線:中央値(平均値ではない!)
・ひげ(Whisker):外れ値を除いた最小・最大値
・点(○):外れ値(通常、Q1-1.5×IQR 以下 または Q3+1.5×IQR 以上)
※IQR = Q3 – Q1(四分位範囲)
基本的な箱ひげ図の作成
まず、シンプルな箱ひげ図を作成してみましょう。曜日別にチップの分布を比較します。
📝 コードの流れ
- SeabornとMatplotlibをインポート
- スタイルとカラーパレットを設定
- tipsデータを読み込み
- boxplot()でグラフを作成
- タイトルやラベルを設定
# ステップ1: ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# ステップ2: スタイル設定
sns.set_style(‘whitegrid’) # 背景に白いグリッド線
sns.set_palette(‘colorblind’) # 色覚バリアフリーの色
# ステップ3: データ読み込み
tips = sns.load_dataset(‘tips’)
# ステップ4: 箱ひげ図を作成
plt.figure(figsize=(12, 6))
sns.boxplot(
data=tips, # データフレーム
x=’day’, # X軸:曜日(カテゴリ)
y=’tip’ # Y軸:チップ(数値)
)
# ステップ5: グラフの装飾
plt.title(‘曜日別チップの分布(箱ひげ図)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.tight_layout()
plt.show()
💡 コードの各行の解説
| コード |
何をしているか |
なぜ必要か |
sns.set_style('whitegrid') |
白いグリッド線の背景を設定 |
値を読み取りやすくするため |
sns.set_palette('colorblind') |
色覚バリアフリーの配色を設定 |
誰にでも見やすいグラフにするため |
sns.load_dataset('tips') |
Seaborn内蔵のtipsデータを読み込み |
練習用のサンプルデータを使うため |
data=tips |
使用するデータフレームを指定 |
どのデータを可視化するか伝えるため |
x='day', y='tip' |
X軸にカテゴリ、Y軸に数値を指定 |
曜日ごとにチップの分布を見るため |
hueで色分け(グループ化)
hueパラメータを使うと、さらに別のカテゴリで色分けできます。例えば、曜日別に加えて性別でも分けてみましょう。
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 曜日×性別のクロス集計(hueで色分け)
plt.figure(figsize=(12, 6))
sns.boxplot(
data=tips,
x=’day’, # X軸:曜日
y=’tip’, # Y軸:チップ
hue=’sex’ # 性別で色分け(Male=青系、Female=オレンジ系)
)
plt.title(‘曜日・性別別チップの分布’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.legend(title=’性別’, fontsize=10)
plt.tight_layout()
plt.show()
💡 箱ひげ図の使いどころ
| 場面 |
なぜ箱ひげ図が適切か |
| 外れ値の発見 |
異常なデータが点として明示的に表示される |
| 複数グループの比較 |
コンパクトなので多くのグループを並べられる |
| 中央値の比較 |
平均値より外れ値の影響を受けにくい |
| ばらつきの比較 |
箱の大きさでばらつきが一目でわかる |
🎻 3. violinplot()(バイオリン図)
バイオリン図とは何か
バイオリン図(Violin Plot)は、箱ひげ図にデータの密度(カーネル密度推定: KDE)を追加したものです。どこにデータが集中しているかが、形状でわかります。
箱ひげ図より情報量が多く、分布の形(山が1つか2つか、左右対称かなど)を視覚的に把握できます。
【バイオリン図のイメージ】
箱ひげ図: バイオリン図:
┬ ╭─╮
│ ╭─╯ ╰─╮
┌─┴─┐ ╭╯ ╰╮ ← 膨らんでいる部分 = データが多い
│ │ ╭╯ ╰╮
├───┤ → │ ─ │ ← 中央値(白い点など)
│ │ ╰╮ ╭╯
└─┬─┘ ╰╮ ╭╯ ← 細い部分 = データが少ない
│ ╰─╮ ╭─╯
┴ ╰─╯
【特徴】
・膨らんでいる部分:データが多い(密度が高い)
・細い部分:データが少ない(密度が低い)
・全体の形状から分布の特徴がわかる
基本的なバイオリン図の作成
箱ひげ図と同じデータでバイオリン図を作成してみましょう。
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# バイオリン図を作成
plt.figure(figsize=(12, 6))
sns.violinplot(
data=tips,
x=’day’, # X軸:曜日
y=’tip’ # Y軸:チップ
)
plt.title(‘曜日別チップの分布(バイオリン図)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.tight_layout()
plt.show()
分割バイオリン図(split=True)
split=Trueを使うと、1つのバイオリンを左右に分割して2つのグループを比較できます。これは2グループ(例:男女)の比較に最適です。
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 分割バイオリン図(左右に分けて比較)
plt.figure(figsize=(12, 6))
sns.violinplot(
data=tips,
x=’day’, # X軸:曜日
y=’tip’, # Y軸:チップ
hue=’sex’, # 性別で色分け
split=True # 左右に分割して表示
)
plt.title(‘曜日・性別別チップの分布(分割バイオリン図)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.legend(title=’性別’, fontsize=10)
plt.tight_layout()
plt.show()
innerパラメータでカスタマイズ
innerパラメータを使うと、バイオリンの内部に表示する情報を変更できます。
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# バイオリン図の中に箱ひげ図を表示
plt.figure(figsize=(12, 6))
sns.violinplot(
data=tips,
x=’day’,
y=’tip’,
inner=’box’ # 内部に箱ひげ図を表示(推奨)
)
plt.title(‘曜日別チップの分布(バイオリン+箱ひげ)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.tight_layout()
plt.show()
🎻 innerパラメータの選択肢
| 値 |
表示内容 |
おすすめ場面 |
inner='box' |
小さな箱ひげ図を表示 |
分布と統計値を両方見たい(推奨) |
inner='quartile' |
四分位数の線のみ表示 |
シンプルに四分位だけ見たい |
inner='point' |
個別のデータ点を表示 |
データ数が少ない場合 |
inner=None |
バイオリンの形状のみ |
分布の形だけを見たい |
🐝 4. swarmplot()(スウォームプロット)
スウォームプロットとは何か
スウォームプロット(Swarm Plot)は、すべてのデータ点を重ならないように配置するグラフです。名前の由来は、点が蜂の群れ(swarm)のように広がる様子からきています。
箱ひげ図やバイオリン図では見えない「個々のデータ点」を確認したい場合に使います。ただし、データ数が多すぎると重くなるので注意が必要です。
基本的なスウォームプロット
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# スウォームプロットを作成
plt.figure(figsize=(12, 6))
sns.swarmplot(
data=tips,
x=’day’, # X軸:曜日
y=’tip’, # Y軸:チップ
size=5 # データ点のサイズ
)
plt.title(‘曜日別チップ(全データ点表示)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.tight_layout()
plt.show()
バイオリン図と重ねて表示
スウォームプロットは単独で使うよりも、箱ひげ図やバイオリン図と重ねて使うと効果的です。分布の形状と個々のデータ点を同時に確認できます。
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# バイオリン図とスウォームプロットを重ねる
plt.figure(figsize=(12, 6))
# 背景: バイオリン図(薄いグレーで目立たなくする)
sns.violinplot(
data=tips,
x=’day’,
y=’tip’,
color=’lightgray’, # グレーに設定
alpha=0.5 # 半透明に
)
# 前面: スウォームプロット(色分けして目立たせる)
sns.swarmplot(
data=tips,
x=’day’,
y=’tip’,
hue=’sex’, # 性別で色分け
size=4 # 少し小さめに
)
plt.title(‘曜日別チップ(バイオリン+スウォーム)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.legend(title=’性別’, fontsize=10)
plt.tight_layout()
plt.show()
⚠️ スウォームプロットの注意点
| 注意点 |
詳細 |
対策 |
| データ数の制限 |
1000点以上あると処理が重くなる |
サンプリング(.sample(n=500))を使う |
| 重なりの警告 |
点が多いと警告が出ることがある |
stripplot()やkdeplotを検討 |
| 見た目の調整 |
sizeが大きいと重なりやすい |
size=3〜5程度が適切 |
📊 5. barplot()(棒グラフ)
Seabornのbarplot()の特徴
Seabornのbarplot()は、MatplotlibのものとPは異なり、平均値を自動計算し、信頼区間(エラーバー)も表示します。
データフレームを渡すだけで、グループごとの平均値と統計的な信頼性を同時に示せるため、非常に便利です。
基本的な棒グラフ
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 曜日別の平均チップを自動計算して表示
plt.figure(figsize=(12, 6))
sns.barplot(
data=tips,
x=’day’, # X軸:曜日
y=’tip’, # Y軸:チップ(自動で平均値を計算)
errorbar=’ci’ # 95%信頼区間を表示(デフォルト)
)
plt.title(‘曜日別平均チップ(95%信頼区間付き)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘平均チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.tight_layout()
plt.show()
💡 信頼区間(エラーバー)とは
棒の上に表示される縦線は95%信頼区間です。「真の平均値がこの範囲にある確率が95%」という意味です。
- エラーバーが長い:データのばらつきが大きい、または件数が少ない
- エラーバーが短い:データが安定している、または件数が多い
- エラーバーが重なっている:グループ間に統計的な差がない可能性
性別で色分け
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 曜日×性別の平均チップ
plt.figure(figsize=(12, 6))
sns.barplot(
data=tips,
x=’day’, # X軸:曜日
y=’tip’, # Y軸:チップ(平均値)
hue=’sex’ # 性別で色分け
)
plt.title(‘曜日・性別別の平均チップ’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘平均チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.legend(title=’性別’, fontsize=10)
plt.tight_layout()
plt.show()
水平棒グラフ
xとyを入れ替えると、水平方向の棒グラフになります。カテゴリ名が長い場合に便利です。
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 水平棒グラフ(xとyを入れ替え)
plt.figure(figsize=(10, 6))
sns.barplot(
data=tips,
y=’day’, # Y軸に曜日(カテゴリ)
x=’tip’, # X軸にチップ(数値)
orient=’h’ # 水平方向を明示(オプション)
)
plt.title(‘曜日別平均チップ(水平棒グラフ)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.ylabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.xlabel(‘平均チップ(ドル)’, fontsize=12, fontweight=’bold’)
plt.tight_layout()
plt.show()
📈 6. countplot()(頻度集計)
countplot()とは何か
countplot()は、カテゴリの出現回数(頻度)を自動で集計して棒グラフで表示します。barplot()との違いは、countplot()は「件数」を、barplot()は「平均値」を表示することです。
データの偏り(例:曜日ごとのデータ件数の違い)を確認するのに便利です。
基本的なカウントプロット
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 曜日別のデータ件数を自動集計
plt.figure(figsize=(12, 6))
sns.countplot(
data=tips,
x=’day’ # X軸:曜日(自動で件数を集計)
)
plt.title(‘曜日別のデータ件数’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘件数’, fontsize=12, fontweight=’bold’)
plt.tight_layout()
plt.show()
性別で色分け
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 曜日×性別のクロス集計
plt.figure(figsize=(12, 6))
sns.countplot(
data=tips,
x=’day’, # X軸:曜日
hue=’sex’ # 性別で色分け
)
plt.title(‘曜日・性別別のデータ件数’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12, fontweight=’bold’)
plt.ylabel(‘件数’, fontsize=12, fontweight=’bold’)
plt.legend(title=’性別’, fontsize=10)
plt.tight_layout()
plt.show()
💡 countplot() vs barplot() の違い
| 項目 |
countplot() |
barplot() |
| 表示する値 |
データの件数(頻度) |
数値の平均値 |
| y引数 |
不要(自動で件数を集計) |
必要(平均を計算する列) |
| エラーバー |
なし |
あり(信頼区間) |
| 使用場面 |
データの偏りを確認 |
グループの平均を比較 |
🎯 7. 実践例:4つのグラフを比較
同じデータを4つの方法で可視化
同じデータを異なるグラフで表現し、それぞれの特徴を比較してみましょう。2×2のレイアウトで4つのグラフを並べます。
# ライブラリをインポート
import seaborn as sns
import matplotlib.pyplot as plt
# データ読み込み
tips = sns.load_dataset(‘tips’)
# スタイル設定
sns.set_style(‘whitegrid’)
sns.set_palette(‘Set2′)
# 2×2のレイアウトでグラフを作成
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
# ===== 1. 箱ひげ図(左上)=====
sns.boxplot(
data=tips,
x=’day’,
y=’tip’,
hue=’sex’,
ax=axes[0, 0] # 左上に配置
)
axes[0, 0].set_title(‘箱ひげ図(分布の比較)’,
fontsize=14, fontweight=’bold’)
axes[0, 0].set_xlabel(‘曜日’, fontsize=11)
axes[0, 0].set_ylabel(‘チップ(ドル)’, fontsize=11)
axes[0, 0].legend(title=’性別’, fontsize=9)
# ===== 2. バイオリン図(右上)=====
sns.violinplot(
data=tips,
x=’day’,
y=’tip’,
hue=’sex’,
split=True, # 左右に分割
ax=axes[0, 1] # 右上に配置
)
axes[0, 1].set_title(‘バイオリン図(密度の可視化)’,
fontsize=14, fontweight=’bold’)
axes[0, 1].set_xlabel(‘曜日’, fontsize=11)
axes[0, 1].set_ylabel(‘チップ(ドル)’, fontsize=11)
axes[0, 1].legend(title=’性別’, fontsize=9)
# ===== 3. 棒グラフ(左下)=====
sns.barplot(
data=tips,
x=’day’,
y=’tip’,
hue=’sex’,
ax=axes[1, 0] # 左下に配置
)
axes[1, 0].set_title(‘棒グラフ(平均値の比較)’,
fontsize=14, fontweight=’bold’)
axes[1, 0].set_xlabel(‘曜日’, fontsize=11)
axes[1, 0].set_ylabel(‘平均チップ(ドル)’, fontsize=11)
axes[1, 0].legend(title=’性別’, fontsize=9)
# ===== 4. カウントプロット(右下)=====
sns.countplot(
data=tips,
x=’day’,
hue=’sex’,
ax=axes[1, 1] # 右下に配置
)
axes[1, 1].set_title(‘カウントプロット(件数の集計)’,
fontsize=14, fontweight=’bold’)
axes[1, 1].set_xlabel(‘曜日’, fontsize=11)
axes[1, 1].set_ylabel(‘件数’, fontsize=11)
axes[1, 1].legend(title=’性別’, fontsize=9)
# 全体のタイトル
plt.suptitle(‘📊 カテゴリカルデータ可視化の4つの方法’,
fontsize=18, fontweight=’bold’, y=0.995)
# レイアウト調整
plt.tight_layout()
# 保存
plt.savefig(‘categorical_comparison.png’, dpi=300, bbox_inches=’tight’)
plt.show()
📊 グラフの使い分け早見表
| グラフ |
見せたい情報 |
特徴 |
おすすめ場面 |
| 箱ひげ図 |
分布、外れ値 |
5つの統計値を表示 |
異常値の発見、分布の比較 |
| バイオリン図 |
分布の形状 |
密度(KDE)を可視化 |
分布の詳細な比較、見栄えの良いプレゼン |
| スウォーム |
全データ点 |
すべての点を表示 |
少量データの詳細確認 |
| 棒グラフ |
平均値 |
信頼区間も表示 |
グループ間の平均比較 |
| カウント |
頻度、件数 |
件数を自動集計 |
データの偏りを確認 |
📝 STEP 17 のまとめ
✅ このステップで学んだこと
| トピック |
重要ポイント |
| カテゴリカルデータ |
グループや区分を表すデータ。比較が目的 |
| boxplot() |
箱ひげ図。分布と外れ値を確認 |
| violinplot() |
バイオリン図。密度(分布の形)を可視化 |
| swarmplot() |
全データ点を重ならず表示 |
| barplot() |
平均値と信頼区間を自動計算 |
| countplot() |
頻度(件数)を自動集計 |
| hue引数 |
別のカテゴリで色分けできる |
💡 最重要ポイント
カテゴリカルデータの可視化では、見せたい情報に応じてグラフを選択することが重要です。
- 分布全体を見たい → 箱ひげ図 / バイオリン図
- 平均値を比較したい → 棒グラフ
- データ件数を確認したい → カウントプロット
- 個別のデータ点を見たい → スウォームプロット
次のステップでは、インタラクティブなグラフを作成できるPlotlyを学びます!
📝 実践演習
演習 1
基礎
tipsデータで、曜日別のチップの箱ひげ図を作成してください。
【解答コード】
import seaborn as sns
import matplotlib.pyplot as plt
# スタイル設定
sns.set_style(‘whitegrid’)
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 箱ひげ図を作成
plt.figure(figsize=(12, 6))
sns.boxplot(data=tips, x=’day’, y=’tip’)
plt.title(‘曜日別チップの箱ひげ図’, fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12)
plt.ylabel(‘チップ(ドル)’, fontsize=12)
plt.tight_layout()
plt.show()
ポイント:x=’day’でカテゴリ(曜日)、y=’tip’で数値(チップ)を指定します。
演習 2
応用
tipsデータで、曜日・性別別のチップの分割バイオリン図を作成してください。
【解答コード】
import seaborn as sns
import matplotlib.pyplot as plt
# スタイル設定
sns.set_style(‘whitegrid’)
# データ読み込み
tips = sns.load_dataset(‘tips’)
# 分割バイオリン図を作成
plt.figure(figsize=(12, 6))
sns.violinplot(
data=tips,
x=’day’,
y=’tip’,
hue=’sex’,
split=True # 左右に分割
)
plt.title(‘曜日・性別別チップ(分割バイオリン図)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12)
plt.ylabel(‘チップ(ドル)’, fontsize=12)
plt.legend(title=’性別’, fontsize=10)
plt.tight_layout()
plt.show()
ポイント:split=Trueで男女を左右に分割表示。hue=’sex’で性別を色分けしています。
演習 3
発展
tipsデータで、バイオリン図とスウォームプロットを重ねたグラフを作成してください。
【解答コード】
import seaborn as sns
import matplotlib.pyplot as plt
# スタイル設定
sns.set_style(‘whitegrid’)
# データ読み込み
tips = sns.load_dataset(‘tips’)
# グラフ作成
plt.figure(figsize=(12, 6))
# 背景: バイオリン図(薄いグレー)
sns.violinplot(
data=tips,
x=’day’,
y=’tip’,
color=’lightgray’, # グレーに設定
alpha=0.5 # 半透明に
)
# 前面: スウォームプロット(色分け)
sns.swarmplot(
data=tips,
x=’day’,
y=’tip’,
hue=’sex’, # 性別で色分け
size=4 # 点のサイズ
)
plt.title(‘曜日別チップ(バイオリン+スウォーム)’,
fontsize=16, fontweight=’bold’, pad=15)
plt.xlabel(‘曜日’, fontsize=12)
plt.ylabel(‘チップ(ドル)’, fontsize=12)
plt.legend(title=’性別’, fontsize=10)
plt.tight_layout()
plt.show()
ポイント:先にviolinplot()、次にswarmplot()の順で描画すると、バイオリンが背景になります。バイオリンは薄くして(alpha=0.5)、スウォームを目立たせています。
❓ よくある質問
Q1: 箱ひげ図とバイオリン図はどちらを使うべきですか?
目的で使い分けましょう。外れ値を強調したい場合は箱ひげ図、分布の形状を詳しく見たい場合はバイオリン図がおすすめです。プレゼンでは見た目が美しいバイオリン図、統計レポートでは標準的な箱ひげ図が好まれる傾向があります。
Q2: barplot()の信頼区間(エラーバー)が長すぎます。どうすればいいですか?
これはデータのばらつきが大きいことを示しています。信頼区間を短くしたい場合は、errorbar=’se’(標準誤差)を使うか、errorbar=Noneで非表示にできます。ただし、データの実態を正しく伝えるためには表示を推奨します。ばらつきが大きいこと自体が重要な情報だからです。
Q3: スウォームプロットが重くて動きません。どうすればいいですか?
データ数が多すぎる可能性があります。1000点以上あると処理が重くなるので、サンプリング(例:tips.sample(n=500))で点を減らすか、stripplot()を使いましょう。または、hexbinやkdeplotで密度を表現する方法もあります。
Q4: hueで色分けしたとき、凡例が邪魔です。移動できますか?
plt.legend()のloc引数で位置を調整できます。例えば、plt.legend(loc=’upper right’)で右上、plt.legend(bbox_to_anchor=(1.05, 1))でグラフの外側に配置できます。凡例を非表示にしたい場合はplt.legend([])を使います。
Q5: 複数のグラフを重ねたいとき、描画の順序は重要ですか?
はい、重要です。先に描画したグラフが背景、後に描画したグラフが前面になります。例えば、バイオリン図を背景、スウォームプロットを前面にしたい場合は、violinplot()を先に、swarmplot()を後に書きます。
artnasekai
#artnasekai #学習メモ