本ページでは、Python のデータ可視化ライブラリ、Seaborn (シーボーン) を使って回帰モデルや相関を可視化したグラフを出力する方法を紹介します。
Seaborn には、回帰モデルを可視化するクラスとして seaborn.regplot
と seaborn.lmplot
のクラスが実装されています。
regplot: 回帰モデルの可視化
seaborn.regplot メソッドは、2 次元のデータと線形回帰モデルの結果を重ねてプロットします。
seaborn.regplot の使い方
1 2 3 4 5 6 |
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 付属の飲食店のチップの額のデータセットをロードします。
1 2 3 4 5 6 7 8 9 10 11 |
>>> 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 軸にチップの額を出力。
1 |
sns.regplot(x="total_bill", y="tip", data=tips) |
信頼区間を 50% に設定。これは、50% の確率で、薄いブルーの範囲内に収まることを意味します。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, ci=50) |
散布図を非表示 ( scatter=False
) に設定。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, scatter=False) |
回帰を行わず ( fit_reg=False
) 、散布図のみを出力。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, fit_reg=False) |
多項式回帰による近似を行い (以下例では、3 次) 、回帰曲線と信頼区間を表示。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, order=3) |
回帰直線と信頼区間をデータが存在する区間のみ出力。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, truncate=True) |
マーカーの種類を + 印に変更。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, marker="+") |
色を紫色 (purple
) に設定。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, color="purple") |
matplotlib のオプションを利用し、線の太さを 10
に設定。
1 |
sns.regplot(x="total_bill", y="tip", data=tips, line_kws={"linewidth": 10}) |
一様乱数によるランダムノイズ を x 軸に追加し、データの重なりを抑制して出力。
1 2 3 4 |
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) |
ロジスティック回帰を行い、散布図とロジスティック関数を出力。
1 2 3 4 5 |
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) |
lmplot: 回帰モデルの可視化とグリッドによる表示
seaborn.lmplot メソッドは、seaborn.regplot の機能に加えて、複数のグラフをまとめて 1 度に出力する機能 (FacetGrid) を持っている点が特徴です。
seaborn.lmplot の使い方
1 2 3 4 5 6 7 8 |
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 付属の飲食店のチップの額のデータセットをロードします。
1 2 3 4 5 6 7 8 9 10 11 |
>>> 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 軸にチップの額、喫煙の有無を色で分けて出力。
1 |
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips) |
x 軸に全体の支払額、y 軸にチップの額、喫煙の有無を列で分けて出力。
1 |
sns.lmplot(x="total_bill", y="tip", col="smoker", data=tips) |
x 軸に全体の支払額、y 軸にチップの額、喫煙の有無を行で分けて出力。
1 |
sns.lmplot(x="total_bill", y="tip", row="smoker", data=tips) |
凡例 (Legend) を省略して出力。
1 |
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, legend=False) |
x 軸に全体の支払額、y 軸にチップの額、性別を列で分けて出力。x 軸の目盛をそれぞれ独立して出力。
1 |
sns.lmplot(x="total_bill", y="tip", col="sex", data=tips, sharex=False) |
x 軸に全体の支払額、y 軸にチップの額、性別を列で分けて出力。y 軸の目盛をそれぞれ独立して出力。
1 |
sns.lmplot(x="total_bill", y="tip", col="sex", data=tips, sharey=False) |
マーカーの種類を喫煙有無でそれぞれ ”o”, “+” に指定して出力。
1 |
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, markers=["o", "x"]) |
カラーパレットを Set1
に指定。
1 |
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, palette="Set1") |
喫煙有無について、Yes の場合 g
(緑), No の場合 m
(マゼンタ) の色で出力。
1 2 |
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, palette=dict(Yes="g", No="m")) |
アスペクト比(縦横比)を 0.4、x 軸に 0.1 のランダムノイズを設定して出力。
1 2 |
sns.lmplot(x="size", y="total_bill", hue="day", col="day", data=tips, aspect=.4, x_jitter=.1) |
1 行に出力するファセットの数を 2 つに指定。
行方向で性別、列方向で時間帯(ランチまたはディナー)を組みわせて出力
1 |
sns.lmplot(x="total_bill", y="tip", col="day", hue="day", data=tips, col_wrap=2) |
背景を白、グリッドをグレーに設定。
1 2 |
sns.set_style("whitegrid") sns.lmplot(x="total_bill", y="tip", hue="sex", data=tips) |
参考・一部コード出典:
seaborn.regplot — seaborn 0.7.1 documentation
seaborn.lmplot — seaborn 0.7.1 documentation