K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

ラグプロットで自己相関の癖を掘る

中級

06.7.24

ラグプロットで自己相関の癖を掘る

最終更新 2020-03-14 読了時間 2 分
まとめ
ラグプロットは、時系列の「1 期前の値」を横軸、「現在の値」を縦軸に取った散布図で、点が対角線に沿って並ぶほど自己相関が強い(前の値が次の値をよく予測する)ことを示します。配列を 1 つずらして series[:-lag] と series[lag:] を組にするだけで作れ、np.corrcoef の値がその散布図の相関係数、つまりラグ 1 の自己相関係数です。ランダムウォークのように前の値を引き継ぐ系列では点が 45 度線に貼り付き、ホワイトノイズでは円状に散ります。読み終えると、相関係数 0.98 前後が示す強い持続性を図から読み取り、lag を 7 や 30 に変えて周期性を探る使い方ができるようになります。

直感 #

毎日の株価や気温のように「今日の値は昨日の値に近い」系列では、昨日の値を横軸、今日の値を縦軸に取って点を打つと、点はほぼ対角線上に並びます。逆にコイン投げのような独立な系列では、昨日の値から今日の値は予測できないので点は丸く散らばります。ラグプロットはこの散布図そのもので、点の並びの「細さ」が自己相関の強さに対応します。ラグを 1 ではなく 7 にすれば「1 週間前の値との関係」が見え、週周期のあるデータなら点がふたたび対角線に集まります。

Python で描く #

次のコードは、標準偏差 1.2 の正規乱数を累積和した 120 点のランダムウォークを作り、1 期ずらした 2 本の配列を散布図にします。np.corrcoef で相関係数を計算してタイトルに入れ、対角線を破線で重ねます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(11)
series = np.cumsum(rng.normal(0, 1.2, size=120)) + 50
lag = 1

x_prev = series[:-lag]
x_curr = series[lag:]

fig, ax = plt.subplots(figsize=(4.4, 4.4))
ax.scatter(x_prev, x_curr, color="#38bdf8", alpha=0.7)

coef = np.corrcoef(x_prev, x_curr)[0, 1]
ax.set_xlabel("1期前の値")
ax.set_ylabel("現在の値")
ax.set_title(f"ラグ{lag}の散布図(相関係数 {coef:.2f})")
ax.grid(alpha=0.2)

lims = [min(series) - 2, max(series) + 2]
ax.plot(lims, lims, color="#475569", linestyle="--", linewidth=1)
ax.set_xlim(lims)
ax.set_ylim(lims)

fig.tight_layout()

plt.show()

右上がりであれば自己相関が強く、パターンが読めますの図

実行結果の読み方 #

点が破線の対角線に細く沿っていれば自己相関が強く、タイトルの相関係数は 0.98 前後になります。ランダムウォークは変化量が小さいので、前期の値がそのまま次期の良い予測になることをこの並びが示しています。点が対角線の上側に多ければ上昇傾向、下側に多ければ下降傾向で、円状に広がるなら前の値が次の値の手がかりにならないホワイトノイズに近い系列です。lag を 1・7・30 と変えて 3 枚並べると、どの遅れを特徴量に使うべきかが見えてきます。

何が起きているか(ステップで見る) #

コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。

見るポイント:ずらした自分自身との相関が自己相関。周期と同じラグで相関が高くなる。

使いどころと落とし穴 #

ラグプロットは、予測モデルを作る前に「前の値を特徴量に使う意味があるか」を 1 枚で確認するときに使います。ラグ 1 だけ見て自己相関がないと判断するのは危険で、週次データなら 7、月次なら 12 のように周期の候補を複数試してください。全ラグをまとめて見たいなら statsmodels.graphics.tsaplots.plot_acf で自己相関関数を描く方が効率的で、ラグプロットは特定のラグの関係の形(線形か、外れ値があるか)を確かめる補助に使います。上昇トレンドがあるデータでは、トレンドだけで点が対角線に並んで見かけの正相関が出るので、np.diff で差分を取るか対数変換してトレンドを除いてから描きます。