解 説

今回はscikit-learn で単回帰分析する方法について解説します。
分析対象は「スプレッドシート(エクセル)とPythonで統計分析(2) 単回帰分析の方法」で行った「1日の最高気温とアイスクリームの販売個数」のデータを使います。

スプレッドシートで単回帰分析を行う方法は「スプレッドシート(エクセルなど)とPythonで統計分析(2) 単回帰分析の方法」を参考にしてください。

データの準備

用意したデータはある店舗における1日の最高気温とアイスクリーム購入数です。
(注)データの数値は架空の数値です。

必要なライブラリの読み込みを行います。
sklearn.linear_model.LinearRegression クラスをあわせて読み込みます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# sklearn.linear_model.LinearRegression クラスを読み込み
from sklearn import linear_model
clf = linear_model.LinearRegression()

CSVの読み込みを行います。

ice = pd.read_csv("ice.csv")
ice.head(5)

読み込んだデータの一部を「ice.head(5)」で表示しています。

# 説明変数に "最高気温" を利用
X = ice.loc[:, ['最高気温']].as_matrix()

# 目的変数に "アイスクリーム販売数" を利用
Y = ice['アイスクリーム販売数'].as_matrix()

# 予測モデルを作成
clf.fit(X, Y)

回帰係数を求めます。
回帰係数とは回帰直線の傾きのことで、この値が求まると散布図に回帰直線を引くことができます。
また、回帰直線を引けるということは、予測ができるようになります。
scikit-learn を使うことで回帰係数も簡単に求めることができます。

# 回帰係数
print(clf.coef_)

結果:[1.76617647]

scikit-learn を使わなかった場合は最小二乗法を使うことになります。

最小二乗法の公式
$$
a = \frac{\frac{1}{n}{\displaystyle\sum_{i=1}^{n}}(X_i – \overline{X})(Y_i – \overline{Y})}
{\displaystyle{\frac{1}{n}\sum_{i=1}^{n}}(X_i – \overline{X})^{2}}
= \frac{\displaystyle\sum_{i=1}^{n}(X_i – \overline{X})(Y_i – \overline{Y})}
{\displaystyle\sum_{i=1}^{n}(X_i – \overline{X})^{2}}
$$

切片を求めます。

# 切片 (誤差)
print(clf.intercept_)

結果:-9.75735294117645

決定係数を求めます。

# 決定係数
print(clf.score(X, Y))

結果:0.920300641543021

散布図を描画します。

# 散布図
plt.scatter(X, Y)
 
# 回帰直線
plt.plot(X, clf.predict(X))