- ホーム
- コラム
- YDC Labコラム
- データ解析ならPythonが最高!第6回

データ解析ならPythonが最高!第6回
Lab研究員 北山
移動平均、単回帰分析
移動平均
移動平均は時系列データをスムージング(平滑化)する手法の1つで、直近 n 点の平均をとります。
5点移動平均
次のグラフを見てください。上段は時系列データのグラフです。デコボコしています。
下段は5点移動平均のグラフです。デコボコが減り滑らかになっていることが分かります。
移動平均は、一定区間の平均値を区間をずらしながら求めたものです。
ここで連載のデータ解析ならPythonが最高!Vol.2 を思い出すと「平均とは真の値と推定される、もっともらしい値」ということでした。
ここで推定しようとしている真の値、それは、傾向変動です。次のグラフのように、時系列データは傾向変動に誤差が加わったものだと考えます。
誤差はプラス方向やマイナス方向に振れるので、複数の点を合計すると、プラスとマイナスが打ち消しあって誤差の影響が小さくなります。
だからといって調子に乗って移動平均の点数をやたらと増やすと、傾向変動まで見えなくなったり、使えるデータ数が少なくなります。
移動平均の点数は何点ぐらいがいいのか。移動平均の点数の違いによって、真の値からのバラツキの度合いを考えてみます。
移動平均は時系列データから n 点を抽出した平均です。平均が真の値に対して、どれぐらいバラツクかというと・・・
つまり、n点移動平均の分散は、
式から分かるように n が大きいほど平均の分散は小さくなりますが、n を大きくしすぎても、
実用上は3点から7点までが移動平均の1つの目安です。
いずれにしろ残念ながら、移動平均が推定する傾向変動は点推定です。
もし傾向変動の直線を推定できれば、その線を延ばして未来や未知の値を予測することができるのに・・・何とか傾向変動の直線を推定することはできないでしょうか。
ここで単回帰の登場です。
単回帰分析
重さ 2 kg の白菜を x 個、重さ 3 kg の木箱に詰めました。このとき、白菜を詰めた木箱の総重量は次式で予測できます。
グラフにすると次のようになります。
総重量の予測値は、白菜の個数に比例して変化することが分かります。
このように x による y の変化を表した直線を回帰直線といい、次式で表します。
この式を回帰式といいます。
ここで、w1 は白菜一個の重さ 2 kg に相当し、直線の傾きを表します。
w0 は木箱の重さ 3 kg に相当し、切片といいます。
w1 や w0 を回帰係数といいますが、母数の回帰係数(母回帰係数)と区別して、標本から推定した回帰係数を偏回帰係数といいます。
さて、実際には白菜1個の重さにはバラツキがあります。木箱に詰めた白菜の総重量を測ったところ、次の結果が得られました。
このとき総重量の変化は、白菜の個数によって変化する部分と、個々の白菜の重さのバラツキによって変化する部分に分けられます。
回帰直線で表せないバラツキによって変化する部分を残差といい、次式で表します。
残差を次のグラフのように
真の値(回帰直線)からのバラツキだと考えると、Vol2の建物の高さの測量のように、このような測量結果が得られるもっともらしい値
(回帰直線)を推定することができます。次の残差平方和を最小とする回帰係数が、もっともらしい推定になります。
残差平方和を最小とする偏回帰係数は、次式で求めることができます。
この式を用いて白菜の個数と総重量の偏回帰係数を計算すると
傾き w1 = 2.1
切片 w0 = 3.1
となりました。
これより、総重量を予測する回帰式は次のようになります。
白菜一個あたりの重さが 2.1 kg、木箱の重さが 3.1 kg ということです。
回帰式をグラフにすると次のようになります。
ところで、式(1)を変形すると
となり、回帰直線の傾き w1 は、x と y のバラツキのスケール(標準偏差)の違いを補正した相関係数であることが分かります。
相関の強さにより回帰直線の傾きがどのように変化するか次に示します。
相関が弱いほど傾きが小さくなります。また、図のように回帰直線は必ず x と y の平均を通ります。
スカラーからベクトルへ
次の3標本の回帰式
を縦ベクトルで表すと
ここで各ベクトルをそれぞれ
とおくと、予測値ベクトルは、次のように白菜の個数ベクトル x を傾き w1 倍したベクトルと定数項を切片 w0 倍したベクトルの和として表せます。
傾きと切片
ベクトルの内積を用いて、回帰直線の傾き w1 を求めます。白菜の個数 x と総重量 y の偏差ベクトルをそれぞれ a、b とすると
式(1)より、ベクトルの内積
を用いて、 次式で傾き w1 を求めることができます。
これを幾何学的なイメージで説明すると次のようになります。
白菜の個数の偏差ベクトル a 、総重量の偏差ベクトル b とすると、偏差ベクトル w1a と b の差が残差です。残差ベクトルの大きさは、w1a と残差ベクトルが直交するとき最小となります。
このとき a と b の成す角をθとすると、残差ベクトルの大きさを最小とする w1a の大きさは
で求めることができます。
これを a の大きさで割ると、偏回帰係数 w1 が求まります。
傾きが分かれば、式 (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]]
次回は重回帰分析の予定です。