Seaborn で散布図・回帰モデルを可視化する

本ページでは、Python のデータ可視化ライブラリ、Seaborn (シーボーン) を使って回帰モデルや相関を可視化したグラフを出力する方法を紹介します。

Seaborn には、回帰モデルを可視化するクラスとして seaborn.regplotseaborn.lmplot のクラスが実装されています。

regplot: 回帰モデルの可視化

seaborn.regplot メソッドは、2 次元のデータと線形回帰モデルの結果を重ねてプロットします。

seaborn.regplot の使い方

seaborn.regplot(x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci',
          scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, 
                order=1, logistic=False, lowess=False, robust=False, logx=False,
                x_partial=None, y_partial=None, truncate=False, dropna=True,
                x_jitter=None, y_jitter=None, label=None, color=None, marker='o', 
                scatter_kws=None, line_kws=None, ax=None)

seaborn.regplot の主要な引数

x, y x 軸、y 軸の列名を文字列で指定するか、行列を指定。
data Pandas のデータフレームを指定。
x_estimator 関数を指定。x 軸の各値に指定された関数を実行し、その返り値をプロットする。x 軸が離散値である場合によく利用されます。(デフォルト値: None)
x_bins x 軸の値を離散値に変換し、信頼区間を求めます。(散布図の出力のみ使用され、回帰は元データを用います) ビンの数を数値またはベクトルで指定します。(デフォルト値: None)
x_ci x 軸 の信頼区間 (%) 。0 から 100 の間の数値を指定。ci を指定した場合は、ci の値を用います。(デフォルト値: 95)
scatter True に設定すると、散布図を出力します。False に設定すると、散布図を出力しません。 (デフォルト値: True)
fit_reg True に設定すると、x と y の値に基づいて線形回帰を行い、モデルを出力します。(デフォルト値: False)
ci 回帰を行う際の信頼区間 (%) を指定します。大量のデータを用いる際のブートストラップに利用されます。0 から 100 の間の数値で指定します。(デフォルト値: 95)
n_boot ブートストラップによるサンプリングを行う回数。(デフォルト値: 1000)
units x や y の観測値がいくつかのユニットで構成される場合、変数名を指定することで、マルチレベルによるブートストラップを行い、信頼区間を計算します。これは回帰や推定の結果には影響しません。(デフォルト値: None)
order 1 以上の数値を指定すると、numpy.polyfit を用いて、多項式回帰を行います。(デフォルト値: 1)
logistic True に設定すると、y 軸が 2 値の変数で構成され、ロジスティック回帰モデルを利用します。このモデルを利用する場合、通常の線形回帰に比べて多くの計算を要するので、n_boot を小さな値に設定するか、ci を None に設定することを推奨します。(デフォルト値: False)
lowess True に設定すると、ノンパラメトリックな lowess モデル (locally weighted linear regression) を用いて推定を行います。この場合、信頼区間は出力されません。(デフォルト値: False)
robust True に設定すると、ロバスト回帰モデルを利用して推定を実施します。このモデルを利用すると、外れ値の重みを軽くして扱います。このモデルを利用する場合、通常の線形回帰に比べて多くの計算を要するので、n_boot を小さな値に設定するか、ci を None に設定することを推奨します。(デフォルト値: False)
logx True に設定すると、y ~ log(x) の式で線形回帰を行います。この場合、x は、正の数である必要があります。(デフォルト値: False)
x_partial, y_partial 交絡変数 (Confounding variables) を文字列または行列で指定。
truncate 散布図がプロットされた後、回帰直線はx軸の端から端までをつなぐようにプロットするが、True に設定すると、データの範囲内で回帰直線をプロットする。(デフォルト値: False)
x_jitter, y_jitter 一様なランダムノイズを x, y の変数に適用する場合、そのノイズの大きさを設定する。(デフォルト値: None)
label 散布図または回帰直線 (scatter=Falseの場合) の凡例として出力するラベルの文字列。(デフォルト値: None)
color 色を matplotlib の色で指定。(デフォルト値: None)
marker マーカーの記号を matplotlib のマーカーコードで指定。(デフォルト値: ‘o’)
scatter_kws, line_kws matplotlib の plt.scatter , plt.plot に渡すオプションをディクショナリ形式で指定。(デフォルト値: None)
ax 軸 (Axes) オブジェクトに関する指定を matplotlib の形式で指定。(デフォルト値: None) 参考: matplotlib で折れ線グラフを描く

グラフの出力例

Seaborn 付属の飲食店のチップの額のデータセットをロードします。

>>> import seaborn as sns
>>> sns.set_style("whitegrid")
>>> tips = sns.load_dataset("tips")
     total_bill   tip     sex smoker   day    time  size
0         16.99  1.01  Female     No   Sun  Dinner     2
1         10.34  1.66    Male     No   Sun  Dinner     3
2         21.01  3.50    Male     No   Sun  Dinner     3
3         23.68  3.31    Male     No   Sun  Dinner     2
4         24.59  3.61  Female     No   Sun  Dinner     4
5         25.29  4.71    Male     No   Sun  Dinner     4
 ... (中略)

x 軸に全体の支払額、y 軸にチップの額を出力。

sns.regplot(x="total_bill", y="tip", data=tips)

regplot01


信頼区間を 50% に設定。これは、50% の確率で、薄いブルーの範囲内に収まることを意味します。

sns.regplot(x="total_bill", y="tip", data=tips, ci=50)

regplot02


散布図を非表示 ( scatter=False ) に設定。

sns.regplot(x="total_bill", y="tip", data=tips, scatter=False)

regplot03


回帰を行わず ( fit_reg=False ) 、散布図のみを出力。

sns.regplot(x="total_bill", y="tip", data=tips, fit_reg=False)

regplot04


多項式回帰による近似を行い (以下例では、3 次) 、回帰曲線と信頼区間を表示。

sns.regplot(x="total_bill", y="tip", data=tips, order=3)

regplot05


回帰直線と信頼区間をデータが存在する区間のみ出力。

sns.regplot(x="total_bill", y="tip", data=tips, truncate=True)

regplot06


マーカーの種類を + 印に変更。

sns.regplot(x="total_bill", y="tip", data=tips, marker="+")

regplot07


色を紫色 (purple) に設定。

sns.regplot(x="total_bill", y="tip", data=tips, color="purple")

regplot08


matplotlib のオプションを利用し、線の太さを 10 に設定。

sns.regplot(x="total_bill", y="tip", data=tips, line_kws={"linewidth": 10})

regplot09


一様乱数によるランダムノイズ を x 軸に追加し、データの重なりを抑制して出力。

import numpy as np
x_values=np.random.randint(1, 10, 100)
sns.regplot(x=x_values, y=np.random.rand(len(x_values)), fit_reg=False)
sns.regplot(x=x_values, y=np.random.rand(len(x_values)), fit_reg=False, x_jitter=0.3)

regplot10


ロジスティック回帰を行い、散布図とロジスティック関数を出力。

import numpy as np
np.random.seed(0)
x_values=np.concatenate((np.random.randint(0, 60, 50), np.random.randint(40, 100, 50)))
y_values=np.concatenate((np.repeat(0, 50), np.repeat(1, 50)))
sns.regplot(x=x_values, y=y_values, logistic=True)

regplot11

lmplot: 回帰モデルの可視化とグリッドによる表示

seaborn.lmplot メソッドは、seaborn.regplot の機能に加えて、複数のグラフをまとめて 1 度に出力する機能 (FacetGrid) を持っている点が特徴です。

seaborn.lmplot の使い方

seaborn.lmplot(x, y, data, hue=None, col=None, row=None, palette=None,
               col_wrap=None, size=5, aspect=1, markers='o', sharex=True,
               sharey=True, hue_order=None, col_order=None, row_order=None,
               legend=True, legend_out=True, x_estimator=None, x_bins=None,
               x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000,
               units=None, order=1, logistic=False, lowess=False, robust=False,
               logx=False, x_partial=None, y_partial=None, truncate=False,
               x_jitter=None, y_jitter=None, scatter_kws=None, line_kws=None)

seaborn.lmplot の主要な引数

基本的には、seaborn.regplot と同じです。seaborn.lmplot では、ファセットと呼ばれる、各グラフの表示枠単位でレイアウトなどの設定を行う事ができます。

x, y x 軸、y 軸の列名を文字列で指定するか、行列を指定。
data Pandas のデータフレームを指定。
hue, col, row データのサブセットを表す変数を指定。hue で指定した場合、色で分けて出力し、col または row で指定した場合は、別々の表示枠 (ファセット) として出力されます。(デフォルト値: None)
palette hue で指定した変数の各項目に用いる色をディクショナリまたは、matplotlib のパレットで指定。
col_wrap 1 行につき出力するファセットの数。例えば、2 と指定すると、横方向に 2 つのファセットを出力し、あふれたファセットは次の行に出力します。(デフォルト値: False)
size 各ファセットの高さ (単位: インチ) (デフォルト値: 5)
aspect 各ファセットのアスペクト比。つまり、aspect * size は、各ファセットの幅 (単位: インチ) を示します。(デフォルト値: 1)
markers 散布図に用いるマーカーの種類。リストを指定した場合、hue で指定した変数の各項目に適用されます。(デフォルト値: ‘o’)
sharex, sharey True に設定すると、各ファセットは x 軸、または y 軸で同じ目盛を利用します。(デフォルト値: True)
hue_order, col_order, row_order 各ファセットの出力する順番。何も指定しない場合はデータの出現順もしくは Pandas のカテゴリの順番になります。(デフォルト値: None )
legend True に設定し、hue が設定されている場合、凡例を出力します。(デフォルト値: True)
legend_out True に設定すると、図のサイズを拡張し、凡例を範囲外に出力します。(デフォルト値: True)
x_estimator 関数を指定。x 軸の各値に指定された関数を実行し、その返り値をプロットする。x 軸が離散値である場合によく利用されます。(デフォルト値: None)
x_bins x 軸の値を離散値に変換し、信頼区間を求めます。(散布図の出力のみ使用され、回帰は元データを用います) ビンの数を数値またはベクトルで指定します。(デフォルト値: None)
x_ci x 軸 の信頼区間 (%) 。0 から 100 の間の数値を指定。ci を指定した場合は、ci の値を用います。(デフォルト値: 95)
scatter True に設定すると、散布図を出力します。False に設定すると、散布図を出力しません。 (デフォルト値: True)
fit_reg True に設定すると、x と y の値に基づいて線形回帰を行い、モデルを出力します。(デフォルト値: False)
ci 回帰を行う際の信頼区間 (%) を指定します。大量のデータを用いる際のブートストラップに利用されます。0 から 100 の間の数値で指定します。(デフォルト値: 95)
n_boot ブートストラップによるサンプリングを行う回数。(デフォルト値: 1000)
units x や y の観測値がいくつかのユニットで構成される場合、変数名を指定することで、マルチレベルによるブートストラップを行い、信頼区間を計算します。これは回帰や推定の結果には影響しません。(デフォルト値: None)
logistic True に設定すると、y 軸が 2 値の変数で構成され、ロジスティック回帰モデルを利用します。このモデルを利用する場合、通常の線形回帰に比べて多くの計算を要するので、n_boot を小さな値に設定するか、ci を None に設定することを推奨します。(デフォルト値: False)
lowess True に設定すると、ノンパラメトリックな lowess モデル (locally weighted linear regression) を用いて推定を行います。この場合、信頼区間は出力されません。(デフォルト値: False)
robust True に設定すると、ロバスト回帰モデルを利用して推定を実施します。このモデルを利用すると、外れ値の重みを軽くして扱います。このモデルを利用する場合、通常の線形回帰に比べて多くの計算を要するので、n_boot を小さな値に設定するか、ci を None に設定することを推奨します。(デフォルト値: False)
logx True に設定すると、y ~ log(x) の式で線形回帰を行います。この場合、x は、正の数である必要があります。(デフォルト値: False)
x_partial, y_partial 交絡変数 (Confounding variables) を文字列または行列で指定。(デフォルト値: None)
truncate 散布図がプロットされた後、回帰直線はx軸の端から端までをつなぐようにプロットするが、True に設定すると、データの範囲内で回帰直線をプロットする。(デフォルト値: False)
x_jitter, y_jitter 一様なランダムノイズを x, y の変数に適用する場合、そのノイズの大きさを設定する。(デフォルト値: None)
scatter_kws, line_kws matplotlib の plt.scatter , plt.plot に渡すオプションをディクショナリ形式で指定。(デフォルト値: None)

グラフの出力例

Seaborn 付属の飲食店のチップの額のデータセットをロードします。

>>> import seaborn as sns
>>> sns.set_style("whitegrid")
>>> tips = sns.load_dataset("tips")
     total_bill   tip     sex smoker   day    time  size
0         16.99  1.01  Female     No   Sun  Dinner     2
1         10.34  1.66    Male     No   Sun  Dinner     3
2         21.01  3.50    Male     No   Sun  Dinner     3
3         23.68  3.31    Male     No   Sun  Dinner     2
4         24.59  3.61  Female     No   Sun  Dinner     4
5         25.29  4.71    Male     No   Sun  Dinner     4
 ... (中略)

x 軸に全体の支払額、y 軸にチップの額、喫煙の有無を色で分けて出力。

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)

lmplot01


x 軸に全体の支払額、y 軸にチップの額、喫煙の有無を列で分けて出力。

sns.lmplot(x="total_bill", y="tip", col="smoker", data=tips)

lmplot02


x 軸に全体の支払額、y 軸にチップの額、喫煙の有無を行で分けて出力。

sns.lmplot(x="total_bill", y="tip", row="smoker", data=tips)

lmplot03


凡例 (Legend) を省略して出力。

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, legend=False)

lmplot04


x 軸に全体の支払額、y 軸にチップの額、性別を列で分けて出力。x 軸の目盛をそれぞれ独立して出力。

sns.lmplot(x="total_bill", y="tip", col="sex", data=tips, sharex=False)

lmplot05


x 軸に全体の支払額、y 軸にチップの額、性別を列で分けて出力。y 軸の目盛をそれぞれ独立して出力。

sns.lmplot(x="total_bill", y="tip", col="sex", data=tips, sharey=False)

lmplot06


マーカーの種類を喫煙有無でそれぞれ ”o”, “+” に指定して出力。

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, markers=["o", "x"])

lmplot07


カラーパレットを Set1 に指定。

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, palette="Set1")

lmplot08


喫煙有無について、Yes の場合 g (緑), No の場合 m (マゼンタ) の色で出力。

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
           palette=dict(Yes="g", No="m"))

lmplot09



アスペクト比(縦横比)を 0.4、x 軸に 0.1 のランダムノイズを設定して出力。

sns.lmplot(x="size", y="total_bill", hue="day", col="day", data=tips,
           aspect=.4, x_jitter=.1)

lmplot10


1 行に出力するファセットの数を 2 つに指定。
行方向で性別、列方向で時間帯(ランチまたはディナー)を組みわせて出力

sns.lmplot(x="total_bill", y="tip", col="day", hue="day", data=tips, col_wrap=2)

lmplot11


背景を白、グリッドをグレーに設定。

sns.set_style("whitegrid")
sns.lmplot(x="total_bill", y="tip", hue="sex", data=tips)

lmplot12

参考・一部コード出典:
seaborn.regplot — seaborn 0.7.1 documentation
seaborn.lmplot — seaborn 0.7.1 documentation