web-dev-qa-db-ja.com

Seabornで回帰をプロットするときに数値フィッティング結果を取得するにはどうすればよいですか?

Pythonでseabornライブラリを使用して線形回帰の結果をプロットする場合、回帰の数値結果を見つける方法はありますか?たとえば、フィッティングを知りたい場合があります。係数またはR2 フィット感。

基になるstatsmodelsインターフェイスを使用して同じ近似を再実行することもできますが、それは不必要な重複作業のように思われ、とにかく結果の係数を比較して数値結果が私と同じであることを確認できるようにしたいですプロットで見ています。

43
The Photon

これを行う方法はありません。

私の意見では、統計ライブラリーに統計モデリングの結果を提供するよう依頼することは逆です。モデリングライブラリのstatsmodelsを使用すると、モデルを適合させ、適合したモデルに正確に対応するプロットを描画できます。正確な対応が必要な場合は、この操作の順序がよりわかりやすくなります。

「しかし、statsmodelsのプロットにはseabornほど多くの美的オプションはありません」と言うかもしれません。しかし、それは理にかなっていると思います— statsmodelsは、モデリングサービスで視覚化を使用することがあるモデリングライブラリです。 seabornは、視覚化サービスでモデリングを使用することがある視覚化ライブラリです。専門化することは良いことであり、すべてをしようとすることは悪いことです。

幸い、seabornstatsmodelsはどちらも tidy data を使用します。つまり、適切なツールを使用してプロットとモデルの両方を取得するために、ほんのわずかな労力で複製を行う必要があります。

22
mwaskom

現在利用可能なドキュメントを見ると、この機能に対応できるかどうかを判断するのに最も近いのは、scipy.stats.pearsonrモジュールを使用しているかどうかです。

r2 = stats.pearsonr("pct", "rdiff", df)

Pandas dataframe内で直接機能させるために、基本的なscipy入力要件に違反することから追い出されたエラーがあります:

TypeError: pearsonr() takes exactly 2 arguments (3 given)

別のPandas明らかに解決したSeabornユーザーを見つけました: https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/stats。 py#L2392

sns.regplot("rdiff", "pct", df, corr_func=stats.pearsonr);

しかし、残念ながら、筆者は独自のカスタム「corr_func」を作成したか、より手動のメソッドを使用して利用できるドキュメント化されていないSeabornの引数渡しメソッドがあるため、これを機能させることができませんでした。

# x and y should have same length.
    x = np.asarray(x)
    y = np.asarray(y)
    n = len(x)
    mx = x.mean()
    my = y.mean()
    xm, ym = x-mx, y-my
    r_num = np.add.reduce(xm * ym)
    r_den = np.sqrt(ss(xm) * ss(ym))
    r = r_num / r_den

# Presumably, if abs(r) > 1, then it is only some small artifact of floating
# point arithmetic.
r = max(min(r, 1.0), -1.0)
df = n-2
if abs(r) == 1.0:
    prob = 0.0
else:
    t_squared = r*r * (df / ((1.0 - r) * (1.0 + r)))
    prob = betai(0.5*df, 0.5, df / (df + t_squared))
return r, prob

MS-ExcelまたはストックのMatplotlibラインプロットから簡単に取得できるものに代わるものとして、回帰フィットネス統計をSeabornパッケージに追加するために非常に必要なユーティリティがあるため、これが暫定ソリューションに向けてこの元の要求を進めるのに役立つことを願っています。

2
user3741230

Seabornの作成者 残念ながら述べられています 彼はそのような機能を追加しないので、ここに回避策があります。

def regplot(*args, **kwargs):
    # this is the class that `sns.regplot` uses
    plotter = sns.regression._RegressionPlotter(*args, **kwargs)

    # this is essentially the code from `sns.regplot`
    ax = kwargs.get("ax", None)
    if ax is None:
        ax = plt.gca()

    scatter_kws = {} if scatter_kws is None else copy.copy(scatter_kws)
    scatter_kws["marker"] = marker
    line_kws = {} if line_kws is None else copy.copy(line_kws)

    plotter.plot(ax, scatter_kws, line_kws)

    # unfortunately the regression results aren't stored, so we rerun
    grid, yhat, err_bands = plotter.fit_regression(plt.gca())

    # also unfortunately, this doesn't return the parameters, so we infer them
    slope = (yhat[-1] - yhat[0]) / (grid[-1] - grid[0])
    intercept = yhat[0] - slope * grid[0]
    return slope, intercept

これは線形回帰に対してのみ機能することに注意してください。これは、回帰結果から勾配と切片を推測するだけだからです。良い点は、seabornの独自の回帰クラスを使用しているため、結果が表示されているものと一致することが保証されていることです。欠点はもちろん、seabornのプライベート実装の詳細を使用しているため、いつでも機能しなくなる可能性があることです。

1
Legendre17