はじめに
大学の宿題や研究、会社での突然の無茶振り、などなど、線形回帰モデルを求めなければならない場面は多々あると思います。そういう人の参考になればと思います。ちなみに、この記事では線形重回帰を扱います。
前提として、
- 線形回帰モデルにが何なのかだいたい分かる
- jupyter notebook(python3) が使える環境である
前提が満たされていない人は、新しいタブを開いてググって調べてください。素晴らしいWebページが世の中にはたくさんあります(そして、戻って来て欲しい)。
線形回帰モデルを求める理論的な話は、過去の記事を参照してください。
データとソースコードはgitに置いているので、ご自由にどうぞ
さあ、jupyterを使って線形回帰モデルを求める最短の道のりをご紹介いたしましょう。
CSVを読み込む
pandas
を使って、CSVを読み込む- データフレームとして読み込まれる
pandas
が無い的なエラーが出たら、ターミナルからインストール$pip install pandas
read_csv("ファイル名", sep="区切り文字")
import pandas as pd # data.csv を読み込む data = pd.read_csv("data.csv", sep=",") data
出力結果
五教科合計 | 数学 | 理科 | 英語 | |
---|---|---|---|---|
0 | 450 | 100 | 95 | 80 |
1 | 400 | 80 | 90 | 70 |
2 | 350 | 80 | 85 | 60 |
3 | 300 | 50 | 55 | 60 |
4 | 250 | 30 | 50 | 40 |
5人の学生の「五教科合計」「数学」「理科」「英語」の点数のデータです(本来ならもっとたくさんの学生のデータが欲しいところですが、例ですので)。
この記事では、以下の線形回帰モデルを推定します。
データを分離
次に、変数 data
(データフレーム)から部分的に抽出します
y = data['五教科合計']
y
出力結果
0 450
1 400
2 350
3 300
4 250
Name: 五教科合計, dtype: int64
X = data.loc[:,['数学','理科','英語']] X
出力結果
数学 | 理科 | 英語 | |
---|---|---|---|
0 | 100 | 95 | 80 |
1 | 80 | 90 | 70 |
2 | 80 | 85 | 60 |
3 | 50 | 55 | 60 |
4 | 30 | 50 | 40 |
線形回帰モデルを推定
sklearn
が無いと言われたら、ターミナルを開いてインストール$pip install scikit-learn
fit(説明変数の行列X, 目的変数のベクトルy)
: 線形回帰モデルを推定
from sklearn import linear_model model = linear_model.LinearRegression() # 線形回帰モデルを推定 model.fit(X, y) # 結果を出力 print("回帰係数= ", model.coef_) print("切片= ", model.intercept_) print("決定係数= ", model.score(X, y))
出力結果
回帰係数= [-0.63897764 2.33226837 3.43450479]
切片= 5.59105431309905
決定係数= 0.9840255591054313
誤差の分布を可視化(おまけ)
predict(X)
: Xをインプットとして、推定したモデルによる目的変数のベクトルを出力- 推定と同じXを使えば、誤差(モデルとデータとのずれ)を計算できる
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import pandas as pd import seaborn as sns %matplotlib inline ep = y - model.predict(X) ep = ep.rename(columns={'五教科合計': 'epsilon'}) # 可視化 sns.distplot(ep)
出力結果
おわりに
元々、私自身の備忘録として記事にまとめました。いつも複数のWebサイトを見て、どうやるんだっけ?ってなるから、、。この記事が誰かの役に立ちますように。