自己相関 関連の補強キーワード。 クリックで該当箇所へ:
🍰 まずはやさしく
過去の自分とどれだけ似ているかを見る指標です。
データの傾向や周期性を知るために使います。
テストの点数が前の回と似ているか調べるようなものです。
この章では定義や計算方法について読みます。
🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #1。最初のスニペットです。SSDSE-B-2026 を読み込みます。
📥 入力例(df.head())
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# SSDSE-B-2026 は 47都道府県×12年(2012〜2023)のパネル(1行目=英字コード, 2行目=日本語名)
# skiprows=[1] で日本語名の行を飛ばし、英字コード行をヘッダにする
# 実在する列コード例: A1101=総人口 / A4101, B4101 も実在の指標列1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 基本パターン import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import seaborn as sns # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 基本統計量 df.describe() # 可視化(L322101=食料費, L322102=住居費, L322108=教育費(いずれも二人以上の世帯)) sns.pairplot(df[['L322101', 'L322108', 'L322102']]) plt.show() |
📤 このブロックは標準出力には何も出さない
このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。
統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:
| 機能 | Python (pandas) | Python (scipy) |
|---|---|---|
| 要約統計 | df.describe() | stats.describe() |
| 平均 | df.mean() | np.mean() |
| 標準偏差 | df.std() | np.std() |
| 相関 | df.corr() | stats.pearsonr() |
| t検定 | — | stats.ttest_ind() |
| 回帰 | — | stats.linregress() |
| 分布フィッティング | — | stats.norm.fit() |
この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。
| グループ | 主要概念 |
|---|---|
| 記述統計 | 平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数 |
| 可視化 | ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ |
| 推測統計 | 標本平均、 標準誤差、 信頼区間、 p値、 有意水準 |
| 確率分布 | 正規分布、 t分布、 χ²分布、 F分布、 二項分布 |
| 仮説検定 | t検定、 F検定、 χ²検定、 ノンパラ検定 |
| 回帰 | 単回帰、 重回帰、 OLS、 Ridge、 LASSO |
| 分類 | ロジスティック回帰、 決定木、 SVM、 k-NN |
| 教師なし学習 | クラスタリング、 PCA、 因子分析 |
| 時系列 | ARIMA、 VAR、 指数平滑法、 自己相関 |
| 因果推論 | DiD、 IV、 傾向スコア、 交絡変数 |
| 前処理 | 標準化、 正規化、 欠損値処理、 多重共線性対策 |
| 評価 | R²、 残差、 CV、 RMSE、 効果量 |
🍰 まずはやさしく
時系列データが過去の自分とどれだけ相関するかを指します。
データの分析で重要な考え方として使われます。
都道府県の人口の変化などを調べる時に役立ちます。
定義から実装までを6つの視点で読み進めます。
論文中に 「自己相関」として登場する用語。
自己相関 とは:時系列が「過去の自分」とどれだけ相関しているか。1期ずれた値との相関 r(1)、2期ずれの r(2) ...。
本ページでは「autocorrelation」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。
「autocorrelation」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。
🍰 まずはやさしく
鏡に映った過去の自分と比べるようなものです。
データに一定のパターンがあるかを見つけるために使います。
部活の記録が前日と似た動きをしているか考える例です。
図を使ってラグという考え方を直感的に理解します。
自己相関は「同じ系列の過去の自分との相関」。 SSDSE-B-2026 の北海道の出生数を見ると、 2019 年 31,020 → 2020 年 29,523 → 2021 年 28,762 と、 前年とほぼ同じ水準が続く。 これは「ラグ 1 の自己相関が高い」状態。 ACF プロットで一目瞭然。
自己相関は「過去の自分と現在の自分の相関」。 ラグ k だけずらした時系列同士の Pearson 相関で、 周期性やトレンドの検出に使われる。
→ 1ステップずらした自分との相関がラグ1の自己相関係数 r1。
→ 信頼区間(破線)を超える棒は有意。 一定間隔で大きい棒は周期性のサイン。
→ コレログラムの形状でホワイトノイズ/トレンド/季節性を識別できる。
🍰 まずはやさしく
自己相関を数式で表した厳密なルールです。
計算の結果として何が出るのかをはっきりさせるために使います。
スマホの利用時間を毎日記録して計算するイメージです。
数式に登場する記号の意味を一つずつ読み解きます。
直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。
上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。
| 記号 | 意味(言葉での説明) |
|---|---|
| $\rho_k$ | ラグ $k$ における自己相関係数($-1 \le \rho_k \le 1$) |
| $y_t$ | 時刻 $t$ の観測値 |
| $\bar y$ | 時系列全体の平均 |
| $n$ | サンプル数 |
| $k$ | 考えるラグ(1 期前、 2 期前、 …) |
SSDSE-B の時系列変数(例:東京都の総人口 A1101 の年次推移)から自己相関を計算し、 ACF/PACF を可視化。 ARIMA 同定までの完全例。
🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #4。主要な指標(係数・統計量・スコア)を算出します。
📥 入力例(df.head())
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# SSDSE-B-2026 は 47都道府県×12年(2012〜2023)のパネル(1行目=英字コード, 2行目=日本語名)
# skiprows=[1] で日本語名の行を飛ばし、英字コード行をヘッダにする
# 実在する列コード例: A1101=総人口 / A4101, B4101 も実在の指標列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 28 29 30 31 32 | import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import acf, pacf, adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.stats.diagnostic import acorr_ljungbox df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 東京都の総人口 A1101 を年次昇順に並べた実測時系列(2012〜2023, 12点) tokyo = df[df['Prefecture'] == '東京都'].sort_values('SSDSE-B-2026') ts = pd.Series(tokyo['A1101'].values, index=tokyo['SSDSE-B-2026'].values) # ACF / PACF(n=12 と短いのでラグは5まで) acf_vals = acf(ts, nlags=5, fft=False) pacf_vals = pacf(ts, nlags=5, method='ywm') print(f'ACF(1)={acf_vals[1]:.3f}, ACF(2)={acf_vals[2]:.3f}, ACF(3)={acf_vals[3]:.3f}') print(f'PACF(1)={pacf_vals[1]:.3f}, PACF(2)={pacf_vals[2]:.3f}') fig, axes = plt.subplots(2, 1, figsize=(10, 6)) plot_acf(ts, lags=5, ax=axes[0]); axes[0].set_title('ACF') plot_pacf(ts, lags=5, method='ywm', ax=axes[1]); axes[1].set_title('PACF') plt.tight_layout(); plt.savefig('acf_pacf.png', dpi=110) # Ljung-Box 検定(ラグ3) lb = acorr_ljungbox(ts, lags=[3], return_df=True) print(f"Ljung-Box Q(3)={lb['lb_stat'].iloc[0]:.1f}, p={lb['lb_pvalue'].iloc[0]:.3f}") # ADF(単位根検定) adf_stat, p, *_ = adfuller(ts) print(f'ADF stat = {adf_stat:.3f}, p = {p:.4f}') print('p < 0.05 で「単位根なし=定常」') |
📤 実行例(実測) ACF(1)=0.783, ACF(2)=0.542, ACF(3)=0.293 PACF(1)=0.783, PACF(2)=-0.186 Ljung-Box Q(3)=15.9, p=0.001 ADF stat = 0.605, p = 0.9877 p < 0.05 で「単位根なし=定常」
| 項目 | 値 | 参考 | 解釈 |
|---|---|---|---|
| lag | ACF | 解釈 | |
| 1 | 0.783 | 強い自己相関 | 前年と密接 |
| 2 | 0.542 | 中程度 | 2年前とも相関 |
| 3 | 0.293 | 弱まる | トレンドの減衰 |
| 検定 | Ljung-Box (lag=3) | Q=15.9, p=0.001 | ホワイトノイズ仮説棄却 |
| 検定 | ADF(原系列) | p = 0.988 | 単位根あり(非定常) |
| 差分後 | ADF (1階差分) | p = 0.031 | 差分後は定常 |
👉 値は東京都 総人口 A1101(2012〜2023, 12点)の実測。 同じ手順で他都道府県・他変数にも適用可能。
数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 12 年 × 100+ 指標のパネル)の実値を当てはめて、 自己相関 の挙動を電卓的に追体験します。
SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。
合成時系列 [2,4,7,5,3] でラグ 1 の自己相関 ρ_1 を計算する。
| t | x_t | x_t - x̄ |
|---|---|---|
| 1 | 2 | -2.2 |
| 2 | 4 | -0.2 |
| 3 | 7 | +2.8 |
| 4 | 5 | +0.8 |
| 5 | 3 | -1.2 |
x̄ = (2+4+7+5+3)/5 = 21/5 = 4.2
1 2 3 4 5 6 7 8 9 | import numpy as np x = np.array([2, 4, 7, 5, 3]) xm = x - x.mean() num = (xm[:-1] * xm[1:]).sum() den = (xm**2).sum() rho = num / den print(f"分子 = {num:.2f}") print(f"分母 = {den:.2f}") print(f"ρ_1 = {rho:.4f}") |
💬 手計算 (Step 3) 0.0784 と Python 出力が完全一致。
🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #5。仮説検定・モデル評価を行います。
📥 入力例(df.head())
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# SSDSE-B-2026 は 47都道府県×12年(2012〜2023)のパネル(1行目=英字コード, 2行目=日本語名)
# skiprows=[1] で日本語名の行を飛ばし、英字コード行をヘッダにする
# 実在する列コード例: A1101=総人口 / A4101, B4101 も実在の指標列1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # scikit-learn の TimeSeriesSplit と組み合わせて自己相関対応の CV from sklearn.model_selection import TimeSeriesSplit from sklearn.linear_model import LinearRegression import numpy as np # 時系列を AR(1) 風の特徴量化 X = ts.shift(1).dropna().values.reshape(-1, 1) y = ts.iloc[1:].values tscv = TimeSeriesSplit(n_splits=5) for fold, (tr, va) in enumerate(tscv.split(X)): m = LinearRegression().fit(X[tr], y[tr]) score = m.score(X[va], y[va]) print(f'fold {fold}: R² = {score:.3f}, coef = {m.coef_[0]:.3f}') |
📤 実行例(実測) fold 0: R² = nan, coef = 1.081 fold 1: R² = nan, coef = 1.059 fold 2: R² = nan, coef = 0.986 fold 3: R² = nan, coef = 0.912 fold 4: R² = nan, coef = 0.902
🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #6。結果を整形して表示します。
📥 入力例(df.head())
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# SSDSE-B-2026 は 47都道府県×12年(2012〜2023)のパネル(1行目=英字コード, 2行目=日本語名)
# skiprows=[1] で日本語名の行を飛ばし、英字コード行をヘッダにする
# 実在する列コード例: A1101=総人口 / A4101, B4101 も実在の指標列1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from scipy.signal import correlate import numpy as np # scipy.signal で正規化自己相関 x = ts.values - ts.mean() acf_full = correlate(x, x, mode='full') / (len(x) * x.var()) mid = len(acf_full) // 2 print('lag 0..5 の ACF:', acf_full[mid:mid+6]) # 周期解析(パワースペクトル) from scipy.signal import periodogram f, Pxx = periodogram(ts.values, fs=1.0) # 年次データ import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(8, 4)) ax.semilogy(f, Pxx); ax.set_xlabel('周波数 (1/年)'); ax.set_ylabel('Power') ax.set_title('ピリオドグラム'); plt.savefig('periodogram.png', dpi=110) |
📤 実行例(実行時の標準出力) lag 0..5 の ACF: [1. 0.783 0.542 0.293 0.035 -0.189] → scipy.signal でも statsmodels.acf と一致(偏り推定量) 処理完了
🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #7。47都道府県データに当てはめて確認します。
📥 入力例(df.head())
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# SSDSE-B-2026 は 47都道府県×12年(2012〜2023)のパネル(1行目=英字コード, 2行目=日本語名)
# skiprows=[1] で日本語名の行を飛ばし、英字コード行をヘッダにする
# 実在する列コード例: A1101=総人口 / A4101, B4101 も実在の指標列1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import optuna from statsmodels.tsa.arima.model import ARIMA # ARIMA (p, d, q) の自動同定 def objective(trial): p = trial.suggest_int('p', 0, 4) d = trial.suggest_int('d', 0, 2) q = trial.suggest_int('q', 0, 4) try: model = ARIMA(ts, order=(p, d, q)).fit() return model.aic except Exception: return 1e10 study = optuna.create_study(sampler=optuna.samplers.TPESampler(seed=0), direction='minimize') study.optimize(objective, n_trials=40, show_progress_bar=False) print('Best ARIMA:', study.best_params, 'AIC:', study.best_value) |
📤 実行例(実測)
Best ARIMA: {'p': 0, 'd': 2, 'q': 0} AIC: 243.86767855016137| ライブラリ / 関数 | 用途 |
|---|---|
statsmodels.tsa.stattools.acf, pacf | 計算 |
statsmodels.graphics.tsaplots.plot_acf, plot_pacf | プロット |
statsmodels.stats.diagnostic.acorr_ljungbox | Ljung-Box 検定 |
statsmodels.tsa.stattools.adfuller | ADF 検定 |
statsmodels.stats.stattools.durbin_watson | DW 統計量 |
statsmodels.tsa.arima.model.ARIMA | ARIMA モデル |
🎯 このコードでやること: まず環境をそろえます。 必要なライブラリを入れ、 matplotlib の日本語フォント(Hiragino Sans)を設定し、 SSDSE を encoding='cp932' で読み込んで shape・head()・describe() を確認します。 この後の節では、 47 都道府県それぞれの 12 年系列について自己相関(ACF)と偏自己相関(PACF)を計算します。 12 点しかない系列でラグ 5 以上の自己相関を論じても、 使えるペアが 7 組しか残らない——サンプル数と読めるラグ数の関係を意識するのがこのページの要点です。 エンコーディングを指定し忘れると UnicodeDecodeError で止まるのが最初の関門なので、 ここだけは丸暗記して構いません。 パスを変数にせず直書きしているのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 自己相関 を SSDSE-B-2026 で確かめる最小コード import pandas as pd import numpy as np # 1) SSDSE-B-2026(教育用標準データセット)を読み込み # 1行目=英字コード, 2行目=日本語名 → skiprows=[1] でコード行をヘッダにする df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) print('shape:', df.shape) # (564, 112) — 47都道府県×12年のパネル print('cols head:', list(df.columns[:6])) # 2) 自己相関は「時系列」の道具。SSDSE-B-2026 は 47都道府県×12年のパネルなので、 # 県別に年で昇順ソートすれば実系列も作れる(時系列デモは下の合成系列で行う) pop = df['A1101'].astype(float) # 総人口(実在コード) print('総人口 describe:', pop.describe().round(0).to_dict()) # 3) 参考: 断面データでの変数間相関(=自己相関ではない点に注意) inc = df['B4101'].astype(float) # B4101 も実在の指標列 print('corr(A1101, B4101):', pop.corr(inc).round(3)) |
うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=[1] が必要、 の 3 点を確認してください。
| 前提条件 | 確認方法 | 満たさない場合の対処 |
|---|---|---|
| 弱定常性 (平均・分散・自己共分散が時間不変) | ADF 検定、 KPSS 検定 | 差分 (一階差/季節差) |
| 線形関係 | ラグ散布図の目視確認 | 対数変換 or 非線形モデル |
| 十分な観測数 (n ≥ 30 + 推定パラメータ) | サンプル数確認 | データ収集延長 |
| 外れ値・欠損が極端でない | 時系列プロットで確認 | 補間 or ロバスト手法 |
| 等間隔観測 | タイムスタンプ確認 | リサンプリング or 不規則時系列モデル |
| 誤解 | 正しい理解 |
|---|---|
| 「ACF だけで AR モデルを決定」 | PACF と併用しないと AR の次数 p が決まらない |
| 「非有意 = 構造なし」 | 非線形構造 (例: ARCH/GARCH) は ACF に出ないこともある |
| 「自己相関 = 因果」 | 時間的順序はあっても因果ではない (Granger 因果は別概念) |
| 「自己相関が消えるまで差分」 | 過剰差分は逆に MA 構造を導入。 ADF/KPSS で適切な d を判断 |
| 「短期データでも有意 = 信頼可能」 | n が小さい時の自己相関は不安定。 ブートストラップ CI で検証 |
statsmodels.tsa.arima.ARIMA で (p, d, q) を推定SSDSE-B-2026 は 47都道府県×12年のパネルであり、 一般に人口・経済の年次系列で自己相関を計算すると、 ラグ 1 の自己相関が +0.85 程度と非常に強く出ることが多いです。 これは「前年の値が翌年に大きく影響する」という慣性的構造を示し、 AR(1) モデルが第一候補となります。
| 変数 | r_1 (ラグ1) | 推定モデル | 解釈 |
|---|---|---|---|
| 総人口 (年次) | +0.99 | ARIMA(0,1,0) (ランダムウォーク) | 非定常、 差分必要 |
| 出生数 (年次) | +0.85 | AR(1) | 強い慣性 |
| 完全失業率 (月次) | +0.92 | SARIMA | 季節調整必要 |
| CPI 変化率 (月次) | +0.45 | ARMA(1,1) | 中程度の慣性 |
| 日次株価変化率 | ~0 | ホワイトノイズ近似 | 予測困難 (効率市場仮説) |
📤 重要: 「強い自己相関 = 予測しやすい」とは限らない。 ランダムウォークは自己相関 +1 だが、 差分系列はホワイトノイズで予測不能。 自己相関の値だけでなく系列構造全体を理解することが必須。
alpha=0.05 で自動描画。pmdarima.auto_arima で (p, d, q) と (P, D, Q, S) を AIC 最小化で自動探索可能。statsmodels.stats.diagnostic.acorr_ljungbox) で全ラグ同時に検定。自己相関分析は時系列予測の入り口であり、 状態空間モデル・カルマンフィルタ・機械学習 (LSTM 等) への橋渡しになる重要な基礎概念です。 まずは ACF/PACF を読めるようになることが時系列マスターへの最短ルートとなります。
自己相関は数学的には「同じ時系列の異なるラグ間の Pearson 相関」として定義されます。 ラグ k の自己相関 r_k は以下の数式で表されます。
$$ r_k = \frac{\sum_{t=k+1}^{N} (y_t - \bar{y})(y_{t-k} - \bar{y})}{\sum_{t=1}^{N} (y_t - \bar{y})^2} $$
分母は系列全体の分散 (定数)、 分子はラグ k 個離れた値の積和です。 これによって、 系列が定常であれば「どれだけ離れても影響が残っているか」を測ることができます。 自己相関は -1 から +1 の範囲を取り、 ホワイトノイズ系列では全てのラグ (k≥1) で 0 に近づきます。
| 手法 | 対象 | 出力 | 主な用途 |
|---|---|---|---|
| ACF (自己相関) | 単一時系列 | ラグ別相関 r_k | 構造把握、 MA 次数決定 |
| PACF (偏自己相関) | 単一時系列 | 中間ラグ統制後の相関 | AR 次数決定 |
| 相互相関 (CCF) | 2 時系列間 | ラグ別相関 (X_t と Y_{t-k}) | リード・ラグ関係特定 |
| スペクトル密度 | 単一時系列 | 周波数別パワー | 周期性検出 |
| Ljung-Box 検定 | 単一時系列 | 複数ラグ同時のχ²検定 | 残差の白色性検証 |
| Durbin-Watson | 回帰残差 | 統計量 (0-4) | 残差のラグ1自己相関検定 |
📤 各手法は補完的に使う。 ACF + PACF + Ljung-Box の 3 点セットが時系列モデリングの基本ツールキット。
これらを順に学ぶことで、 古典的時系列分析から現代的な機械学習ベース手法まで一気通貫で扱えるようになります。 各ステップで実データを使って手を動かすことが重要で、 SSDSE や政府統計の総合窓口 (e-Stat) の公開データを活用すると教育効果が高まります。
自己相関を見ることで、 観測時系列が下表のどのパターンに該当するか判別できます。 これは予測手法選択の第一歩です。
| パターン | 特徴 | 推奨予測手法 |
|---|---|---|
| 水準定常 | 平均一定、 ACF 急減衰 | AR/MA/ARMA |
| トレンド (確定) | 線形/非線形トレンド明確 | トレンド除去 + ARMA |
| トレンド (確率) | ランダムウォーク、 単位根 | ARIMA、 差分 |
| 季節性 (周期 S) | ラグ S で ACF 山 | SARIMA、 Prophet |
| レジームスイッチ | 時期で構造変化 | マルコフ切替モデル |
| 非線形構造 | ACF は出ないが残差に構造 | GARCH、 LSTM、 Transformer |
📤 パターン判別 → 適切なモデル選択という流れは、 時系列分析の中核的な技能です。 ACF/PACF は判別の最初のステップで、 そこから残差診断 → モデル改善のサイクルを回すことが実務的なベストプラクティスです。
時系列データに対して通常の OLS 回帰を行うと、 残差に自己相関が残ることが多く、 標準誤差の過小評価 → 統計的有意性の過大評価という重大な問題を引き起こします。 これを 系列相関 (Serial Correlation) 問題と呼び、 計量経済学の主要トピックの 1 つです。
| 問題 | 影響 | 対処法 |
|---|---|---|
| 残差の正の自己相関 | 標準誤差過小評価、 t 値過大評価 | HAC 標準誤差 (Newey-West)、 GLS |
| 残差の負の自己相関 | 標準誤差過大評価、 検出力低下 | 差分の取り過ぎ確認、 GLS |
| 擬似回帰 (Spurious Regression) | 非定常変数間で偽の有意関係 | 共和分検定、 差分系列を使う |
| 説明変数の系列相関 | 回帰係数の不偏性は保たれるが効率性低下 | FGLS、 動学的回帰 |
| 説明変数の同時性 | 回帰係数のバイアス | 操作変数法、 VAR |
📤 時系列回帰では「残差の自己相関チェック」は必須ステップです。 Durbin-Watson 統計量、 Breusch-Godfrey 検定、 Ljung-Box 検定で診断できます。
機械学習で時系列予測を行う際、 ラグ特徴量 (lag features) は強力な予測子になります。 自己相関の高いラグを特徴量に加えると予測精度が向上します。
これらをまとめて生成する Python ライブラリとして tsfresh や featuretools があり、 数十〜数百の時系列特徴量を自動抽出できます。 Kaggle の時系列コンペでも上位解法はこれらを駆使しているのが定番です。
| 領域 | 活用例 | 主要 KPI |
|---|---|---|
| 金融 | 株価・為替の予測、 ボラティリティ推定 | Sharpe Ratio、 VaR |
| マクロ経済 | GDP、 物価、 失業率の景気循環分析 | 景気動向指数 |
| 需要予測 | 小売・物流の在庫最適化 | MAPE、 欠品率 |
| 気象 | 気温・降水量の短期予測 | RMSE |
| 疫学 | 感染者数の傾向把握、 介入効果評価 | 実効再生産数 |
| エネルギー | 電力需要予測、 価格予測 | 予測誤差率 |
| IoT | センサデータの異常検知 | F1 スコア |
📤 自己相関分析は、 金融からエネルギー、 IoT まであらゆる時系列が関わる領域で実務的に活用される基礎技術です。 これを習得することで、 時系列分析全般のキャリアパスが大きく広がります。
自己相関分析の発展史を振り返ると、 1970 年代の Box-Jenkins 法の確立、 1980 年代の単位根検定 (Dickey-Fuller) の登場、 1990 年代の共和分分析 (Granger・Engle、 ノーベル賞)、 2000 年代以降の状態空間モデル・機械学習の融合という流れがあります。 各時代の重要な発見・理論を理解することで、 現代の時系列分析手法の位置付けがクリアになります。
| 年代 | 重要発見・手法 | 提案者 | 現代への影響 |
|---|---|---|---|
| 1927 | AR 過程の概念 | Yule | 時系列モデリングの基礎 |
| 1937 | スペクトル分析 | Wiener | 周波数領域での時系列分析 |
| 1970 | ARIMA モデル、 Box-Jenkins 法 | Box & Jenkins | 古典的時系列分析の集大成 |
| 1979 | 単位根検定 (Dickey-Fuller) | Dickey & Fuller | 定常性検証の標準 |
| 1981 | VAR モデル | Sims | 多変量時系列分析 |
| 1987 | 共和分分析 | Engle & Granger | 長期均衡関係の検証 (ノーベル賞 2003) |
| 1982 | ARCH モデル | Engle | ボラティリティモデリング |
| 1997 | LSTM ネットワーク | Hochreiter & Schmidhuber | 深層学習による時系列モデリング |
| 2017 | Transformer | Vaswani et al. | 長期依存性のモデリング |
📤 これらの理論・手法は、 全て「自己相関構造をどう捉え、 どう活用するか」という共通の問いに対する異なるアプローチです。 古典的手法と機械学習を相補的に使えるようになるのが、 現代の時系列分析者の求められるスキルセットです。
自己相関は単なる統計量ではなく、 時系列データの構造を読み解き、 将来を予測し、 意思決定に貢献する強力なツールです。 ACF/PACF を読めるようになるだけで、 トレンド・季節性・周期性・ホワイトノイズ・非定常性などの主要構造を判別でき、 適切なモデル選択ができるようになります。
本記事で学んだ知識を実データで試すことが、 理解定着の最良の方法です。 SSDSE-B-2026 や e-Stat で公開されている都道府県別・産業別の時系列データを使い、 ACF を計算し、 ARIMA を当てはめ、 残差診断を行うという一連の流れを 1 回でも経験すれば、 自己相関の本質が体感的に分かります。 時系列分析は奥が深い分野ですが、 自己相関の理解はその第一歩であり、 最も投資対効果の高い基礎スキルです。
以下の問題で自身の理解度を確認してください。 答えはセクション末尾に置いていますので、 まず自分で考えてみましょう。
解答:
これらの問題が解けるようになれば、 ACF/PACF 解釈の基礎は身についたと言えます。 さらに進んで複合的なケース (例: 季節調整付きトレンド + 構造変化) にも対応できるようになると、 時系列分析の中級レベルに到達したと評価できます。
現代の時系列予測では、 古典的な ARIMA と機械学習 (LSTM、 Transformer、 Prophet など) のどちらを選ぶかが頻繁に議論されます。 結論から言うと「データサイズ・解釈可能性・計算資源」のトレードオフで決まります。
| 手法 | データサイズ目安 | 解釈可能性 | 計算コスト | 予測精度 (典型) |
|---|---|---|---|---|
| ARIMA/SARIMA | 数十〜数百点 | 高 (係数の意味明確) | 低 | 小規模で高い |
| Prophet (Facebook) | 数百〜数千点 | 中 (トレンド・季節分解) | 中 | 中程度 |
| XGBoost/LightGBM (lag特徴量) | 数千〜数万点 | 中 (特徴量重要度) | 中 | 高い |
| LSTM/GRU | 数万点以上 | 低 | 高 | 大規模で高い |
| Transformer (TFT, Informer) | 数十万点以上 | 低-中 (注意機構の可視化) | 非常に高 | 超大規模で最高 |
| N-BEATS/N-HiTS | 数万点以上 | 中 | 高 | 非常に高い |
📤 公的統計のような小規模 (数十〜数百点) データでは、 古典的な ARIMA が ML 系を上回ることが多いのが現実です。 「とりあえず LSTM」ではなく、 データ規模に応じた選択が重要です。 また、 重要なのは ML 系を使う場合も、 自己相関分析でデータ構造を理解した上で特徴量設計 (lag、 差分、 季節成分) を行うことです。 ACF/PACF の知識は ML 時系列でも活きます。
本記事では基本的な ACF/PACF を扱いましたが、 時系列分析の世界には数多くの発展トピックがあります。 興味に応じて以下のテーマも学習を進めてください。
これらは全て自己相関の理解を基礎としており、 ACF/PACF が体系の根幹に位置することが分かります。 時系列分析を専門にする場合、 これらの発展トピックも順次学習していくことで、 データサイエンティストとしての価値が大きく高まります。
実務で自己相関分析を行う際、 以下のチェックリストに従うとミスを防げます。 プロジェクト開始時に印刷しておくと便利です。
このチェックリストを使うことで、 抜け漏れのない時系列分析が可能になります。 特に「残差診断」と「限界の明示」は省略されがちですが、 分析品質を担保する上で必須のステップです。 チーム開発の場合はチェックリスト項目をプルリクエストのテンプレートに組み込み、 全員が自動的にチェックを通る運用にすると品質維持に効果的です。 また、 半年に 1 度はチェック項目を見直し、 新しい知見や失敗事例を取り入れることで、 組織的な時系列分析の能力が継続的に向上していきます。 これは個人の技能習得だけでなく、 組織のデータ分析文化を成熟させる上でも重要な取り組みです。 さらに、 チェック項目を Jupyter Notebook のテンプレート化や Python の関数群として実装しておけば、 分析プロジェクトの立ち上げが大幅にスピードアップします。 オープンソースとして公開することで、 業界全体の分析品質向上にも貢献できます。 こうした地道な仕組み作りが、 結果として組織全体の時系列分析力を底上げします。 個人レベルの努力と組織レベルの仕組みが両輪となって、 質の高い時系列分析が継続的に生まれる環境が作られていきます。 これこそがデータ駆動意思決定の組織的成熟の本質であり、 自己相関分析の習得がそのスタートライン地点になります。
この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。
スライダーで時系列のトレンド・周期・ノイズを変えると、 上段の系列・中段のコレログラム(ACF)・下段の散布図がすべてリアルタイム更新されます。 「周期データは周期に対応するラグで山が出る」「トレンドは緩やかに減衰する」「ホワイトノイズはほぼ 0」——この対応を手を動かして体感してください。 コレログラムをクリック/ドラッグ(タッチ可)するとラグ $k$ を選べ、 下段の散布図 $x_t$ vs $x_{t-k}$ が連動します。
↑ コレログラム(クリック/ドラッグでラグ選択)。 破線は 95% 信頼帯 $\pm 1.96/\sqrt{N}$。
↑ 散布図 $x_t$ vs $x_{t-k}$(現在の $k$)。 点が対角線に沿うほど自己相関が強い。
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
| 統計量 | 効果量 | 小 | 中 | 大 |
|---|---|---|---|---|
| 2群平均差 | Cohen's d | 0.2 | 0.5 | 0.8 |
| 相関 | r | 0.1 | 0.3 | 0.5 |
| 線形回帰 | R² | 0.02 | 0.13 | 0.26 |
| ANOVA | η² (eta²) | 0.01 | 0.06 | 0.14 |
| χ² | Cramér's V | 0.1 | 0.3 | 0.5 |
| ロジスティック | Odds Ratio | 1.5 | 2.5 | 4.0 |
自己相関は時系列分析の基礎ツールであり、 ホワイトノイズ・トレンド・季節性・周期性などの構造を判別する強力な指標です。 ACF (Auto-Correlation Function) と PACF (Partial Auto-Correlation Function) を組み合わせると、 ARIMA モデルの次数決定にも直接活用できます。
図: ACF/PACF の典型例。 棒の長さがラグ k 時点での自己相関を表し、 信頼帯 (±2/√N) を超えるラグが統計的に有意。
図: 時系列データ (上) とその自己相関 (下)。 同じデータでも時系列プロットと ACF を併用することで構造の把握が深まる。
図: y_t vs y_{t-1} のラグ散布図パターン例。 強い正の自己相関なら右上がり、 負なら右下がり、 ホワイトノイズなら無相関の雲状になる。
| ACF の形状 | PACF の形状 | 推定モデル | 解釈 |
|---|---|---|---|
| 全ラグで非有意 | 全ラグで非有意 | ホワイトノイズ | 構造なし、 予測不能 |
| 指数的減衰 | ラグ p で打切り | AR(p) | 過去 p 期の値が現在に影響 |
| ラグ q で打切り | 指数的減衰 | MA(q) | 過去 q 期のノイズが現在に影響 |
| 指数的減衰 | 指数的減衰 | ARMA(p,q) | AR と MA の混合構造 |
| ゆっくり減衰しない | ラグ 1 で有意 | 非定常 → 差分必要 | トレンドあり (I(d)) |
| 周期 s で山 | 周期 s で有意 | 季節 ARMA | 季節性あり (S=4/12 など) |
📤 読み方: ACF と PACF を併読することで ARIMA の (p, d, q) と季節成分 (P, D, Q, S) を推定可能。 これは Box-Jenkins 法の中核。
自己相関 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 関連・回帰 › 相関 › 自己相関
中心に 自己相関 を置き、 そこから 時系列分析・相関係数・ARIMA・VAR・共分散・Spearman相関 など 計 7 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。
大きな円が小さな円を包含する Circle Packing 図。 「自己相関」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「自己相関」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 自己相関 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 相関 → 自己相関 という入れ子の位置を示します。 「相関には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
「自己相関」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。
これらの接続を意識することで、 「自己相関」を中核に据えた一貫した分析パイプラインを構築できる。
「autocorrelation」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。
| シナリオ | 重視する観点 | 候補手法 |
|---|---|---|
| データが大規模 (n が多い、 高次元) | 計算コスト / メモリ / 並列化が必要 | 偏自己相関 (PACF) 等 |
| 外れ値が多い / ノイズあり | 頑健性 / 外れ値除去 / 中央値ベース | ARIMA 等 |
| 解釈性を重視する | 線形 / 木構造 / ルールベース | Durbin-Watson 等 |
| 予測精度を最優先する | アンサンブル / ハイパラ調整 / 交差検証 | Ljung-Box 検定 等 |
| データが少ない | 正則化 / ベイズ / 転移学習 / 簡素なモデル | クロス相関 等 |
自己相関の核心は「時系列を自分自身のコピーとラグ $k$ だけずらして重ね、どれだけ揃うか」を測ることです。ラグ 1 なら「今年の値」と「去年の値」の Pearson 相関、ラグ 2 なら「今年」と「一昨年」の相関です。ずらして揃うということは、過去が未来を部分的に予言しているということ。ここが「予測可能性」の源になります。
既存の計算例(東京都 A1101, 増加トレンド)とは逆に、減少トレンドの系列でも自己相関が高く出ることを確認します。秋田県の総人口 A1101 は 12 年間ほぼ単調減少です(人口減少で知られる県)。トレンドの向きにかかわらず、隣接年が近いので ACF は大きく出ます。
📤 実測(SSDSE-B-2026, cp932, skiprows=[1])
秋田県 A1101(人): 1063000, 1050000, 1037000, 1023119, 1011000,
999000, 985000, 972000, 959502, 945000, 930000, 914000
ACF(1) = 0.742, ACF(2) = 0.497, ACF(3) = 0.271 (原系列・n=12)
1階差分後 ACF(1) = 0.343 (トレンド除去で低下)※ 上記は SSDSE-B-2026 の実測値。合成データではありません。手順は Prefecture=='秋田県' を年で昇順ソートし A1101 を取り出すだけで、既存の東京都コード(🧮 実値計算例)を '秋田県' に変えれば再現できます。
自己相関は「見えている相関が本物か」を左右します。特に非定常と回帰残差の系列相関は、多くの誤った結論の温床です。
| 落とし穴 | 何が起きるか | 対策 |
|---|---|---|
| ① 非定常だと自己相関が「見せかけ」 | 単位根(ランダムウォーク)を含む系列は ACF がほとんど減衰せず「強い自己相関」に見えるが、これはトレンドの残像。無関係な 2 系列の回帰が高い決定係数を出す見せかけの回帰の原因。 | 定常性を ADF/KPSS で確認 → 差分・対数差分で定常化してから ACF を見る。 |
| ② 回帰残差の自己相関(標準誤差が過小) | OLSは誤差が iid(独立同分布)を前提。残差に正の系列相関があると標準誤差が過小推定され、t 値が水増しされて「有意」の誤判定(Type I エラー増)を招く。 | 標準誤差を HAC / Newey-West(後述)で頑健化、またはラグ項・GLS を導入。 |
| ③ 季節性の周期を見落とす | 周期 $s$ のラグ(12 か月なら 12, 24…)のピークを無視すると、モデルが系統的にズレる。 | 季節差分 $ (1-B^{s}) $ や SARIMA、季節ダミーで周期を明示的に扱う。 |
| ④ 系列相関を iid と誤仮定 | 時系列データに通常の t 検定・相関検定・交差検証をそのまま適用すると、実効サンプルサイズが実際より小さいのに大きいと錯覚し、過信につながる。 | ブロック/時系列 CV(TimeSeriesSplit)、ブロックブートストラップを使う。 |
| ⑤ 短系列で推定が不安定 | $N$ が小さいと ACF の分散が大きく、信頼区間 $\pm 2/\sqrt{N}$ も広い。SSDSE-B の 12 点では高次ラグはほぼ判定不能。 | ラグ数を $N/4$ 程度に抑える、点推定を過信しない、より長い頻度のデータを併用。 |
| ⑥ ACF と PACF を混同 | ACF の高いラグ 2 を「2 期前が直接効く」と誤読。実際はラグ 1 経由の間接効果かもしれない。 | 直接効果はPACFで確認。AR(1) なら PACF はラグ 1 で切れる。 |
| ⑦ 目視だけで判断 | 「棒が少し飛び出た」を主観で有意/無意と決めがち。 | Ljung-Box 検定で複数ラグをまとめて「自己相関なし」を統計的に検定(後述)。 |
定常化した系列の ACF と PACF の「切れ方」で ARIMA の次数 $(p,d,q)$ を読みます。古典的な対応表です。
| モデル | ACF の形 | PACF の形 |
|---|---|---|
| AR(p) | 徐々に減衰(tail off) | ラグ $p$ で急に切れる(cut off) |
| MA(q) | ラグ $q$ で急に切れる | 徐々に減衰 |
| ARMA(p,q) | 徐々に減衰 | 徐々に減衰 |
$d$(差分回数)は原系列が定常になるまでの回数。SARIMA では季節ラグの ACF/PACF で季節次数 $(P,D,Q)_s$ を読みます。
残差に系列相関(や不均一分散)があるとき、係数推定はそのままに標準誤差だけを頑健化するのが HAC(Heteroskedasticity and Autocorrelation Consistent)標準誤差、代表実装が Newey–West です。statsmodels なら fit(cov_type='HAC', cov_kwds={'maxlags':L}) で適用でき、t 検定・信頼区間の過信を防げます。時系列回帰・パネル分析の定番です。
自己相関の解釈は定常性が前提。非定常なら差分・対数変換・トレンド除去で定常化し、その後の ACF を見ます。上の秋田県の例でも、1 階差分で ACF(1) が 0.742→0.343 に下がりました。「原系列の高い ACF はトレンド由来、差分後に残る ACF がモデル化すべき本体」という切り分けが要点です。
有意な自己相関が残っているということは「まだ使える情報がある」=予測の余地があるということ。逆に、良い予測モデルの残差はホワイトノイズ(ACF がすべて信頼区間内)になるべきで、残差に自己相関が残っていればモデルが情報を取りこぼしています。予測の良し悪しは残差の Ljung–Box で点検します。関連して、片方のラグが他方を予測するかはグランジャー因果、多変量への一般化はVARです。
「過去の自分」との相関(時間方向)を空間方向に置き換えたのが空間自己相関。近い地域ほど値が似る傾向を測る指標が Moran's I($-1$〜$+1$、正なら似た値が隣接=クラスタ化)です。SSDSE-B のような 47 都道府県データでは、隣接県で人口・家計指標が似る空間自己相関がしばしば見られ、地域回帰で残差の空間相関を無視すると時系列と同じく標準誤差を過小評価します。時間の ACF と発想は同型です。
このサイト内の関連用語(実在ページのみリンク、未整備の項目はテキスト):