Seaborn(シーボーン)は、Matplotlibの上に作られたPythonの統計可視化ライブラリです。pandasのDataFrameを渡すだけで、散布図・ヒストグラム・箱ひげ図・ヒートマップなどを1〜2行で描けます。この記事では、Seabornとは何か、pip install seaborn で何が入るか、最初のグラフの描き方と関数の選び方までを解説します。最新版0.13.2を、2026年10月時点で最新のpandas 3.1・Matplotlib 3.11と組み合わせて動かした結果も載せています。
まとめ:Seabornの要点
- Seabornとは:Matplotlibをラップした統計グラフ専用のライブラリ。集計・信頼区間・回帰直線を関数の中で計算して描く。
- インストール:
pip install seaborn。numpy・pandas・matplotlibも自動で入る。scipyとstatsmodelsが要る機能はpip install "seaborn[stats]"。 - 最新版:0.13.2(2024年1月25日公開)。以降のリリースは無く、2026年10月時点でもこれが最新。
- 使い方の型:
import seaborn as snsのあとsns.関数名(data=df, x="列名", y="列名")。仕上げはMatplotlibで行う。 - 最新環境での注意:pandas 3.1・Matplotlib 3.11でも描画はできるが、箱ひげ図はMatplotlib 3.13で削除予定の引数を使っている。
Seabornとは:Matplotlibの上で統計グラフを描くライブラリ
Seabornは、作者のMichael Waskom氏が開発するオープンソースのライブラリで、PyPIの初版0.1は2013年10月に公開されました。描画そのものはMatplotlibが行い、Seabornは「どの値をどう集計して、どの図にするか」を受け持ちます。たとえば棒グラフの関数 barplot は、渡した生データからカテゴリごとの平均と95%信頼区間を計算してから描きます。Matplotlibで同じ図を作るなら、集計と誤差棒を自分で書くことになります。
データの受け渡しはpandasのDataFrameが基本です。列名を x=・y=・hue=(色分け)に指定するだけで、凡例や軸ラベルも列名から自動で付きます。中身の数値計算はNumPyが担っています。
読み方・名前の由来とsnsの意味
読みは「シーボーン」です。import seaborn as sns と書く理由について、公式FAQは「ライブラリの名前の由来への遠回しな参照だが、seaborn name spaceと考えてもよい」と答えています。米ドラマ『ザ・ホワイトハウス』の登場人物Samuel Norman Seaborn(頭文字がS.N.S.)が由来という説が広く知られていますが、公式FAQは人物名までは書いていません。import seaborn as sb でも動作は同じです。ただ公式ドキュメントも他の記事もsnsで書かれているので、合わせておくとコードを読み比べやすくなります。
Matplotlibとの違いと使い分け
Matplotlibが線や軸といった部品を1つずつ組み立てる道具だとすると、Seabornは統計の決まった図をまとめて出す道具です。両者は置き換えではなく、Seabornで描いてMatplotlibで整える関係です。
| 観点 | Matplotlib | Seaborn |
|---|---|---|
| 代表的な入力 | 配列・リスト・DataFrame | DataFrame+列名など |
| 集計・信頼区間 | 自分で計算 | 関数内で計算 |
| 色分け・凡例 | 色・ラベルなどを指定 | hue=から自動生成 |
| 既定の見た目 | 素の白背景 | set_themeで整う |
| 細かな配置 | 全部制御できる | Matplotlibに任せる |
選ばないほうがよい場面もはっきりしています。マウスで拡大・ホバーしたいWeb用のグラフならPlotlyやBokeh、センサー値のように毎秒更新する描画ならPyQtGraphのほうが向いています。部署で同じ指標を毎日見るなら、スクリプトでグラフを量産する代わりにBIツールの導入も選択肢になります。定期更新・権限管理・共有の要件と、導入・保守費用を比較して判断します。Seabornが強いのは、手元のデータを分析者が探索するとき(EDA)と、論文や報告書に載せる静的な統計グラフです。
Seabornのインストール手順(pip・conda・uv)
pip install seabornの依存パッケージとPython要件
pipなら次の1行です。
pip install seaborn
PyPI上の0.13.2の要件は、Python 3.8以上・numpy 1.20以上(1.24.0を除く)・pandas 1.2以上・matplotlib 3.4以上(3.6.1を除く)です。ただし依存ライブラリ側の新しい版はもっと新しいPythonを要求します。2026年10月27日にPython 3.13の空の仮想環境で実行すると、次の組み合わせが入りました。
| パッケージ | 入った版 | その版のPython要件 |
|---|---|---|
| seaborn | 0.13.2 | 3.8以上 |
| pandas | 3.1.0 | 3.11以上 |
| numpy | 2.5.4 | 3.12以上 |
| matplotlib | 3.11.2 | 3.11以上 |
Python 3.8〜3.10では、pipは各Python版に対応するpandasやmatplotlibを選びます。ただし、OSや既存パッケージの制約によってはインストールに失敗する場合もあります。同じ pip install seaborn でも、Pythonの版で中身が変わる点は覚えておくと、チームで「自分の環境だけ動かない」ときの切り分けが速くなります。
seaborn[stats]による統計機能用の追加依存
scipyとstatsmodelsは任意依存で、通常の pip install seaborn では入りません。無いまま次の関数を呼ぶと、描画の途中ではなく呼び出し時点で止まります(seaborn 0.13.2で実測)。
| 呼び出し | 必要なもの | 無いときのエラー |
|---|---|---|
| sns.clustermap() | scipy | RuntimeError |
| regplot(lowess=True) | statsmodels | RuntimeError |
| regplot(logistic=True) | statsmodels | RuntimeError |
カーネル密度推定の kdeplot と普通の回帰直線の regplot はscipy無しでも動きました。上の表の機能を使うなら、公式のインストール手順にある追加依存つきで入れます。zshでは角かっこがワイルドカード扱いになるため、引用符で囲みます。
pip install "seaborn[stats]"
conda・uv・Jupyterで入れる場合
Anaconda系の環境では、公式手順どおりconda-forgeから入れます。pipとcondaを同じ環境で混ぜると依存が壊れることがあるので、pipとcondaの使い分けを先に決めておきます。
conda install seaborn -c conda-forge
プロジェクトごとに依存を固定するならuvが手軽です。uv add seaborn で pyproject.toml とロックファイルに記録されます。
uv init sns-demo
cd sns-demo
uv add seaborn
uv run python -c "import seaborn as sns; print(sns.__version__)"
JupyterやGoogle Colabのセルでは !pip install seaborn より %pip install seaborn を使います。%pip は実行中のカーネルのPythonに入れるため、「入れたのにimportできない」というずれが起きません。
インストールの確認とバージョン確認
入ったかどうかは、使うPythonそのものでimportして確かめます。
python -c "import seaborn as sns; print(sns.__version__)"
python -m pip show seaborn
ModuleNotFoundError: No module named 'seaborn' が出る原因のほとんどは、pipが入れた先と実行しているPythonが別であることです。pip ではなく python -m pip install seaborn と書けば、今のPythonに確実に入ります。
Seabornの使い方:importから最初のグラフまで
付属のサンプルデータtipsで、色分けつきの散布図を描きます。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.scatterplot(data=tips, x="total_bill", y="tip", hue="day")
ax.set_title("Total bill vs tip")
plt.show()
ラベルを英語にしているのは、日本語がそのままでは文字化けするためです(対処は後述の日本語の章)。sns.set_theme() は見た目の既定値を整える関数で、旧名の sns.set() も同じ働きです。load_datasetはGitHubのseaborn-dataリポジトリからCSVを取ってくるため、初回はネット接続が要ります。取得したデータはキャッシュされ、置き場所は環境変数 SEABORN_DATA、無ければOSのキャッシュフォルダ(macOSなら ~/Library/Caches/seaborn)です。sns.get_dataset_names() で一覧を出すと、tips・iris・flights・penguins・titanicなど22種類が返りました。社内のネットワークで取得できない場合は、自分のDataFrameを渡せば同じ関数がそのまま使えます。
figure-level関数とaxes-level関数の違い
Seabornでつまずきやすいのが、関数が2種類あることです。公式の関数概要によると、scatterplot や histplot のようなaxes-level関数はMatplotlibのAxes1枚に描いてそのAxesを返します。一方、relplot・displot・catplot のfigure-level関数は図全体を作ってFacetGridを返し、col=・row= で条件ごとに図を並べられます。
戻り値が違うので、タイトルの付け方も変わります。figure-level関数の結果に ax.set_title() を書くとAttributeErrorになるため、次のように使い分けます。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# axes-level:Axesが返る。既存のsubplotsにも描ける
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
sns.histplot(data=tips, x="total_bill", ax=axes[0])
sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[1])
axes[0].set_title("Total bill")
# figure-level:FacetGridが返る。col=で昼と夜に分けて並べる
g = sns.relplot(data=tips, x="total_bill", y="tip", col="time", hue="day")
g.set_axis_labels("Total bill", "Tip")
g.figure.suptitle("Tip by time", y=1.03)
plt.show()
判断の基準は単純です。自分で組んだsubplotsの中に描きたいならaxes-level、条件ごとの比較図を1行で作りたいならfigure-levelを選びます。
Seabornで描ける主要グラフと関数の選び方
関数は「何を見たいか」で選びます。同じ目的のaxes-levelとfigure-levelが対になっています。
| 見たいもの | axes-level | figure-level |
|---|---|---|
| 数値の分布 | histplot・kdeplot | displot |
| カテゴリ別の比較 | boxplot・violinplot・barplot・countplot | catplot |
| 2変数の関係・推移 | scatterplot・lineplot | relplot |
| 回帰直線 | regplot | lmplot |
| 全変数の組み合わせ | なし | pairplot |
| 行列・相関 | heatmap | clustermap |
分布とカテゴリ別の比較
countplot はカテゴリの件数、boxplot は中央値と四分位、violinplot は分布の山の形まで見せます。0.13.0でカテゴリ系の関数は全面的に書き直され、hue を指定しなければ1色で描く仕様になりました。古い記事のように曜日ごとに色が変わらなくても、それは正常な動作です。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
sns.histplot(data=tips, x="total_bill", bins=20, ax=axes[0])
sns.countplot(data=tips, x="day", ax=axes[1])
sns.violinplot(data=tips, x="day", y="total_bill", hue="sex", ax=axes[2])
plt.show()
2変数の関係と時系列の推移
lineplot は同じx値に複数の行があると平均を取り、95%信頼区間の帯を重ねます。flightsは1年に12か月分の行があるので、年ごとの平均線に帯が付きます。帯が要らなければ errorbar=None を渡します。pairplot は全数値列の組み合わせを一度に散布図にするので、相関がありそうな組の当たりを付けるのに使えます。
import seaborn as sns
import matplotlib.pyplot as plt
flights = sns.load_dataset("flights")
sns.lineplot(data=flights, x="year", y="passengers", errorbar=None)
plt.show()
sns.pairplot(sns.load_dataset("iris"), hue="species")
plt.show()
相関行列とピボットのヒートマップ
ヒートマップには行列の形のデータを渡します。ここでpandas側の変更に2つ引っかかります。文字列の列を含むDataFrameに corr() をそのまま呼ぶと、pandas 3.1では ValueError: could not convert string to float: 'Female' で止まるので numeric_only=True を付けます。pivot は位置引数を受け付けず、pivot("month", "year", "passengers") はTypeErrorになるため、index=・columns=・values= を書きます。
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
corr = tips.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="coolwarm", vmin=-1, vmax=1)
plt.show()
flights = sns.load_dataset("flights")
matrix = flights.pivot(index="month", columns="year", values="passengers")
sns.heatmap(matrix, annot=True, fmt="d", cmap="YlGnBu")
plt.show()
最新のpandas 3.1・Matplotlib 3.11で0.13.2を動かした結果
0.13.2は2024年1月の公開で、その後pandasは3系、Matplotlibは3.11まで進みました。古いSeabornが新しい依存の上で動くのかを確かめるため、2026年10月27日にPython 3.13.14・pandas 3.1.0・NumPy 2.5.4・Matplotlib 3.11.2の環境で、この記事の関数を含む約30通りの呼び出しを実行しました。正常な使用例では描画が完了しました。非推奨の呼び出しや誤った引数指定も含め、警告・エラーが出たケースを次の6項目にまとめます。
| 呼び出し | 結果 | 原因 |
|---|---|---|
| boxplot・catplot(kind=”box”) | MatplotlibDeprecationWarning | vert引数が3.13で削除予定 |
| seaborn.objectsのPlot | Pandas4Warning | copy引数の廃止予定 |
| barplot(ci=95) | FutureWarning | ciはerrorbarへ移行 |
| distplot() | UserWarning | 0.14.0で削除予定 |
| tips.corr() | ValueError | 文字列列を含む |
| pivot()の位置引数 | TypeError | キーワード専用 |
今すぐ壊れるのは下の2つで、どちらもpandas側の書き方の問題です。注意したいのは1行目です。Matplotlib 3.11は箱ひげ図の vert=True/False を非推奨にし、3.13で削除すると警告しています。Seaborn 0.13.2の boxplot はこの引数を渡しているため、Matplotlib 3.13が出た時点で箱ひげ図が描けなくなる見込みです。GitHubの開発版(0.14.0.dev0)はMatplotlib 3.10以降で orientation を渡すよう修正済みですが、2026年10月時点でリリースはされていません。
この警告はDeprecationWarningの仲間なので、普通に python script.py で実行すると表示されず、python -W default script.py で初めて見えました。業務のスクリプトで箱ひげ図を使っているなら、Seabornの次の版が出るまで依存に matplotlib<3.13 の上限を書いておくのが安全です。distplot は0.11.0から、barplot・pointplot・lineplotの ci= は0.12.0から非推奨です。見つけたら、distplotは histplot・displot に、ci=は errorbar=("ci", 95) に書き換えます。
日本語の文字化けとset_themeの関係
タイトルや軸ラベルに日本語を入れると、四角い豆腐(□)になることがあります。Seabornならではの落とし穴は、sns.set_theme() がフォント設定を上書きする点です。日本語フォントを同梱したmatplotlib-fontja 1.1.0で検証すると、次のようになりました。
| 手順 | font.familyの値 | 文字欠けの警告 |
|---|---|---|
| import matplotlib_fontja の直後 | IPAexGothic | なし |
| そのあとsns.set_theme() | sans-serif | 7件 |
| sns.set_theme(font=”IPAexGothic”) | IPAexGothic | 0件 |
日本語化のライブラリを先に読み込んでも、後からset_themeを呼ぶと既定のフォントに戻ります。set_themeの font= に日本語フォント名を渡すのが確実です。matplotlib-fontjaはSeabornの依存に含まれないため、先に python -m pip install matplotlib-fontja で入れておきます。
import matplotlib_fontja
import seaborn as sns
sns.set_theme(style="whitegrid", font="IPAexGothic")
OSに入っているフォントを使う方法やjapanize-matplotlibとの違いは、Matplotlibの日本語化の章で詳しく扱っています。
Seabornに関するよくある質問
Seabornは無料ですか?商用で使えますか?
無料で、商用利用もできます。ライセンスはBSDライセンス(3条項)で、社内ツールや製品に組み込めます。再配布時は著作権表示・条件・免責事項を保持し、プロジェクト名や貢献者名を許可なく製品の推奨・宣伝に使わないなど、ライセンスの条件を守ります。
作ったグラフを画像ファイルで保存するには?
axes-level関数なら plt.savefig("graph.png", dpi=150, bbox_inches="tight")、figure-level関数なら戻り値のFacetGridに g.savefig("graph.png") を呼びます。plt.show() のあとに保存すると白紙になる環境があるので、保存はshowより前に書きます。
seaborn.objectsとは何ですか?使うべきですか?
0.12.0で入った、so.Plot(df, x=..., y=...).add(so.Dot()) のように部品を重ねて図を組み立てる新しい書き方です。公式チュートリアルは「実験的で未完成だが、本格的な利用に耐える安定性はある」と説明しています。pandas 3.1では上の実測のとおり警告も出るため、互換性を優先するチームでは従来の関数APIを標準にしておくのが無難です。
Seabornの最新版に更新するには?
python -m pip install --upgrade seaborn を実行します。ただし2026年10月時点の最新は0.13.2なので、すでに0.13.2なら変化はありません。pandasやMatplotlibだけが新しくなって警告が出る場合は、上の実測表で原因を確かめてください。
Seabornだけ入れればMatplotlibの知識は不要ですか?
不要にはなりません。Seabornの図はMatplotlibのFigureとAxesの上に描かれるので、タイトル・軸範囲・凡例の位置・保存はMatplotlibの関数で行います。fig, ax = plt.subplots() と ax= の受け渡しだけは覚えておくと、Seabornの図を自由に並べられます。