Python + scikit-learn で最小二乗法による線形回帰分析を行う

## 概要

- Python の機械学習ライブラリ scikit-learn を使用して Anscombe's quartet のデータセットに対して最小二乗法による線形回帰分析を行う

## 線形回帰とは

複数のXY値データをもとにして、任意のXY値を予測するための直線式を求める分析手法。

[線形回帰 \- Wikipedia](https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0)

> 線形回帰（せんけいかいき、英: linear regression）とは、統計学における回帰分析の一種である。

[回帰分析\(かいきぶんせき\)とは \- コトバンク](https://kotobank.jp/word/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90-2191)

> 相関関係や因果関係があると思われる2つの変数のうち、一方の変数から将来的な値を予測するための予測式（回帰直線）を求めるための手法。2組のデータの傾向を分析するために行われる。

## 最小二乗法とは

[最小二乗法（直線）の簡単な説明 \| 高校数学の美しい物語](https://mathtrain.jp/leastsquares)

> 最小二乗法とは，データの組 (xi,yi) が多数与えられたときに，x と y の関係を表すもっともらしい関数 y=f(x) を求める方法です。

> 二つセットのデータの組 (xi,yi) が n 個与えられた状況を考えています。そして xi と yi に直線的な関係があると推察できるときに，ある意味で最も相応しい直線を引くのが最小二乗法です。

## 使用するデータ

Anscombe's quartet のデータセットを使う。

[アンスコムの例 \- Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%A0%E3%81%AE%E4%BE%8B)

> アンスコムの例(Anscombe's quartet）あるいはアンスコムの数値例とは、回帰分析において、散布図はそれぞれ異なるのに回帰直線やその他の統計量が同じになってしまう現象について、統計学者のフランク・アンスコムが1973年に紹介した例である。回帰分析をする前に散布図を確認し傾向を把握することの重要性、そして外れ値が統計量に与える影響の大きさを示している。

[Anscombe's quartet \- Wikipedia](https://en.wikipedia.org/wiki/Anscombe%27s_quartet)

> Anscombe's quartet comprises four data sets that have nearly identical simple descriptive statistics, yet have very different distributions and appear very different when graphed. Each dataset consists of eleven (x,y) points.

## 環境構築

今回の環境。

- macOS Mojave 10.14.6
- Python 3.7.4
- scikit-learn 0.21.3

機械学習ライブラリ scikit-learn とグラフ描画ライブラリ Matplotlib をインストールする。
依存関係で数値計算ライブラリ NumPy や科学技術計算ライブラリ SciPy もインストールされる。

```
$ pip install scikit-learn matplotlib
(中略)
Installing collected packages: numpy, joblib, scipy, scikit-learn, setuptools, kiwisolver, pyparsing, six, cycler, python-dateutil, matplotlib
Successfully installed cycler-0.10.0 joblib-0.13.2 kiwisolver-1.1.0 matplotlib-3.1.1 numpy-1.17.0 pyparsing-2.4.2 python-dateutil-2.8.0 scikit-learn-0.21.3 scipy-1.3.0 setuptools-41.0.1 six-1.12.0
```

インストールされたライブラリのバージョンを確認する。

```
$ pip freeze
cycler==0.10.0
joblib==0.13.2
kiwisolver==1.1.0
matplotlib==3.1.1
numpy==1.17.0
pyparsing==2.4.2
python-dateutil==2.8.0
scikit-learn==0.21.3
scipy==1.3.0
six==1.12.0
```

## ソースコード

```py
# 機械学習ライブラリ scikit-learn の最小二乗法モデルを使用する
from sklearn.linear_model import LinearRegression

# グラフ描画ライブラリ Matplotlib を使用する
import matplotlib.pyplot as plt

# アンスコムのデータセット
X = [[10.0], [8.0], [13.0], [9.0], [11.0], [14.0], [6.0], [4.0], [12.0], [7.0], [5.0]]
y = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]

# 最小二乗法モデルで予測式を求める
model = LinearRegression()
model.fit(X, y)
print('切片:', model.intercept_)
print('傾き:', model.coef_)

# x=0, x=10, x=20 に対する予測結果を求める
source = [[0], [10], [20]]
predicted = model.predict(source)
print('予測結果:')
print('x:', source)
print('y:', predicted)

# グラフを描画する
plt.xlim(0, 20) # X軸の表示範囲を指定
plt.scatter(X, y) # 点を描画
plt.plot(source, predicted, color = 'blue') # 直線を描画
plt.savefig('linear-regression.png')
```

## 実行結果

```
切片: 3.0000909090909094
傾き: [0.50009091]
予測結果:
x: [[0], [10], [20]]
y: [ 3.00009091  8.001      13.00190909]
```

![linear-regression.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/3b545626-3b57-c0a7-af96-0976f8a0f717.png)

## 参考資料

- [sklearn\.linear\_model\.LinearRegression — scikit\-learn 0\.21\.3 documentation](https://scikit-learn.org/0.21/modules/generated/sklearn.linear_model.LinearRegression.html)
- [matplotlib\.pyplot — Matplotlib 3\.1\.1 documentation](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.html)
- [見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑 第2章 教師あり学習 01 線形回帰](https://www.shoeisha.co.jp/book/detail/9784798155661)