#はじめに
かばん検定を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$が含まれた場合)になるとと有意な差が出ることがわかります.