📍 あなたが今見ているもの
論文中に 「AIC(赤池情報量基準)」として登場する用語。
AIC(赤池情報量基準) とは:モデルの「適合度」と「複雑さ(パラメータ数)」のバランスを評価。AICが小さいモデルが良い。
📖 詳細な解説
この用語は、 統計データ解析・データサイエンスの世界で重要な概念の1つです。 ジャストインタイム型学習では、 必要なときに参照し、 関連概念と合わせて学ぶことで定着を図ります。
基本的な定義
この用語の基本的な意味、 数学的定義、 直感的理解について、 上記の3つの概念マップを通じて、 関連する用語と一緒に把握しましょう。
使い時の判断基準
- データの種類は何か(連続値 / カテゴリ / 順序)
- サンプルサイズは十分か(n > 30 が目安)
- 仮定は満たされているか(正規性、 独立性等)
- 結果の解釈に必要な情報は揃っているか
Python による実装例
▼ コード解説(AIC の計算(statsmodels))
🎯 解説: model.aic 属性で AIC を取得。 AIC = -2*log(L) + 2*k。 値が小さいほど良いモデル。
📥 入力例: df, y = 死亡率, X = 説明変数の候補
📤 実行例: AIC = 178.3
log-likelihood = -85.1
k = 4 パラメータ
💬 読み方: AIC は絶対値に意味はなく、 モデル間の差で比較。 ΔAIC < 2 なら同等、 4-7 なら中程度の差、 >10 なら有意な差。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# SSDSE データの読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
# 基本統計
df.describe()
df.info()
# 可視化
df.hist(bins=30, figsize=(15, 10))
plt.show()
|
📖 包括的解説 — この概念を完全マスター
📍 学習の3ステップ
- 定義を理解する:この概念は何か? 数式や条件を確認
- 具体例を見る:実データ(SSDSE 等)で計算してみる
- 応用する:自分のデータに適用、 結果を解釈
🔧 Python実装パターン
▼ コード解説(複数モデルの AIC 比較)
🎯 解説: 説明変数の組み合わせを変えてループで AIC を計算。 最小値のモデルを最適候補とする。
📥 入力例: 候補: [高齢化率], [高齢化率,出生率], [全変数]
📤 実行例: M1 AIC=185.2
M2 AIC=178.3(最小)
M3 AIC=180.5
💬 読み方: AIC 最小のモデルが「予測誤差最小」の意味で最適。 ただし過学習に注意し、 交差検証と併用するのが安全。
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()
|
📚 統計概念マップでの位置
このページの上にある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() |
🚧 一般的な落とし穴と対策
- 外れ値の影響:散布図・ 箱ひげ図で確認、 ロバスト手法も検討
- サンプルサイズ不足:power analysis で事前に確認
- 仮定の違反:正規性、 独立性、 等分散性をチェック
- 多重比較問題:補正(Bonferroni、 FDR)を適用
- p-hacking:事前登録(pre-registration)で防ぐ
- 因果と相関の混同:観察データから因果結論を出さない
📊 結果報告の標準フォーマット
- 点推定:得られた値
- 不確実性:信頼区間または標準誤差
- サンプルサイズ:n を明記
- 効果量:実質的な意義
- p値:統計的有意性
- 仮定の確認:診断プロット
🌐 関連分野での応用
- マーケティング:A/Bテスト、 顧客分析
- 医療:臨床試験、 疫学研究
- 金融:リスク管理、 ポートフォリオ
- 製造:品質管理、 工程最適化
- 公共政策:効果評価、 計画立案
- 研究:仮説検証、 探索的解析
🎓 さらに学ぶための文献
- Wasserman "All of Statistics"
- Hastie, Tibshirani & Friedman "The Elements of Statistical Learning"
- Gelman & Hill "Data Analysis Using Regression"
- VanderPlas "Python Data Science Handbook"
📚 統計学習の総合ガイド
🎯 学習目標
このページの概念をマスターすることで、 以下のスキルが身につきます:
- 定義と公式を正確に理解
- 適切な使用場面を判断
- Python で実装し、 結果を可視化
- 仮定の確認と診断
- 結果の解釈と報告
- 限界と注意点の理解
- 関連手法との使い分け
📊 SSDSE-B-2026 データの構造
このコンペの主要データセット(SSDSE-B-2026)の構造:
- 47都道府県 × 過去複数年(パネル形式)
- 112列の社会経済指標
- 人口、 出生、 死亡、 婚姻、 経済、 教育、 環境、 家計など多次元
- 政府統計を統合した信頼性の高いデータ
🔍 主要な変数群
| カテゴリ |
変数例 |
| 人口 | 総人口、 年齢別人口、 性別人口 |
| 人口動態 | 出生数、 死亡数、 合計特殊出生率、 婚姻数 |
| 気候 | 気温、 降水量、 降水日数 |
| 教育 | 幼小中高校数、 教員数、 生徒数、 大学進学率 |
| 経済 | 求職件数、 求人件数、 旅館数 |
| 医療 | 病院数、 診療所数、 歯科診療所 |
| 家計 | 消費支出、 食料費、 住居費、 教育費等の項目別 |
💡 ジャストインタイム型学習
このガイドは「必要なときに必要な知識」を提供する設計:
- 論文中の用語をクリック → 該当の用語解説へジャンプ(ポップアップ)
- 概念マップで関連用語を辿る
- 包含マップで体系を把握
- ツリーマップで全体を俯瞰
- Python コードをコピーして実行
- SSDSE データで実際に試す
🛠️ Python データサイエンス環境
▼ コード解説(BIC との比較)
🎯 解説: AIC は予測精度重視、 BIC は真のモデル発見重視。 BIC = -2*log(L) + log(n)*k で罰則項が大きい。
📥 入力例: 同じモデルで AIC と BIC を計算
📤 実行例: AIC=178.3, BIC=185.7
k=4, n=47
BIC の方が罰則大きい
💬 読み方: BIC は「真のモデルが候補に含まれる」前提で一貫性を持つ。 AIC は予測誤差最小を目指す。 用途で使い分け。
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())
|
🌟 効果的なEDAテンプレート
▼ コード解説(AICc(小標本補正))
🎯 解説: AICc = AIC + 2k(k+1)/(n-k-1)。 n/k < 40 のとき AIC は楽観的すぎ、 AICc が推奨。
📥 入力例: n=47, k=5 のとき
📤 実行例: AIC=178.3
AICc=179.7
差はわずかだが小標本では効く
💬 読み方: n/k が 10 程度の小さなデータでは AICc を使うべき。 大規模データ(n>1000)では AIC と AICc はほぼ同じ。
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()
|
📈 報告書テンプレート
分析結果を報告する際の標準的な構成:
- 背景・目的:なぜこの分析が必要か
- データ:出所、 サンプルサイズ、 期間
- 方法:使用した統計手法、 仮定
- 結果:図表、 統計量、 検定結果
- 解釈:結果が何を意味するか
- 限界:分析の制約
- 結論:要点まとめ、 今後の課題
🗺️ 概念マップ — 3つの視点で体系を理解する
AIC(赤池情報量基準) がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
📍 体系階層のパス
🌐 体系階層に未登録
① 🔗 関係マップ — 「他の手法とどう繋がっているか」
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先
② ⭕ 包含マップ — 「どのカテゴリに含まれているか」
大きな円が小さな円を包含する Circle Packing 図。 「AIC(赤池情報量基準)」は緑色でハイライト。
- カテゴリ円をクリック:その内部にズームイン
- 白背景クリック:1階層戻る
- 用語円をクリック:詳細ページへ遷移
- マウスホバー:階層パス表示
③ 🌳 ツリーマップ — 「面積で見るボリューム比較」
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「AIC(赤池情報量基準)」は緑色でハイライト。
- カテゴリ矩形をクリック:その内部にドリルダウン
- パンくず(上のリンク)クリック:その階層に戻る
- 用語矩形をクリック:詳細ページへ遷移
- マウスホバー:階層パスと値を表示
🎯 3つのマップの使い分け
| マップ |
分かること |
こんな時に見る |
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
🧮 SSDSE-B-2026 実値計算例 — モデル比較で AIC を使う
「持ち家比率」を目的変数として、 説明変数の数を変えた 4 モデルの AIC を比較し、 最も小さいモデルを選びます。 47 都道府県の小標本では AICc(補正版 AIC)も併記すべきです(n/k 比が小さいとき AIC は罰則不足)。
| モデル |
説明変数 k |
対数尤度 ℓ |
AIC = −2ℓ+2k |
AICc |
判定 |
| M1: 切片のみ | 1 | 最小 | 大 | 大 | 情報量不足 |
| M2: 平均所得のみ | 2 | 改善 | 中 | 中 | 単純すぎ |
| M3: 所得+人口+高齢化 | 4 | 大幅改善 | 最小 | 最小 | バランス◎ |
| M4: 全数値変数 | 20+ | 最大 | 中 | 悪化 | 過学習 |
▼ コード解説(Cross Validation との比較)
🎯 解説: AIC と K-fold CV の MSE を比較。 漸近的には AIC ≈ leave-one-out CV。
📥 入力例: 5-fold CV と AIC をモデルごとに計算
📤 実行例: M2: AIC=178, CV=2.1
M3: AIC=180, CV=2.3
順位は一致
💬 読み方: AIC は計算が速いがバイアスがある。 大事な意思決定では CV と二重チェックが安全。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | import numpy as np, pandas as pd, statsmodels.api as sm
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
num = df.select_dtypes(include='number').dropna()
y = num['持ち家比率']
candidates = {
'M1': ['切片のみ'],
'M2': ['平均所得'],
'M3': ['平均所得', '総人口', '高齢化率'],
'M4': list(num.drop(columns=['持ち家比率']).columns),
}
for name, cols in candidates.items():
if cols == ['切片のみ']:
X = np.ones((len(y), 1))
else:
X = sm.add_constant(num[cols])
r = sm.OLS(y, X).fit()
k = X.shape[1]; n = len(y)
aic = r.aic
aicc = aic + 2*k*(k+1) / (n - k - 1)
print(f'{name}: k={k}, AIC={aic:.2f}, AICc={aicc:.2f}')
|
※ AICc は n/k < 40 の小標本で必須の補正です。 SSDSE-B-2026(n=47)では k が 5 を超えるとほぼ全モデルで AICc を使うべきです。
⚠️ 落とし穴(補強版 — AIC 比較で踏みやすい7つの罠)
① 異なる y のスケールで AIC を比較する
log(y) と y を別々のモデルで予測して AIC を比較するのは無効です。 対数尤度のスケールが変わるため、 比較できません。 同じ y、 同じ観測値を使ったモデル同士でしか AIC は比較できません。 「対数変換した方が AIC が小さかった」は誤った結論で、 適切にはヤコビアン補正を入れるか、 RMSE などスケール独立な指標で比較してください。 この落とし穴は経済学・生態学の論文でも頻繁に見られる典型例です。
② AIC が最小のモデルを「真のモデル」と思い込む
AIC は予測誤差を最小化するモデルを選ぶ規準であって、 「真のモデル」を当てる規準ではありません。 「真のモデル」を選ぶには BIC(または cAIC)のほうが理論的に整合します。 目的が予測なら AIC、 仮説検定的な「真のモデル選択」なら BIC を使い分けるのが定石。 また、 AIC の差が 2 未満なら統計的に区別不可能な範囲(Burnham & Anderson の基準)なので、 候補モデルを残して報告しましょう。
③ 小標本で AIC をそのまま使う
SSDSE-B のように n=47 で、 パラメータ数 k が 5 を超えると、 AIC は罰則項が弱すぎて大きいモデルに有利になります。 必ず AICc(補正項 2k(k+1)/(n-k-1) を加える)を併用してください。 一般に n/k < 40 のときは AICc が標準です。 統計学習論文でこの補正をしていない例は信頼性を下げる一因。 Hurvich & Tsai (1989) の補正を引用するのが学術的な作法。
④ 異なる観測集合のモデルを AIC で比較する
欠損値を含む変数を入れた瞬間、 そのモデルは「欠損のない n' 件」で推定されます。 別のモデルは元の n 件で推定された場合、 対数尤度の総和が同じスケールに乗らず、 AIC 比較は無効です。 同じ観測集合に揃える(共通の dropna() を取る、 もしくは MICE で多重代入する)必要があります。 これは特に statsmodels で NaN がある列を入れ替えるときに陥りやすい罠です。
⑤ ステップワイズ法と組み合わせて報告
「AIC でステップワイズ変数選択しました」は古典的アプローチですが、 選ばれた変数の p 値が無効になる問題があります。 同じデータで「選ぶ」と「検定する」を行うと検定の前提が崩れます。 推論を目的とするなら、 (i) 別データで検証、 (ii) selective inference、 (iii) 事前理論で変数を固定する、 のいずれかが必要です。 予測だけが目的なら CV と組み合わせて報告しましょう。
⑥ AIC と BIC の差を「軽い違い」と捉える
BIC は罰則項が log(n)·k で、 n が大きいほど厳しくなります。 n=100 で log(n) ≈ 4.6 なので BIC は AIC(罰則 2k)の 2 倍以上厳しい。 「AIC が小さい/BIC が小さい」モデルが異なるのは普通で、 どちらを採用するかは「予測 vs 真モデル」の目的次第。 両方を報告し、 一致したら強い結論、 食い違えばその理由を議論する、 のが論文での標準作法です。
⑦ ベイズモデルに通常の AIC を使う
階層ベイズや MCMC ベースのモデルでは、 古典的 AIC は不適切です。 事後分布から計算する WAIC(Watanabe-Akaike Information Criterion)や LOO-CV ベースの PSIS-LOO を使うのが標準です。 PyMC や Stan には az.waic, az.loo が用意されています。 「ベイズ階層モデルを組んだのに AIC で比較しました」と書くと、 査読でほぼ確実に指摘されます。
🐍 Python 実装バリエーション(AIC・AICc・BIC・WAIC を一気に)
🅰️ statsmodels が一番素直
▼ コード解説(変数選択(前進・後退・stepwise))
🎯 解説: AIC を基準に変数を順次追加・削除。 全探索より高速だが局所最適に陥る可能性あり。
📥 入力例: 候補変数 10 個から選択
📤 実行例: 前進選択: 高齢化率→出生率→… の順で追加
最終モデル: 3 変数, AIC=178
💬 読み方: Stepwise は実用的だが、 全パターン探索(2^k)が可能なら全探索が安心。 LASSO/Elastic Net も代替案。
| import statsmodels.api as sm, pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
num = df.select_dtypes(include='number').dropna()
X = sm.add_constant(num[['平均所得', '総人口', '高齢化率']])
y = num['持ち家比率']
res = sm.OLS(y, X).fit()
print('AIC =', res.aic)
print('BIC =', res.bic)
print('log-likelihood =', res.llf)
|
🅱️ scikit-learn では自分で計算(LinearRegression は AIC を持たない)
▼ コード解説(罰則項の意味(モデル複雑度))
🎯 解説: AIC = -2*log(L) + 2*k の 2*k 部分が「複雑さペナルティ」。 パラメータ数 k が増えるほど罰則が増える。
📥 入力例: k=1, 2, 3, ... での AIC 変化
📤 実行例: k=1: AIC=210
k=3: AIC=178(改善)
k=10: AIC=185(過学習)
💬 読み方: 罰則項がないと最尤推定は常に最大モデルを選ぶ。 AIC の 2k 項が「シンプルさへのバイアス」を与える。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | import numpy as np
from sklearn.linear_model import LinearRegression
X = num[['平均所得', '総人口', '高齢化率']].values
y = num['持ち家比率'].values
m = LinearRegression().fit(X, y)
resid = y - m.predict(X)
n, k = len(y), X.shape[1] + 1 # 切片を含めて k
sigma2 = (resid ** 2).mean()
loglik = -n/2 * (np.log(2*np.pi*sigma2) + 1)
aic = -2*loglik + 2*k
aicc = aic + 2*k*(k+1) / (n - k - 1)
bic = -2*loglik + np.log(n)*k
print(f'AIC={aic:.2f}, AICc={aicc:.2f}, BIC={bic:.2f}')
|
🅲 scipy.stats で正規分布の対数尤度を直接計算
▼ コード解説(AIC weight(Akaike weight))
🎯 解説: AIC weight w_i = exp(-0.5 Δ_i) / Σ exp(-0.5 Δ_j) でモデルの相対的支持度を確率化。
📥 入力例: 5 候補モデルの AIC
📤 実行例: M1 weight = 0.02
M2 weight = 0.85(最有力)
M3 weight = 0.13
💬 読み方: AIC weight 0.85 は「M2 が真のモデルである確率(相対的支持)が 85%」と解釈できる。 単一最良モデルが不安なときの指標。
| from scipy import stats
sigma = resid.std(ddof=0)
loglik2 = stats.norm(loc=0, scale=sigma).logpdf(resid).sum()
print('log-likelihood (scipy):', loglik2)
|
🅳 ベイズ階層モデルなら WAIC / LOO(arviz)
▼ コード解説(非線形モデル・GLM での AIC)
🎯 解説: ロジスティック回帰・ポアソン回帰でも AIC が使える。 -2*log(L) は自動計算される。
📥 入力例: ロジスティック回帰、 ポアソン回帰
📤 実行例: ロジスティック AIC=145.2
ポアソン AIC=132.5
→ ポアソンの方が当てはまり良い
💬 読み方: GLM では誤差分布の選択も AIC で判定可能。 ガウス vs ポアソン vs 負の二項分布の選択など。
| # 例:PyMC で組んだ trace に対して
# import arviz as az
# waic = az.waic(trace)
# loo = az.loo(trace)
# print(waic, loo)
|
📦 AIC ファミリー早見表
| 指標 |
罰則項 |
向く場面 |
| AIC | 2k | 予測誤差最小化、 n が大 |
| AICc | 2k + 2k(k+1)/(n-k-1) | 小標本(n/k < 40) |
| BIC | k log(n) | 真モデル選択、 n が大 |
| DIC | 事後平均偏差 + 有効パラ数 | ベイズ階層 |
| WAIC | 点ごとの対数事後予測密度 | ベイズ(汎用) |
| LOO-CV | leave-one-out 対数尤度和 | ベイズ・MCMC 安定 |