重回帰分析の値を最小二乗法でえる方法を示す。早速だが、次の式に適用することで目的の係数群が手に入る。
\mathbf{w} = (\mathbf{X}^{T}\mathbf{X})^{-1} \mathbf{X}^{T}\mathbf{y}上記x, y, wは次の通りの関係を持っている。
y_i=a_{0i} + x_{0i}w_{0i} + x_{1i} w_{1i} + ... x_{ni} w_{ni}+ faは切片、fは残差と言われる。ここでyはm個あると仮定する。回帰分析のところで説明したとおり、切片aと重みwベクトルを求めるのが回帰分析の目的となる。最初の\mathbf{X}については次のようになる。
\mathbf{X} = \begin{bmatrix} \mathbf{x}_0 & \mathbf{x}_1 & … &\mathbf{x}_n \end{bmatrix} \mathbf{x}_0 = \begin{bmatrix} x_{00} \\ x_{01} \\ ... \\ x_{0m} \end{bmatrix}となっている。
上記ではやや理解がしづらいと思うので、実際に具体例をしめす。なお、他のサイトでは切片を求めない場合もある。当サイトでは、今回は切片を考慮に入れて説明しよう。
LSMを用いた重回帰分析の仕方(計算方法具体例)
具体的に説明のためにあるサイト[2]から取得したデータを用いる
営業所 | 売上額 | 広告費 | 販売員数 |
A | 8 | 500 | 6 |
B | 9 | 500 | 8 |
C | 13 | 700 | 10 |
D | 11 | 400 | 13 |
E | 14 | 800 | 11 |
F | 17 | 1200 | 13 |
G | ? | 1300 | 14 |
上記で営業所Gの売上高を予想したいというのが今回の目的である。(そのために重みベクトルと切片を求める。)上記の表で例えば営業所Aの売上高は 8 = a_0 + 500 * w_0 + 6 * w_1 ということになり、最小二乗法を使うことで未知の切片のa_0と重みである\mathbf{w}が求まる。
まずは上記表を元にa0, x0, x1のベクトル、並びにyのベクトルを定義する。
import numpy def main(): y = numpy.array( [[8, 9, 13, 11, 14, 17]]).T a0 = numpy.array( [[ 1, 1, 1, 1, 1, 1]] ).T # 切片が不要な場合はここは不要 x1 = numpy.array( [[ 500, 500, 700, 400, 800, 1200]] ).T x2 = numpy.array( [[ 6, 8, 10, 13, 11, 13]] ).T
a0に関しては全て1にする。切片であるために1以外の数は適切ではない。そして\mathbf{X}は次のように定義される。
X = numpy.hstack( [a0, x1, x2] ) # 切片が不要であれば最初のa0をなくす。 # [[ 1 500 6] # [ 1 500 8] # [ 1 700 10] # [ 1 400 13] # [ 1 800 11] # [ 1 1200 13]]
肝心のXは上記のように出力される。なお、切片が不要な場合は最初の「1」がなくなった行列となる。さて、定義できたのであとは最初に示した式通りに書いていく。
XTX = X.T.dot(X) # X^T.X invXTX = numpy.linalg.inv( XTX ) result = ( invXTX.dot( X.T ) ).dot( y ) print( result ) # [[1.14814815] # [0.00786008] # [0.53909465]]
出力値として、a_0=1.14814815, x_0=0.00786008, x_1=0.53909465となった。
この値を元にGの営業所の売上予想は 1.14814815 + 1300 \times 0.00786008 + 14 \times 0.53909465=18.9135772となる。
参考文献
- https://k-san.link/linear-regression-01/
- https://istat.co.jp/ta_commentary/multiple
- https://datachemeng.com/wp-content/uploads/ordinaryleastsquares.pdf