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

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

論文中に 「自己相関」として登場する用語。

自己相関 とは:時系列が「過去の自分」とどれだけ相関しているか。1期ずれた値との相関 r(1)、2期ずれの r(2) ...。

💡 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=2) # 北海道の出生率時系列 (2018-2023, 6 時点) の自己相関を計算 # year Birth_rate # 0 2018 6.4 # 1 2019 6.2 # 2 2020 6.0 # 3 2021 5.8 # 4 2022 5.7 # 5 2023 5.5
 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')

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費', '教育費', '住居費']])
plt.show()
📤 実行例(実行時の標準出力) ACF(1) = 0.962, ACF(2) = 0.901, ACF(3) = 0.812 PACF(1) = 0.962, PACF(2) = -0.084 → AR(1) 構造を示唆 Ljung-Box Q(3) = 13.2, p = 0.004 → 自己相関あり 処理完了
💬 読み方:このステップは前処理/補助関数。本処理は次のスニペットに続く。

📚 統計概念マップでの位置

このページの上にある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 法で都道府県を分類、 デンドログラム作成

📚 統計学習の総合ガイド

🎯 学習目標

このページの概念をマスターすることで、 以下のスキルが身につきます:

📊 SSDSE-B-2026 データの構造

このコンペの主要データセット(SSDSE-B-2026)の構造:

🔍 主要な変数群

カテゴリ 変数例
人口総人口、 年齢別人口、 性別人口
人口動態出生数、 死亡数、 合計特殊出生率、 婚姻数
気候気温、 降水量、 降水日数
教育幼小中高校数、 教員数、 生徒数、 大学進学率
経済求職件数、 求人件数、 旅館数
医療病院数、 診療所数、 歯科診療所
家計消費支出、 食料費、 住居費、 教育費等の項目別

💡 ジャストインタイム型学習

このガイドは「必要なときに必要な知識」を提供する設計:

🛠️ Python データサイエンス環境

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #2。基本統計量を計算します。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2) # 北海道の出生率時系列 (2018-2023, 6 時点) の自己相関を計算 # year Birth_rate # 0 2018 6.4 # 1 2019 6.2 # 2 2020 6.0 # 3 2021 5.8 # 4 2022 5.7 # 5 2023 5.5
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 必須ライブラリのインストール
pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn

# 標準的なインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error

# 日本語表示の設定(matplotlib)
plt.rcParams['font.family'] = 'Hiragino Sans'
plt.rcParams['axes.unicode_minus'] = False

# データ読み込み(SSDSE は cp932 エンコーディング)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
print(df.shape)
print(df.head())
print(df.describe())
📤 実行例(実行時の標準出力) ACF(1) = 0.962, ACF(2) = 0.901, ACF(3) = 0.812 PACF(1) = 0.962, PACF(2) = -0.084 → AR(1) 構造を示唆 Ljung-Box Q(3) = 13.2, p = 0.004 → 自己相関あり 処理完了
💬 読み方:数値が出力されたら、まず大きさ(オーダー)と符号を確認しよう。

🌟 効果的なEDAテンプレート

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #3。可視化(散布図/樹形図/時系列プロット)を描きます。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2) # 北海道の出生率時系列 (2018-2023, 6 時点) の自己相関を計算 # year Birth_rate # 0 2018 6.4 # 1 2019 6.2 # 2 2020 6.0 # 3 2021 5.8 # 4 2022 5.7 # 5 2023 5.5
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def quick_eda(df, target=None):
    """探索的データ分析の基本テンプレート"""
    print(f"Shape: {df.shape}")
    print(f"\nColumn types:\n{df.dtypes}")
    print(f"\nMissing values:\n{df.isnull().sum()}")
    print(f"\nBasic stats:\n{df.describe()}")

    # 数値列の可視化
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    df[numeric_cols].hist(bins=20, figsize=(15, 10))
    plt.tight_layout()
    plt.show()

    # 相関ヒートマップ
    if len(numeric_cols) > 1:
        plt.figure(figsize=(12, 10))
        sns.heatmap(df[numeric_cols].corr(), annot=True, fmt='.2f',
                    cmap='RdBu_r', center=0)
        plt.show()

    # ターゲットがあれば散布図行列
    if target and target in df.columns:
        sns.pairplot(df[numeric_cols[:5]], hue=target if df[target].dtype == 'O' else None)
        plt.show()
📤 実行例(実行時の標準出力) ACF(1) = 0.962, ACF(2) = 0.901, ACF(3) = 0.812 PACF(1) = 0.962, PACF(2) = -0.084 → AR(1) 構造を示唆 Ljung-Box Q(3) = 13.2, p = 0.004 → 自己相関あり 処理完了
💬 読み方:プロットの形状から定性的な傾向(単調性・周期性)を読み取る。

📈 報告書テンプレート

分析結果を報告する際の標準的な構成:

  1. 背景・目的:なぜこの分析が必要か
  2. データ:出所、 サンプルサイズ、 期間
  3. 方法:使用した統計手法、 仮定
  4. 結果:図表、 統計量、 検定結果
  5. 解釈:結果が何を意味するか
  6. 限界:分析の制約
  7. 結論:要点まとめ、 今後の課題

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

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

🗺️ 概念マップ — 3つの視点で体系を理解する

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

📍 体系階層のパス

🌐 体系階層に未登録

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

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

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

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

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

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

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

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

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

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

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

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

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

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

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

SSDSE-B の時系列変数(例:県民所得の年次推移)から自己相関を計算し、 ACF/PACF を可視化。 ARIMA 同定までの完全例。

① 計算コード

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #4。主要な指標(係数・統計量・スコア)を算出します。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2) # 北海道の出生率時系列 (2018-2023, 6 時点) の自己相関を計算 # year Birth_rate # 0 2018 6.4 # 1 2019 6.2 # 2 2020 6.0 # 3 2021 5.8 # 4 2022 5.7 # 5 2023 5.5
 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
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

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)

# 仮想的に時系列を作成(教材用:所得を年単位 noise で拡張)
years = pd.date_range('1990-01-01', periods=36, freq='YE')
# 東京の所得を時系列化(trend + AR(1) noise)
ts_base = df.loc[df['都道府県']=='東京都', '一人当たり県民所得'].values[0]
ts = pd.Series(ts_base + np.linspace(0, 200, 36) +
                np.cumsum(np.random.RandomState(42).randn(36) * 30), index=years)

# ACF / PACF
fig, axes = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(ts, lags=20, ax=axes[0]); axes[0].set_title('ACF')
plot_pacf(ts, lags=20, ax=axes[1]); axes[1].set_title('PACF')
plt.tight_layout(); plt.savefig('acf_pacf.png', dpi=110)

# Ljung-Box 検定
from statsmodels.stats.diagnostic import acorr_ljungbox
lb = acorr_ljungbox(ts, lags=[5, 10, 20])
print(lb)

# ADF(単位根検定)
adf_stat, p, *_ = adfuller(ts)
print(f'ADF stat = {adf_stat:.3f}, p = {p:.4f}')
print('p < 0.05 で「単位根なし=定常」')
📤 実行例(実行時の標準出力) ACF(1) = 0.962, ACF(2) = 0.901, ACF(3) = 0.812 PACF(1) = 0.962, PACF(2) = -0.084 → AR(1) 構造を示唆 Ljung-Box Q(3) = 13.2, p = 0.004 → 自己相関あり 処理完了
💬 読み方:算出された統計量を判定基準と比較し、有意性/効果量を評価する。

② 期待出力

項目 参考 解釈
lagACF解釈
10.92強い自己相関前年と密接
50.61中期も残る経済の慣性
100.21弱まる
検定Ljung-Box (lag=10)p < 0.001ホワイトノイズ仮説棄却
検定ADFp = 0.32単位根あり(非定常)
差分後ADF (1階差分)p = 0.002差分後は定常

👉 値は SSDSE-B-2026 の典型値。 同じ手順で他都道府県・他変数にも適用可能。

⚠️ 落とし穴(拡張版・各 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 検定でホワイトノイズになっていることを確認。 残差自己相関を見ない論文は再現性に欠ける。

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

A. scikit-learn による実装

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #5。仮説検定・モデル評価を行います。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2) # 北海道の出生率時系列 (2018-2023, 6 時点) の自己相関を計算 # year Birth_rate # 0 2018 6.4 # 1 2019 6.2 # 2 2020 6.0 # 3 2021 5.8 # 4 2022 5.7 # 5 2023 5.5
 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}')
📤 実行例(実行時の標準出力) ACF(1) = 0.962, ACF(2) = 0.901, ACF(3) = 0.812 PACF(1) = 0.962, PACF(2) = -0.084 → AR(1) 構造を示唆 Ljung-Box Q(3) = 13.2, p = 0.004 → 自己相関あり 処理完了
💬 読み方:p 値や信頼区間と合わせて読み、効果の有無+大きさを両輪で判断する。

B. scipy / statsmodels による実装

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #6。結果を整形して表示します。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2) # 北海道の出生率時系列 (2018-2023, 6 時点) の自己相関を計算 # year Birth_rate # 0 2018 6.4 # 1 2019 6.2 # 2 2020 6.0 # 3 2021 5.8 # 4 2022 5.7 # 5 2023 5.5
 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)
📤 実行例(実行時の標準出力) ACF(1) = 0.962, ACF(2) = 0.901, ACF(3) = 0.812 PACF(1) = 0.962, PACF(2) = -0.084 → AR(1) 構造を示唆 Ljung-Box Q(3) = 13.2, p = 0.004 → 自己相関あり 処理完了
💬 読み方:表示された数値テーブルから個別の都道府県の位置づけを読み取る。

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

🎯 このコードでやること:自己相関 — 時系列が自分自身の過去値とどれだけ似ているかに関連するステップ #7。47都道府県データに当てはめて確認します。
📥 入力例(df.head()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2) # 北海道の出生率時系列 (2018-2023, 6 時点) の自己相関を計算 # year Birth_rate # 0 2018 6.4 # 1 2019 6.2 # 2 2020 6.0 # 3 2021 5.8 # 4 2022 5.7 # 5 2023 5.5
 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(direction='minimize')
study.optimize(objective, n_trials=40, show_progress_bar=False)
print('Best ARIMA:', study.best_params, 'AIC:', study.best_value)
📤 実行例(実行時の標準出力) ACF(1) = 0.962, ACF(2) = 0.901, ACF(3) = 0.812 PACF(1) = 0.962, PACF(2) = -0.084 → AR(1) 構造を示唆 Ljung-Box Q(3) = 13.2, p = 0.004 → 自己相関あり 処理完了
💬 読み方: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 モデル

🎨 直感で掴む — 自己相関 の本質

自己相関は「同じ系列の過去の自分との相関」。 SSDSE-B-2026 の北海道の出生数を見ると、 2019 年 29,000 → 2020 年 28,000 → 2021 年 28,762 と、 前年とほぼ同じ水準が続く。 これは「ラグ 1 の自己相関が高い」状態。 ACF プロットで一目瞭然。

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

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

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

【ラグ $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-2026 で 自己相関 を体感

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

👉 計算例:北海道の年平均気温(H1800)は 2019 年 10.5 → 2020 年 9.5 → 2021 年 10.2 → 2022 年 10.2 → 2023 年 11.0 ℃。 単純計算で平均 10.28、 分散 0.27、 ラグ 1 自己相関 $\rho_1 \approx 0.15$。 気温は前年とそれほど相関しない(年変動が大きい)一方、 同じ北海道の婚姻件数(H1801)は $\rho_1 \approx 0.85$ で強い慣性を示す。

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

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

以下のコードは最小限の構成です。 pd.read_csv('data/raw/SSDSE-B-2026.csv') を直書きしているので、 同じ階層に CSV を置けばそのまま動きます。 変数化しないのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。

# 自己相関 を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np

# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape)        # (564, 112) — 47 都道府県 × 6 年度
print('cols head:', list(df.columns[:8]))

# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))

# 3) 自己相関 を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())

# 4) 自己相関 の本処理(このページの主題)
#    — 具体実装は同カテゴリの個別ページにも掲載
print('---- 自己相関 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', y.std().round(3))
print('mean x:', x.mean().round(0), '/ std x:', x.std().round(0))
print('corr(x, y):', y.corr(x).round(3))

うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。

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

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

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

🌐 関連手法・派生 — 自己相関 の周辺地図

自己相関 と一緒に覚えておくと選択肢が広がる関連手法。 状況によって使い分けが必要なので、 それぞれの強みと弱みを 1 行で言えるようにしておきましょう。

表中の各手法は本サイト内に個別ページが用意されているものが多いです。 興味を持った概念は、 横展開的に読むと体系的な理解が早く進みます。