この記事では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
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") #回帰直線
その他統計値
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]
参考
pandasでの実施、重回帰分析:scikit-learn で線形回帰 (単回帰分析・重回帰分析) – Python でデータサイエンス