数学やプログラミングの備忘録

数理最適化, Python, C++をメインに紹介するブログ。

MENU

今すぐ使える!Pythonで線形回帰分析

はじめに

大学の宿題や研究、会社での突然の無茶振り、などなど、線形回帰モデルを求めなければならない場面は多々あると思います。そういう人の参考になればと思います。ちなみに、この記事では線形重回帰を扱います。

前提として、

  1. 線形回帰モデルにが何なのかだいたい分かる
  2. jupyter notebook(python3) が使える環境である

前提が満たされていない人は、新しいタブを開いてググって調べてください。素晴らしいWebページが世の中にはたくさんあります(そして、戻って来て欲しい)。

線形回帰モデルを求める理論的な話は、過去の記事を参照してください。

www.letsopt.com

データとソースコードはgitに置いているので、ご自由にどうぞ

github.com

さあ、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人の学生の「五教科合計」「数学」「理科」「英語」の点数のデータです(本来ならもっとたくさんの学生のデータが欲しいところですが、例ですので)。

この記事では、以下の線形回帰モデルを推定します。


(五教科合計) = b + a_1 \times (数学) + a_2 \times (理科) + a_3 \times (英語)

データを分離

次に、変数 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)

出力結果

f:id:cresselia2012:20190816144947p:plain

おわりに

元々、私自身の備忘録として記事にまとめました。いつも複数のWebサイトを見て、どうやるんだっけ?ってなるから、、。この記事が誰かの役に立ちますように。