Mímisbrunnr知恵の泉

← 時系列分析 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:時系列データと分解 | 数理:確率過程(マルコフ連鎖・ポアソン過程)(統計)

要点(BLUF)

1. 定常性とは

弱定常(共分散定常)は次の3つを満たすことです。

E[yt]=μ (一定),Var[yt]=σ2 (一定),Cov[yt,ytk]=γk (k だけに依存)\mathbb E[y_t]=\mu\ (\text{一定}),\qquad \mathrm{Var}[y_t]=\sigma^2\ (\text{一定}),\qquad \mathrm{Cov}[y_t,y_{t-k}]=\gamma_k\ (k\ \text{だけに依存})

つまり「いつ見ても同じ統計的性質」。トレンドがあれば平均が動くので非定常、分散が時間とともに膨らんでも非定常です。定常なら過去から学んだ関係が未来にも使える——だから多くのモデルは定常性を前提にし、非定常なら差分対数変換で定常化します。

2. 自己相関 ACF と偏自己相関 PACF

**自己相関関数(ACF)**は、ラグ kk の自己共分散を分散で割ったもの:

ρk=γkγ0=Cov[yt,ytk]Var[yt]\rho_k=\frac{\gamma_k}{\gamma_0}=\frac{\mathrm{Cov}[y_t,y_{t-k}]}{\mathrm{Var}[y_t]}

ρ1\rho_1 が大きければ「1時点前と強く連動」。ただし yty_tyt2y_{t-2} の相関には「yt1y_{t-1} を経由した間接的な相関」も混じります。これを取り除いた直接の相関が偏自己相関(PACF) ϕkk\phi_{kk}yt1,,ytk+1y_{t-1},\dots,y_{t-k+1} を条件づけた yty_tytky_{t-k} の相関)。ACF と PACF を併せて見ると、依存の「形」が読めます。

3. コード:AR(1) の指紋(ACF幾何減衰・PACFラグ1で切れる)

1次自己回帰 AR(1) xt=ϕxt1+εtx_t=\phi x_{t-1}+\varepsilon_tϕ=0.7\phi=0.7)を作り、ACF/PACF を見ます。理論では ACF =ϕk=\phi^k、PACF はラグ1で ϕ\phi・以降 0 になります。

import numpy as np
from statsmodels.tsa.stattools import acf, pacf

# AR(1): x_t = φ x_{t-1} + ε(真の φ=0.7 を仕込む)
rng = np.random.default_rng(1)
phi, n = 0.7, 4000
x = np.zeros(n)
for t in range(1, n):
    x[t] = phi*x[t-1] + rng.normal(0, 1)

a = acf(x, nlags=5, fft=True)
p = pacf(x, nlags=5)
print(f"{'lag':>4}{'ACF推定':>10}{'理論φ^k':>10}{'PACF推定':>10}")
for k in range(6):
    print(f"{k:>4}{a[k]:>10.3f}{phi**k:>10.3f}{p[k]:>10.3f}")

出力:

 lag     ACF推定     理論φ^k    PACF推定
   0     1.000     1.000     1.000
   1     0.696     0.700     0.696
   2     0.484     0.490    -0.000
   3     0.339     0.343     0.004
   4     0.237     0.240    -0.001
   5     0.158     0.168    -0.016

出力の意味:ACF は 0.70,0.48,0.34,0.70,0.48,0.34,\dots幾何級数的に減衰し、理論値 ϕk\phi^k とぴたり一致。一方 PACF はラグ1で 0.6960.696、ラグ2以降はほぼ 00。これが AR(1) の「指紋」です——「1時点前との直接の相関だけがあり、それ以降の相関は yt1y_{t-1} 経由の間接効果にすぎない」ことを PACF が見抜いています。次章の ARIMA では、この ACF/PACF の形から次数 (p,q)(p,q) を当てます(ARMA・ARIMAモデル)。

4. ACF/PACF でモデルを見分ける

ACF と PACF の「どこで切れるか/減衰するか」で、AR か MA かを見当づけます。

モデルACFPACF
AR(pp)緩やかに減衰ラグ pp で切れる
MA(qq)ラグ qq で切れる緩やかに減衰
ARMA(p,qp,q)減衰減衰

切れる方(cut off)が次数を教える」と覚えます。AR は PACF、MA は ACF が次数で切れる。

ACF/PACF を棒グラフ(相関と信頼帯)で描くと判断しやすくなります。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語ラベル用
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

rng = np.random.default_rng(1)
phi, n = 0.7, 4000
x = np.zeros(n)
for t in range(1, n):
    x[t] = phi*x[t-1] + rng.normal(0, 1)

fig, ax = plt.subplots(1, 2, figsize=(11, 4))
plot_acf(x, lags=15, ax=ax[0]); ax[0].set_title("ACF(幾何減衰=AR的)")
plot_pacf(x, lags=15, ax=ax[1], method="ywm"); ax[1].set_title("PACF(ラグ1で切れる=AR(1))")
plt.tight_layout(); plt.show()

グラフの意味:左の ACF は棒が徐々に短くなり(減衰)、右の PACF はラグ1だけ高く、ラグ2以降は信頼帯(青い影)の中=ほぼ0。この「ACF減衰・PACFラグ1で切れる」を見たら AR(1) を疑う、という読み方の練習になります。

5. 定常 vs 非定常:ACF の減衰速度

非定常な系列(ランダムウォークなど)は、ACF がいつまでも 1 に近いままゆっくりしか減衰しません。

import numpy as np
from statsmodels.tsa.stattools import acf

rng = np.random.default_rng(1)
n = 4000
ar1 = np.zeros(n)
for t in range(1, n): ar1[t] = 0.7*ar1[t-1] + rng.normal(0, 1)   # 定常
rw = np.cumsum(rng.normal(0, 1, n))                               # 非定常(ランダムウォーク)
print(f"AR(1)定常    : ACF lag1={acf(ar1,nlags=10,fft=True)[1]:.3f}, lag10={acf(ar1,nlags=10,fft=True)[10]:.3f}")
print(f"ランダムウォーク: ACF lag1={acf(rw,nlags=10,fft=True)[1]:.3f}, lag10={acf(rw,nlags=10,fft=True)[10]:.3f}")

出力:

AR(1)定常    : ACF lag1=0.696, lag10=0.037
ランダムウォーク: ACF lag1=0.998, lag10=0.985

出力の意味:定常な AR(1) は ACF がラグ10で 0.040.04 までストンと落ちるのに、ランダムウォークはラグ10でも 0.9850.985——ほとんど減衰しない。「ACF が長く高止まりしていたら非定常を疑い、差分を検討する」という実務の合図です(単位根の正式な検定は ランダムウォークと単位根)。

⚠️ よくある誤解

関連ノート