4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-05

#はじめに
かばん検定を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');

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

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

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

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

#例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])

img.png

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

キャプチャ.PNG

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

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?