かばん検定をpythonで行う方法


はじめに

かばん検定をpythonで行う方法を述べる

かばん検定とは?

一連の相関関数において,相関があるかを検定する方法.

詳細は,wikipediaを参照のこと

かばん検定で用いる関数

例えば,Ljung-Box検定を行う際には,
statsmodels.stats.diagnostic.acorr_ljungbox
を用いる.
詳細はこちら

例1

例えば,ランダムに発生させたノイズ(白色ガウス雑音)で検定を行う.
もちろん,相関関係はないはずなので,帰無仮説は棄却されないはずです.

import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline
import numpy as np
from statsmodels.stats.diagnostic import acorr_ljungbox
p = print

#データ点は1000点とする
np.random.seed(42)
data = np.random.standard_normal(1000)

#まずはデータをプロットする
plt.figure(figsize=(10,6))
plt.plot(data,lw = 1.5)
plt.xlabel('time')
plt.ylabel('value')
plt.xlim([0,100])
plt.title('time vs. value plot');

当然,白色ガウス雑音の時系列データがプロットされます.

では,これをかばん検定してみましょう.

result = acorr_ljungbox(data,lags = 5)
p(result)

結果は次のようになります.

(array([0.05608493, 0.05613943, 0.31898424, 3.27785331, 3.94903872]), array([0.81279444, 0.97232058, 0.9564194 , 0.51244884, 0.55677627]))

2つの要素をもったタプル形式で出力されますが,1つ目は検定の統計量,2つ目は,p値です.見た目綺麗なように表形式にしましょう.

result_table = pd.DataFrame(data = result, index=['static value', 'P value'],columns=[str(i) for i in range(1,6)])
result_table

以下のような結果が出力されます.列方向は,ラグの大きさです.

例2

次に,MA(2)過程の検定を行いましょう.次のような式を想定します.

y_t = 1 + \epsilon_t + 0.5 \epsilon_{t-3}

ただし,$\epsilon_t$は白色ガウス雑音とします.
式の形から明らかなように,どうやら時間差が3のとき(例えば$y_5$と$y_8$)に相関が生じそうですよね.もちろん数学的に確認もできるのですが,かばん検定でこれを確認します.

#モデルデータの作成
data = np.zeros(1000)
np.random.seed(42)
err = np.random.standard_normal(1000)
for i in range(1000):
    if i-3 < 0:
        data[i] = 1 + err[i]
    else:
        data[i] = 1 + err[i] + 0.5 * err[i-3]

#まずはデータをプロットする
plt.figure(figsize=(10,6))
plt.plot(data,lw = 1.5)
plt.xlabel('time')
plt.ylabel('value')
plt.title('time vs. value plot (MA(3) model)')
plt.xlim([0,100])

result = acorr_ljungbox(data,lags = 5)
result_table = pd.DataFrame(data = result, index=['static value', 'P value'],columns=[str(i) for i in range(1,6)])
result_table

例えばPを0.05で検定した場合,ラグが2以下の場合は有意な差がないですが,3以上(つまり,$\rho_3$が含まれた場合)になるとと有意な差が出ることがわかります.