データ解析ならPythonが最高!第6回

2018.09.10

Lab研究員 北山

移動平均、単回帰分析

移動平均

移動平均は時系列データをスムージング(平滑化)する手法の1つで、直近 n 点の平均をとります。

5点移動平均

Vol6-17.png

次のグラフを見てください。上段は時系列データのグラフです。デコボコしています。
下段は5点移動平均のグラフです。デコボコが減り滑らかになっていることが分かります。

Vol6-18.png

移動平均は、一定区間の平均値を区間をずらしながら求めたものです。

ここで連載のデータ解析ならPythonが最高!Vol.2 を思い出すと「平均とは真の値と推定される、もっともらしい値」ということでした。

ここで推定しようとしている真の値、それは、傾向変動です。次のグラフのように、時系列データは傾向変動に誤差が加わったものだと考えます。

Vol6-19.png

誤差はプラス方向やマイナス方向に振れるので、複数の点を合計すると、プラスとマイナスが打ち消しあって誤差の影響が小さくなります。

だからといって調子に乗って移動平均の点数をやたらと増やすと、傾向変動まで見えなくなったり、使えるデータ数が少なくなります。

移動平均の点数は何点ぐらいがいいのか。移動平均の点数の違いによって、真の値からのバラツキの度合いを考えてみます。
移動平均は時系列データから n 点を抽出した平均です。平均が真の値に対して、どれぐらいバラツクかというと・・・

Vol6-20.png

つまり、n点移動平均の分散は、移動平均をとる前の時系列データの標本の母分散の n 分の1 になることが期待されます。

Vol6-21.png

式から分かるように n が大きいほど平均の分散は小さくなりますが、n を大きくしすぎても、その割に小さくする効果は微々たるものです。

実用上は3点から7点までが移動平均の1つの目安です。

いずれにしろ残念ながら、移動平均が推定する傾向変動は点推定です。
もし傾向変動の直線を推定できれば、その線を延ばして未来や未知の値を予測することができるのに・・・何とか傾向変動の直線を推定することはできないでしょうか。

ここで単回帰の登場です。単回帰分析で直線を推定することができます。

単回帰分析

重さ 2 kg の白菜を x 個、重さ 3 kg の木箱に詰めました。このとき、白菜を詰めた木箱の総重量は次式で予測できます。

Vol6-22.png

グラフにすると次のようになります。

Vol6-23.png

総重量の予測値は、白菜の個数に比例して変化することが分かります。
このように x による y の変化を表した直線を回帰直線といい、次式で表します。

Vol6-34-予測式.png

この式を回帰式といいます。
ここで、w1 は白菜一個の重さ 2 kg に相当し、直線の傾きを表します。
w0 は木箱の重さ 3 kg に相当し、切片といいます。

w1 や w0 を回帰係数といいますが、母数の回帰係数(母回帰係数)と区別して、標本から推定した回帰係数を偏回帰係数といいます。

さて、実際には白菜1個の重さにはバラツキがあります。木箱に詰めた白菜の総重量を測ったところ、次の結果が得られました。

Vol6-31-単回帰グラフ.png

このとき総重量の変化は、白菜の個数によって変化する部分と、個々の白菜の重さのバラツキによって変化する部分に分けられます。

Vol6-32-残差.png

回帰直線で表せないバラツキによって変化する部分を残差といい、次式で表します。

Vol6-33-残差平方和.png

残差を次のグラフのように

Vol6-35-正規方程式スカラー.png

真の値(回帰直線)からのバラツキだと考えると、Vol2の建物の高さの測量のように、このような測量結果が得られるもっともらしい値
(回帰直線)を推定することができます。次の残差平方和を最小とする回帰係数が、もっともらしい推定になります。

Vol6-36-中心化.png

残差平方和を最小とする偏回帰係数は、次式で求めることができます。

Vol6-37.png

この式を用いて白菜の個数と総重量の偏回帰係数を計算すると

傾き w1 = 2.1
切片 w0 = 3.1

となりました。
これより、総重量を予測する回帰式は次のようになります。

Vol6-50.png

白菜一個あたりの重さが 2.1 kg、木箱の重さが 3.1 kg ということです。
回帰式をグラフにすると次のようになります。

Vol6-51.png

ところで、式(1)を変形すると

Vol6-25.png

となり、回帰直線の傾き w1 は、x と y のバラツキのスケール(標準偏差)の違いを補正した相関係数であることが分かります。
相関の強さにより回帰直線の傾きがどのように変化するか次に示します。

Vol6-38.png


相関が弱いほど傾きが小さくなります。また、図のように回帰直線は必ず x と y の平均を通ります。

スカラーからベクトルへ

次の3標本の回帰式

Vol6-60.png

を縦ベクトルで表すと

Vol6-61.png

ここで各ベクトルをそれぞれ

Vol6-57.png

とおくと、予測値ベクトルは、次のように白菜の個数ベクトル x を傾き w1 倍したベクトルと定数項を切片 w0 倍したベクトルの和として表せます

Vol6-59.png

Vol6-49.png

傾きと切片

ベクトルの内積を用いて、回帰直線の傾き w1 を求めます。白菜の個数 x と総重量 y の偏差ベクトルをそれぞれ ab とすると

Vol6-28.png

式(1)より、ベクトルの内積

Vol6-39.png

を用いて、 次式で傾き w1 を求めることができます。

Vol6-29.png

これを幾何学的なイメージで説明すると次のようになります。

白菜の個数の偏差ベクトル a 、総重量の偏差ベクトル b とすると、偏差ベクトル w1ab の差が残差です。残差ベクトルの大きさは、w1a と残差ベクトルが直交するとき最小となります。

Vol6-24.png

このとき ab の成す角をθとすると、残差ベクトルの大きさを最小とする w1a の大きさは

Vol6-26.png

で求めることができます。
これを a の大きさで割ると、偏回帰係数 w1 が求まります。

Vol6-27.png


傾きが分かれば、式 (2) より、切片を求めることができます。

Pythonで単回帰分析

Pythonで単回帰分析を行います。
(単回帰分析)

import numpy as np
X = np.array([[1],[2],[4]])
Y = np.array([[6.6], [5.2], [12.2]])
# 平均
xbar = np.mean(x)
ybar = np.mean(y)
# 偏差
a = x - xbar
b = y - ybar
# 回帰係数
w1 = a.T.dot(b) / a.T.dot(a)
w0 = ybar - w1 * xbar
#予測値
yhat = w1 * x + w0

print(u'傾き w1 = %.1f' % w1)
print(u'切片 w0 = %.1f' % w0)
print(u'予測重量')
print(yhat)

(実行結果)


傾き w1 = 2.1
切片 w0 = 3.1

予測重量
[[ 5.2]
[ 7.3]
[ 11.5]]

次回は重回帰分析の予定です。

  • LINE
  • Mail