seaborn入門#

Seabornは、Pythonで統計グラフィックスを作成するためのライブラリです。matplotlibを基盤として構築されており、pandasデータ構造と緊密に統合されています。

Seabornは、データの探索と理解を支援します。そのプロット関数は、完全なデータセットを含むデータフレームと配列を操作し、内部的に必要な意味的なマッピングと統計的集計を実行して、有益なプロットを作成します。そのデータ指向の宣言型APIにより、プロットのさまざまな要素の意味に集中できます。それらをどのように描くかの詳細にこだわる必要はありません。

seabornの機能の例を以下に示します。

# Import seaborn
import seaborn as sns

# Apply the default theme
sns.set_theme()

# Load an example dataset
tips = sns.load_dataset("tips")

# Create a visualization
sns.relplot(
    data=tips,
    x="total_bill", y="tip", col="time",
    hue="smoker", style="smoker", size="size",
)
../_images/introduction_1_0.png

ここではいくつかの処理が行われています。一つずつ見ていきましょう。

# Import seaborn
import seaborn as sns

この簡単な例では、インポートする必要があるライブラリはseabornだけです。慣例により、snsという略語でインポートされます。

内部的に、seabornはmatplotlibを使用してプロットを描画します。インタラクティブな作業には、matplotlibモードのJupyter/IPythonインターフェースを使用することをお勧めします。それ以外の場合は、プロットを表示する際にmatplotlib.pyplot.show()を呼び出す必要があります。

# Apply the default theme
sns.set_theme()

これはmatplotlibのrcParamシステムを使用しており、seabornで作成しなくても、すべてのmatplotlibプロットの外観に影響します。デフォルトのテーマ以外にも、いくつかの他のオプションがあり、プロットのスタイルとスケーリングを個別に制御して、プレゼンテーションコンテキスト間で作業を迅速に翻訳できます(例:プレゼンテーション中に投影される際に読みやすいフォントを持つ図のバージョンを作成)。matplotlibのデフォルトを好む場合、または異なるテーマを好む場合は、このステップをスキップしてseabornのプロット関数を使用できます。

# Load an example dataset
tips = sns.load_dataset("tips")

ドキュメントのほとんどのコードでは、load_dataset()関数を使用して、サンプルデータセットに迅速にアクセスします。これらのデータセットに特別なものはなく、単なるpandasデータフレームであり、pandas.read_csv()を使用して読み込んだり、手動で作成したりすることもできます。ドキュメントのほとんどの例ではpandasデータフレームを使用してデータを指定しますが、seabornは受け入れるデータ構造について非常に柔軟です。

# Create a visualization
sns.relplot(
    data=tips,
    x="total_bill", y="tip", col="time",
    hue="smoker", style="smoker", size="size",
)

このプロットは、seaborn関数relplot()を一度呼び出すだけで、tipsデータセットの5つの変数の関係を示しています。変数名とそのプロットにおける役割のみを提供したことに注目してください。matplotlibを直接使用する場合とは異なり、プロット要素の属性を色の値やマーカーコードの観点から指定する必要はありませんでした。seabornは内部的に、データフレームの値からmatplotlibが理解できる引数への変換を処理しました。この宣言型のアプローチにより、matplotlibの制御方法の詳細ではなく、回答したい質問に集中できます。

統計グラフィックスのための高レベルAPI#

データを可視化する普遍的に最適な方法はありません。異なる質問には、異なるプロットが最適です。Seabornでは、一貫性のあるデータ指向APIを使用することで、さまざまな視覚表現を簡単に切り替えることができます。

関数relplot()はその名前が示すように、多くの異なる統計的関係を可視化するために設計されています。散布図は効果的なことが多いですが、ある変数が時間の尺度を表す関係は、線で表現する方が適しています。relplot()関数は便利なkindパラメータを持っており、この代替表現に簡単に切り替えることができます。

dots = sns.load_dataset("dots")
sns.relplot(
    data=dots, kind="line",
    x="time", y="firing_rate", col="align",
    hue="choice", size="coherence", style="choice",
    facet_kws=dict(sharex=False),
)
../_images/introduction_11_0.png

sizeパラメータとstyleパラメータが散布図と線プロットの両方で使用されていることに注目してください。しかし、それらは2つの可視化に異なる影響を与えます。散布図ではマーカーの面積とシンボルを変更し、線プロットでは線の幅と点線を変更します。これらの詳細を考慮する必要がないため、プロットの全体的な構造と伝えたい情報に集中できます。

統計的推定#

多くの場合、他の変数の関数として1つの変数の平均値に関心があります。多くのseaborn関数は、これらの質問に答えるために必要な統計的推定を自動的に実行します。

fmri = sns.load_dataset("fmri")
sns.relplot(
    data=fmri, kind="line",
    x="timepoint", y="signal", col="region",
    hue="event", style="event",
)
../_images/introduction_13_0.png

統計値が推定されると、seabornはブートストラップを使用して信頼区間を計算し、推定の不確実性を表す誤差範囲を描画します。

seabornでの統計的推定は、記述統計を超えています。たとえば、lmplot()を使用して、線形回帰モデル(とその不確実性)を含めることで、散布図を強化できます。

sns.lmplot(data=tips, x="total_bill", y="tip", col="time", hue="smoker")
../_images/introduction_15_0.png

分布表現#

統計分析には、データセット内の変数の分布に関する知識が必要です。seaborn関数displot()は、分布の可視化にいくつかのアプローチをサポートしています。これには、ヒストグラムなどの古典的な手法と、カーネル密度推定などの計算集約的な手法が含まれます。

sns.displot(data=tips, x="total_bill", col="time", kde=True)
../_images/introduction_17_0.png

Seabornは、データの経験累積分布関数を計算してプロットするなど、強力だがあまり馴染みのない手法も促進しようと努めています。

sns.displot(data=tips, kind="ecdf", x="total_bill", col="time", hue="smoker", rug=True)
../_images/introduction_19_0.png

カテゴリデータのプロット#

seabornのいくつかの特殊なプロットタイプは、カテゴリデータの可視化を目的としています。catplot()を通じてアクセスできます。これらのプロットは、さまざまなレベルの粒度を提供します。最も細かいレベルでは、「swarm」プロットを描画することで、すべての観測値を確認したい場合があります。これは、カテゴリ軸に沿って点の位置を調整してオーバーラップしないようにする散布図です。

sns.catplot(data=tips, kind="swarm", x="day", y="total_bill", hue="smoker")
../_images/introduction_21_0.png

あるいは、カーネル密度推定を使用して、点がサンプリングされた基になる分布を表すこともできます。

sns.catplot(data=tips, kind="violin", x="day", y="total_bill", hue="smoker", split=True)
../_images/introduction_23_0.png

または、各入れ子になったカテゴリ内の平均値とその信頼区間のみを表示することもできます。

sns.catplot(data=tips, kind="bar", x="day", y="total_bill", hue="smoker")
../_images/introduction_25_0.png

複雑なデータセットに対する多変量ビュー#

いくつかのseaborn関数は、複数種類のプロットを組み合わせて、データセットの有益な概要を迅速に提供します。1つ、jointplot()は、単一の関係に焦点を当てています。2つの変数の同時分布とその各変数の周辺分布をプロットします。

penguins = sns.load_dataset("penguins")
sns.jointplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species")
../_images/introduction_27_0.png

もう1つ、pairplot()は、より広い視点を取ります。すべてのペアワイズ関係と各変数について、それぞれ同時分布と周辺分布を示します。

sns.pairplot(data=penguins, hue="species")
../_images/introduction_29_0.png

図を作成するための低レベルツール#

これらのツールは、軸レベルのプロット関数と、図のレイアウトを管理するオブジェクトを組み合わせて機能し、データセットの構造を軸グリッドにリンクします。両方の要素は公開APIの一部であり、これらを直接使用して、さらに数行のコードだけで複雑な図を作成できます。

g = sns.PairGrid(penguins, hue="species", corner=True)
g.map_lower(sns.kdeplot, hue=None, levels=5, color=".2")
g.map_lower(sns.scatterplot, marker="+")
g.map_diag(sns.histplot, element="step", linewidth=0, kde=True)
g.add_legend(frameon=True)
g.legend.set_bbox_to_anchor((.61, .6))
../_images/introduction_31_0.png

意見のあるデフォルトと柔軟なカスタマイズ#

Seabornは単一の関数呼び出しで完全なグラフィックスを作成します。可能な場合は、プロットのセマンティックマッピングを説明する有益な軸ラベルと凡例を自動的に追加します。

多くの場合、seabornはデータの特性に基づいてパラメータのデフォルト値も選択します。たとえば、これまで見てきたカラーマッピングは、hueに割り当てられたカテゴリ変数の異なるレベルを表すために、異なる色相(青、オレンジ、そして時には緑)を使用していました。数値変数をマッピングする場合、一部の関数は連続的なグラデーションに切り替わります。

sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="body_mass_g"
)
../_images/introduction_33_0.png

作業を共有または公開する準備ができたら、デフォルトで達成されるものを超えて図を磨き上げる必要があるでしょう。Seabornは複数のレベルのカスタマイズを許可します。すべての図に適用される複数の組み込みテーマを定義し、その関数は各プロットのセマンティックマッピングを変更できる標準化されたパラメータを持ち、追加のキーワード引数は基になるmatplotlibアーティストに渡され、より詳細な制御を可能にします。プロットを作成したら、seaborn APIとmatplotlibレイヤーにドロップダウンしてきめ細かい調整を行うことによって、そのプロパティを変更できます。

sns.set_theme(style="ticks", font_scale=1.25)
g = sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="body_mass_g",
    palette="crest", marker="x", s=100,
)
g.set_axis_labels("Bill length (mm)", "Bill depth (mm)", labelpad=10)
g.legend.set_title("Body mass (g)")
g.figure.set_size_inches(6.5, 4.5)
g.ax.margins(.15)
g.despine(trim=True)
../_images/introduction_35_0.png

matplotlibとの関係#

Seabornはmatplotlibと統合されているため、matplotlibがサポートする多くの環境(ノートブックでの探索的分析、GUIアプリケーションでのリアルタイム操作、様々なラスターおよびベクター形式でのアーカイブ出力など)で使用できます。

Seabornの関数のみを使用しても生産性を上げることができますが、グラフを完全にカスタマイズするには、matplotlibの概念とAPIに関するある程度の知識が必要です。Seabornの新しいユーザーにとって、学習曲線の一つの側面は、特定のカスタマイズを実現するためにmatplotlibのレイヤーに降りる必要があるかどうかを知ることです。一方、matplotlibからのユーザーは、自分の知識の多くが転用できることに気付くでしょう。

Matplotlibは包括的で強力なAPIを備えています。図のほぼすべての属性を好みに合わせて変更できます。Seabornの高レベルインターフェースとmatplotlibの深いカスタマイズ性の組み合わせにより、データの迅速な探索と、出版物レベルの最終製品に合わせたグラフの作成が可能です。

次のステップ#

次に進むにはいくつかの選択肢があります。まず、Seabornのインストール方法を学ぶことをお勧めします。インストールが完了したら、サンプルギャラリーを参照して、Seabornで作成できるグラフの種類をより広く理解することができます。または、ユーザーガイドとチュートリアルの残りの部分を読んで、さまざまなツールとその目的について詳しく説明することができます。特定のグラフを作成する方法を知りたい場合は、各関数のパラメーターを文書化し、使用方法を示す多くの例を示すAPIリファレンスを確認できます。