回帰分析(Regression Analysis)とは、ある変数の値から別の変数の値を推定する方法です。
データによって未来を予測するデータサイエンスで頻繁に用いられる手法になります。
回帰分析には推定に用いる独立変数(説明変数)と、推定される従属変数の二つがあります。
独立変数とは、ほかの変数や数値の影響を受けない変数であり、例えば調査や測定の条件になります。
そして従属変数はというと、独立変数の影響を受ける変数であり、調査や測定の結果になるのです。
ここで少し、混乱するのが回帰分析と相関関係の違いです。
相関関係の場合二つの変数は対等であり、どちらかがどちらかに従属するものではありません。
ということを理解したうえで、実際に回帰分析を行ってみましょう。
単回帰分析の実践
単回帰分析(Single Regression Analysis)を実際に行ってみますがそのデータは演習で身につける統計学入門のデータをダウンロードして使っています。
設問は「あるクラスの生徒の身長 y (従属変数) と、母親の身長 x (独立変数)の直線回帰式と決定計数を求める」というものです。
手順解説
分析の手順ですが、まず必要なライブラリのインポートから始めます。
この場合必要なのが、数表操作に必要なPandas、数値計算のためのNumpy、描画に用いられるmatplotlibと、その機能をよりきれいに見せるためのSeabornですね。
次に、データセットの読み込みです。
今回は演習で身につける統計学入門の例題を使っているので、そこからダウンロードします。
データはエクセルフォーマットなのでそれをPython で読み込みます。
しかし、データセットはシートの真ん中にあるので普通に読み込むと欠損値が出てしまいます。
そのために欠損値の部分を削除し、xとy行から列へと反転させます。
# 必要なライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# エクセルデータの読み込み
regdata = pd.read_excel('Ex7-2 data.xlsx', index = 3)
# 欠損値の削除
regdata = regdata.dropna(how = 'all', axis=1).dropna(how = 'all')
#インデックスをUnnamed: 2にセット
regdata = regdata.set_index('Unnamed: 2')
#DataFrameの反転
regdata = regdata.T
regdata
ここまでの処理を施して得られたのが、以下のDataFrameです。
この場合、xが母親の身長である独立変数であり、yが子供の身長である従属変数になります。
数値を可視化する
次に、DataFramの数値を可視化してみます。
使用するライブラリはMatplotlibになります。
x = regdata[['x']] y = regdata[['y']] plt.plot(x, y, 'o') plt.show()
xとyを可視化してみると、なんとなく二つの数値には関連性がありそうですね。
回帰分析を行う
では実際に回帰分析を行ってみます。
回帰分析を行うには、Scikit-learnという機械学習用のライブラリからLinearRegressionをインポートします。
次にモデルを構築し、そのモデルを可視化するという手順ですね。
# 単回帰分析用のモジュールをインポート from sklearn.linear_model import LinearRegression # モデル構築 model_lr = LinearRegression() model_lr.fit(x, y) LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
モデルが構築できたので可視化してみましょう。
# モデルの可視化
plt.plot(x, y, 'o')
plt.plot(x, model_lr.predict(x), linestyle="solid")
plt.show()
# 数値の表示
print('モデル関数の回帰変数 w1: %.3f' %model_lr.coef_)
print('モデル関数の切片 w2: %.3f' %model_lr.intercept_)
print('y= %.3fx + %.3f' % (model_lr.coef_ , model_lr.intercept_))
print('決定係数 R^2: ', model_lr.score(x, y))
ではこの回帰モデルによって得られた数値の意味を見ていきましょう。
回帰分析の説明
ここでもう一度、回帰分析とは何かをおさらいしてみます。
回帰分析とは目的変数(従属変数)yについて、説明変数(独立変数)xを使った式で表すことを言います。
つまり式で表すと単回帰の場合、 となります。
今回の分析に当てはめると、回帰直線「生徒の身長(y)=母親の身長(x)x 回帰係数(a) + 切片 (b)」(グラフ上のオレンジの線)を求めることで、母親の身長から子供の身長を予測することができます。
回帰係数とは
Pythonで得られた結果からは、回帰係数が回帰変数として出力されていますが、意味は同じになります。
の、a の値になりますね。
a の値、つまり回帰係数の意味を検索すると「直線の傾き度合」というように説明されます。
もう少しわかりやすい説明を探すと「従属変数に与える影響の大きさ」つまり「勾配」です。
回帰係数が大きくなるほど、直線の傾きも大きくなることになります。
切片とは
切片とは、回帰直線が軸と交差する場所を表しています。
での場合、bの値になりますね。
今回の例では、回帰直線がy軸と接する場所が、36.097となります。
回帰直線が表す値
では回帰直線で得られた式が何を表しているのかを、見てみようと思います。
今回のモデルで構築で得られた回帰直線式は、以下のように表されます。
これを言葉で表すと、母親の身長 x に回帰係数0.567を掛け、36.097を足すと子供の身長 y が求められるという意味ですね。
試しに母親の身長が162センチの場合、
(0.567 x 162) + 36.067 = 127.92
つまり子供の身長は約128センチになるといえます。
実際のデータ観測結果を見ても、母親の身長が162センチの子供の身長は130センチと計算値に近い値が観測されています。
独立変数 x が従属変数 y をどれくらい説明できるかを示す決定係数は0.867。
つまり、xの値の86%がyを説明できるということになります。
コメント