[備忘録]単回帰


はじめに

機械学習を勉強するついでに統計学についても勉強をはじめてみた。
コミットしたい記事など溜まってるので、物凄くザックリに単回帰について記述したいと思う。
そのため読みにくい、間違っていることを書いてしまうと思うのでご指摘いただければありがたいです。

データについて

例えば下記表のように各日にちの最高気温によってアイスコーヒーの売れた個数のデータがあるする

日付 最高気温 注文数
2017/7/1 29 76
2017/7/2 28 65
2017/7/3 34 93
2017/7/4 31 84
2017/7/5 25 59
2017/7/6 29 64
2017/7/7 32 80
2017/7/8 31 75
2017/7/9 24 53
2017/7/10 33 92
2017/7/11 25 54
2017/7/12 31 75
2017/7/13 26 65
2017/7/14 30 80

このデータを縦軸を売れた個数、横軸を気温とすると下の図のようにプロット出来る。

この図から気温が高くなるほどアイスコーヒーが売れてるような傾向があると分かる。
今回は最高気温が何度の時にアイスコーヒーが何杯売れるかを予測できる一次式を求める。

回帰式を求める。

単回帰では、回帰直線は$\hat{y} = ax +b$で表され、最小二乗法になるように$a$と$b$を求める。
下記に求め方に対応する計算結果の表を示す。

各日にちの最高気温:$x_{i}$
最高気温の平均:$x_{ave} = 29.14285714$
各日にちの注文数:$y_{i}$
注文数の平均を:$y_{ave} = 72.5$
として、回帰式を求めるための偏差平方和・偏差積和を求める。
$x$の偏差平方和:$S_{xx} = \sum_{i=1}^{
14} (x_{i}-x_{ave})^2$
$y$の偏差平方和: $S_{yy} = \sum_{i=1}^{
14}(y_{i}-y_{ave})^2$
$x$と$y$の偏差積和: $S_{xy} = \sum_{i=1}^{
14}(x_{i}-x_{ave})(y_{i}-y_{ave}) $

この時、今回のデータに対する回帰直線$a$と$b$を求め方は

a = \frac{S_{xy}}{S_{xx}}

=\frac{499.00000000000006}{129.7142857142857}
=3.8469162995594726


b=y_{ave} -x_{ave}×a  \\
= 72.5 - 29.142857142857146 × 3.8469162995594726 \\
= - 39.610132158590346



よって回帰式$\hat{y}$は

\hat{y} = 3.8469162995594726  x - 39.610132158590346

と表される。下記図に回帰直線$\hat{y}$をプロットしたグラフを表示する。

上記のようになんとな〜く回帰直線が引けてることがわかる。

寄与率を求める

この回帰式の精度を評価する方法の一つ、寄与率を求めて評価を行ってみる。
寄与率は、重相関係数$R$の平方和で表される。
重相関係数は、

R=\frac{yと\hat{y}の偏差積和}{\sqrt{yの偏差平方和×\hat{y}の偏差平方和}}

と表される。
$y$の偏差平方和: $S_{yy} = \sum_{i=1}^{
14}(y_{i}-y_{ave})^2 $
$\hat{y}$の偏差平方和: $S_{\hat{y}\hat{y}} = \sum_{i=1}^{
14}(\hat{y_{i}} - y_{ave})^2 $
$y$と$\hat{y}$の偏差積和: $S_{y\hat{y}} = \sum_{i=1}^{
14}(y_{i}-y_{ave})(\hat{y_{i}} - y_{ave}) $
であるので、

R=\frac{yと\hat{y}の偏差積和}{\sqrt{yの偏差平方和×\hat{y}の偏差平方}} \\
=\frac{S_{y\hat{y}}}{\sqrt{S_{yy}×S_{\hat{y}\hat{y}}}} \\
=\frac{1919.611233480177}{\sqrt{2159.5×1919.6112334801774}} \\
=\frac{1919.611233480177}{2036.0256527608985}\\
=0.9428227148695986

よって
寄与率:$R^2 = (0.9428227148695986)^2 = 0.8889146716740803$
寄与率は0〜1の間で表されており、1に行くほど回帰式が精度高いことを示している。
統計学上、寄与率がどのくらいあれば精度が高いと言えるか明確な基準がないみたいです。
寄与率の目安としては0.5以上みたいです。

下に今回の計算過程の表を示す。

日付 最高気温:$x$ 注文数:$y$ $S_{xx}$ $S_{yy}$ $S_{xy}$ $\hat{y}$ $S_{yy}$ $S_{\hat{y}\hat{y}}$ $S_{y\hat{y}}$
7/1 29.0 76.0 0.020408163265305982 12.25 -0.4999999999999982 71.95044052863436 12.25 0.3020156125676819 -1.9234581497797407
7/2 28.0 65.0 1.3061224489795906 56.25 8.571428571428568 68.10352422907488 56.25 19.32899920433164 32.97356828193841
7/3 34.0 93.0 23.59183673469388 420.25 99.57142857142858 91.18502202643171 420.25 349.13004812823823 383.04295154185013
7/4 31.0 84.0 3.4489795918367365 132.25 21.357142857142858 79.64427312775331 132.25 51.040638523938036 82.15914096916305
7/5 25.0 59.0 17.163265306122447 182.25 55.92857142857142 56.56277533039646 182.25 253.99513016941958 215.15253303964772
7/6 29.0 64.0 0.020408163265305982 72.25 1.21428571428571 71.95044052863436 72.25 0.3020156125676819 4.671255506607942
7/7 32.0 80.0 8.163265306122453 56.25 21.42857142857143 83.49118942731279 56.25 120.80624502707214 82.4339207048458
7/8 31.0 75.0 3.4489795918367365 6.25 4.642857142857143 79.64427312775331 6.25 51.040638523938036 17.860682819383268
7/9 24.0 53.0 26.44897959183673 380.25 100.28571428571428 52.715859030837 380.25 391.41223388771414 385.7907488986786
7/10 33.0 92.0 14.877551020408168 380.25 75.21428571428572 87.33810572687223 380.25 220.16938156183886 289.34306167400865
7/11 25.0 54.0 17.163265306122447 342.25 76.64285714285714 56.56277533039646 342.25 253.99513016941958 294.83865638766537
7/12 31.0 75.0 3.4489795918367365 6.25 4.642857142857143 79.64427312775331 6.25 51.040638523938036 17.860682819383268
7/13 26.0 65.0 9.877551020408161 56.25 23.57142857142857 60.40969162995594 56.25 146.17555648275737 90.67731277533044
7/14 30.0 80.0 0.7346938775510212 56.25 6.428571428571433 75.79735682819383 56.25 10.872562052436457 24.730176211453706
合計 408.0 1015.0 129.7142857142857 2159.5 499.00000000000006 1015.0 2159.5 1919.6112334801774 1919.611233480177
平均 29.142857142857146 72.5 - - - - - - -

参考までにgithubにテストデータとソースコードを置いとく

github
ソースも雑に書いて汚いが参考になれたらありがたい。