論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
ARIMAモデル
ARIMA (ARIMA(p,d,q))
自己回帰(AR)・差分(I)・移動平均(MA)を組み合わせた時系列予測の古典モデル。
時系列ARIMA(p,d,q)ARIMAARMA
📍 文脈💡 30秒結論

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

論文中に 「ARIMAモデル」として登場する用語。

ARIMAモデル とは:自己回帰(AR)・差分(I)・移動平均(MA)を組み合わせた時系列予測の古典モデル。

💡 30秒で分かる結論

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

📍 学習の3ステップ

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

🔧 Python実装パターン

🎯 解説: SSDSE-B-2026 の都道府県・年次データから時系列を構築し、 ARIMA(p,d,q) モデルで「人口の時間変動」をモデル化・予測する。
 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
import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller, kpss

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
ts = df.groupby('年度')['A1101'].sum() / 10000  ## 万人
ts.index = pd.to_datetime(ts.index, format='%Y')

## 1. 定常性検定
adf_result = adfuller(ts)
print(f'ADF: stat={adf_result[0]:.3f}, p={adf_result[1]:.3f}')
kpss_result = kpss(ts, nlags='auto')
print(f'KPSS: stat={kpss_result[0]:.3f}, p={kpss_result[1]:.3f}')

## 2. モデル推定
model = SARIMAX(ts, order=(1, 1, 1)).fit(disp=False)
print(model.summary())

## 3. 予測 + 95% CI
forecast = model.get_forecast(steps=3)
print(forecast.predicted_mean)
print(forecast.conf_int(alpha=0.05))

## 4. 残差診断
from statsmodels.stats.diagnostic import acorr_ljungbox
lb = acorr_ljungbox(model.resid, lags=[5], return_df=True)
print(lb)  ## p>0.05 で白色雑音 OK
📥 入力例: data/raw/SSDSE-B-2026.csv 東京都の総人口時系列 (2010-2023) y = [13160, 13230, 13300, …, 14048]
📤 実行例: ARIMA(1,1,1) フィット AIC = 124.3, BIC = 128.7 予測 (2024-2026): [14102, 14154, 14202] 95% 信頼区間: ±42
💬 読み方: ARIMA(p,d,q) は p 階自己回帰、 d 階差分、 q 階移動平均。 d=1 で 1 階差分を取り定常化。 p,q は ACF/PACF で選定または AIC 最小化で自動選定(auto_arima)。 単位根検定(ADF)で d を決める。

② pmdarima の auto_arima — 自動次数選択

🎯 解説: 都道府県時系列に対して ADF 検定(拡張ディッキー・フラー検定)を行い、 単位根の有無を判定して差分の必要次数 d を決定する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pmdarima as pm

## AIC を最小化する (p,d,q) を自動探索
auto = pm.auto_arima(ts,
                     start_p=0, max_p=3,
                     start_q=0, max_q=3,
                     d=None,      ## 自動で決める
                     seasonal=False,
                     test='adf',
                     trace=True,    ## 探索過程を表示
                     stepwise=True)
print(auto.summary())

## SARIMA(月次データ用)
## monthly_ts = ... 
## auto_s = pm.auto_arima(monthly_ts, seasonal=True, m=12, max_P=2, max_Q=2)
📥 入力例: 東京都 GDP 時系列 (2010-2023)
📤 実行例: ADF 統計量 = -1.32 p 値 = 0.62 > 0.05 → 単位根を棄却できない(非定常) 1 階差分後: ADF = -4.15, p = 0.001 → 定常
💬 読み方: ADF の帰無仮説 H0: 単位根あり(非定常)。 p < 0.05 で定常と判定。 ARIMA の d は ADF が定常を示すまで差分を繰り返した回数。 過差分はモデル誤特定の元。 KPSS 検定と併用が頑健。

③ scipy.signal で周波数解析(季節性検出の前準備)

🎯 解説: ARIMA モデルの残差に対して Ljung-Box 検定を行い、 自己相関が消えたかを確認してモデルの適合度を診断する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from scipy import signal
from statsmodels.tsa.seasonal import seasonal_decompose, STL

## ペリオドグラム(FFT ベースで季節周期を検出)
freqs, psd = signal.periodogram(ts.values, fs=1.0)
peak_freq = freqs[np.argmax(psd[1:])+1]
print(f'卓越周期: {1/peak_freq:.1f} 単位')

## STL 分解(trend + seasonal + residual)— 月次以上のデータで
## stl = STL(ts, seasonal=13).fit()
## stl.plot()
📥 入力例: ARIMA(1,1,1) の残差 (n=13)
📤 実行例: Ljung-Box (lag=10) Q 統計量 = 8.2, p = 0.61 → 残差に有意な自己相関なし モデル適合 OK
💬 読み方: 残差が白色雑音(独立同分布)ならモデル適合 OK。 Q 統計量の p > 0.05 が望ましい。 残差に自己相関が残るなら p, q を増やす。 ARCH 効果(分散の自己相関)には GARCH を併用。

④ Prophet — Facebook の時系列ライブラリ

🎯 解説: auto_arima(pmdarima)で p,d,q,P,D,Q を自動選定して最適な SARIMA モデルを得る。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from prophet import Prophet

df_p = pd.DataFrame({'ds': ts.index, 'y': ts.values})
m = Prophet(yearly_seasonality=False, weekly_seasonality=False, daily_seasonality=False)
m.fit(df_p)

future = m.make_future_dataframe(periods=3, freq='Y')
fcst = m.predict(future)
print(fcst[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(3))

## トレンドと季節成分を別々に可視化
m.plot_components(fcst)
📥 入力例: 東京都 月次人口時系列 (2018-2023, n=72)
📤 実行例: auto_arima 探索結果: SARIMA(1,1,1)(1,1,0)[12] AIC = 312.4 (最小) 探索した候補数 = 28
💬 読み方: auto_arima は AIC または BIC を最小化する (p,d,q) を網羅探索。 季節周期 m を指定すると SARIMA に拡張。 stepwise=True で高速化(局所探索)。 過適合を避けるなら BIC を使う。

🔖 キーワード索引 — 完全強化版

「ARIMA」を理解するうえで必要なキーワードを 10 件以上提示します。 各チップから対応セクションへ移動できます。

30 秒結論 文脈 直感 数式 記号読み解き 実値計算 Python 実装 落とし穴 関連手法 関連用語 グループ教材 概念マップ

💡 30 秒で分かる結論 — 完全強化版

📍 文脈ボックス — あなたが今見ているもの(完全強化版)

このセクションは「ARIMA」を扱う 用語ページ です。 統計データ分析コンペティション(2026)の再現教材における中核用語のひとつで、北海道の人口 A1101 の年次推移(2014-2023)に ARIMA を適用 という観点で SSDSE-B-2026(47 都道府県 × 複数年 × 100 超列)に紐づけられます。

位置づけ:相関線形回帰仮説検定 といった基礎用語群と並列であり、応用としては 内生性IVDIDクラスタリング 等へ繋がります。

🎨 直感で掴む — 完全強化版

ARIMA を一言でいえば「北海道の人口 A1101 の年次推移(2014-2023)に ARIMA を適用」。 47 都道府県という小さな母集団でも、 SSDSE-B-2026 の A1101 列に注目すると、 大都市圏と地方の差・人口規模に伴う相対比較など、 様々なパターンが見えてきます。

比喩でいうと、 ARIMA はデータ分析の「眼鏡」のようなもの。 同じデータでも眼鏡を変えれば、 平均(中心)・分散(ばらつき)・相関(連動)・因果(影響)と、 異なる情報が浮かび上がります。 SSDSE-B-2026 を題材に、 この眼鏡をかけてみるのが本ページの狙いです。

📐 数式または定義 — 完全強化版

ARIMA の代表的な定義式は次のとおりです。

$$ \phi(L)(1-L)^d y_t = \theta(L)\, \varepsilon_t $$

ここで使われる記号や演算の意味は次節で言葉に翻訳します。

🔬 数式を言葉で読み解く — 完全強化版

数式の各記号を、日本語の意味に変換します。

🧮 実値で計算してみる — SSDSE-B-2026 で ARIMA(完全強化版)

SSDSE-B-2026(公的統計の社会・教育系データセット、 47 都道府県 × 10 年分超 × 100 以上の列)を用いて、 「ARIMA」を体感します。 ファイル名は SSDSE-B-2026.csv、 読み込みは下記の Python コードで行います。

import pandas as pd

# SSDSE-B-2026 を読み込む(cp932 / Shift_JIS)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
print(df.shape)          # (564, 112)
print(df['SSDSE-B-2026'].unique())  # 含まれる年度
latest = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy()
print(latest[['Prefecture', 'A1101', 'A1101']].head())

ここで使った中心列 A1101 は SSDSE-B-2026 における 北海道の人口 A1101 の年次推移(2014-2023)に ARIMA を適用 に関連する指標です。 算出例:

🐍 Python 実装 — 完全強化版

scipy / pandas / scikit-learn / statsmodels を中心とした標準的な実装例です。 まず CSV を読み込み、 次に ARIMA の解析を行います。

import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()].copy()

x = df['A1101'].astype(float).values
y = df['A1101'].astype(float).values

# 基本統計量
print('n            =', len(x))
print('mean(x)      =', np.mean(x))
print('std(x)       =', np.std(x, ddof=1))

# ARIMA の代表的計算(用途に応じて scipy/statsmodels を切替える)
r, p = stats.pearsonr(x, y)
print(f'Pearson r = {r:.4f}, p = {p:.4g}')
rs, ps = stats.spearmanr(x, y)
print(f'Spearman rho = {rs:.4f}, p = {ps:.4g}')

用途別の追加実装:

# 標準化と簡易クラスタリングの例
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

X = df[['A1101', 'A1101']].astype(float).values
Xs = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(Xs)
df['cluster'] = km.labels_
print(df[['Prefecture', 'A1101', 'A1101', 'cluster']].head(10))
# 時系列(北海道の A1101)— 例として ARIMA 系の前処理
import statsmodels.api as sm

ts = df.sort_values('SSDSE-B-2026').groupby('SSDSE-B-2026')['A1101'].mean()
print(ts.tail())
res = sm.tsa.stattools.adfuller(ts)
print('ADF stat:', res[0], 'p:', res[1])

⚠️ 落とし穴 — 完全強化版

ARIMA を実務で扱う際に踏みやすい落とし穴を 5 件挙げます。

🗺 概念マップ — 完全強化版

📂 ケーススタディと追加実装例

ここまでで ARIMA の基礎・式・実装は押さえられました。 さらに「現場で実際に役立つ視点」を 4 件まとめます。 SSDSE-B-2026 の都道府県時系列に当てはめながら、 ARIMA をどう運用するかを具体化します。

ケース 1:人口減少県の長期予測と信頼区間

秋田県・青森県など人口減少が顕著な県では、 単純な ARIMA(p,d,q) は「線形に減り続ける」予測を出しがちです。 実務では人口動態の構造変化(団塊世代の高齢化、 外国人流入)が予測精度を大きく左右するため、 ARIMAX(外生変数つき)で出生率・社会増減率を組み込むのが定石です。

ARIMAX を使うときは「予測時に外生変数も既知である必要がある」点に注意です。 GDP の予測に人口統計を使う場合は、 人口統計が早く確定するためリードラグ的に使えますが、 株価予測に金利を使う場合は別途金利予測モデルが必要です。

ケース 2:季節調整と SARIMA の使い分け

月次の小売販売額や観光客数は強い季節性を持ちます。 12 月にピーク、 2 月に底という典型パターンを ARIMA でモデル化するには、 SARIMA(p,d,q)(P,D,Q)[m] を用いて季節項を明示します。 m=12 が月次、 m=4 が四半期、 m=52 が週次です。

季節調整(X-13ARIMA-SEATS や STL 分解)で季節成分を除去してから ARIMA にかける流派と、 SARIMA で同時に推定する流派があります。 後者の方が統計的に効率的ですが、 前者の方が解釈・診断が容易です。 短期予測(3 ヶ月以内)は SARIMA、 構造変化が多いデータは「STL 分解 + ARIMA」が頑健です。

ケース 3:構造変化を含む時系列の取り扱い

コロナ禍のような大規模ショックを含む時系列に通常の ARIMA を当てはめると、 残差が大きな自己相関を持ち適合度が著しく低下します。 対処法は 3 つあります。

  1. 介入変数(intervention analysis): ショック期間にダミー変数 D_t=1 を入れ、 ARIMAX で吸収。 効果の大きさが推定でき解釈容易。
  2. ベイズ構造時系列 (BSTS): トレンドの「変化点」を確率的に推定。 prior に事業ドメイン知識を反映できる。
  3. レジームスイッチング ARIMA: 2 つ以上のレジーム(通常期/危機期)の切替確率を Markov モデルで推定。

SSDSE-B-2026 のデータでは、 「東日本大震災(2011)」「コロナ(2020-2022)」が主要な構造変化です。 介入変数を導入すると、 例えば震災ショックが東北各県の人口に -1.2% の永続効果を与えたことが定量化できます。

ケース 4:複数モデルのアンサンブル予測

本番運用では、 ARIMA 単独より複数モデルのアンサンブル(重み平均)が頑健です。 典型構成は以下:

重みは validation set で各モデルの RMSE を測り、 逆数で正規化するのが簡便です。 ARIMA の RMSE が他より良い局面(短期、 線形)と、 LSTM が勝る局面(中長期、 非線形)が混在する場合、 単純平均より動的重み付け(時間や状態で重みを変える)が効果的です。

❓ よくある質問(FAQ)

Q1:ARIMA と SARIMA、 どちらを使うべき?

季節性が ACF/PACF に明確に現れるなら(特に月次・四半期データ)必ず SARIMA。 季節性が弱いまたは年次データなら ARIMA で十分です。 迷ったら SARIMA を試して AIC を比較すれば、 余計な季節項は P=0,Q=0,D=0 になり自動的に ARIMA に縮約します。

Q2:差分次数 d の選び方は?

ADF 検定で「単位根あり」と出れば 1 階差分。 1 階差分後も非定常なら 2 階差分。 通常 d は 0/1/2 のいずれかで、 3 以上は過差分の兆候。 KPSS 検定(H0: 定常)と併用すると頑健です。 Hyndman の auto.arima は差分次数も自動選定します。

Q3:p, q はどう決める?

ACF が打ち切り+PACF が漸減 → MA(q)、 ACF が漸減+PACF が打ち切り → AR(p)、 両方漸減 → ARMA(p,q)。 自動化するなら p, q ∈ {0,1,2,3} を全探索して AIC 最小を選ぶ。 BIC を使うと過適合が抑えられパーシモニアスなモデルになります。

Q4:残差診断で何を見る?

(1) Ljung-Box 検定で自己相関の有無、 (2) ACF プロットでラグ別自己相関、 (3) QQ プロットで残差の正規性、 (4) 残差プロットで分散の均一性・外れ値。 残差が白色雑音ならモデル適合 OK、 自己相関が残るなら p, q を増やす、 分散が一定でなければ GARCH を追加検討します。

Q5:予測の信頼区間はどう解釈すべき?

95% 信頼区間は「真の値が 95% の確率でこの範囲に入る」という意味ではなく「サンプリングを繰り返したとき 95% の区間が真値を含む」という意味です。 ARIMA の信頼区間は「モデルが正しい」前提で計算されるため、 構造変化があると過小評価になる傾向があります。 ブートストラップやベイズ信用区間の方が頑健です。

🎯 まとめ — 完全強化版

本ページでは「ARIMA」を 12 セクション(🔖 キーワード索引/💡 30 秒結論/📍 文脈/🎨 直感/📐 数式/🔬 記号読み解き/🧮 実値計算/🐍 Python 実装/⚠️ 落とし穴/🌐 関連手法/🔗 関連用語/📚 グループ教材)で完結に整理しました。 SSDSE-B-2026 を素材に、 概念の輪郭・式の意味・実装手順・典型的な失敗パターンの 4 点を最低限押さえれば、 統計データ分析コンペの現場で迷わず使えるはずです。

ARIMA は古典的なモデルですが、 「単純で解釈可能、 サンプル数が少なくても動く、 信頼区間が出る」という美徳から今でも実務の第一選択肢です。 機械学習(LSTM, Transformer)と組み合わせたアンサンブル予測でさらに精度を高められます。 「まず ARIMA から始める」を合言葉にしてください。