pythonで回帰分析してみる①scikit-learn LinearRegression編

この記事ではpythonを使って回帰分析する際のコードをまとめていく。いくつか方法がありそうなので、ライブラリごとに変えていければと思う。

 今回はscikit-learn LinerRegression編。

検索すると山ほど例が出てくるので、今回は自分のメモ用に簡単なコードだけ残しておく。

 

Numpyの場合

こちらはnumpyを利用してやる場合。データの次元を指定するreshapeが必要になるので注意。

%matplotlib notebook
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
import seaborn as sns

#データを作成
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 6, 6, 9, 6])
x = x.reshape(-1, 1) #データが一次元である事を指定する
y = y.reshape(-1, 1)

#直線回帰モデルを設定
clf = linear_model.LinearRegression()

#学習
clf.fit(x, y)

#結果
print("回帰係数=", clf.coef_[0])
print("切片:",clf.intercept_)
print("R^2=",clf.score(x, y))

#予想値
x_ex = np.arange(-1, 7, 0.1)
y_ex = clf.coef_[0] * x_ex + clf.intercept_

#プロット
sns.set_style("whitegrid", {'grid.linestyle':'--'})
plt.rcParams["font.family"] = 'meiryo'

fig1 = plt.figure(figsize=(3,3), facecolor='w')
ax1 = fig1.add_subplot(111)
ax1.set_xlim(-1, 7)
ax1.set_ylim(-2, 10)
ax1.set_xlabel("X",fontsize=10,fontname='meiryo')
ax1.set_ylabel("Y",fontsize=10,fontname='meiryo')

ax1.scatter(x, y, marker="o",alpha=1,edgecolors="#08699E",facecolor="#08699E", s=40) #実データ
ax1.plot(x_ex, y_ex ,'r--',color="#000000") #回帰の予想値

 出力はこんな感じ 。手作業の回帰分析と同じ結果が得られた。

回帰係数= [1.1]
切片: [2.5]
R^2= 0.48790322580645173

 f:id:Chemstat:20201101081444p:plain

 

Pandasの場合

padasの場合はデータをこんな感じで整える必要がある。

import pandas as pd
cols = ['X', 'Y'] data = pd.DataFrame(index=[], columns=cols) x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 6, 6, 9, 6]) data['X'] = x data['Y'] = y x = data.loc[:, ['X']] y = data['Y'] #直線回帰モデルを設定 clf = linear_model.LinearRegression() #学習 clf.fit(x, y)

 

回帰による予想値

 xを与えると、predictで予想値を得ることが出来る。これを使って残差を求め各種検定が可能になる。

#予想値
y_pred = clf.predict(x)

#プロット
ax1.scatter(x, y_pred, marker="o",alpha=1,edgecolors="#08699E",facecolor="#08699E", s=40) #予想値
ax1.plot(x_ex, y_ex ,'r--',color="#000000") #回帰直線

f:id:Chemstat:20201101084157p:plain

 

その他統計値

 xを与えると、predictで予想値を得ることが出来る。

#平均二乗誤差(残差/データ数なので、統計的には使いづらい)
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y, y_pred))

#r2値
from sklearn.metrics import r2_score
print('r^2 train data: ', r2_score(y, y_pred))

 

重回帰分析の場合

一応重回帰の場合はこんな感じ

from sklearn import linear_model
import pandas as pd
cols = ['X', 'Y', 'Z']
data = pd.DataFrame(index=[], columns=cols)
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 6, 6, 9, 6])
z = np.array([1, 3, 4, 7, 9])
data['X'] = x
data['Y'] = y
data['Z'] = z
print(data)
X_Y = data.drop('Z', axis=1)
Z = data['Z']

#直線回帰モデルを設定
clf = linear_model.LinearRegression()

#学習
clf.fit(X_Y, Z)

#結果
#偏回帰係数
print(pd.DataFrame({"Name":X_Y.columns, "Coefficients":clf.coef_}).sort_values(by='Coefficients'))
# 切片 (誤差)
print(clf.intercept_)
print("切片:",clf.intercept_)
print("R^2=",clf.score(X_Y, Z))

 

  Name  Coefficients
1    Y     -0.015748
0    X      2.017323
切片: -1.1606299212598445
R^2= 0.9804693530955689
[0.82519685 2.77952756 4.79685039 6.76692913 8.83149606]

 

参考

numpyでの実施:回帰分析の基礎 - 井上 研一

pandasでの実施、重回帰分析:scikit-learn で線形回帰 (単回帰分析・重回帰分析) – Python でデータサイエンス