見せかけの相関に注意しましょう。
データを弄ると必ず聞く言葉です。
偏相関係数を見ましょう。
時々聞く言葉です。というわけで偏相関係数の説明をします。
偏相関係数は、共通の特徴量を持つと思われる量の相関を測るものです。
相関係数が高いのに偏相関係数が低い状態の事を、見せかけの相関がある状態という訳です。
相関係数の復習から始めて、偏相関係数の定義を学んで、時系列分析での応用を説明します。
最後に、pythonで計算させてみます。
参考文献は2冊です。
記事で使っているソースコードはgithub に置いてあります。
https://github.com/msamunetogetoge
相関係数
相関係数の定義を復習します。
期待値を取る操作を
耳にタコが出来るほど聞く話ですが、相関係数が高いからと言って、
例えば、体重と年収が相関があったとしましょう。体重が重い程、年収が高いようなデータがあったとします。意味不明だなと思って調べてみると、何故かデータ収集の対象年齢が12歳からとなっていることが分かりました。12歳の子供は体重が軽く、年収がほぼ0なので、そんなデータになっていたと分かってめでたしめでたしです。
未知の事象に挑戦している時に、同じような事が起きたときに冷静に行動するための量として、偏相関係数があります。
偏相関係数
偏相関係数は、
変数が大量にある場合でも同じ定義です。
実際、
単回帰の時、回帰式は以下のようになっていました。
2
これらの式を元に共分散を計算します。
まずは
偏相関係数の式に代入すると、
です。
と書く時、
と書けます。ただし、
この行列と、
となります。行列とベクトルで書くと、回帰式は
となります。偏相関係数は、この回帰式を使って
と書かれます。手計算するのは大変ですが、データがある場合にパソコンに計算させるのは簡単です。
時系列分析での応用
偏相関係数は時系列分析で重要な役割を果たします。具体的には、定常なAR過程か否かを見極めるのに使う事が出来ます。つまり、定常な
簡単の為に、
ただし、
2次の偏相関係数を計算するために、
最小二乗法から、
同じような計算で、3次以上でも0になることが分かります。
pythonでの計算
初めに、irisデータで偏相関係数を計算してみます。
patal length とpatal width の相関が非常に高いので、他の変数の影響を取り除いて偏相関係数を計算してみます。
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
X=df.iloc[:,:2]
X["beta_0"]=1
X=X[["beta_0","sepal length (cm)","sepal width (cm)" ]]
#patal length とpatal width の相関が0.96なので、偏相関係数を計算
y=df[["petal length (cm)","petal width (cm)"]]
beta = np.dot(np.dot(np.linalg.inv( np.dot(X.T , X) ) , X.T), y)
#重回帰による予測値
y_hat = np.dot(X, beta)
#patal length とpatal width の相関が0.96
Y = y - y_hat
S_Y =np.zeros((2,2))
for j in [0,1]:
Y_j =Y.iloc[:,j] - np.mean(Y.iloc[:,j])
for i in [0,1] :
Y_i =Y.iloc[:,i] - np.mean(Y.iloc[:,i])
S_Y[j,i]=np.dot(Y_i, Y_j)
pac = S_Y[0,1]/np.sqrt(S_Y[0,0]*S_Y[1,1])
print(pac)
#0.870769773836145
偏相関係数は0.87 と大きな値になりました。
次に、適当に
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
#相関係数計算の関数
def autcor(X, k):
X_bar = np.mean(X)
X_bar_k = X_bar * np.ones(k)
X_k = np.append(X_bar_k ,X)
k_X = np.append(X, X_bar_k )
r= np.dot(X_k -X_bar , k_X - X_bar )
r/= np.linalg.norm(X-X_bar)**2
return r
#偏相関係数計算の関数
def Pac(Y,k):
Y = pd.DataFrame(Y, columns=["y_t"])
for i in range(k):
if i ==0:
Y["y_t-1"] = Y["y_t"].shift().fillna(0)
else:
Y["y_t-"+str(i+1)]=Y["y_t-"+str(i)].shift().fillna(0)
X =Y.iloc[:,1:k-1]
y=Y.iloc[:,[0,k]]
beta = np.dot(np.dot(np.linalg.inv( np.dot(X.T , X) ) , X.T), y)
y_hat = np.dot(X, beta)
y_til = y - y_hat
S_Y =np.zeros((2,2))
for j in [0,1]:
Y_j =y_til.iloc[:,j] - np.mean(y_til.iloc[:,j])
for i in [0,1] :
Y_i =y_til.iloc[:,i] - np.mean(y_til.iloc[:,i])
S_Y[j,i]=np.dot(Y_i, Y_j)
pac = S_Y[0,1]/np.sqrt(S_Y[0,0]*S_Y[1,1])
return pac
#AR(1)の生成
phi = 0.6
epsilon = np.random.randn(200000)
T=1000
Y=np.zeros(T)
for t in range(T):
Y[t]=phi*Y[t-1] +epsilon[t]
#10次まで計算
n=10
pac=[]
ac=[]
for k in range(n):
pac=np.append(pac,Pac(Y,k+1))
ac = np.append(ac,autcor(Y,k+1))

AR過程では、指数関数的に相関係数が小さくなっていく様子が見えます。また、偏相関係数は、2次以降でほぼ0となっています。MA過程では次のようなグラフになります。

上の2つの図から分かるように、偏相関係数は、AR過程か否かを判定する材料には出来ますが、MA過程にはあまり効果がありません。
まとめ
- 相関係数について復習した
- 偏相関係数の定義を確認した
- 時系列分析における偏相関係数の役割を解説した
- python で計算してみた
が長さ の、 データからなるベクトルだったら、 です。 に従う確率変数なら です- 計算は単回帰分析の記事を読んでください 。
- 単回帰の場合です。
- 省略されている計算は重回帰分析の記事に書いてます。
- 定常な
過程 なら、 相関係数が次数 から0でした。MA過程に関する記事を読んでみて下さい。 - 一般にk次の偏相関係数を計算するための回帰係数について、
が成り立ちます。