論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
自己相関
Autocorrelation (ACF)
時系列が「過去の自分」とどれだけ相関しているか。1期ずれた値との相関 r(1)、2期ずれの r(2) ...。
時系列ACFACF自己相関autocorrelation

🔖 キーワード索引(補強・追加分)

自己相関 関連の補強キーワード。 クリックで該当箇所へ:

ACF PACF Ljung-Box Durbin-Watson AR モデル MA モデル ARIMA 単位根 ADF 検定 ホワイトノイズ

💡 30秒で分かる結論

🍰 まずはやさしく

過去の自分とどれだけ似ているかを見る指標です。

データの傾向や周期性を知るために使います。

テストの点数が前の回と似ているか調べるようなものです。

この章では定義や計算方法について読みます。

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #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 で挑戦

統計データ活用コンペティションの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、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

📍 あなたが今見ているもの

🍰 まずはやさしく

時系列データが過去の自分とどれだけ相関するかを指します。

データの分析で重要な考え方として使われます。

都道府県の人口の変化などを調べる時に役立ちます。

定義から実装までを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 プロットで一目瞭然。

💡 ポイント:自己相関 を初めて学ぶときは「正確な定義」より「どんな問題を解くための道具か」を先に押さえてください。 数式は次の「📐 数式」セクションで丁寧に展開します。
📌 比喩がうまく刺さらないときは、 自分の身近な例(家計簿・スポーツの記録・成績表)に置き換えてみると理解が定着します。 SSDSE-B-2026 を電卓代わりに触りながら、 上の説明を再読すると効果的です。

🎨 概念図で押さえる — 自己相関の構造

自己相関は「過去の自分と現在の自分の相関」。 ラグ k だけずらした時系列同士の Pearson 相関で、 周期性やトレンドの検出に使われる。

図 1: ラグの考え方

ラグの図

→ 1ステップずらした自分との相関がラグ1の自己相関係数 r1。

図 2: コレログラム(ACF プロット)

コレログラム

→ 信頼区間(破線)を超える棒は有意。 一定間隔で大きい棒は周期性のサイン。

図 3: 自己相関のパターン3種

自己相関のパターン

→ コレログラムの形状でホワイトノイズ/トレンド/季節性を識別できる。

📐 数式または定義 — 自己相関 の形式的表現

🍰 まずはやさしく

自己相関を数式で表した厳密なルールです。

計算の結果として何が出るのかをはっきりさせるために使います。

スマホの利用時間を毎日記録して計算するイメージです。

数式に登場する記号の意味を一つずつ読み解きます。

直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。

【ラグ $k$ の自己相関 (Sample ACF)】
$$ \rho_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} $$
この数式は「自己相関 がどう計算されるか」を最短で示したもの。 記号の意味は次の「🔬 数式を言葉で読み解く」で 1 つずつ解説します。
📚 数式が苦手な方へ:1 つの長い式を一度に理解しようとせず、 記号ごとに「言葉に翻訳」するのが王道。 紙に書き写してから、 自分の言葉で音読してみてください。

🔬 数式を言葉で読み解く — 自己相関 の記号辞書

上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。

記号意味(言葉での説明)
$\rho_k$ラグ $k$ における自己相関係数($-1 \le \rho_k \le 1$)
$y_t$時刻 $t$ の観測値
$\bar y$時系列全体の平均
$n$サンプル数
$k$考えるラグ(1 期前、 2 期前、 …)
📌 読み下しのコツ:左から右に「主語 → 述語 → 目的語」と見立てて、 「これは何を、 どうしている式か?」と一文で要約してみてください。 慣れれば 5 秒で読めます。

🧮 SSDSE-B 実値計算例(47都道府県データ)

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 で「単位根なし=定常」
💬 読み方:算出された統計量を判定基準と比較し、有意性/効果量を評価する。

② 期待出力

項目 参考 解釈
lagACF解釈
10.783強い自己相関前年と密接
20.542中程度2年前とも相関
30.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 で 自己相関 を体感

数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 12 年 × 100+ 指標のパネル)の実値を当てはめて、 自己相関 の挙動を電卓的に追体験します。

👉 直感:総人口(A1101)のような「水準」を年ごとに並べると、 前年の値がほぼそのまま翌年に持ち越されるため、 ラグ 1 自己相関 $\rho_1$ は 1 に近づく(ランダムウォーク的)。 一方、 増減の「差分」や変動の大きい比率指標では $\rho_1$ は小さくなりやすい。 SSDSE-B-2026 は 47 都道府県 × 12 年(2012〜2023)のパネルであり、 県別に年で昇順ソートすれば実際の年次系列でも計算できる。 下のデモは東京都の総人口 A1101(2012〜2023)の実測年次系列で行う。

SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。

🧮 数式に値を入れて手で計算する: ラグ 1 自己相関

合成時系列 [2,4,7,5,3] でラグ 1 の自己相関 ρ_1 を計算する。

Step 1: 平均と偏差

tx_tx_t - x̄
12-2.2
24-0.2
37+2.8
45+0.8
53-1.2

x̄ = (2+4+7+5+3)/5 = 21/5 = 4.2

Step 2: 分子と分母

分子 = Σ(x_t-x̄)(x_{t+1}-x̄) = (-2.2)(-0.2) + (-0.2)(2.8) + (2.8)(0.8) + (0.8)(-1.2) = 0.44 - 0.56 + 2.24 - 0.96 = 1.16 分母 = Σ(x_t-x̄)² = 4.84 + 0.04 + 7.84 + 0.64 + 1.44 = 14.80

Step 3: ρ_1 = 分子 / 分母

ρ_1 = 1.16 / 14.80 ≈ 0.0784

🐍 Python で再現

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}")

📤 実行結果

分子 = 1.16 分母 = 14.80 ρ_1 = 0.0784

💬 手計算 (Step 3) 0.0784 と Python 出力が完全一致。

🐍 Python 実装バリエーション(scikit-learn / scipy / Optuna)

A. scikit-learn による実装

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #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
💬 読み方:p 値や信頼区間と合わせて読み、効果の有無+大きさを両輪で判断する。

B. scipy / statsmodels による実装

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #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 と一致(偏り推定量)
処理完了
💬 読み方:表示された数値テーブルから個別の都道府県の位置づけを読み取る。

C. Optuna でハイパラ・選択最適化

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #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
💬 読み方:SSDSE-B-2026 の実値に当てはめると教科書例より分散が大きいことに注意。

D. ライブラリ早見表

ライブラリ / 関数 用途
statsmodels.tsa.stattools.acf, pacf計算
statsmodels.graphics.tsaplots.plot_acf, plot_pacfプロット
statsmodels.stats.diagnostic.acorr_ljungboxLjung-Box 検定
statsmodels.tsa.stattools.adfullerADF 検定
statsmodels.stats.stattools.durbin_watsonDW 統計量
statsmodels.tsa.arima.model.ARIMAARIMA モデル

🐍 Python 実装 — 自己相関 を SSDSE-B-2026 で動かす

🎯 このコードでやること: まず環境をそろえます。 必要なライブラリを入れ、 matplotlib の日本語フォント(Hiragino Sans)を設定し、 SSDSE を encoding='cp932' で読み込んで shapehead()describe() を確認します。 この後の節では、 47 都道府県それぞれの 12 年系列について自己相関(ACF)と偏自己相関(PACF)を計算します。 12 点しかない系列でラグ 5 以上の自己相関を論じても、 使えるペアが 7 組しか残らない——サンプル数と読めるラグ数の関係を意識するのがこのページの要点です。 エンコーディングを指定し忘れると UnicodeDecodeError で止まるのが最初の関門なので、 ここだけは丸暗記して構いません。 パスを変数にせず直書きしているのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) B4101(年平均気温) 北海道 5,092,000 11.0 東京都 14,086,000 17.6 沖縄県 1,468,000 23.8 …(全 47 行)
 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 不規則時系列モデル

🚨 誤解 TOP 5

誤解正しい理解
「ACF だけで AR モデルを決定」PACF と併用しないと AR の次数 p が決まらない
「非有意 = 構造なし」非線形構造 (例: ARCH/GARCH) は ACF に出ないこともある
「自己相関 = 因果」時間的順序はあっても因果ではない (Granger 因果は別概念)
「自己相関が消えるまで差分」過剰差分は逆に MA 構造を導入。 ADF/KPSS で適切な d を判断
「短期データでも有意 = 信頼可能」n が小さい時の自己相関は不安定。 ブートストラップ CI で検証

🔄 時系列分析ワークフロー (Box-Jenkins 法)

  1. 探索的分析: 時系列プロットでトレンド・季節性・外れ値の有無を確認
  2. 定常性検査: ADF 検定で単位根の有無、 KPSS 検定で水準・トレンド定常性を確認
  3. 差分処理: 非定常なら一階差分、 季節性があれば季節差分も適用
  4. ACF/PACF 描画: 差分後系列で ACF/PACF をプロットし、 AR(p)/MA(q) 次数を推定
  5. モデル推定: statsmodels.tsa.arima.ARIMA で (p, d, q) を推定
  6. 残差診断: 残差の自己相関 (Ljung-Box 検定) が消えていれば適合良好
  7. 情報量規準: 複数候補モデルから AIC/BIC で最良を選択
  8. 予測・検証: ホールドアウトで予測精度 (RMSE, MAPE) を評価

📚 ケーススタディ: SSDSE データの自己相関分析

SSDSE-B-2026 は 47都道府県×12年のパネルであり、 一般に人口・経済の年次系列で自己相関を計算すると、 ラグ 1 の自己相関が +0.85 程度と非常に強く出ることが多いです。 これは「前年の値が翌年に大きく影響する」という慣性的構造を示し、 AR(1) モデルが第一候補となります。

変数r_1 (ラグ1)推定モデル解釈
総人口 (年次)+0.99ARIMA(0,1,0) (ランダムウォーク)非定常、 差分必要
出生数 (年次)+0.85AR(1)強い慣性
完全失業率 (月次)+0.92SARIMA季節調整必要
CPI 変化率 (月次)+0.45ARMA(1,1)中程度の慣性
日次株価変化率~0ホワイトノイズ近似予測困難 (効率市場仮説)

📤 重要: 「強い自己相関 = 予測しやすい」とは限らない。 ランダムウォークは自己相関 +1 だが、 差分系列はホワイトノイズで予測不能。 自己相関の値だけでなく系列構造全体を理解することが必須。

🛠️ 実装上のベストプラクティス

自己相関分析は時系列予測の入り口であり、 状態空間モデル・カルマンフィルタ・機械学習 (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 に近づきます。

📊 自己相関 vs 関連手法

手法対象出力主な用途
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 点セットが時系列モデリングの基本ツールキット。

🎓 学習の次のステップ

  1. 定常性の理論的理解: 弱定常 vs 強定常、 エルゴード性の概念を理解する
  2. ARIMA モデル全般: AR/MA/ARMA/ARIMA/SARIMA の関係を体系的に学ぶ
  3. 状態空間モデル: ARIMA の一般化として状態空間モデル/カルマンフィルタを学ぶ
  4. 非定常時系列: 共和分、 VECM、 単位根検定の理論を深める
  5. 機械学習との接続: Prophet、 LSTM、 Transformer 系の時系列モデルを実装比較
  6. 多変量・スペクトル分析: VAR、 ウェーブレット変換、 動学的因子モデルを学ぶ

これらを順に学ぶことで、 古典的時系列分析から現代的な機械学習ベース手法まで一気通貫で扱えるようになります。 各ステップで実データを使って手を動かすことが重要で、 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 ライブラリとして tsfreshfeaturetools があり、 数十〜数百の時系列特徴量を自動抽出できます。 Kaggle の時系列コンペでも上位解法はこれらを駆使しているのが定番です。

🏆 自己相関の応用領域

領域活用例主要 KPI
金融株価・為替の予測、 ボラティリティ推定Sharpe Ratio、 VaR
マクロ経済GDP、 物価、 失業率の景気循環分析景気動向指数
需要予測小売・物流の在庫最適化MAPE、 欠品率
気象気温・降水量の短期予測RMSE
疫学感染者数の傾向把握、 介入効果評価実効再生産数
エネルギー電力需要予測、 価格予測予測誤差率
IoTセンサデータの異常検知F1 スコア

📤 自己相関分析は、 金融からエネルギー、 IoT まであらゆる時系列が関わる領域で実務的に活用される基礎技術です。 これを習得することで、 時系列分析全般のキャリアパスが大きく広がります。

📊 自己相関の解釈における歴史的事例

自己相関分析の発展史を振り返ると、 1970 年代の Box-Jenkins 法の確立、 1980 年代の単位根検定 (Dickey-Fuller) の登場、 1990 年代の共和分分析 (Granger・Engle、 ノーベル賞)、 2000 年代以降の状態空間モデル・機械学習の融合という流れがあります。 各時代の重要な発見・理論を理解することで、 現代の時系列分析手法の位置付けがクリアになります。

年代重要発見・手法提案者現代への影響
1927AR 過程の概念Yule時系列モデリングの基礎
1937スペクトル分析Wiener周波数領域での時系列分析
1970ARIMA モデル、 Box-Jenkins 法Box & Jenkins古典的時系列分析の集大成
1979単位根検定 (Dickey-Fuller)Dickey & Fuller定常性検証の標準
1981VAR モデルSims多変量時系列分析
1987共和分分析Engle & Granger長期均衡関係の検証 (ノーベル賞 2003)
1982ARCH モデルEngleボラティリティモデリング
1997LSTM ネットワークHochreiter & Schmidhuber深層学習による時系列モデリング
2017TransformerVaswani et al.長期依存性のモデリング

📤 これらの理論・手法は、 全て「自己相関構造をどう捉え、 どう活用するか」という共通の問いに対する異なるアプローチです。 古典的手法と機械学習を相補的に使えるようになるのが、 現代の時系列分析者の求められるスキルセットです。

🔚 まとめ — 自己相関を「武器」にするために

自己相関は単なる統計量ではなく、 時系列データの構造を読み解き、 将来を予測し、 意思決定に貢献する強力なツールです。 ACF/PACF を読めるようになるだけで、 トレンド・季節性・周期性・ホワイトノイズ・非定常性などの主要構造を判別でき、 適切なモデル選択ができるようになります。

本記事で学んだ知識を実データで試すことが、 理解定着の最良の方法です。 SSDSE-B-2026 や e-Stat で公開されている都道府県別・産業別の時系列データを使い、 ACF を計算し、 ARIMA を当てはめ、 残差診断を行うという一連の流れを 1 回でも経験すれば、 自己相関の本質が体感的に分かります。 時系列分析は奥が深い分野ですが、 自己相関の理解はその第一歩であり、 最も投資対効果の高い基礎スキルです。

📝 演習問題 — 自己相関理解度チェック

以下の問題で自身の理解度を確認してください。 答えはセクション末尾に置いていますので、 まず自分で考えてみましょう。

  1. 問題 1: ACF がラグ 12 で大きな山を示す月次データはどんな構造を持つ? どのモデルが適切?
  2. 問題 2: ACF が ゆっくり減衰する系列で、 一階差分後の ACF が急速に消える場合、 元系列の構造は?
  3. 問題 3: 残差の Ljung-Box 検定で p<0.05 が出た場合、 モデルは適切か? 改善策は?
  4. 問題 4: 株価収益率の自己相関がほぼ 0 だが、 自乗収益率の自己相関は強い。 この現象は何を意味する?
  5. 問題 5: PACF がラグ 2 で打切り、 ACF が指数的減衰する系列に当てはめるべきモデルは?

解答:

  1. 年単位の季節性 (周期 12)。 SARIMA(p,d,q)(P,D,Q,12) が適切。
  2. 非定常 (単位根)。 一階差分で定常化したので I(1) 系列。ARIMA(p,1,q) を検討。
  3. 残差に自己相関が残っており、 モデルが構造を捉え切れていない。 次数を上げる、 季節項追加、 非線形項検討。
  4. 線形の予測は難しい (効率市場仮説と整合) が、 ボラティリティクラスタリングが存在。 GARCH モデルで分散をモデル化すべき。
  5. AR(2) モデル。 PACF の打切り位置が AR の次数を示し、 ACF の減衰は AR の典型的特徴。

これらの問題が解けるようになれば、 ACF/PACF 解釈の基礎は身についたと言えます。 さらに進んで複合的なケース (例: 季節調整付きトレンド + 構造変化) にも対応できるようになると、 時系列分析の中級レベルに到達したと評価できます。

🌐 自己相関 vs 機械学習時系列モデル: 使い分けガイド

現代の時系列予測では、 古典的な 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. □ 時系列プロットでデータの俯瞰を行ったか (トレンド・季節性・外れ値の有無)
  2. □ 観測間隔は等間隔か。 不等間隔ならリサンプリング or 専用モデル使用
  3. □ 欠損値の処理方針を決めたか (補間 or 削除 or 専用モデル)
  4. □ ADF/KPSS 検定で定常性を確認したか
  5. □ 非定常なら適切な差分処理を行ったか (一階差分、 季節差分)
  6. □ ACF と PACF を両方プロットしたか
  7. □ ラグ数は十分か (n/4 程度を目安)
  8. □ 信頼帯 (±2/√N) を可視化したか
  9. □ 季節性の有無を判断したか (周期 S を確定)
  10. □ モデル候補を複数比較したか (AIC/BIC で選択)
  11. □ 残差診断を行ったか (Ljung-Box、 残差プロット、 QQプロット)
  12. □ ホールドアウト or 交差検証で予測精度を評価したか
  13. □ 予測区間 (信頼区間) を提供したか (点推定だけでなく)
  14. □ 分析仮定と限界を報告書に明示したか
  15. □ 再現可能なコードとデータを保存したか

このチェックリストを使うことで、 抜け漏れのない時系列分析が可能になります。 特に「残差診断」と「限界の明示」は省略されがちですが、 分析品質を担保する上で必須のステップです。 チーム開発の場合はチェックリスト項目をプルリクエストのテンプレートに組み込み、 全員が自動的にチェックを通る運用にすると品質維持に効果的です。 また、 半年に 1 度はチェック項目を見直し、 新しい知見や失敗事例を取り入れることで、 組織的な時系列分析の能力が継続的に向上していきます。 これは個人の技能習得だけでなく、 組織のデータ分析文化を成熟させる上でも重要な取り組みです。 さらに、 チェック項目を Jupyter Notebook のテンプレート化や Python の関数群として実装しておけば、 分析プロジェクトの立ち上げが大幅にスピードアップします。 オープンソースとして公開することで、 業界全体の分析品質向上にも貢献できます。 こうした地道な仕組み作りが、 結果として組織全体の時系列分析力を底上げします。 個人レベルの努力と組織レベルの仕組みが両輪となって、 質の高い時系列分析が継続的に生まれる環境が作られていきます。 これこそがデータ駆動意思決定の組織的成熟の本質であり、 自己相関分析の習得がそのスタートライン地点になります。

⚠️ 落とし穴(拡張版・各 100 文字以上)

① 非定常データに直接 ACF を読む
ACF は定常時系列に対して意味を持つ指標。 トレンドや単位根がある非定常データでは、 ACF はゆっくりとした減衰を示し、 「真の構造」を見誤る。 必ず ADF / KPSS 検定で定常性を確認、 必要なら差分(1 階・季節差分)を取る。 経済時系列はほぼ全て非定常なので、 まず ADF が出発点。
② Durbin-Watson 値だけで判断
DW は lag=1 の自己相関しか検出できない。 高次の自己相関(lag=2, 3, ...)があっても DW=2.0 近くで「問題なし」と見える可能性。 さらに DW は説明変数に y のラグが含まれる場合バイアスがあり使えない。 Breusch-Godfrey LM 検定や Ljung-Box を使うのが現代の標準。
③ ACF のスパイクを全て有意と読む
ACF プロットの 95% 信頼帯(±2/√n)の外に出る点は、 多重比較で偶然出やすい。 lag を 20 個見れば、 ホワイトノイズでも 1 つは帯の外に出ると期待される。 個別 lag の検定より Ljung-Box(複数 lag を一括検定)を使う。 さらに lag を 20% 程度に絞る(log(n) ルール)。
④ ACF と PACF を混同
ACF は「lag k での直接+間接相関」、 PACF は「k 以外の lag の影響を除いた直接相関」。 AR(p) モデルの同定には PACF を、 MA(q) モデルには ACF を見る。 両者を混同すると AR/MA の次数選択を間違える。 ARIMA 同定の基本中の基本。
⑤ サンプル数が少ない時の不安定さ
n=30〜50 の時系列で ACF を計算すると、 各 lag の標準誤差が大きく、 「偶然」のパターンを構造と誤認しやすい。 SSDSE の年次データ(36 年程度)でも注意が必要。 信頼区間の幅を広めに取り、 多重 lag の検定で判断する。
⑥ 季節性を見落とす
月次・四半期データでは lag=12(月)または lag=4(四半期)に大きな自己相関が出ることがある(季節性)。 これを「ノイズ」と片付けると重要な構造を見逃す。 SARIMA・季節分解(X-13ARIMA-SEATS)で対処。 年次データでも 5〜7 年サイクル(景気循環)に注意。
⑦ 因果との混同
「t-1 期の値が t 期と相関」は単なる慣性であり、 因果ではない。 ARIMA は将来予測には有用だが、 「政策が結果を生んだ」とは言えない。 因果関係には差分の差分・操作変数など別のデザインが必要。 ARIMA を「予測モデル」と限定して使う節度が大切。
⑧ 残差の自己相関を確認しない
ARIMA を当てはめた後、 残差にまだ自己相関が残っていれば、 モデルが不十分。 必ず残差の ACF と Ljung-Box 検定でホワイトノイズになっていることを確認。 残差自己相関を見ない論文は再現性に欠ける。

⚠️ よくある落とし穴 — 自己相関 で初学者がやりがちなミス

この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。

❌ トレンドのある系列でそのまま計算
トレンドがあると ACF は緩やかに減衰せずに高いまま。 必ず階差を取って再計算。
❌ サンプル数不足
$n=5$ 程度では ACF が偶然大きく出ることがある。 95% CI バンド ($\pm 2/\sqrt{n}$) で判定。
❌ ラグ 1 だけ見て満足
ラグ 7(週周期)、 ラグ 12(月→年周期)など複数のラグを必ず確認。
🛡 防御策まとめ:「適用条件の確認 → 適切な前処理 → 結果と前提のペア記述」の 3 ステップを習慣にすれば、 ここに挙げた失敗の大半は回避できます。

🎮 触って理解する

スライダーで時系列のトレンド・周期・ノイズを変えると、 上段の系列・中段のコレログラム(ACF)・下段の散布図がすべてリアルタイム更新されます。 「周期データは周期に対応するラグで山が出る」「トレンドは緩やかに減衰する」「ホワイトノイズはほぼ 0」——この対応を手を動かして体感してください。 コレログラムをクリック/ドラッグ(タッチ可)するとラグ $k$ を選べ、 下段の散布図 $x_t$ vs $x_{t-k}$ が連動します。

↑ コレログラム(クリック/ドラッグでラグ選択)。 破線は 95% 信頼帯 $\pm 1.96/\sqrt{N}$。

↑ 散布図 $x_t$ vs $x_{t-k}$(現在の $k$)。 点が対角線に沿うほど自己相関が強い。

🧭 直感:自己相関は「今の値を、 k 期前の値でどれだけ言い当てられるか」。 周期 12 の系列ではラグ 12・24 で ACF が大きく跳ね、 トレンド系列では全ラグでプラスがゆっくり減衰し、 ホワイトノイズは全ラグで信頼帯の中に収まります。 スライダーを動かして、 コレログラムの「形」と系列の「見た目」を対応づけてください。

⚠️ よくある落とし穴

🚀 発展

🗺️ 統計手法選択フローチャート

Q1: 何を知りたい?

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:

統計量 効果量
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰0.020.130.26
ANOVAη² (eta²)0.010.060.14
χ²Cramér's V0.10.30.5
ロジスティックOdds Ratio1.52.54.0

🖼️ 自己相関の追加図解 — 実データでの典型パターン

自己相関は時系列分析の基礎ツールであり、 ホワイトノイズ・トレンド・季節性・周期性などの構造を判別する強力な指標です。 ACF (Auto-Correlation Function) と PACF (Partial Auto-Correlation Function) を組み合わせると、 ARIMA モデルの次数決定にも直接活用できます。

自己相関プロット (ACF)

図: 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つの視点で体系を理解する

自己相関 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス › 関連・回帰 › 相関 › 自己相関

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心に 自己相関 を置き、 そこから 時系列分析・相関係数・ARIMA・VAR・共分散・Spearman相関 など 計 7 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語あとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「自己相関」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「自己相関」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 自己相関隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス相関 → 自己相関 という入れ子の位置を示します。 「相関には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

🔗 隣接手法への橋渡し

「自己相関」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

これらの接続を意識することで、 「自己相関」を中核に据えた一貫した分析パイプラインを構築できる。

🌳 手法選択フロー

「autocorrelation」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。

典型シナリオ別の手法選択

シナリオ重視する観点候補手法
データが大規模 (n が多い、 高次元)計算コスト / メモリ / 並列化が必要偏自己相関 (PACF)
外れ値が多い / ノイズあり頑健性 / 外れ値除去 / 中央値ベースARIMA
解釈性を重視する線形 / 木構造 / ルールベースDurbin-Watson
予測精度を最優先するアンサンブル / ハイパラ調整 / 交差検証Ljung-Box 検定
データが少ない正則化 / ベイズ / 転移学習 / 簡素なモデルクロス相関

選んだ後の検証ステップ

  1. 前処理確認: 標準化 / 欠損処理 / カテゴリ変数のエンコード が適切か
  2. ハイパラ調整: 交差検証で安定する値を選ぶ
  3. 性能評価: タスクに応じた指標 (RMSE / Accuracy / F1 / AUC / シルエット等) を複数併用
  4. 頑健性チェック: 別手法 / 別シードで結果が大きく違わないか確認
  5. 解釈: 結果を分野知識と照らし合わせ、 意味のある発見になっているか検討

🧭 直感をもう一段深める — 「過去の自分」との相関

自己相関の核心は「時系列を自分自身のコピーとラグ $k$ だけずらして重ね、どれだけ揃うか」を測ることです。ラグ 1 なら「今年の値」と「去年の値」の Pearson 相関、ラグ 2 なら「今年」と「一昨年」の相関です。ずらして揃うということは、過去が未来を部分的に予言しているということ。ここが「予測可能性」の源になります。

📈 追加の実測例 — 秋田県 総人口 A1101(2012〜2023, 12点)

既存の計算例(東京都 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                            (トレンド除去で低下)
⚠️ 12年短系列の注意:SSDSE-B-2026 の年次は 2012〜2023 のわずか 12 点です。この長さでは信頼区間 $\pm 2/\sqrt{12}\approx\pm 0.58$ と非常に広く、ラグ 2 以降の ACF 推定は不安定です。値そのものより「トレンドがあると ACF が高く、差分で下がる」という傾向の理解に使ってください。厳密な次数同定・検定には、より長い月次・四半期系列が必要です。

※ 上記は 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・検定という順序を崩さないでください。

🚀 発展 — 自己相関を使いこなす

① ACF/PACF による ARIMA 次数同定(Box–Jenkins 法)

定常化した系列の 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$ を読みます。

② 系列相関の検定 — Durbin–Watson と Ljung–Box

③ 系列相関の補正 — HAC / Newey–West

残差に系列相関(や不均一分散)があるとき、係数推定はそのままに標準誤差だけを頑健化するのが 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)

「過去の自分」との相関(時間方向)を空間方向に置き換えたのが空間自己相関。近い地域ほど値が似る傾向を測る指標が Moran's I($-1$〜$+1$、正なら似た値が隣接=クラスタ化)です。SSDSE-B のような 47 都道府県データでは、隣接県で人口・家計指標が似る空間自己相関がしばしば見られ、地域回帰で残差の空間相関を無視すると時系列と同じく標準誤差を過小評価します。時間の ACF と発想は同型です。

🔗 関連ページ

このサイト内の関連用語(実在ページのみリンク、未整備の項目はテキスト):