🎓 レベル:基礎 | 重要度:A(必須)
📎 前提:時系列データと分解 | 数理:確率過程(マルコフ連鎖・ポアソン過程)(統計)
要点(BLUF)
- 定常性=平均・分散・自己相関が時間によらず一定。多くの時系列モデル(ARIMA など)の前提です。非定常な系列は差分などで定常化してから扱います(ランダムウォークと単位根)。
- 自己相関 ACF はラグ だけ離れた値同士の相関、偏自己相関 PACF は途中のラグの影響を除いた直接の相関。
- ACF/PACF のパターンがモデルの指紋:AR() は PACF がラグ で切れ、MA() は ACF がラグ で切れます。AR(1) は ACF が幾何減衰・PACF がラグ1で切れる(コードで実証)。
1. 定常性とは
弱定常(共分散定常)は次の3つを満たすことです。
つまり「いつ見ても同じ統計的性質」。トレンドがあれば平均が動くので非定常、分散が時間とともに膨らんでも非定常です。定常なら過去から学んだ関係が未来にも使える——だから多くのモデルは定常性を前提にし、非定常なら差分や対数変換で定常化します。
2. 自己相関 ACF と偏自己相関 PACF
**自己相関関数(ACF)**は、ラグ の自己共分散を分散で割ったもの:
が大きければ「1時点前と強く連動」。ただし と の相関には「 を経由した間接的な相関」も混じります。これを取り除いた直接の相関が偏自己相関(PACF) ( を条件づけた と の相関)。ACF と PACF を併せて見ると、依存の「形」が読めます。
3. コード:AR(1) の指紋(ACF幾何減衰・PACFラグ1で切れる)
1次自己回帰 AR(1) ()を作り、ACF/PACF を見ます。理論では ACF 、PACF はラグ1で ・以降 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 は と幾何級数的に減衰し、理論値 とぴたり一致。一方 PACF はラグ1で 、ラグ2以降はほぼ 。これが AR(1) の「指紋」です——「1時点前との直接の相関だけがあり、それ以降の相関は 経由の間接効果にすぎない」ことを PACF が見抜いています。次章の ARIMA では、この ACF/PACF の形から次数 を当てます(ARMA・ARIMAモデル)。
4. ACF/PACF でモデルを見分ける
ACF と PACF の「どこで切れるか/減衰するか」で、AR か MA かを見当づけます。
| モデル | ACF | PACF |
|---|---|---|
| AR() | 緩やかに減衰 | ラグ で切れる |
| MA() | ラグ で切れる | 緩やかに減衰 |
| ARMA() | 減衰 | 減衰 |
「切れる方(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で までストンと落ちるのに、ランダムウォークはラグ10でも ——ほとんど減衰しない。「ACF が長く高止まりしていたら非定常を疑い、差分を検討する」という実務の合図です(単位根の正式な検定は ランダムウォークと単位根)。
⚠️ よくある誤解
- 「ACF が高い=因果」ではない:自己相関は系列内の連動の記述で、因果ではありません(グレンジャー因果 で別途扱う)。
- 「ACF と PACF は同じ」ではない:ACF は間接相関込み、PACF は直接相関のみ。AR/MA の判別には両方見ます。
- 「定常化は差分だけ」ではない:トレンドは差分、分散の増大は対数変換、季節は季節差分、と原因に応じて使い分けます。
- 「ACF の山が信頼帯を超えたら必ず有意」ではない:多数のラグを見れば偶然超えるものも出ます。全体のパターンで判断します。
関連ノート
- 時系列データと分解
- ランダムウォークと単位根(次のトピック・非定常の検定と差分)
- AR・MAモデル(ACF/PACF の指紋を持つモデル本体)
- ARMA・ARIMAモデル(次数 (p,q) の同定)
- 確率過程(マルコフ連鎖・ポアソン過程)(統計・定常過程の土台)
- 第1章 時系列の基礎 目次
- 時系列分析・予測テキスト 全体目次