sklearnを使って単線形回帰をやってみた

前回はstatsmodelを使った単線形回帰をしましたが、今回は別のモジュール(sklearn)を使って同じことをやってみようと思います。

ライブラリのインポート

In [2]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
from sklearn.linear_model import LinearRegression

データの読み込み

In [3]:
# データの読み込み
data = pd.read_csv('mibile_company_stock_price_2020-10-01_2021-09-30.csv')
data.head()
Out[3]:
date NTT KDDI softbank rakuten
0 2019-10-01 2590.5 2839 1471 1093
1 2019-10-02 2633.5 2924 1500 1041
2 2019-10-03 2624.5 2918 1494 1019
3 2019-10-04 2617.5 2942 1496 1023
4 2019-10-07 2642.0 2939 1496 1036

回帰の作成

従属変数と独立変数の宣言

In [4]:
# 独立変数の宣言
x = data['NTT']
# sklearnに入れるデータの形状は2D arrayである必要があるため、変換
x = x.values.reshape(-1,1)
# 従属変数の宣言
y = data['KDDI']

回帰

In [5]:
# クラスからオブジェクトを作成します
reg = LinearRegression()
In [6]:
# 回帰モデル作成
reg.fit(x,y)
Out[6]:
LinearRegression()

決定係数

In [7]:
reg.score(x,y)
Out[7]:
0.7273309367824944

係数

In [8]:
# 係数を出力します
reg.coef_
Out[8]:
array([0.93115309])

切片

In [9]:
# 切片を出力します
reg.intercept_
Out[9]:
745.5546297586911

予測

In [11]:
# データフレームを作成します
new_data = pd.DataFrame(data=[2600,2800],columns=['KDDI'])
new_data['Predicted_NTT'] = reg.predict(new_data)
new_data
Out[13]:
KDDI Predicted_NTT
0 2600 3166.552656
1 2800 3352.783273
In [15]:
# データを散布図として表示します
plt.scatter(x,y)
# 変数を使った回帰式
yhat = reg.coef_*x + reg.intercept_
# 変数を使わない回帰式
#yhat = 0.0017*x + 0.275
# 回帰直線の表示
fig = plt.plot(x,yhat, lw=4, c='orange', label ='regression line')
# 軸に名前を付けます
plt.xlabel('KDDI', fontsize = 20)
plt.ylabel('NTT', fontsize = 20)
plt.show()

Follow me!