seaborn について
Seabornは、データ探索や整った統計グラフの作成に使うPythonライブラリです。データセット中心の描画や統計推定を備え、関数型と宣言型のAPIを提供し、matplotlibとも連携します。
主な機能
- 01変数間の関係と分布の描画
- 02カテゴリーデータの比較
- 03回帰と残差の可視化
- 04ヒートマップとクラスターマップの作成
- 05ファセット付き複数パネル図の作成
- 06関数型・宣言型APIの利用
活用シーン
- 01変数間の関係を探索
- 02カテゴリー間の分布を比較
- 03ヒートマップで相関を表示
- 04複数パネルの統計図を作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crazymsn/ academic-skills --skill seabornインストール後、Claude Code で/seabornを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/examples.mdfunction_reference.mdobjects_interface.md詳細
Seaborn 統計的可視化
概要
Seaborn は、出版品質の統計グラフィックを作成するための Python 可視化ライブラリです。データセット指向のプロット、多変量解析、自動的な統計推定、そして複雑な複数パネルの図を最小限のコードで作成したい場合にこのスキルを使用してください。
設計思想
Seaborn は以下の中核原則に従っています。
- データセット指向: 抽象的な座標ではなく、DataFrame と名前付き変数を直接扱います
- 意味的マッピング: データの値を自動的に視覚的属性(色、サイズ、スタイル)へ変換します
- 統計的認識: 集計、誤差推定、信頼区間が組み込まれています
- 美的なデフォルト: 出版に適したテーマとカラーパレットを標準で提供します
- Matplotlib 連携: 必要な場合は matplotlib のカスタマイズと完全に互換性があります
クイックスタート
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# Load example dataset
df = sns.load_dataset('tips')
# Create a simple visualization
sns.scatterplot(data=df, x='total_bill', y='tip', hue='day')
plt.show()
中核となるプロットインターフェース
関数インターフェース(従来型)
関数インターフェースは、可視化の種類ごとに整理された専用のプロット関数を提供します。各カテゴリには、軸レベルの関数(単一の軸にプロット)と、図レベルの関数(ファセットを用いて図全体を管理)があります。
使用する場面:
- 迅速な探索的分析
- 単一目的の可視化
- 特定のプロットタイプが必要な場合
オブジェクトインターフェース(モダン)
seaborn.objects インターフェースは、ggplot2 に似た宣言的で組み合わせ可能な API を提供します。メソッドを連結して、データマッピング、マーク、変換、スケールを指定することで可視化を構築します。
使用する場面:
- 複雑なレイヤー化された可視化
- 変換を細かく制御する必要がある場合
- カスタムのプロットタイプを構築する場合
- プログラムによるプロットの生成
from seaborn import objects as so
# Declarative syntax
(
so.Plot(data=df, x='total_bill', y='tip')
.add(so.Dot(), color='day')
.add(so.Line(), so.PolyFit())
)
カテゴリ別のプロット関数
リレーショナルプロット(変数間の関係)
用途: 2 つ以上の変数が互いにどのように関係しているかを調べる
scatterplot()- 個々の観測値を点として表示lineplot()- 傾向や変化を表示(自動的に集計し、CI を計算)relplot()- 自動ファセットを備えた図レベルのインターフェース
主なパラメータ:
x,y- 主要な変数hue- 追加のカテゴリ変数または連続変数を色でエンコードsize- 点や線のサイズによるエンコードstyle- マーカーや線のスタイルによるエンコードcol,row- 複数のサブプロットへファセット分割(図レベルのみ)
# Scatter with multiple semantic mappings
sns.scatterplot(data=df, x='total_bill', y='tip',
hue='time', size='size', style='sex')
# Line plot with confidence intervals
sns.lineplot(data=timeseries, x='date', y='value', hue='category')
# Faceted relational plot
sns.relplot(data=df, x='total_bill', y='tip',
col='time', row='sex', hue='smoker', kind='scatter')
分布プロット(単変量および二変量の分布)
用途: データの広がり、形状、確率密度を把握する
histplot()- 柔軟なビニングを備えた棒グラフ形式の度数分布kdeplot()- ガウスカーネルを用いた滑らかな密度推定ecdfplot()- 経験累積分布(調整するパラメータはなし)rugplot()- 個々の観測値を示す目盛り線displot()- 単変量および二変量の分布のための図レベルのインターフェースjointplot()- 周辺分布を備えた二変量プロットpairplot()- データセット全体にわたる two 変数の組み合わせの行列
主なパラメータ:
x,y- 変数(単変量の場合はyは省略可能)hue- カテゴリごとに分布を分けて表示stat- 正規化方法: "count", "frequency", "probability", "density"bins/binwidth- ヒストグラムのビニングの制御bw_adjust- KDE のバンド幅の倍率(大きいほど滑らか)fill- 曲線下の領域を塗りつぶすmultiple- hue の扱い方: "layer", "stack", "dodge", "fill"
# Histogram with density normalization
sns.histplot(data=df, x='total_bill', hue='time',
stat='density', multiple='stack')
# Bivariate KDE with contours
sns.kdeplot(data=df, x='total_bill', y='tip',
fill=True, levels=5, thresh=0.1)
# Joint plot with marginals
sns.jointplot(data=df, x='total_bill', y='tip',
kind='scatter', hue='time')
# Pairwise relationships
sns.pairplot(data=df, hue='species', corner=True)
カテゴリカルプロット(カテゴリ間の比較)
用途: 離散的なカテゴリ間で分布や統計量を比較する
カテゴリカル散布図:
stripplot()- ジッターを加えた点で全観測値を表示swarmplot()- 重ならない点(ビースウォームアルゴリズム)
分布の比較:
boxplot()- 四分位数と外れ値violinplot()- KDE と四分位情報boxenplot()- 大規模データセット向けの拡張ボックスプロット
統計的推定値:
barplot()- 平均値や集計値と信頼区間pointplot()- 推定値を結ぶ線付きの点countplot()- カテゴリごとの観測数
フィギュアレベル:
catplot()- ファセット化されたカテゴリカルプロット(kindパラメーターで種類を指定)
主なパラメーター:
x,y- 変数(通常はどちらか一方がカテゴリカル)hue- 追加のカテゴリによるグループ化order,hue_order- カテゴリの順序を制御dodge- hue の水準を横に並べて分離orient- "v"(縦)または "h"(横)kind- catplot のプロット種類: "strip", "swarm", "box", "violin", "bar", "point"
# Swarm plot showing all points
sns.swarmplot(data=df, x='day', y='total_bill', hue='sex')
# Violin plot with split for comparison
sns.violinplot(data=df, x='day', y='total_bill',
hue='sex', split=True)
# Bar plot with error bars
sns.barplot(data=df, x='day', y='total_bill',
hue='sex', estimator='mean', errorbar='ci')
# Faceted categorical plot
sns.catplot(data=df, x='day', y='total_bill',
col='time', kind='box')
回帰プロット(線形関係)
用途: 線形回帰と残差を可視化する
regplot()- 散布図と近似直線を持つ軸レベルの回帰プロットlmplot()- ファセット機能に対応したフィギュアレベルの回帰プロットresidplot()- モデルの適合度を評価するための残差プロット
主なパラメーター:
x,y- 回帰の対象となる変数order- 多項式回帰の次数logistic- ロジスティック回帰を当てはめるrobust- ロバスト回帰を使用する(外れ値の影響を受けにくい)ci- 信頼区間の幅(デフォルトは 95)scatter_kws,line_kws- 散布図と直線の見た目をカスタマイズする
# Simple linear regression
sns.regplot(data=df, x='total_bill', y='tip')
# Polynomial regression with faceting
sns.lmplot(data=df, x='total_bill', y='tip',
col='time', order=2, ci=95)
# Check residuals
sns.residplot(data=df, x='total_bill', y='tip')
行列プロット(矩形データ)
用途: 行列、相関、グリッド構造のデータを可視化する
heatmap()- 注釈付きの色エンコード行列clustermap()- 階層クラスタリングされたヒートマップ
主なパラメーター:
data- 2 次元の矩形データセット(DataFrame または配列)annot- セル内に値を表示するfmt- 注釈の書式文字列(例: ".2f")cmap- カラーマップ名center- カラーマップの中心となる値(発散型カラーマップ向け)vmin,vmax- カラースケールの範囲square- セルを正方形に固定するlinewidths- セル間の隙間
# Correlation heatmap
corr = df.corr()
sns.heatmap(corr, annot=True, fmt='.2f',
cmap='coolwarm', center=0, square=True)
# Clustered heatmap
sns.clustermap(data, cmap='viridis',
standard_scale=1, figsize=(10, 10))
マルチプロットグリッド
Seaborn には、複雑な複数パネルの図を作成するためのグリッドオブジェクトがあります。
FacetGrid
カテゴリ変数に基づいてサブプロットを作成します。relplot、displot、catplot などのフィギュアレベル関数から呼び出すと最も便利ですが、カスタムプロットのために直接使用することもできます。
g = sns.FacetGrid(df, col='time', row='sex', hue='smoker')
g.map(sns.scatterplot, 'total_bill', 'tip')
g.add_legend()
PairGrid
データセット内のすべての変数どうしの二変量関係を表示します。
g = sns.PairGrid(df, hue='species')
g.map_upper(sns.scatterplot)
g.map_lower(sns.kdeplot)
g.map_diag(sns.histplot)
g.add_legend()
JointGrid
二変量プロットと周辺分布を組み合わせます。
g = sns.JointGrid(data=df, x='total_bill', y='tip')
g.plot_joint(sns.scatterplot)
g.plot_marginals(sns.histplot)
フィギュアレベル関数と軸レベル関数の違い
この違いを理解することは、seaborn を効果的に使うために非常に重要です。
軸レベル関数
- 単一の matplotlib
Axesオブジェクトにプロットします - 複雑な matplotlib の図に簡単に組み込めます
ax=パラメーターを受け取り、正確な配置を指定できますAxesオブジェクトを返します- 例:
scatterplot,histplot,boxplot,regplot,heatmap
使用するタイミング:
- カスタムの複数プロットレイアウトを構築するとき
- 異なる種類のプロットを組み合わせるとき
- matplotlib レベルの細かい制御が必要なとき
- 既存の matplotlib コードと統合するとき
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
sns.scatterplot(data=df, x='x', y='y', ax=axes[0, 0])
sns.histplot(data=df, x='x', ax=axes[0, 1])
sns.boxplot(data=df, x='cat', y='y', ax=axes[1, 0])
sns.kdeplot(data=df, x='x', y='y', ax=axes[1, 1])
フィギュアレベル関数
- 全サブプロットを含む図全体を管理します
colおよびrowパラメーターによる組み込みのファセット化FacetGrid、JointGrid、PairGridオブジェクトを返します- サイズ指定には
heightとaspectを使用します(サブプロット単位) - 既存の図の中に配置することはできません
- 例:
relplot,displot,catplot,lmplot,jointplot,pairplot
使用するタイミング:
- ファセット化された可視化(スモールマルチプル)
- 素早い探索的分析
- 一貫した複数パネルのレイアウト
- 他の種類のプロットと組み合わせる必要がないとき
# Automatic faceting
sns.relplot(data=df, x='x', y='y', col='category', row='group',
hue='type', height=3, aspect=1.2)
データ構造の要件
ロング形式データ(推奨)
各変数が列、各観測値が行になります。この「タイディー」形式は最大限の柔軟性を提供します:
# Long-form structure
subject condition measurement
0 1 control 10.5
1 1 treatment 12.3
2 2 control 9.8
3 2 treatment 13.1
利点:
- すべての seaborn 関数で使用できます
- 変数を視覚的プロパティに簡単に割り当てられます
- 任意の複雑さに対応します
- DataFrame 操作と相性が良いです
ワイド形式データ
変数が列全体に広がる形式です。単純な矩形データに便利です:
# Wide-form structure
control treatment
0 10.5 12.3
1 9.8 13.1
ユースケース:
- 単純な時系列
- 相関行列
- ヒートマップ
- 配列データのクイックプロット
ワイド形式からロング形式への変換:
df_long = df.melt(var_name='condition', value_name='measurement')
カラーパレット
Seaborn はデータ型ごとに慎重に設計されたカラーパレットを提供します:
定性パレット(カテゴリデータ)
色相の違いによってカテゴリを区別します:
"deep"- デフォルト、鮮やかな色"muted"- より柔らかく、彩度の低い色"pastel"- 明るく、彩度を抑えた色"bright"- 高彩度の色"dark"- 暗めの値"colorblind"- 色覚異常に配慮した色
sns.set_palette("colorblind")
sns.color_palette("Set2")
逐次パレット(順序データ)
低い値から高い値への推移を示します:
"rocket","mako"- 広い輝度範囲(ヒートマップに適しています)"flare","crest"- 輝度範囲を制限(点や線に適しています)"viridis","magma","plasma"- Matplotlib の知覚的に均一なパレット
sns.heatmap(data, cmap='rocket')
sns.kdeplot(data=df, x='x', y='y', cmap='mako', fill=True)
発散パレット(中心を持つデータ)
中央値からの偏差を強調します:
"vlag"- 青から赤"icefire"- 青からオレンジ"coolwarm"- 寒色から暖色"Spectral"- レインボーの発散パレット
sns.heatmap(correlation_matrix, cmap='vlag', center=0)
カスタムパレット
# Create custom palette
custom = sns.color_palette("husl", 8)
# Light to dark gradient
palette = sns.light_palette("seagreen", as_cmap=True)
# Diverging palette from hues
palette = sns.diverging_palette(250, 10, as_cmap=True)
テーマと見た目
テーマの設定
set_theme() は全体的な見た目を制御します:
# Set complete theme
sns.set_theme(style='whitegrid', palette='pastel', font='sans-serif')
# Reset to defaults
sns.set_theme()
スタイル
背景とグリッドの見た目を制御します:
"darkgrid"- グレーの背景に白いグリッド(デフォルト)"whitegrid"- 白い背景にグレーのグリッド"dark"- グレーの背景、グリッドなし"white"- 白い背景、グリッドなし"ticks"- 白い背景に軸の目盛り
sns.set_style("whitegrid")
# Remove spines
sns.despine(left=False, bottom=False, offset=10, trim=True)
# Temporary style
with sns.axes_style("white"):
sns.scatterplot(data=df, x='x', y='y')
コンテキスト
用途に応じて要素のスケールを調整します:
"paper"- 最小(デフォルト)"notebook"- やや大きめ"talk"- プレゼンテーションスライド向け"poster"- 大判向け
sns.set_context("talk", font_scale=1.2)
# Temporary context
with sns.plotting_context("poster"):
sns.barplot(data=df, x='category', y='value')
ベストプラクティス
1. データの準備
意味のある列名を持つ、適切に構造化された DataFrame を常に使用してください:
# Good: Named columns in DataFrame
df = pd.DataFrame({'bill': bills, 'tip': tips, 'day': days})
sns.scatterplot(data=df, x='bill', y='tip', hue='day')
# Avoid: Unnamed arrays
sns.scatterplot(x=x_array, y=y_array) # Loses axis labels
2. 適切なプロットの種類を選ぶ
連続 x、連続 y: scatterplot, lineplot, kdeplot, regplot
連続 x、カテゴリ y: violinplot, boxplot, stripplot, swarmplot
1 つの連続変数: histplot, kdeplot, ecdfplot
相関・行列: heatmap, clustermap
ペアごとの関係: pairplot, jointplot
3. ファセット分割にはフigure レベル関数を使用する
# Instead of manual subplot creation
sns.relplot(data=df, x='x', y='y', col='category', col_wrap=3)
# Not: Creating subplots manually for simple faceting
4. セマンティックマッピングを活用する
hue、size、style を使用して、追加の次元をエンコードします:
sns.scatterplot(data=df, x='x', y='y',
hue='category', # Color by category
size='importance', # Size by continuous variable
style='type') # Marker style by type
5. 統計的推定を制御する
多くの関数は統計量を自動的に計算します。その内容を理解し、カスタマイズしてください:
# Lineplot computes mean and 95% CI by default
sns.lineplot(data=df, x='time', y='value',
errorbar='sd') # Use standard deviation instead
# Barplot computes mean by default
sns.barplot(data=df, x='category', y='value',
estimator='median', # Use median instead
errorbar=('ci', 95)) # Bootstrapped CI
6. Matplotlib と組み合わせる
Seaborn は Matplotlib と シームレスに統合でき、細かい調整が可能です:
ax = sns.scatterplot(data=df, x='x', y='y')
ax.set(xlabel='Custom X Label', ylabel='Custom Y Label',
title='Custom Title')
ax.axhline(y=0, color='r', linestyle='--')
plt.tight_layout()
7. 高品質な図の保存
fig = sns.relplot(data=df, x='x', y='y', col='group')
fig.savefig('figure.png', dpi=300, bbox_inches='tight')
fig.savefig('figure.pdf') # Vector format for publications
よくあるパターン
探索的データ分析
# Quick overview of all relationships
sns.pairplot(data=df, hue='target', corner=True)
# Distribution exploration
sns.displot(data=df, x='variable', hue='group',
kind='kde', fill=True, col='category')
# Correlation analysis
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
出版品質の図
sns.set_theme(style='ticks', context='paper', font_scale=1.1)
g = sns.catplot(data=df, x='treatment', y='response',
col='cell_line', kind='box', height=3, aspect=1.2)
g.set_axis_labels('Treatment Condition', 'Response (μM)')
g.set_titles('{col_name}')
sns.despine(trim=True)
g.savefig('figure.pdf', dpi=300, bbox_inches='tight')
複雑な複数パネルの図
# Using matplotlib subplots with seaborn
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
sns.scatterplot(data=df, x='x1', y='y', hue='group', ax=axes[0, 0])
sns.histplot(data=df, x='x1', hue='group', ax=axes[0, 1])
sns.violinplot(data=df, x='group', y='y', ax=axes[1, 0])
sns.heatmap(df.pivot_table(values='y', index='x1', columns='x2'),
ax=axes[1, 1], cmap='viridis')
plt.tight_layout()
信頼帯付きの時系列
# Lineplot automatically aggregates and shows CI
sns.lineplot(data=timeseries, x='date', y='measurement',
hue='sensor', style='location', errorbar='sd')
# For more control
g = sns.relplot(data=timeseries, x='date', y='measurement',
col='location', hue='sensor', kind='line',
height=4, aspect=1.5, errorbar=('ci', 95))
g.set_axis_labels('Date', 'Measurement (units)')
トラブルシューティング
問題: 凡例がプロット領域の外にある
フigure レベル関数は、デフォルトで凡例を外側に配置します。内側に移動するには:
g = sns.relplot(data=df, x='x', y='y', hue='category')
g._legend.set_bbox_to_anchor((0.9, 0.5)) # Adjust position
問題: ラベルが重なる
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
問題: 図が小さすぎる
フigure レベル関数の場合:
sns.relplot(data=df, x='x', y='y', height=6, aspect=1.5)
Axes レベル関数の場合:
fig, ax = plt.subplots(figsize=(10, 6))
sns.scatterplot(data=df, x='x', y='y', ax=ax)
問題: 色が十分に区別できない
# Use a different palette
sns.set_palette("bright")
# Or specify number of colors
palette = sns.color_palette("husl", n_colors=len(df['category'].unique()))
sns.scatterplot(data=df, x='x', y='y', hue='category', palette=palette)
問題: KDE が滑らかすぎる、またはギザギザになる
# Adjust bandwidth
sns.kdeplot(data=df, x='x', bw_adjust=0.5) # Less smooth
sns.kdeplot(data=df, x='x', bw_adjust=2) # More smooth
リソース
このスキルには、より詳しく学ぶための参考資料が含まれています:
references/
function_reference.md- すべての seaborn 関数のパラメーターと例を網羅した一覧objects_interface.md- モダンな seaborn.objects API の詳細ガイドexamples.md- さまざまな分析シナリオに共通するユースケースとコードパターン
詳細な関数シグネチャ、高度なパラメーター、特定の例が必要な場合は、リファレンスファイルを必要に応じて読み込んでください。