Pythonで単回帰分析
(1)単回帰分析を行なう
今回は単回帰分析と図の作成をしたいと思います。以前、scipyのstatsを用いたので、今回はsklearnで行なってみます。
(2)使うデータ
いつもどおりirisデータです。
(3)実際に計算してみる。
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
df = pd.read_csv('iris.csv')
#変数を指定。[]が2つあるのは、sklearnとPandasの関係性のため。
X = df[['sepal.length']]
Y = df[['petal.length']]
#単回帰分析
reg = LinearRegression().fit(X, Y)
#係数と回帰式を確認
print('回帰係数: %.3f' %reg.coef_)
print('切片: %.3f' %reg.intercept_)
print('回帰直線: y = %.3fx %.3f' % (reg.coef_ , reg.intercept_))
#決定係数を確認
R2 = reg.score(X, Y)
print('決定係数 R2: %.3f' %R2)
#予測結果をdfに追加
df['pred'] = reg.predict(X)
#図にしてみます。
plt.xticks(np.arange(0, 11, 1))
plt.xlim(0, 10)
plt.yticks(np.arange(0, 11, 1))
plt.ylim(0, 10)
plt.xlabel('がくの長さ')
plt.ylabel('花弁の長さ')
plt.scatter(df['sepal.length'], df['petal.length'])
plt.plot(df['sepal.length'], df['pred'], color='orange')
plt.show()
出来上がりの図はこちらです。
以下、解説です。
■6~8行目
#変数を指定。[]が2つあるのは、sklearnとPandasの関係性のため。
X = df[['sepal.length']]
Y = df[['petal.length']]
sklearnはnumpyの配列を想定しているようで、Pandasのコラムを指定するだけだとエラーになります。[]を2つ書くことで、コラムをnumpyの配列っぽくしてくれます。
■9~10行目
#単回帰分析
reg = LinearRegression().fit(X, Y)
回帰分析はこの1行で終わりです。簡単!
■12~16行目
#係数と回帰式を確認
print('回帰係数: %.3f' %reg.coef_)
print('切片: %.3f' %reg.intercept_)
print('回帰直線: y = %.3fx %.3f' % (reg.coef_ , reg.intercept_))
#決定係数を確認
R2 = reg.score(X, Y)
print('決定係数 R2: %.3f' %R2)
回帰係数と切片を確認します。その後、回帰式を算出します。また決定係数R2も併せて出力します。
各変数の意味は以下のとおりです。
coef_:回帰係数
intercept_:切片
score:決定係数R2
(4)まとめ
Excelよりは手間がかかりますが、簡単ですね。
またsklearn_pandasというパッケージも開発されているようです。このパッケージを使えば、6~8行目は[]1つで良くなるかもしれません。
(5)参考
sklearn.linear_model.LinearRegressionについてはここです。
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html