Python

Python seaborn チュートリアル プロット機能 回帰モデルを可視化 (2)

原文のドキュメントはこちらから。

各種モデルへの適合

(1)で使用した単純線形回帰モデルは簡単に適合できるが、いくつかの種類のデータセットには適切ではない。Anscombeのカルテットデータセットは、単純な線形回帰が、単純な目視検査で明らかに違いがわかるような関係の同一の推定値を提供するいくつかの例を示している。例えば、最初のケースでは、線形回帰は良いモデルだ。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), ci=None, scatter_kws={"s": 80})

plt.show()

2つ目のデータセットの直線的な関係は同じだが、プロットを見ると明らかに良いモデルではないことがわかりる。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), ci=None, scatter_kws={"s": 80})

plt.show()

このような高次の関係が存在する場合、 lmplot() と regplot() は多項式回帰モデルを適合させて、データセット内の単純な非線形傾向を探索することができる。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), order=2, ci=None, scatter_kws={"s": 80})

plt.show()

別の問題は、研究対象の主な関係以外の何らかの理由で逸脱する「外れ値」オブザベーションによって提起される。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"), ci=None, scatter_kws={"s": 80})

plt.show()

アウトライアの存在下では、比較的大きな残差をダウンウェイトするために別の損失関数を使用するロバスト回帰を適合させることが有用である。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"), robust=True, ci=None, scatter_kws={"s": 80})

plt.show()

私の環境では以下のエラーがでたことがあった。

ModuleNotFoundError: No module named ‘statsmodels’

pip install statsmodels
もしくは、
conda install statsmodels
jupyterを利用している場合は、ノートブックを再起動する

y変数が2値の場合、単純な線形回帰もまた「機能する」が、ありえない予測を返す。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

tips = sns.load_dataset("tips")
tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips, y_jitter=.03)

plt.show()

この場合の解決策は、回帰線が与えられたxの値に対してy = 1の推定確率を示すように、ロジスティック回帰を適合させることである。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

tips = sns.load_dataset("tips")
tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips, logistic=True, y_jitter=.03)

plt.show()

ロジスティック回帰の推定値は、単純回帰よりもかなり計算量が多く(これはロバスト回帰にも当てはまる)、回帰線の周囲の信頼区間はブートストラップ手順を使用して計算されるため、より高速な反復のためにこれを無効にしたい場合がある(ci=Noneを使用)。

全く別のアプローチは、ローレス・スムーサーを使用してノンパラメトリック回帰を適合させることだ。このアプローチは、計算量が多いので、現在のところ信頼区間はまったく計算されていないが、仮定が最も少ないアプローチである。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

tips = sns.load_dataset("tips")
sns.lmplot(x="total_bill", y="tip", data=tips, lowess=True)

plt.show()

residplot() 関数は、単純回帰モデルがデータセットに適しているかどうかを確認するのに便利なツール。これは,単純な線形回帰を適合させて除去し、各オブザベーションの残差値をプロットする。理想的には、これらの値は、y = 0の周りにランダムに散らばっていることが望ましい。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

anscombe = sns.load_dataset("anscombe")
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), scatter_kws={"s": 80})

plt.show()

残差に構造がある場合、単純な線形回帰が適切でないことを示唆している。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(color_codes=True)

anscombe = sns.load_dataset("anscombe")
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), scatter_kws={"s": 80})

plt.show()