高校数学ではじめる機械学習 #2 回帰: 数値を予測する - お菓子の売上は値段によってどう変わるのか?

[目次はこちら](https://qiita.com/tomo_t/items/25035a9487bd5014754b)
##今回のお題
前回のおさらいです。Predictive Analysisの一種に<b>回帰(Regression)</b>があります。これはある数値を他のデータから予測することを目指すのでした。

さて、今回はその回帰というのがどのような仕組みになっているのかを見ていきます。と言っても、(広い意味での)回帰にもいろいろな種類があり、今回はその中でも最も有名な<b>線形回帰</b>を紹介します。この線形回帰のことを指して単に(狭い意味での)「回帰」と言う人もいるので、このあたりの言語は統一されていないと思っておいてください。

数学的な説明だけをしても面白くないので、現実的な事例に沿って線形回帰がどのように使えるかを紹介します。今回は、みなさんがお菓子メーカーの大正製菓(架空)のマーケティング担当者だと仮定しましょう。あなたは、自社の主力製品である板チョコをいくらの価格でスーパーに販売してもらうべきかを検討しています。そのために、<b>いくらで板チョコを売ればどれくらいの数量の売上が見込めるのか</b>を知りたいと思っています。これはビジネスの世界では<b>価格弾力性</b>と言われる問題です。あなたはこのプロジェクトのために懇意にしているスーパーマーケットチェーンに頼んで、一週間毎日板チョコの値段を変えて売ってもらい、売上数量と価格のデータをもらいました。(現実にはこういった実験は難しいですが)

以下がそのデータです。

|曜日|小売価格|売上数量|
|---|--:|--:|
|月|90|559|
|火|95|522|
|水|100|506|
|木|105|478|
|金|110|439|

難しい分析をせずに、どういった傾向が見て取れるでしょうか？
値段が高いときほど売れている量が少ないですね。これは我々の感覚に一致しているので、このデータを分析して出てくる結果は、意味のあるものになりそうです。

##線形回帰
ここから数学の話を始めます。線形回帰のもっとも単純な場合に、<b>単回帰</b>があります。これは、ある変数$y$を別の変数$x$を使って、

```math
y \sim \hat{y}=bx+a
```
と近似しようとします。$\hat{y}$はワイ-ハットと呼んで、$y$の近似値にしたいよ、という願望を意味します。$\sim$というのも見覚えがない方もいるかもしれませんが、これも近似という意味です。ですので、上の式は、<b>「$\hat{y}=bx+a$という一次関数(直線)で$\hat{y}$を定義します。$\hat{y}$で$y$を近似できるといいなあ」</b>と言う意味です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528459/c2967d83-1a4b-522c-e6c7-9759d142e1c9.png)
(図はhttp://www.isc.meiji.ac.jp/~mcelab/www_jyo_en2/jyo_en_2_9_j_2015_f/index_sj.html より拝借)

さて、近似、近似と言ってきましたが、どうやって「近似できた」と言うのでしょうか。もちろん様々な方法が考えられますが、最もよく使われてるのが<b>平方誤差</b>を最小化する方法です。誤差(残差)というのは$|y-\hat{y}|$のことで、$y$と$\hat{y}$が同じであればぴったり近似できた、つまり誤差は0になります。平方誤差というのは、これを二乗して足し合わせたもの、つまり

```math
J = \sum_i (y_i-\hat{y}_i)^2 = \sum_i (y_i-(bx_i+a))^2
```
のことです。ここで添え字$i$が登場しましたが、これは「データの各レコードそれぞれについて」と言うための便宜的なものです。各レコードの誤差を計算して、二乗して足し合わせるよ、ということを意味しています。

###微分による方法
さて、「最小化」と言えば一番最初に思い浮かべるのは何でしょうか。微分ですね。ではここで微分する変数はなんでしょう。$x$と$y$はデータに書いてある数値そのものなので、変数ではありません。ここで知りたい変数は、回帰のパラメーターである$a$と$b$です。最小値を取るということは、それぞれで誤差関数$J$を微分して0になればよいので、

```math
\begin{align}
\frac{\partial J}{\partial a} &= -\sum_i 2(y_i-(bx_i+a)) =0 \\
\frac{\partial J}{\partial b} &= -\sum_i 2x_i(y_i-(bx_i+a)) =0
\end{align}
```
が条件です。ここで$\frac{\partial}{\partial a}$というのは見慣れない記号だという方もいるかもしれませんが、「ただ$a$で微分しただけ」と認識してもらっても構いません。厳密にはこれは偏微分という記号で、$a$と$b$は独立して微分できるよ、と主張しているだけです。

では、上の式二本は何を意味しているでしょうか？この式は以下のように書き直せます。

```math
\begin{align}
2a\sum_i 1 + 2b \sum_i x_i -2\sum_i y_i &= 0 \\
2a\sum_i x_i + 2b \sum_i x_i^2 -2\sum_i x_iy_i &= 0
\end{align}
```
これは何でしょう？$\sum_i x_iy_i$のような部分は、すべて手持ちのデータから決まっている定数です。ですので、実はこれはただの二元連立一次方程式でした。なので、この方程式の解である$(a,b)$の組は中学生の数学で解けて、その解が平方二乗誤差$J$を最小化します。

###ベクトルによる方法
実はこの$J$の最小化は、微分を使わずに、ベクトルによっても解くことができます。たとえば、次のようなデータを考えましょう。

|x|y|
|--:|--:|
|1|8|
|2|17|
|3|21|
|4|35|
|5|39|

先ほどの図では、このデータを横向きに読んで、各データの点が$(x,y)$平面上にあるような説明をしました。では、このデータを縦に見るとどうなるのでしょう？わかりやすくするために一列加えてみましょう。

|x|I|y|
|--:|--:|--:|
|1|1|8|
|2|1|17|
|3|1|21|
|4|1|35|
|5|1|39|
全部1である、$I$という列を加えました。この表を縦に見て、5次元の$\vec{x}, \vec{I}, \vec{y}$が並んでいると思ってみましょう。そうすると、$\hat{y}=bx+a$で$y$を近似するというのは、

```math
\vec{\hat{y}}=b\vec{x}+a\vec{I}
```
とベクトル$\vec{x},\vec{I}$の和で$\vec{y}$に近似できるベクトルを作ろう、という問題になります。

先に進む前に、$J = \sum_i (y_i-\hat{y}_i)^2$が幾何学的に何を意味するか考えてみましょう。$\vec{y}$と$\vec{\hat{y}}$がベクトルだと思うと、$J$は要素ごとの差を取って二乗して足したものです。これは何でしょう？2点間の距離に他なりません。つまり、$J$を最小化する問題というのは、ベクトル$\vec{x},\vec{I}$の和で$\vec{y}$に最も「近い」点を作ろうというベクトルの問題と等価になりました。

では、また見方を少し変えてみましょう。$\vec{x},\vec{I}$の2本のベクトルの和として作れる点の集合はなんでしょうか？これは平面です。ですので、この平面(平面$p$と呼ぶことにします)の中の点で、点$\vec{y}$に最も近い点を探してくればいいです。では、平面$p$の中で、平面外の点$\vec{y}$に一番近い点というのは幾何学的に何なのでしょう？3次元の例を考えると分かりやすいと思いますが、これは$\vec{y}$から$p$に降ろした垂線の足になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528459/82f226f4-6b31-3d17-3614-6444ac3ffd41.png)


高校数学をよく覚えている皆さんは、三角錐$\vec{a},\vec{b},\vec{c}$について、ある頂点から対面に降ろした垂線の足を求める問題に見覚えがあるかもしれません。ですので、この$J$の最小化の問題は、三角錐の垂線の足と同じ手法で、高校2年生の数学で(微分を使わずに)求めることができました。

もちろん現実的には、データサイエンティストが手でこの計算をすることはなく、データをソフトウェアに入れれば回帰の結果を教えてもらえます。

##価格弾力性
過去の偉い人達の研究や経験から、価格で売上数量を直接単回帰してもあまりうまくいかないことが知られています。かわりに、価格$p$と数量$V$の対数をとって、

```math
\log V \sim b \log p + a
```
で回帰したほうがうまくいくと言われています。ここで係数$b$をある商品の<b>価格弾力性</b>と呼びます。価格が高いほど売上は少なくなることが予想されるので、$b$の符号はマイナスです。価格弾力性の意味合いとしては、例えば$b=-0.02$であれば、価格が1%上がると、売上は数量ベースで2%落ちるということが予測されます。

では実際に先ほどのデータを対数を取ってみましょう。(対数の底は$e$です。念のため。)

|曜日|log p|log V|
|---|--:|--:|
|月|4.500|6.326|
|火|4.554|6.257|
|水|4.605|6.227|
|木|4.654|6.170|
|金|4.700|6.084|

このデータを使って$\log V$を$\log p$で回帰してみます。すると、(計算過程は飛ばします)

```math
\begin{align}
a&= 11.44\\
b&= -1.14
\end{align}
```
を得ました。なので、$\log V$と$\log p$には、

```math
\log V \sim 11.44 - 1.14 \log p
```
の関係がありました。これは、値段を1%上げると売上数量は1.14%低下することを示しています。

直線でデータが近似できない場合にも、何かしらの結果の数字を得てしまいます。ですので、実際には、統計ソフト(ExcelやR、Python...)を使って回帰した時に結果と一緒に教えてもらえるp値という値を見て、結果に意味があるかを確認することになります。もしくは単回帰くらいでしたら、点をプロットして直線に乗っていることを確認しても大きな問題はないかもしれません。

##複数変数で別の変数を説明する- 重回帰
ここまでは一つの変数(価格:説明変数といいます)で別の変数(数量:目的変数といいます)を説明することを考えてきました。しかし、現実には売上数量に影響を与えるのはその商品の価格だけではないでしょう。例えば、曜日や天気、競合商品の価格なども大きな影響があるのではないでしょうか。このように多くの変数を使って足し算の形で変数$y$を近似させる手法を、重回帰と言います。

```math
y \sim \hat{y} = a +b_1x_1+b_2x_2+b_3x_3+ \dots
```
少し複雑になりますが、この場合も連立方程式やベクトルの問題に帰着して解くことができます。

##まとめと発展
今回は、データの中のある変数と別の変数の関係性を足し算の形で表す方法を説明しました(ちなみに線形というのは足し算という意味です)。係数と切片を求める計算は、微分やベクトルを使って、連立方程式の形に帰着されました。

線形回帰にはいくつかの有名な問題が指摘されています。まず、そもそもデータが直線の関係にない場合、足し算の形で関係を近似することはできません。この場合は、変数を2乗した項を含めて重回帰するなどの手法が考えられます。また、重回帰において、複数の説明変数の間に非常に強い相関がある場合、結果が安定しなくなる「多重共線性」という有名な問題があります。そのため、重回帰を行う際には事前に説明変数の間の相関を確認しておく必要があります。

また、重要な解釈上の問題として、回帰における関係は因果関係を必ずしも示していないことに注意してください。例えば、夏のアイスの売上を缶ジュースの売上で回帰することで、何かしら意味のある関係性を見出せるかもしれません。しかしこれはアイスが売れたからジュースが売れた、のような関係があるわけではなく、暑い日に両方とも売れるという関係があるだけと考えるのが自然でしょう。

最後に注意点ですが、時系列のデータ(例えば株価の推移)は関連性のない変数同士でも、回帰することで一見意味のある関係を見出してしまうことがあります。これは時系列解析という別の難しい分野に属する問題ですので、安易に回帰して、意味合いがあると結論付けないよう注意してください。

次回は、分類問題について説明します。