最小二乗法の式の導出と例題 – 最小二乗法と回帰直線を思い通りに使えるようになろう

2018年5月31日

この記事ではこんなことを書いています

最小二乗法によってデータの回帰直線を求める方法を丁寧に解説していきます。

まずは、最小二乗法とは何かということを数式を使わずにざっくりと理解します。

その後、最小二乗法の式の導出を途中の計算式を省略せずに紹介します。

最後に、その式を使って例題を解いていき、実践で使えるようになりましょう。

この記事を読み終わると最小二乗法と回帰直線を思い通りに使えるようになっているでしょう。

スポンサーリンク

最小二乗法とは何かをざっくりと

まずは、最小二乗法とは何かをざっくりと知っておきましょう。

細かい部分は理解する必要はありません。なんとなく、「最小二乗法はこんな感じのことをやるためのものだんだ」と思ってくれれば十分です。

 

次の表を見てください。

小学生(1年(6歳)~6年(11歳))の年齢と身長・体重の関係を示しています。

この身長と体重の関係をグラフに書いてみましょう。

横軸に身長、縦軸に体重をとっています。

身長が伸びるつれて、体重も増えています。

この関係を直線で表そうと思ったら、なんとなく

こんな感じの青い直線みたいになりそうですね。

この直線は私が「だいたいこんなものだろう」いう感じで引きましたが、ちゃんと直線を決めるなら、\(y\)を体重、\(x\)を身長として直線の式、

$$y=ax+b$$

の係数\(a\)と\(b\)を決める必要があります。

この直線を”回帰(かいき)直線”と言います。

回帰直線の係数\(a\)と\(b\)を、実際のデータ(上のグラフの点)ともっともズレが小さくなるように決めるのが”最小二乗法”なのです。

 

少し難しく言うと、

回帰直線の係数\(a\)と\(b\)を、実際のデータと誤差が最小となるように決める方法が最小二乗法

ということになります。

要は、実際のデータを一番イイ感じで表現できる直線を作るための方法ということです。

 

スポンサーリンク

最小二乗法の式を導出してみよう

では、最小二乗法を導出してみましょう。

少し数学の知識が必要ですが、丁寧にゆっくり進みますので一つずつ理解しながら読み進めていきましょう。

先ほどの身長と体重の表とグラフをもう一度見ましょう。

ただし、説明がしやすいようにデータに少しバラつきを持たせています。

 

このとき、データと回帰直線のズレはどのように表現できるでしょうか?

このズレは色んな表現ができると思われますが、最小二乗法では、

”横軸\(x\)が同じ値のときの縦軸\(y\)の違い”

をデータと回帰直線のズレと定義します。

グラフ上にそのズレを描くと、

のように、ズレは\(\leftrightarrow\)で表現できます。

今後はこのズレのことを”誤差”と呼びましょう。

 

回帰直線を

$$y=ax+b$$

で表し、データの座標を、

$$(x_i, y_i), \quad i=1,2,3,\cdots$$

と表現すると、

となる。

例えば、データの\((x_4, y_4)\)の部分に注目すると、データと回帰直線の誤差は、データの\(y_4\)から回帰直線の\(y\)の値を引いた値なので、

\begin{align}
\text{データ\((x_4, y_4)\)と回帰直線の誤差} &= y_4-y \\
&= y_4-(ax_4+b)
\end{align}

となります(下の図参照)。※回帰直線の\(x\)に\(x_4\)を代入すると\(x_4\)での回帰直線上の\(y\)の値が求まることを使っています

誤差をすべての\(x_i\)についてそれぞれ表現すると、

$$\text{データ\((x_i, y_i)\)と回帰直線の誤差}=y_i-(ax_i+b)$$

となりますね。

 

次に、これらの誤差の二乗を考えます。

$$\text{データ\((x_i, y_i)\)と回帰直線の誤差の二乗}=(y_i-(ax_i+b))^2$$

この二乗をするという操作は、誤差の負の値を考えないようにするためです。

なぜ負の値を考えないかというと、

誤差はデータと回帰直線のズレなので、正だろうが負だろうがどちらでも同じだけズレていたら同じ値として考えるべきである

からです。

詳しくは以下の”なぜ誤差の二乗を考えるか”を参照してください。特に、この点に問題がない方は読み飛ばしてもらって構いません。

なぜ誤差の二乗を考えるのか

例えば、以下のグラフでデータの\((x_2, y_2)\)と\((x_4, y_4)\)の点に注目しましょう。

この二点はほとんど同じ誤差(データと回帰直線のズレ)を持っていることが分かります。

誤差は”データから回帰直線の値を引いたもの”なので、それぞれの誤差は、

\begin{align}
\text{\((x_2, y_2)\)点の誤差} & = y_2-\text{回帰直線上の\(y\)} \\
\text{\((x_4, y_4)\)点の誤差} & = y_4-\text{回帰直線上の\(y\)}
\end{align}

と表現できます。

ここで、\((x_2, y_2)\)点は回帰直線の下にありますので、\(y_2\)は回帰直線上の\(y\)より小さいです(\(y_2 < \text{回帰直線上の\(y\)}\))。

一方、\((x_4, y_4)\)点は回帰直線の上にありますので、\(y_4\)は\text{回帰直線上の\(y\)}より大きいです(\(y_4 > \text{回帰直線上の\(y\)}\))。

よって、

\begin{align}
\text{\((x_2, y_2)\)点の誤差} & = y_2-\text{回帰直線上の\(y\)} \rightarrow \text{負}\\
\text{\((x_4, y_4)\)点の誤差} & = y_4-\text{回帰直線上の\(y\)} \rightarrow \text{正}
\end{align}

となり、二つの符号は違っています。

しかし、データの点が回帰直線の上に来ようが下に来ようが、同じだけズレているなら同じ値としてみなしたいので、どちらも正の値としてみるために二乗をとるのです。

二乗ではなく絶対値をとっても良いのですが、絶対値を含んだ式は計算が複雑になる傾向があるため、二乗をとることが多いです。

さて、誤差の二乗が以下のように表せると分かりました。

$$\text{データ\((x_i, y_i)\)と回帰直線の誤差の二乗}=(y_i-(ax_i+b))^2$$

この誤差の二乗をすべてのデータの点で合計すると、

$$\text{誤差の二乗の合計}=\sum_{i=1}^{i_\text{データの数}}(y_i-(ax_i+b))^2$$

と書くことができます。

この”誤差の二乗の合計”を最小にすることで良い回帰直線が引けそうです。

そうなるような係数\(a\)と\(b\)を決めましょう。それが最小二乗法です。

そこで、上の式を少し変形してみましょう。

\begin{align}
\text{誤差の二乗の合計} &= \sum_{i=1}^{i_\text{データの数}}\left\{y_i-(ax_i+b)\right\}^2 \\
&= \sum_{i=1}^{i_\text{データの数}}\left\{ x_i^2 a^2 + 2 x_i (b-y_i) a + (b-y_i)^2\right\}
\end{align}

と書けます。計算は省略しましたが、特に特別なテクニックは使っていません。ただ展開すればこのような式になります。

この式から、横軸に\(a\)をとり、縦軸に”誤差の二乗の合計”をとると、以下のようなグラフになるであろうことが分かります。

このような下に凸のグラフですね。その理由は\(a^2\)の前の係数\(x_i^2\)が二乗なので必ず正だからです。

 

ということは、”誤差の二乗の合計”を最小にするには、上のグラフの傾きが\(0\)となる点の\(a\)を見つけ出せばよいことが分かります。

式を\(a\)について微分して、それが\(0\)となるという式を作ると、

\begin{align}
\sum_{i=1}^{i_\text{データ数}} \left\{ 2x_i^2 + 2x_i (b-y_i) \right\} = 0 \\
2a\sum_{i=1}^{i_\text{データ数}}x_i^2 + 2b\sum_{i=1}^{i_\text{データ数}}x_i – 2\sum_{i=1}^{i_\text{データ数}}x_i y_i = 0
\end{align}

です。

 

また、\(b\)についても\(a\)と同じように式変形をし、傾きが\(0\)になるような式を作ると、

\begin{align}
\sum_{i=1}^{i_\text{データ数}} \left\{ 2b + 2(x_i a + y_i) \right\} = 0 \\
2nb – 2\sum_{i=1}^{i_\text{データ数}} y_i + 2a\sum_{i=1}^{i_\text{データ数}} = 0
\end{align}

となります。

これより、連立方程式、

\begin{align}
2a\sum_{i=1}^{n}x_i^2 + 2b\sum_{i=1}^{n}x_i – 2\sum_{i=1}^{n}x_i y_i & = 0 \tag{1} \\
2nb – 2\sum_{i=1}^{n} y_i + 2a\sum_{i=1}^{n}x_i & = 0 \tag{2}
\end{align}

ができました。なお、\(i_\text{データ数}\)は\(n\)としました。

この連立方程式を解いて、係数\(a\)と\(b\)を求めましょう。

 

まずは、式(2)から\(b\)についての式にすると、

\begin{align}
2nb – 2\sum_{i=1}^{n} y_i + 2a\sum_{i=1}^{n}x_i & = 0 \\
b & = \frac{\sum_{i=1}^n y_i}{n} – a \frac{\sum_{i=1}^n x_i}{n}
\end{align}

となる。

ここで、\(x\)と\(y\)のすべてのデータの平均値を、それぞれ\(\overline{x}\)と\(\overline{y}\)とすれば、

\begin{align}
\overline{y} = \frac{\sum_{i=1}^n y_i}{n} \\
\overline{x} = \frac{\sum_{i=1}^n x_i}{n}
\end{align}

である。これを使って\(b\)の式を書き直すと、

\begin{align}
b = \overline{y} – a \overline{x}
\end{align}

となる。

 

この\(b\)の式を、連立方程式の式(1)に代入し\(a\)についての式にすると、

\begin{align}
a = \frac{\frac{\sum_{i=1}^n x_i y_i}{n}-\overline{x} \overline{y}}{\frac{\sum_{i=1}^n x_i^2}{n}-\overline{x}^2}
\end{align}

となります。

ここで、分母と分子の

\begin{align}
\frac{\sum_{i=1}^n x_i^2}{n}-\overline{x}^2\text{ と }\frac{\sum_{i=1}^n x_i y_i}{n}-\overline{x} \overline{y}
\end{align}

の部分を変形します。

 

まずは、

$$\frac{\sum_{i=1}^n x_i^2}{n} – \overline{x}^2$$

からです。これは以下のように変形できます。

\begin{align}
\frac{\sum_{i=1}^n x_i^2}{n} – \overline{x}^2 & = \frac{\sum_{i=1}^n x_i^2}{n} – 2 \overline{x}^2 + \overline{x}^2 \\
& = \frac{\sum_{i=1}^n x_i^2}{n} – 2 \frac{\sum_{i=1}^n x_i}{n} \overline{x} + \overline{x}^2 \\
& = \frac{1}{n} \left( \sum_{i=1}^n x_i^2 – 2 \overline{x} \sum_{i=1}^n x_i + n \overline{x}^2 \right) \\
& = \frac{1}{n} \sum_{i=1}^n \left( x_i^2 – 2 \overline{x} x_i + n \overline{x}^2 \right) \\
& = \frac{1}{n} \sum_{i=1}^n \left( x_i – \overline{x} \right)^2
\end{align}

途中で、

\begin{align}
\overline{x} = \frac{\sum_{i=1}^n x_i}{n}
\end{align}

を使っています。

 

続いて、

$$\frac{\sum_{i=1}^n x_i y_i}{n}$$

ですが、これも基本的に同様の変形操作で求めることができます。

\begin{align}
\frac{\sum_{i=1}^n x_i y_i}{n}-\overline{x} \overline{y} & = \frac{\sum_{i=1}^n x_i y_i}{n} – 2 \overline{x} \overline{y} + \overline{x} \overline{y} \\
& = \frac{1}{n} \left( \sum_{i=1}^n x_i y_i – 2n  x_i y_i +  n x_i y_i \right) \\
& = \frac{1}{n} \left( \sum_{i=1}^n x_i y_i – n \frac{\sum_{i=1}^n x_i}{n} \overline{y} –  n \frac{\sum_{i=1}^n y_i}{n} \overline{x} + n \overline{x} \overline{y} \right) \\
& = \frac{1}{n} \sum_{i=1}^n \left( x_i y_i – \overline{y} x_i –  \overline{x} y_i + \overline{x}\overline{y} \right) \\
& = \frac{1}{n} \sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}
\end{align}

これも計算の中で、

\begin{align}
\overline{x} & = \frac{\sum_{i=1}^n x_i}{n} \\
\overline{y} & = \frac{\sum_{i=1}^n y_i}{n}
\end{align}

を使っています。

 

これらを\(a\)の式へ代入すると、

\begin{align}
a & = \frac{\frac{\sum_{i=1}^n x_i y_i}{n}-\overline{x} \overline{y}}{\frac{\sum_{i=1}^n x_i^2}{n}-\overline{x}^2} \\
& = \frac{\frac{1}{n} \sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}}{\frac{1}{n} \sum_{i=1}^n \left( x_i – \overline{x} \right)^2} \\
& = \frac{\sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}}{\sum_{i=1}^n \left( x_i – \overline{x} \right)^2}
\end{align}

 

よって、回帰直線および係数\(a\)と\(b\)をまとめると、

\begin{align}
y & = ax + b \\
a & = \frac{\sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}}{\sum_{i=1}^n \left( x_i – \overline{x} \right)^2} \\
b & = \overline{y} – a \overline{x}
\end{align}

となります。

これが”最小二乗法を使って回帰直線を求める公式”です。

式の導出が理解できたあとは、実際に例題を解いてみて公式の使い方を学び、色んな問題に使えるように慣れていきましょう。

以下では最小二乗法を使って回帰直線を決める例題を紹介しています。

 

最小二乗法を使って例題を解いてみよう

前節で最小二乗法の公式を導出しましたので、次は実際に使ってみましょう。

最小二乗法を使って回帰直線を求める公式は、以下の通りでした。

\begin{align}
y & = ax + b \\
a & = \frac{\sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}}{\sum_{i=1}^n \left( x_i – \overline{x} \right)^2} \\
b & = \overline{y} – a \overline{x}
\end{align}

\(a\)と\(b\)が直線の傾きと切片であり、これを決めるために最小二乗法を使って、実際のデータと直線の誤差が最小となるように決めたのでしたね。

上の式から、係数\(a\)と\(b\)を決めるために必要なのは、

\begin{align}
x_i, y_i \text{:実際の\(x\)と\(y\)のデータ} \\
\overline{x}, \overline{y}\text{:実際の\(x\)と\(y\)の平均値}
\end{align}

です。

 

では、例題に入りましょう。

最小二乗法を使って回帰直線を求める例題

以下のような身長と体重の関係があったとします。

身長(cm) 体重(kg)
116.5 21.3
125.5 22.0
128.1 26.9
132.0 32.3
141.0 33.1
145.2 38.2

この関係をグラフに表示すると、以下のようになります。

さて、このデータの回帰直線の式を求めましょう。

では、解いていきましょう。

今の場合、身長が\(x\)、体重が\(y\)です。

回帰直線は\(y=ax+b\)で表せるので、この係数\(a\)と\(b\)を公式を使って求めるだけです。

 

まずは、簡単な係数\(b\)からです。係数\(b\)は、以下の式で求めることができます。

\begin{align}
b = \overline{y} – a \overline{x}
\end{align}

必要なのは身長と体重の平均値である\(\overline{x}\)と\(\overline{y}\)です。

これは、データの表からすぐに分かります。

身長(cm) 体重(kg)
116.5 21.3
125.5 22.0
128.1 26.9
132.0 32.3
141.0 33.1
145.2 38.2
(平均)131.4 (平均)29.0

ですね。よって、

\begin{align}
\overline{x} = 131.4 \\
\overline{y} = 29.0
\end{align}

を\(b\)の式に代入して、

\begin{align}
b & = \overline{y} – a \overline{x} \\
& = 29.0 – 131.4a
\end{align}

となります。

 

次に係数\(a\)です。求める式は、

\begin{align}
a & = \frac{\sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}}{\sum_{i=1}^n \left( x_i – \overline{x} \right)^2}
\end{align}

です。

必要なのは、各データの平均値からの差(\(x_i-\overline{x}, y_i-\overline{y}\))であることが分かります。

これも表から求めることができ、

身長(\(x_i\)) \(x_i-\overline{x}\) 体重(\(y_i\)) \(y_i-\overline{y}\)
116.5 -14.88 21.3 -7.67 
125.5 -5.88  22.0 -6.97 
128.1 -3.28  26.9 -2.07 
132.0 0.62  32.3 3.33 
141.0 9.62  33.1 4.13 
145.2 13.82 38.2 9.23 
(平均)131.4=\(\overline{x}\) (平均)29.0=\(\overline{y}\)

となります。

さらに、\(a\)の式を見ると必要なのはこれら(\(x_i-\overline{x}, y_i-\overline{y}\))を掛けて足したもの、

$$\sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}$$

と\(x_i-\overline{x}\)を二乗した後に足したもの、

$$\sum_{i=1}^n \left( x_i – \overline{x} \right)^2$$

です。

これらを求めた表を以下に示します。

\(x_i-\overline{x}\) \(y_i-\overline{y}\) \((x_i-\overline{x})(y_i-\overline{y})\) \(\left( x_i – \overline{x} \right)^2\)
 -14.88  -7.67 114.11 221.51
 -5.88  -6.97 40.99 34.61
 -3.28  -2.07 6.79 10.78
 0.62  3.33 2.06 0.38
 9.62  4.13 39.75 92.48
 13.82  9.23 127.57 190.90
\(\sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}=331.27\) \(\sum_{i=1}^n \left( x_i – \overline{x} \right)^2=550.67\)

よって、\(a\)は、

\begin{align}
a & = \frac{\sum_{i=1}^n \left\{ (x_i-\overline{x})(y_i-\overline{y}) \right\}}{\sum_{i=1}^n \left( x_i – \overline{x} \right)^2} \\
& = \frac{331.27}{550.67} = 0.601554
\end{align}

となり、\(a\)を\(b\)の式にも代入すると、

\begin{align}
b & = \overline{y} – a \overline{x} \\
& = 29.0 – 131.4a \\
& = 29.0 – 131.4 \times 0.601554 \\
& = -50.0675
\end{align}

となります。

よって、回帰直線\(y=ax+b\)は、

$$y = 0.601554x -50.0675$$

と求まります。

 

最後にこの直線をグラフ上に描いてみましょう。

すると、

このような青の点線のようになります。

これが、最小二乗法により誤差の合計を最小とした場合の直線です。

 

お疲れさまでした。

ここでの例題を解いた方法で、色々なデータに対して回帰直線を求めてみましょう。

実際に使うことで、さらに理解が深まるでしょう。

 

スポンサーリンク

まとめ

  • 最小二乗法とはデータとそれを表現する直線(回帰直線)の誤差を最小にするように直線の係数を決める方法
  • 最小二乗法の式の導出は少し面倒だが、難しいことはやっていないので、分からない場合は読み返そう※分かりにくいところは質問してね!
  • 例題をたくさん解いて、自分のものにしよう

※コメントの反映には少し時間がかかります

スポンサーリンク