いっかくのデータサイエンティストをいく

1からプログラミングとデータサイエンスを独習したい

【統計学】回帰分析と最小二乗法(Python)

今回はPythonで単回帰分析です。調べてみるといろいろやり方があるようです。

データはおなじみの上記書籍のP60にあるJリーグの試合結果のデータを使用します。

statsmodelで単回帰分析

こちらは回帰分析の結果の要約が出ます。

wcs.hatenablog.com

import pandas as pd
import statsmodels.api as sm
#データ
df = pd.DataFrame({ 
                   'score':[67, 84, 80, 60, 68, 62, 51, 47, 49, 50, 57, 43, 56, 46, 42, 32, 44, 38],
                   'wins':[22, 20, 20, 18, 17, 18, 13, 13, 13, 13, 13, 13, 13, 12, 12, 5, 6, 4]
                   })

#回帰分析
import statsmodels.api as sm
y = df["wins"]
X = df["score"]
mod = sm.OLS(y, sm.add_constant(X))
res = mod.fit()
res.summary() #結果を表示

結果はこちら f:id:imakoto0323:20180613170433p:plain

sklearnで単回帰分析

こちらは散布図に回帰直線が描けます。予測とかもできるので機械学習向けかもしれません。 こちらも参考になります。

qiita.com

import pandas as pd
from sklearn.linear_model import LinearRegression

#データ
df = pd.DataFrame({ 
                   'score':[67, 84, 80, 60, 68, 62, 51, 47, 49, 50, 57, 43, 56, 46, 42, 32, 44, 38],
                   'wins':[22, 20, 20, 18, 17, 18, 13, 13, 13, 13, 13, 13, 13, 12, 12, 5, 6, 4]
                   })

#回帰分析
mod = LinearRegression(fit_intercept = True)
lm = mod.fit(df[["score"]], df[["wins"]])
print(lm)
 
# 回帰係数
print(mod.coef_)
#[[ 0.3139177]]
# 切片 (誤差)
print(mod.intercept_)
#[-3.41020408]
# 決定係数
print(mod.score(df[["score"]], df[["wins"]]))
#0.753611299082

結果をいちいち呼び出さないといけなかったり、結果の出力の方が違ったりなんだかです。