論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
BIC
Bayesian Information Criterion
モデル選択
別称: ベイズ情報量規準 / Schwarz情報量規準

🔖 キーワード索引

BICBayesian Information Criterionモデル選択ベイズ情報量規準Schwarz情報量規準

本ページは BIC(Bayesian Information Criterion)を多角的に解説します。 上のチップは、 検索・関連語の手がかりです。

bic criterion」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「bic criterion」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

bic criterion統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「bic criterion の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

モデルの良さを測る物差しです。

最適なモデルを選ぶために使います。

スマホのプラン選びのように比較します。

結論を短くまとめて紹介します。

💡 実務 Tips — 明日から使える 10 箇条

  1. 必ず複数モデルを比較: 「1 つのモデルの BIC 値」には意味がない
  2. ΔBIC で議論: 絶対値ではなく差で判断
  3. AIC も同時に計算: 結論が一致すれば信頼度高
  4. CV と併用: 異なる視点での検証
  5. BIC 重みを見る: 「2 位以下も無視できるか」を確認
  6. サンプル数 n の定義を明記: 階層・時系列で曖昧になりがち
  7. パラメータ数 k の数え方を明示: 切片、 分散項を含めるか
  8. 同じデータ・同じ目的変数で比較: 違うデータの BIC は比較不可
  9. ライブラリ間の定数差に注意: 同じ実装で再計算が安全
  10. 「BIC 最小 = 正解」とは思わない: ΔBIC<2 なら同等候補が複数

✅ BIC 使用前チェックリスト

⚙️ ライブラリ実装比較

環境APIBIC 定義
statsmodels (Python)model.bic$-2 \log L + k \log n$(標準)
sklearn GMM (Python)gm.bic(X)$-2 \log L + k \log n$(標準)
R lm/glmBIC(model)$-2 \log L + k \log n$(標準)
R forecast::auto.arima引数 ic='bic'状態空間モデル用に調整
SPSSOutput に "Schwarz BC"標準と若干違う場合あり
Stataestat ic標準
SAS PROC REGSBC オプション標準

同じデータでも、 ライブラリで定数項が異なる場合があります(特に切片・分散パラメータの数え方)。 同じ環境で再計算してから比較するのが安全。

💡 BIC を使うときの小ネタ集

📑 BIC 関連の主要論文(時系列)

  1. Akaike (1973): AIC の提案 — 情報量規準の出発点
  2. Schwarz (1978): BIC の導出 — Annals of Statistics, 6(2)
  3. Hannan & Quinn (1979): HQC の提案 — 時系列向け中間的規準
  4. Hurvich & Tsai (1989): AICc 補正 — 小標本対応
  5. Kass & Raftery (1995): Bayes Factors レビュー — BIC の理論的位置づけ
  6. Raftery (1995): BIC の社会科学応用 — ΔBIC 解釈基準
  7. Burnham & Anderson (2002): モデル選択の教科書 — BIC 重みの定式化
  8. Spiegelhalter et al. (2002): DIC の提案 — 階層モデル対応
  9. Chen & Chen (2008): EBIC の提案 — 高次元対応
  10. Watanabe (2010): WAIC の提案 — 特異モデル対応
  11. Vehtari et al. (2017): PSIS-LOO — 効率的な CV
  12. Gelman et al. (2014): BDA3 教科書 — BIC vs WAIC の現代的整理

🎓 BIC 適用事例集 — 多分野からの例

事例 1: 株価ボラティリティの GARCH 次数

日経平均の日次収益率に GARCH(p, q) を適用。 (1, 1), (2, 1), (1, 2), (2, 2) を BIC で比較し、 GARCH(1, 1) が選ばれることが多い。

事例 2: 顧客クラスタリングのクラスタ数

EC サイト顧客の購買履歴(RFM 分析)を GMM で K=2〜10 クラスタリング、 BIC で最適 K を決定。 マーケティングセグメンテーションの自動化。

事例 3: 生存解析のリスク因子選択

がん患者の生存時間データに Cox 回帰を適用、 候補リスク因子(年齢・性別・腫瘍ステージ等)から BIC で最重要因子を選択。

事例 4: 教育心理の潜在クラス分析

学習スタイル調査の応答パターンを LCA で分析、 「視覚型」「聴覚型」等のクラス数を BIC で決定。

事例 5: 気象データの ARIMA 予測

月別気温データに ARIMA(p, 1, q) × 季節成分を適用、 BIC で最適次数を選び、 1 年先まで予測。

事例 6: 言語モデルの n-gram 次数

n-gram 言語モデル(bigram, trigram, 4-gram)で BIC を計算、 シンプルな bigram が選ばれることが多い(特に小コーパス)。

🔮 BIC の未来 — 2026 年以降の展望

📊 SSDSE-B-2026 教材としての要約

本ページで紹介した SSDSE-B-2026 を使った BIC 演習は、 次の特徴があります:

同じ手順を、 自分の業務データ(売上・顧客・センサ等)に適用すれば、 「実務での BIC 活用」がそのまま身につきます。

🏁 結語

BIC は 1978 年の Schwarz 論文以来、 統計モデル選択の標準ツールとして君臨してきました。 ベイズ事後確率の漸近近似という美しい理論的根拠と、 「適合度 + ペナルティ」というシンプルな計算式の両方を備えており、 古典統計学とベイズ統計学の橋渡しとして稀有な存在です。 「真のモデルを選ぶ」という目的において、 AIC や交差検証では替えがたい役割を持っています。

本ページで紹介した SSDSE-B-2026 を使った演習は、 「モデル選択を数字で語る」感覚を養うのに最適です。 47 都道府県という親しみやすい題材で、 「過学習」「適合度ペナルティ」「AIC との違い」を体感してください。 BIC の理解は、 AIC・WAIC・交差検証など、 モデル選択全般への入口になります。 さらに、 ベイズ統計学・情報理論・モデル比較理論など、 統計学の中核領域への扉でもあります。

是非、 手元のデータで「BIC 重み付きアンサンブル」「ARIMA 自動次数選択」「GMM のクラスタ数決定」を試してください。 「データに語らせる」という統計学の本質的な楽しみを、 BIC は実現してくれます。

✅ 学習完了の最終確認

📌 最後のメッセージ

「モデル選択」は統計学・機械学習の永遠のテーマです。 BIC はその中で最も使われ、 最も理解しやすい指標の 1 つ。 ただし、 BIC は 万能ではないことも本ページで強調しました。 「予測性能」なら AIC や CV、 「階層モデル」なら DIC、 「高次元」なら EBIC、 「特異モデル」なら WAIC — それぞれの場面に最適な道具を選ぶ目を養うことが、 真のデータサイエンティストへの道です。

BIC を入口として、 モデル選択・統計推論・ベイズ統計学・情報理論の奥深い世界に踏み出してください。 SSDSE-B-2026 という公開データを使った演習が、 その一助となれば幸いです。 「シンプルなモデルは美しい」という Occam の剃刀の精神を、 BIC は数学的に体現しています。

Data scientists, statisticians, applied researchers — BIC is a tool you will use many times throughout your career. Master it now, and it will serve you well.

📍 文脈 — どこで使う概念か

🍰 まずはやさしく

モデルを選ぶための道具です。

どの分析方法が正しいか決めます。

部活の成績をどう分析するか選びます。

どんな場面で使うかを見ていきましょう。

BIC(Bayesian Information Criterion, ベイズ情報量規準)は、 1978 年に Schwarz が提案した モデル選択の標準ツール。 回帰、 時系列、 混合分布、 隠れマルコフモデル等の比較で広く使われます。 AIC と並ぶ二大選択基準で、 BIC は真のモデル選択、 AIC は予測性能と棲み分けるのが一般的理解です。

🎨 直感で掴む — 具体例で理解する

🍰 まずはやさしく

シンプルさと正確さのバランスです。

複雑すぎる分析を防ぐために使います。

買い物でコスパを考える感覚に似ています。

仕組みを具体例で分かりやすく説明します。

モデル選択の原理:

BIC は −2 log L(尤度の指標、 小さいほど適合度が良い)に、 k log n(パラメータ数 × log(サンプル数) のペナルティ)を足します。 これを 最小化するモデルを選ぶ。

AIC のペナルティは 2k で、 BIC の k log n よりも軽い。 サンプル数 n=100 なら log(100)≈4.6 で、 BIC は AIC の 2.3 倍厳しいことになります。

🎨 もう一歩深く — BIC が何を最小化しているか

BIC は表面的には「適合度 + 複雑さペナルティ」ですが、 ベイズの定理から導出される深い意味があります。 Schwarz (1978) の元論文では、 モデルの事後確率 $P(\mathcal{M} \mid \text{data})$ を最大化することと、 BIC 最小化が漸近的に等価であることが示されました。

具体的には、 ベイズ因子(Bayes Factor)$B_{12}$ — 2 つのモデル $\mathcal{M}_1, \mathcal{M}_2$ のどちらが「真らしいか」の比 — について、 サンプル数 $n \to \infty$ で:

【Schwarz の近似】
$$-2 \log B_{12} \approx \mathrm{BIC}_1 - \mathrm{BIC}_2$$
BIC の差が、 ベイズ因子の対数(の -2 倍)を近似する

つまり「BIC が 10 小さい」とは、 ベイズ因子で言えば「$e^5 \approx 148$ 倍そのモデルが真らしい」という意味。 Raftery(1995)の解釈ガイド:

$\Delta$BICベイズ因子証拠の強さ
0-21-3言うほどでない
2-63-20正しいかもしれない
6-1020-150強い証拠
10+150+決定的な証拠

この対応表が、 BIC の「数値の意味」を直感的に教えてくれます。

🎨 BIC 結果を可視化するテクニック

モデル数 vs BIC のプロット

候補モデルを「変数数 k」順に並べ、 各モデルの BIC を点で表示。 「U 字形カーブ」が見えれば最適 k が明らか。

AIC vs BIC の比較プロット

同じ x 軸(k)に AIC と BIC を重ねる。 AIC は緩く、 BIC は厳しい曲線になることが視覚化される。

BIC 重みの棒グラフ

上位 5-10 モデルの BIC 重みを棒グラフに。 「1 モデルが圧倒」か「複数が拮抗」かが一目瞭然。

ΔBIC のヒートマップ

変数の有無を行列で表現、 各セルに ΔBIC を色付き表示。 全部分集合の構造が見える。

時系列モデルの BIC サーフェス

ARIMA(p, q) の (p, q) ∈ {0,1,2,3}² で BIC を計算、 9 マスのヒートマップ。 最小マスが推奨次数。

📐 定義・数式

🍰 まずはやさしく

計算式で表した評価基準です。

数値でモデルの良さを判定します。

テストの点数のように計算して比べます。

詳しい式と意味について解説します。

【BIC の定義】
$$\mathrm{BIC} = -2 \log L + k \log n$$
$L$ = 最大尤度、 $k$ = パラメータ数、 $n$ = サンプル数

AIC との比較:

【AIC】
$$\mathrm{AIC} = -2 \log L + 2k$$
ペナルティが定数 2k なのが BIC との違い

📐 理論深掘り — Schwarz の元論文と漸近的導出

Schwarz (1978, Annals of Statistics) は、 モデル比較における 事後確率から BIC を導出しました。 ベイズ的にモデル $\mathcal{M}_k$ の事後確率は:

【事後確率】
$$P(\mathcal{M}_k \mid \text{data}) \propto P(\text{data} \mid \mathcal{M}_k) P(\mathcal{M}_k)$$
事前確率 × 周辺尤度

周辺尤度(evidence, marginal likelihood)は:

【周辺尤度】
$$P(\text{data} \mid \mathcal{M}_k) = \int P(\text{data} \mid \theta, \mathcal{M}_k) P(\theta \mid \mathcal{M}_k) d\theta$$
パラメータ $\theta$ について積分(パラメータ不確実性を平均化)

この積分を Laplace 近似(最尤推定値の周りで二次近似)すると:

【Laplace 近似】
$$\log P(\text{data} \mid \mathcal{M}_k) \approx \log L - \frac{k}{2} \log n + O(1)$$
$O(1)$ 項は $n \to \infty$ で無視できる

両辺に $-2$ を掛けると:

【BIC の導出】
$$-2 \log P(\text{data} \mid \mathcal{M}_k) \approx -2 \log L + k \log n = \mathrm{BIC}$$
周辺尤度の対数の -2 倍が BIC(漸近的に)

これが BIC の ベイズ的解釈です。 「BIC を最小化する」≈「事後確率を最大化する」≈「最も真らしいモデルを選ぶ」。 この理論的正当化が、 BIC を強力にしています。

一致性(Consistency)

BIC は 漸近的一致性を持ちます:「真のモデルが候補に含まれているなら、 $n \to \infty$ で必ず真のモデルが選ばれる確率が 1 に収束」。 AIC は一致性を持たず、 過剰な変数を含めがち。 この性質が、 「真のモデル発見」を目的とするときの BIC の優位性。

予測性能との関係

逆に AIC は、 「平均的な予測誤差を最小化する」観点で優れます。 BIC が選ぶシンプルなモデルは、 適合は弱いが 過学習が少ない。 「真のモデルを探す」vs「予測を良くする」という目的の違いが、 BIC vs AIC の使い分けを決めます。

🆚 AIC vs BIC — どう選ぶか詳細比較

項目AICBIC
提案者赤池弘次(1973)Schwarz(1978)
ペナルティ$2k$$k \log n$
理論的基礎KL 発散最小化事後確率最大化
目的予測性能真のモデル選択
一致性×(過剰選択)○(漸近的一致)
効率性○(予測誤差最小)
サンプル依存定数$\log n$ で増加
小標本AICc 補正版が必要そのまま使える
選びがちなモデル複雑寄りシンプル寄り
予測誤差低い(汎化)やや高い
解釈性低い高い(シンプル)

使い分けの原則

📐 BIC と AIC を並べて読み解く — 数式を言葉で読み解く

$$\text{BIC} = -2\ln L + k \ln n, \qquad \text{AIC} = -2\ln L + 2k$$

この二式を言葉で読み解くと、 共通項 $-2\ln L$ は「対数尤度の悪さ(モデルがデータを説明できないペナルティ)」、 そして第 2 項がパラメータ数 $k$ に対する罰則だ。 AIC は $2k$ で固定だが、 BIC は $k \ln n$ で標本サイズに応じて重くなる。 SSDSE-B-2026 の都道府県データ(n=47)では $\ln 47 \approx 3.85$、 つまり BIC の罰則は AIC の約 1.9 倍。 n=1000 のミクロデータなら $\ln 1000 \approx 6.91$、 罰則比は約 3.5 倍と急上昇する。 BIC が「サンプルが大きいほどシンプル志向」と言われる理由は、 ここに集約されている。

n $\ln n$ BIC 罰則/k AIC 罰則/k BIC/AIC 比
102.302.302.001.15
47 (SSDSE)3.853.852.001.93
1004.614.612.002.30
1,0006.916.912.003.45
10,0009.219.212.004.61

このコードでやること: SSDSE-B-2026(2023 年度)の 1 世帯あたり光熱・水道費(L322103)を被説明変数に、 実在する気候・経済指標を 1 個 → 5 個と増やして OLS を推定し、 AIC と BIC を同時にプロットして「どこで罰則が拮抗するか」を見る。

📥 入力データ (SSDSE-B-2026 / 2023 年度・実測値):

都道府県 光熱水道費(L322103) 気温(B4101) 降水日数(B4106) 消費支出(L3221) 総人口(A1101) 婚姻件数(A9101) 北海道 28,337 11.0 125 296,888 5,092,000 17,281 青森県 30,475 12.6 170 263,371 1,184,000 3,326 東京都 22,761 17.6 90 341,320 14,086,000 71,774 沖縄県 20,869 23.8 124 251,222 1,468,000 6,316 ... ... ... ... ... ... ... (全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
d = df[df['SSDSE-B-2026'] == 2023].dropna()
y = d['L322103']
features = ['B4101', 'B4106', 'L3221', 'A1101', 'A9101']

rows = []
for k in range(1, len(features) + 1):
    X = sm.add_constant(d[features[:k]])
    m = sm.OLS(y, X).fit()
    rows.append({'k_features': k, 'AIC': m.aic, 'BIC': m.bic})

print(pd.DataFrame(rows).to_string(index=False))

📤 実行すると次の出力が得られる:

k_features AIC BIC 1 848.85 852.55 2 838.77 844.32 3 833.82 841.22 4 835.61 844.86 5 837.56 848.66

💬 AIC・BIC ともに k=3 で最小(気温 + 降水日数 + 消費支出の 3 変数)、 k=4 以降は両指標とも増加に転じる。 SSDSE-B-2026 (n=47) では BIC の罰則が AIC の約 1.93 倍で、 今回は両者が同じモデルを選んだ。 ただし k=3 と k=4 の差を見ると、 BIC は +3.64、 AIC は +1.79 と BIC が約 2 倍厳しく罰則をかけており、 サンプルが大きくなるほどこの差は拡大する。 「BIC は真のモデルに収束する一致性」「AIC は予測誤差最小の効率性」という性質の違いを、 罰則項の係数だけで読み解ける。

🖼 補足: BIC を「サンプルサイズ依存の罰則」として直感する

BIC は AIC と並ぶ「モデル選択基準」だが、 罰則項に log(n) を含むため サンプルサイズが大きくなるほどパラメータ数の多いモデルを厳しく排除する。 ここでは 3 枚の図と 1 つの Python 実装で、 BIC の挙動を可視化する。

図 1: 残差分布と尤度の関係(hist_basic.png)

BIC の根幹は 対数尤度 である。 残差が正規分布に近いほど対数尤度は大きくなり BIC は小さくなる。 ヒストグラムで残差の形状をまず確認することが BIC 計算の前提となる。

残差ヒストグラム

図 2: モデル複雑度とフィット(ols_basic.png)

線形回帰モデルにパラメータを追加するほどフィット(RSS 低下)は改善するが、 BIC は k·log(n) の罰則で抑制する。 単純な OLS の図で「フィットの改善が罰則を上回るか」のトレードオフを直感的に掴む。

OLS フィット概念

図 3: 正則化との対比(reg_ridge_lasso.png)

BIC は「離散的な変数選択」、 Ridge/Lasso は「連続的な係数収縮」という別アプローチでオーバーフィットに対抗する。 図は係数空間での収縮の様子を示しており、 BIC が選ぶ「サブセットモデル」と Lasso が選ぶ「スパース解」の違いを比較する助けになる。

Ridge/Lasso 比較

📊 表: BIC と他のモデル選択基準の比較

基準罰則項性質n→∞ で選ぶモデル
AIC2k予測誤差最小(効率性)真のモデルに収束しない
BICk·log(n)真のモデル収束(一致性)真のモデルに収束する
AICc2k + 2k(k+1)/(n-k-1)小標本補正AIC に漸近
HQC2k·log(log(n))AIC と BIC の中間真のモデルに収束する
DIC有効パラメータ数ベイズ階層モデル用事前分布に依存
WAIC事後分散ベースベイズ予測一般化真の予測分布に収束

🐍 Python 実装: BIC の罰則がサンプル数で変わる様子

このコードでやること: SSDSE-B-2026 の 47 都道府県データで、 サンプルサイズ n を 10, 47, 200, 1000 と変化させたときに BIC の罰則項 k·log(n) がどう変化するか計算する。

📥 入力データ (SSDSE-B-2026 抜粋):

SSDSE-B-2026 Code Prefecture L322103(光熱・水道費) 2023 R01000 北海道 28,337 2023 R13000 東京都 22,761 2023 R47000 沖縄県 20,869 ...(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
ns = [10, 47, 200, 1000]
ks = [1, 2, 3, 4, 5]
for n in ns:
    for k in ks:
        penalty = k * np.log(n)
        print(f'n={n} k={k} 罰則=k·log(n)={penalty:.2f}')

📤 実行すると次の出力が得られる:

n=10 k=1 罰則=k·log(n)=2.30 n=10 k=5 罰則=k·log(n)=11.51 n=47 k=1 罰則=k·log(n)=3.85 n=47 k=5 罰則=k·log(n)=19.25 n=200 k=1 罰則=k·log(n)=5.30 n=200 k=5 罰則=k·log(n)=26.49 n=1000 k=1 罰則=k·log(n)=6.91 n=1000 k=5 罰則=k·log(n)=34.54

💬 サンプル数が n=10 → n=1000 に増えると罰則は log(1000)/log(10) ≈ 3 倍に。 つまり「大標本ではパラメータ追加への壁が約 3 倍厚くなる」。 SSDSE の n=47 では AIC(罰則 2k)の 1.93 倍だが、 全国市町村データ (n=1741) では 7.46 / 2 = 3.73 倍にまで拡大する。 BIC の「大標本で真のモデルに収束する一致性」はこの罰則の挙動から来ている。

✅ 理解度チェック (BIC)

  1. BIC の罰則項は AIC と比べてどのような点で「サンプルサイズに依存」するか、 一行で説明できますか?
  2. n=100 のとき、 パラメータが 1 つ増えたときに BIC が増加する量は何か? (AIC との差も計算してみよう)
  3. 「AIC は予測誤差最小、 BIC は真のモデル収束」という違いは、 罰則項のどの部分から来ているか?
  4. SSDSE-B-2026 (n=47) で「BIC で k=2 が最小」なら、 都道府県データに対して何変数モデルが選ばれたことを意味しますか?
  5. BIC とベイズ的事後確率の対応(ラプラス近似の意味)を 50 字以内で述べてみよう。

⚠️ BIC を実務で使うときの落とし穴 (3 件)

📜 BIC の歴史的背景と理論的位置づけ

BIC は 1978 年に Gideon Schwarz が論文 "Estimating the Dimension of a Model" で提案したため、 「Schwarz Bayesian Criterion(SBC)」あるいは「Schwarz 基準」とも呼ばれる。 Schwarz の出発点は、 ベイズの定理から事後モデル確率 P(M|D) を計算し、 そのラプラス近似(Laplace approximation)として周辺尤度 P(D|M) の対数を log L̂ - (k/2)·log(n) + O(1) と表現することにあった。 ここから定数項と符号を整理して BIC = -2·log L̂ + k·log(n) という形式が導かれる。 つまり BIC は「ベイズ的事後確率最大のモデル」を選ぶことに(漸近的には)等価であり、 一様な事前分布を仮定したとき真のモデルに確率 1 で収束するという「一致性(consistency)」を持つ。 一方、 1973 年に赤池弘次が提案した AIC は「予測誤差最小化」(Kullback-Leibler 情報量最小化)を目的としており、 サンプル数を増やしても真のモデルに収束しない代わりに、 予測精度の観点では効率的(efficient)である。 つまり BIC と AIC は「真のモデル発見 vs 予測誤差最小化」という別目的の指標であり、 どちらを使うかは分析者の目的に依存する判断となる。

🧪 BIC を用いた変数選択の実務手順

実務で BIC を変数選択に使う標準手順は以下のとおり。 (1) すべての候補変数を列挙し、 主要な変数組み合わせ(2^k 通り、 ただし k が大きいときは前向き選択や後向き選択を併用)を実行する。 (2) 各モデルで最尤推定または OLS を実行し、 対数尤度 log L̂ を取得する。 (3) BIC = -2·log L̂ + k·log(n) を計算し、 最小の BIC を持つモデルを選ぶ。 (4) BIC 差が ΔBIC ≤ 2 程度のモデルは「証拠が弱い」とみなし、 複数モデルを併記する場合もある。 (5) 選ばれたモデルで残差診断(残差プロット、 QQ プロット、 Cook の距離)を実施し、 仮定の妥当性を確認する。 (6) BIC で選ばれたモデルが本当に予測精度を高めるかは別問題なので、 交差検証で予測 RMSE を併記するのが理想。

🔬 BIC の事後モデル確率としての解釈

BIC を単なる「罰則付き対数尤度」としてではなく、 「事後モデル確率の近似」として捉えると、 その意味がより明確になる。 ベイズの定理により、 データ D を観測したときの モデル M の事後確率は P(M|D) = P(D|M)·P(M) / P(D) である。 ここで P(D|M) = ∫ P(D|θ,M)·P(θ|M) dθ は周辺尤度(marginal likelihood)と呼ばれ、 多次元の積分を解くことに帰着する。 ラプラス近似により、 サンプル数 n が大きいときこの積分は log P(D|M) ≈ log L̂ - (k/2)·log(n) + O(1) と展開される。 ここから BIC = -2·log P(D|M) + O(1) という関係が成立し、 「BIC を最小化する = 事後モデル確率を最大化する」という解釈が得られる。 さらに 2 つのモデル M1, M2 の BIC 差 ΔBIC = BIC2 - BIC1 はベイズ因子の対数近似(Kass and Raftery 1995)と関連し、 おおよそ BF12 ≈ exp(ΔBIC/2) となる。 経験的には ΔBIC > 10 なら「非常に強い証拠」、 6 < ΔBIC ≤ 10 なら「強い証拠」、 2 < ΔBIC ≤ 6 なら「正の証拠」、 ΔBIC ≤ 2 なら「区別不能」と判断される(Raftery 1995)。 この対応表は社会科学・経済学・生物学などでモデル比較の標準として広く受け入れられている。

💡 SSDSE-B-2026 を用いた BIC モデル選択のケーススタディ

SSDSE-B-2026(47 都道府県データ、 n=47)を題材に、 1 世帯あたりの光熱・水道費(L322103)を予測するモデルを BIC で選ぶケースを考える。 候補となる説明変数は (1) 年平均気温、 (2) 降水日数、 (3) 消費支出、 (4) 総人口、 (5) 婚姻件数、 (6) 高齢人口の 6 つとする(いずれも SSDSE-B-2026 に実在する列)。 これら 6 変数のすべての組み合わせは 2^6 = 64 通り存在する。 完全列挙して各モデルの BIC を計算し、 最小値を持つモデルを最良モデルとする。 実データで計算すると「年平均気温 + 降水日数 + 消費支出」の 3 変数モデルが最小 BIC(841.22)を示す。 これは寒冷地ほど暖房で光熱費が上がり(気温の効果)、 気候(降水日数)と世帯全体の支出規模(消費支出)が加わると当てはまりが着実に改善するためである。 一方、 総人口・婚姻件数・高齢人口といった「人口規模の列」を足しても対数尤度はほとんど改善せず、 BIC の罰則 k·log(47) = 3.85k がそれを上回る。 これは 1 世帯あたりの平均額が都道府県の人口規模とほぼ無関係だからである。 結果として、 世帯光熱費を予測する最も簡潔なモデルは「気温 + 降水日数 + 消費支出の 3 変数」となる。 これは Occam の剃刀(最も単純な説明を選ぶ)と整合的であり、 BIC が持つ理論的性質(一致性)が実データで活きる典型例である。 ただし、 BIC で除外された変数が「無意味」というわけではなく、 「追加の説明力が罰則を上回らない」というだけである点には注意したい。

🔬 記号・要素の読み解き

$L$(最大尤度)
「このモデルが、 このデータを生み出す確率」の最大値
$-2 \log L$
適合度の指標。 小さいほどモデルがデータに合っている
$k$
モデルが推定したパラメータの個数
$\log n$
サンプル数の対数。 $n$ が増えるほどペナルティが強くなる
$k \log n$
パラメータ数 $\times$ サンプル数の対数 = BIC のペナルティ項

🔬 数式を言葉で読み解く — BIC の各項の意味

BIC の式:

【BIC の定義】
$$\mathrm{BIC} = -2 \log L + k \log n$$
最大尤度 $L$、 パラメータ数 $k$、 サンプル数 $n$

第 1 項 $-2 \log L$ — 適合度

「モデルがデータを説明する度合い」を表します。 尤度 $L$ は 「このモデルが、 このデータを生成する確率」。 値が大きいほど良い適合だが、 慣習として $-2 \log$ を取り、 「小さいほど良い」尺度に変換します。 これは deviance(逸脱度)と呼ばれ、 統計学では標準的。

第 2 項 $k \log n$ — 複雑さペナルティ

パラメータ数 $k$ が増えるほど、 モデルは複雑になり、 過学習リスクが上がる。 そのペナルティを $\log n$ の係数で表現。 サンプル数 $n$ が大きいほどペナルティが強くなる(パラメータの追加に対して厳しくなる)。

具体例:$n=100$ で $\log n \approx 4.6$、 $n=1000$ で $\log n \approx 6.9$、 $n=10000$ で $\log n \approx 9.2$。 サンプル数が 10 倍になっても、 ペナルティ係数は 1.5 倍程度の緩やかな増加。

AIC との対比

【AIC との違い】
$$\mathrm{AIC} = -2 \log L + 2k,\quad \mathrm{BIC} = -2 \log L + k \log n$$
$\log n > 2$ が成り立つのは $n \ge 8$ から。 通常のデータでは BIC のペナルティが必ず重い

AIC のペナルティは 定数 $2k$、 BIC は $k \log n$。 $n=100$ なら BIC のペナルティは AIC の 2.3 倍。 $n=1000$ なら 3.45 倍。 サンプルが大きいほど、 BIC は シンプルなモデルを選びがちです。

最小化の意味

BIC を最小化することは、 「適合度を上げる」と「複雑さを下げる」のトレードオフで最適点を探すこと。 純粋に「適合度だけ」見ると 必ず複雑モデルが勝つ(過学習)。 BIC は パラメトリックな正則化として機能します。

🔬 BIC の派生・拡張

EBIC(Extended BIC、 Chen & Chen 2008)

【EBIC】
$$\mathrm{EBIC} = -2 \log L + k \log n + 2 \gamma \log \binom{p}{k}$$
$p$ は候補変数数、 $\gamma \in [0, 1]$ は追加ペナルティ

$p \gg n$ の高次元データで、 BIC では選びすぎる問題に対処。 ゲノミクス・テキスト解析で使われます。

DIC(Deviance Information Criterion)

【DIC】
$$\mathrm{DIC} = -2 \log L(\bar{\theta}) + 2 p_D$$
$p_D$ は「実効パラメータ数」(MCMC で推定)

階層ベイズモデル・MCMC 推定で使う BIC のベイズ版。 階層構造で「真のパラメータ数」が曖昧な場合に対応。

WAIC(Widely Applicable IC、 渡辺 2010)

【WAIC】
$$\mathrm{WAIC} = -2 \sum_i \log \mathbb{E}[p(y_i \mid \theta)] + 2 V_i$$
$V_i$ は対数尤度の事後分散

特異モデル(混合モデル、 ニューラルネット等)でも一致性を持つ。 通常の AIC / BIC が機能しない場合の救世主。

QIC(Quasi-likelihood IC)

GEE(Generalized Estimating Equations)など、 完全な尤度が定義できないモデルでの BIC 相当物。

CAIC(Consistent AIC)

$-2 \log L + k(\log n + 1)$。 BIC より少し厳しいペナルティで一致性を保証。

Hannan-Quinn IC

$-2 \log L + 2k \log \log n$。 AIC と BIC の中間。 時系列解析でよく使われる。

📝 演習問題

演習 1: 異なる目的変数で BIC を比較

SSDSE-B-2026 で、 「総人口(A1101)」「出生数(A4101)」「婚姻件数(A9101)」をそれぞれ目的変数にして同じ説明変数群で重回帰し、 BIC 最小モデルがどう変わるか確認。

演習 2: 対数変換の効果

人口を log 変換して回帰してから BIC を計算。 変換しないモデルと BIC が比較可能か検討。

演習 3: GMM のクラスタ数

SSDSE-B-2026 の 47 都道府県を 3 変数で GMM クラスタリング、 K=1〜10 で BIC を計算し最適 K を見つけよ。

演習 4: AIC との選好差

SSDSE データの一部(n=10, 20, 30, 47)で同じモデル比較を行い、 AIC と BIC の選好差をプロット。 サンプル数依存を確認。

演習 5: BIC 重みでのアンサンブル予測

複数モデルの BIC 重みを使って、 47 都道府県の予測値を平均化。 単一最良モデルとの予測誤差を比較。

演習 6: ARIMA モデルの (p, q) 選択

SSDSE-B-2026 の時系列データ(例:年度別総人口推移)で ARIMA(p, 1, q) の (p, q) ∈ {0, 1, 2, 3}² で BIC を計算、 最適次数を選択。

演習 7: 非線形項の追加

「人口の二乗」「対数」など非線形項を追加すると、 BIC が下がるか調査。 過学習との線引きを意識。

演習 8: ロジスティック回帰の BIC

「都市/地方」の二値分類で BIC を使い、 変数選択。 線形回帰との違いを観察。

❓ FAQ — BIC に関するよくある質問

Q1. BIC と AIC、 どちらが正解?
A. 目的が違うため、 「正解」はない。 真のモデル選択 → BIC、 予測性能 → AIC、 という棲み分け。 不確実なら両方計算して比較。

Q2. BIC の値が負になることがある?
A. はい。 BIC の絶対値に意味はなく、 モデル間の差だけが意味を持ちます。 ライブラリによっては符号を反転していることもあるので注意。

Q3. 違うデータセットで BIC を比較できる?
A. できない。 BIC は同じデータでのモデル比較のための指標。 異なるデータの BIC を直接比べてはいけない。

Q4. BIC で機械学習モデル(決定木、 RF 等)を比較できる?
A. 困難。 これらは尤度が明示的に定義されない場合が多く、 厳密な BIC 計算は不可。 代わりに交差検証を使う。

Q5. 正則化(Lasso)と BIC の関係は?
A. Lasso のチューニングパラメータを BIC で選ぶ研究がある(BIC-Lasso)。 ただし高次元では EBIC のほうが信頼性高い。

Q6. クロスバリデーション(CV)との違いは?
A. BIC は 理論ベース(漸近近似)、 CV は データ駆動。 小標本では CV が安定、 大標本では BIC が高速。

Q7. BIC で正則化パラメータ λ を選ぶ?
A. はい、 可能。 Lasso/Ridge の各 λ で BIC を計算、 最小値の λ を採用。 ただし「実効的パラメータ数」の計算が必要。

Q8. 階層モデルでの BIC は信頼できる?
A. 古典的 BIC は階層構造を扱えない。 DICWAIC を使うべき。

📊 SSDSE-B-2026 を使った BIC 教材展開

演習 1(基礎): 単回帰 vs 重回帰の BIC

「人口を出生数だけで説明」vs「出生数 + 婚姻件数で説明」の 2 モデルを BIC で比較。 初学者向け。

演習 2(中級): ARIMA で都道府県人口推移

SSDSE-B-2026 の 2018-2023 年度データから、 各都道府県の人口時系列で ARIMA を当て、 (p, d, q) を BIC で選択。

演習 3(中級): GMM クラスタリング

47 都道府県を 3-5 次元の社会経済指標で GMM クラスタリング、 BIC で最適 K を決定。

演習 4(上級): ベイジアンネットワーク

「人口 → 婚姻 → 出生 → 高齢化」のような因果グラフを pgmpy で構築、 BIC スコアで最適構造を探索。

演習 5(上級): モデル平均化での予測

BIC 重みで複数の回帰モデルを平均化し、 「未来の都道府県人口」を予測。 単一最良モデルとの精度比較。

📋 BIC チートシート

公式まとめ

指標公式
BIC$-2 \log L + k \log n$
AIC$-2 \log L + 2k$
AICc$-2 \log L + 2k + 2k(k+1)/(n-k-1)$
HQC$-2 \log L + 2k \log \log n$
EBIC$-2 \log L + k \log n + 2\gamma \log \binom{p}{k}$

ΔBIC の解釈(Raftery 1995)

ΔBIC意味
0-2言うほどでない(事実上同等)
2-6正しいかもしれない
6-10強い証拠
10+決定的な証拠

BIC 重み(Burnham & Anderson 2002)

【モデル $i$ の重み】
$$w_i = \frac{\exp(-\Delta\mathrm{BIC}_i / 2)}{\sum_j \exp(-\Delta\mathrm{BIC}_j / 2)}$$
合計が 1 になる確率重み。 アンサンブル予測に利用

Python の主要 API

ライブラリAPI
statsmodels (回帰)OLS(y, X).fit().bic
statsmodels (ARIMA)ARIMA(y, order=(p,d,q)).fit().bic
sklearn (GMM)GaussianMixture(K).fit(X).bic(X)
sklearn (BayesianGaussianMixture)自動 K 選択
R (lm)BIC(model)
R (forecast)auto.arima(y, ic='bic')

📝 専門用語ミニ辞典

尤度(Likelihood)
パラメータ θ のもとでデータ y が生成される確率 $P(y \mid \theta)$
最大尤度推定(MLE)
尤度を最大にする θ を選ぶ推定法
対数尤度
$\log L$。 計算しやすいので慣習的に使う
逸脱度(Deviance)
$-2 \log L$。 BIC の第 1 項
パラメータ数 k
モデルが推定する自由パラメータの個数
事後確率
$P(\mathcal{M} \mid \text{data})$。 BIC がベイズ的に近似する量
周辺尤度(Evidence)
$P(\text{data} \mid \mathcal{M}) = \int P(\text{data}\mid\theta) P(\theta) d\theta$
ベイズ因子
$P(\text{data} \mid \mathcal{M}_1) / P(\text{data} \mid \mathcal{M}_2)$。 BIC で近似
一致性(Consistency)
$n \to \infty$ で真のモデルを選ぶ確率が 1 に収束
効率性(Efficiency)
予測誤差を漸近的に最小化する性質
Laplace 近似
事後分布をガウスで近似する手法。 BIC の導出基礎
過剰モデル(Overfitting Model)
パラメータが多すぎて訓練データに過適合
過少モデル(Underfitting Model)
パラメータが少なすぎてデータを説明しきれない
BIC 重み
$w_i \propto \exp(-\Delta\mathrm{BIC}_i / 2)$、 モデル平均化に使用
Schwarz Criterion
BIC の別名(提案者 Gideon Schwarz に因む)

📖 必読文献

原典

教科書

主要論文

日本語教材

🧮 数値例・実値計算

例:3 つの回帰モデルを n=100 のデータで比較:

モデル変数数 k−2 log LBIC選択
単回帰(k=2)2180180 + 2×4.6 = 189.2
重回帰(k=5)5150150 + 5×4.6 = 173.0
重回帰(k=10)10140140 + 10×4.6 = 186.0

k=10 は適合度は最高だが、 ペナルティで負ける。 k=5 が BIC 最小で 選択される。

🧮 SSDSE-B-2026 で実値計算 — 世帯光熱費を説明する回帰モデルの BIC 比較

SSDSE-B-2026 の 47 都道府県データを使い、 「1 世帯あたり光熱・水道費(L322103)を何の変数で説明できるか」を BIC で評価します。 説明変数の候補:

列コード意味
B4101年平均気温
B4106降水日数(年間)
L3221消費支出(二人以上の世帯)
A1101総人口
A9101婚姻件数
A130365歳以上人口

モデル候補

モデル説明変数(数 k)
M1年平均気温のみ(k=2)
M2気温 + 降水日数(k=3)
M3気温 + 降水日数 + 消費支出(k=4)
M4上記 + 総人口(k=5)
M5上記 + 婚姻件数(k=6)
M6全 6 変数(k=7)

n=47 なので $\log n \approx 3.85$。 各モデルの BIC は次のように計算されます。

手計算で BIC 差を見る

仮に M3 が $-2 \log L = 240$、 M4 が $-2 \log L = 235$ なら:

M3: 240 + 4 × 3.85 = 240 + 15.4 = 255.4 M4: 235 + 5 × 3.85 = 235 + 19.25 = 254.25 → ΔBIC = 1.15 → 「ほぼ同等」(Raftery 基準) → 総人口を追加する根拠は弱い

尤度が 5 改善されてもペナルティで 3.85 増えるので、 実質改善は 1.15 のみ。 これは「決定的な差ではない」ので、 シンプルな M3 を選ぶのが BIC の推奨です。

🧮 数式に値を入れて手で計算する: BIC = -2 logL + k log n

合成データ (n=100) で 3 モデルの BIC を比較する。

Step 1: モデル別パラメータ

モデルlogLkBIC
M1-501104.61
M2-42293.21
M3-40393.82

Step 2: BIC 計算 (n=100, log n ≈ 4.605)

M1 BIC = -2×(-50) + 1×4.605 = 100 + 4.605 = 104.605 M2 BIC = -2×(-42) + 2×4.605 = 84 + 9.210 = 93.210 M3 BIC = -2×(-40) + 3×4.605 = 80 + 13.815 = 93.815 最小は M2 → 線形モデル選択 (AIC では M3 だが BIC は罰則強く M2)

🐍 Python で再現

1
2
3
4
5
6
7
import numpy as np
logL = np.array([-50, -42, -40])
k = np.array([1, 2, 3])
n = 100
bic = -2*logL + k*np.log(n)
print(f"BIC = {bic.round(3)}")
print(f"最良 index = {bic.argmin()}")

📤 実行結果

BIC = [104.605 93.21 93.815] 最良 index = 1

💬 手計算 (Step 2) M2 が最良 (BIC=93.21) と Python 出力が完全一致。

🐍 Python 実装例

最小コードで動かしてみる例:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 B4101(年平均気温) B4106(降水日数(年間)) L322103(光熱・水道費(二人以上の世帯)) 北海道 11.0 125 28,337 東京都 17.6 90 22,761 沖縄県 23.8 124 20,869 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import statsmodels.api as sm
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()  # 47 都道府県(2023 年度)に絞る
X = sm.add_constant(df[['B4101', 'B4106']])
y = df['L322103']

model = sm.OLS(y, X).fit()
print(f'AIC = {model.aic:.2f}')
print(f'BIC = {model.bic:.2f}')
📤 実行例(実測) AIC = 838.77 BIC = 844.32

🐍 Python 実装 ① — SSDSE-B-2026 で複数モデルの BIC を比較

🎯 このコードでやること:SSDSE-B-2026 の 47 都道府県データから 6 変数の組み合わせで重回帰モデルを構築、 statsmodels の .bic 属性で各モデルの BIC を取得して最適モデルを選択します。

📥 入力データ(SSDSE-B-2026.csv 抜粋)

SSDSE-B-2026,Code,Prefecture,L322103,B4101,B4106,L3221,A1101,A9101,A1303 2023,R01000,北海道,28337,11.0,125,296888,5092000,17281,1681000 2023,R13000,東京都,22761,17.6,90,341320,14086000,71774,3205000 2023,R31000,鳥取県,25300,16.6,147,272599,537000,1810,179000 2023,R47000,沖縄県,20869,23.8,124,251222,1468000,6316,350000 (全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd
import statsmodels.api as sm

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

models = {
    'M1: 気温のみ':        ['B4101'],
    'M2: +降水日数':           ['B4101', 'B4106'],
    'M3: +消費支出':           ['B4101', 'B4106', 'L3221'],
    'M4: +総人口':             ['B4101', 'B4106', 'L3221', 'A1101'],
    'M5: +婚姻件数':             ['B4101', 'B4106', 'L3221', 'A1101', 'A9101'],
    'M6: 全 6 変数':          ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303'],
}

print(f'{"モデル":>20s} | {"AIC":>10s} | {"BIC":>10s} | {"R²":>6s}')
print('-' * 60)
for name, cols in models.items():
    X = sm.add_constant(df[cols])
    m = sm.OLS(y, X).fit()
    print(f'{name:>20s} | {m.aic:>10.2f} | {m.bic:>10.2f} | {m.rsquared:>6.3f}')

📤 実行例(出力)

モデル | AIC | BIC | R² ------------------------------------------------------------ M1: 気温のみ | 848.85 | 852.55 | 0.606 M2: +降水日数 | 838.77 | 844.32 | 0.695 M3: +消費支出 | 833.82 | 841.22 | 0.737 ← BIC 最小 M4: +総人口 | 835.61 | 844.86 | 0.738 M5: +婚姻件数 | 837.56 | 848.66 | 0.739 M6: 全 6 変数 | 837.85 | 850.80 | 0.748

💬 結果の読み方: BIC 最小は M3(気温 + 降水日数 + 消費支出、 k=4)で 841.22。 M6(全変数)は R² が 0.748 と最高だがペナルティで負け、 BIC は 850.80。 気温・降水・消費支出の 3 変数以降に総人口・婚姻件数・高齢人口を足しても、 1 世帯あたりの平均額はそれら人口規模の列とほぼ無関係で R² はほぼ横ばい(0.737→0.748)なのに BIC は上がる。 「変数を増やしすぎると BIC で罰せられる」という典型例。 AIC でも M3 が最小で、 M4-M6 の悪化幅は BIC ほど大きくない(AIC のペナルティが緩い)。

🐍 Python 実装 ② — Forward Selection で BIC 最小化

🎯 このコードでやること:候補変数 6 個から、 BIC が最も下がる変数を 1 つずつ追加していく 前進選択法を実装し、 BIC 基準での最適モデル発見の自動化を体験します。

📥 入力データ: 上の df, y と候補変数リスト。

 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
import statsmodels.api as sm

candidates = ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303']
selected = []
best_bic = float('inf')

print('--- Forward Selection by BIC ---')
while True:
    found = False
    for c in candidates:
        if c in selected:
            continue
        trial = selected + [c]
        X = sm.add_constant(df[trial])
        m = sm.OLS(y, X).fit()
        if m.bic < best_bic:
            best_bic = m.bic
            best_var = c
            found = True
    if not found:
        break
    selected.append(best_var)
    print(f'追加: {best_var:>8s}  → BIC={best_bic:.2f}, vars={selected}')

print(f'\n最終選択: {selected}  (BIC={best_bic:.2f})')

📤 実行例(出力)

--- Forward Selection by BIC --- 追加: B4101 → BIC=852.55, vars=['B4101'] 追加: B4106 → BIC=844.32, vars=['B4101', 'B4106'] 追加: L3221 → BIC=841.22, vars=['B4101', 'B4106', 'L3221'] (これ以上 BIC が下がらないため停止) 最終選択: ['B4101', 'B4106', 'L3221'] (BIC=841.22)

💬 結果の読み方: 前進選択で「気温・降水日数・消費支出」の 3 変数が選ばれ、 これ以上追加しても BIC は下がりません。 全変数 6 個を試した上のセクション(M3)と同じ結論で、 網羅探索(下記)とも一致します。 BIC は変数選択の 自動化に使われる定番です。 ただし変数間の相関や因果関係を考慮しないため、 専門知識による事後判断が必須。

🐍 Python 実装 ③ — AIC vs BIC のサンプル数依存

🎯 このコードでやること:SSDSE-B-2026 の 47 都道府県をサブサンプリングして n=10, 20, 30, 47 と変えていき、 「同じデータで n が変わると AIC と BIC の選好がどう変わるか」を確認します。

📥 入力データ: 上の df をサンプリング。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import statsmodels.api as sm

models_test = {
    'k=2 (1 変数)': ['B4101'],
    'k=4 (3 変数)': ['B4101', 'B4106', 'L3221'],
    'k=7 (6 変数)': ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303'],
}

for n in [10, 20, 30, 47]:
    df_sub = df.sample(n=n, random_state=0)
    y_sub = df_sub['L322103']
    print(f'\n--- n={n} ---')
    print(f'{"モデル":>14s} | {"AIC":>9s} | {"BIC":>9s} | {"BIC-AIC":>9s}')
    for name, cols in models_test.items():
        X = sm.add_constant(df_sub[cols])
        m = sm.OLS(y_sub, X).fit()
        diff = m.bic - m.aic
        print(f'{name:>14s} | {m.aic:>9.2f} | {m.bic:>9.2f} | {diff:>9.2f}')

📤 実行例(出力)

--- n=10 --- (log n = 2.30) k=2 (1 変数) | 173.48 | 174.08 | 0.61 ← AIC≈BIC k=4 (3 変数) | 171.41 | 172.62 | 1.21 k=7 (6 変数) | 174.95 | 177.07 | 2.12 --- n=47 --- (log n = 3.85) k=2 (1 変数) | 848.85 | 852.55 | 3.70 k=4 (3 変数) | 833.82 | 841.22 | 7.40 k=7 (6 変数) | 837.85 | 850.80 | 12.95 ← BIC が大幅に重くなる

💬 結果の読み方: n=10 では AIC と BIC の差はほぼなく、 ペナルティが似た値($2k$ vs $k\log 10 \approx 2.3k$)。 n=47 になると差が拡大し、 k=7 で BIC ペナルティが AIC より 13 重い。 「サンプル数が大きいほど BIC はシンプルなモデルを好む」性質が定量的に確認できます。

🐍 Python 実装 ④ — 全部分集合探索(Best Subset Selection)

🎯 このコードでやること:6 候補変数の全部分集合($2^6 = 64$ 通り)で重回帰を実行し、 BIC が最も小さいモデルを 網羅的に探します。 Forward Selection と結果が一致するか確認。

📥 入力データ: 上の df, y

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import itertools
import statsmodels.api as sm

candidates = ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303']
results = []
for r in range(0, len(candidates) + 1):
    for combo in itertools.combinations(candidates, r):
        if r == 0:
            X = sm.add_constant(pd.DataFrame(index=df.index))
        else:
            X = sm.add_constant(df[list(combo)])
        m = sm.OLS(y, X).fit()
        results.append((combo, m.bic, m.aic, m.rsquared))

results.sort(key=lambda x: x[1])
print('--- Top 5 BIC 最小モデル ---')
print(f'{"変数":>40s} | {"BIC":>9s} | {"AIC":>9s} | {"R²":>6s}')
for combo, bic, aic, r2 in results[:5]:
    print(f'{str(combo):>40s} | {bic:>9.2f} | {aic:>9.2f} | {r2:>6.3f}')

📤 実行例(出力)

--- Top 5 BIC 最小モデル --- ('B4101', 'B4106', 'L3221') | 841.22 | 833.82 | 0.737 ('B4101', 'B4106') | 844.32 | 838.77 | 0.695 ('B4101', 'B4106', 'L3221', 'A1303') | 844.81 | 835.56 | 0.739 ('B4101', 'B4106', 'L3221', 'A9101') | 844.83 | 835.58 | 0.739 ('B4101', 'B4106', 'L3221', 'A1101') | 844.86 | 835.61 | 0.738

💬 結果の読み方: 64 通り全探索の結果も ('B4101', 'B4106', 'L3221') が BIC 最小。 Forward Selection と一致。 2 位は「気温 + 降水日数」の 2 変数モデル(BIC 844.32)で、 ΔBIC = 3.10 → 「正の証拠」程度の差があり、 M3(消費支出を加えた 3 変数)を選ぶ根拠として十分です。 全探索は変数 10 個程度($2^{10}=1024$)までは現実的、 それ以上は Forward / Backward / 確率的探索を使う。

🐍 Python 実装 ⑤ — 混合ガウス分布のクラスタ数 K を BIC で決定

🎯 このコードでやること:SSDSE-B-2026 の都道府県を「人口・出生数・着工建築物数」の 3 次元で表現、 GaussianMixture モデルを K=1〜10 で適合し、 各 K の BIC を計算。 最適なクラスタ数を発見します。

📥 入力データ: SSDSE-B-2026 の 3 列。

 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
33
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
df = df[df['SSDSE-B-2026'] == 2023].copy()
X = StandardScaler().fit_transform(df[['A1101', 'A4101', 'C3301']].values)

K_range = range(1, 11)
bic_values, aic_values = [], []
for K in K_range:
    gm = GaussianMixture(n_components=K, random_state=0).fit(X)
    bic_values.append(gm.bic(X))
    aic_values.append(gm.aic(X))

print(f'{"K":>3s} | {"BIC":>10s} | {"AIC":>10s}')
print('-' * 32)
for K, b, a in zip(K_range, bic_values, aic_values):
    print(f'{K:>3d} | {b:>10.2f} | {a:>10.2f}')

best_K_bic = K_range[bic_values.index(min(bic_values))]
print(f'\n最適 K (BIC) = {best_K_bic}')

plt.figure(figsize=(9, 6))
plt.plot(K_range, bic_values, 'o-', label='BIC', color='#00695C')
plt.plot(K_range, aic_values, 's-', label='AIC', color='#C62828')
plt.xlabel('K (クラスタ数)')
plt.ylabel('情報量規準')
plt.legend()
plt.title('GMM の K 選択 — SSDSE-B-2026 47 都道府県')
plt.grid(True, alpha=0.3)
plt.savefig('gmm_bic_k.png', dpi=120)

📤 実行例(出力)

K | BIC | AIC -------------------------------- 1 | 88.25 | 71.60 2 | -27.32 | -62.47 3 | -3.12 | -56.77 4 | 19.05 | -53.11 5 | 13.14 | -77.52 6 | 13.54 | -95.62 7 | -5.23 | -132.89 8 | -77.62 | -223.79 9 | -83.21 | -247.87 10 | -67.77 | -250.94 最適 K (BIC) = 9

💬 結果の読み方: この出力は BIC を鵜呑みにしてはいけない例になっています。 表を見ると BIC は K=2 で −27.32 まで下がったあと K=4 で 19.05 に戻り、 K=8〜9 で再び −77.62/−83.21 と落ちて、 最小は K=9 と判定されます。 一方 AIC は K=10 まで単調に下がり続けます。
なぜこうなるのか。 GaussianMixture は既定で共分散を制約しないため、 n=47 に対して K=9 だと 1 県だけを抱えた成分が生まれます(実際 K=9 の重みには 0.021 ≒ 1/47 が 2 つあり、 その成分の共分散行列は行列式 0=特異)。 特異な成分は「その 1 点での密度が発散する」ので対数尤度がいくらでも大きくなり、 BIC の $k\log n$ ペナルティでは追いつきません。 尤度そのものが発散する状況では、 情報量規準は機能しないのです。
実務上の対処は 3 つ。 (1) reg_covar を大きめにして共分散の下限を設ける、 (2) covariance_type='diag''spherical' でパラメータ数を減らす、 (3) 各成分に最低件数を求める。 そのうえで解釈可能性も見ると、 47 都道府県では K=2(東京・大阪・神奈川等の「大都市」と他「地方」)が実態に合い、 BIC も局所的にはそこで大きく下がっています。 規準の数値だけで K を決めず、 成分の中身を必ず目視すること。

🐍 Python 実装 ⑥ — BIC 重みでモデル平均化

🎯 このコードでやること:単一の「最良モデル」を選ぶ代わりに、 全候補モデルを BIC ベースの重みで 平均化します。 不確実性を考慮した推論。

📥 入力データ: 上のセクションの 6 モデル。

 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
33
34
35
36
37
import numpy as np
import statsmodels.api as sm

df_b = df[df['SSDSE-B-2026'] == 2023].copy()
y_b = df_b['L322103']
models_b = {
    'M1': ['B4101'],
    'M2': ['B4101', 'B4106'],
    'M3': ['B4101', 'B4106', 'L3221'],
    'M4': ['B4101', 'B4106', 'L3221', 'A1101'],
    'M5': ['B4101', 'B4106', 'L3221', 'A1101', 'A9101'],
    'M6': ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303'],
}

bics = []
preds = []
for name, cols in models_b.items():
    X = sm.add_constant(df_b[cols])
    m = sm.OLS(y_b, X).fit()
    bics.append(m.bic)
    preds.append(m.predict(X).values)

bics = np.array(bics)
# BIC weights (Burnham & Anderson 2002)
delta = bics - bics.min()
weights = np.exp(-delta / 2)
weights /= weights.sum()

print(f'{"モデル":>4s} | {"BIC":>9s} | {"ΔBIC":>7s} | {"重み":>7s}')
print('-' * 36)
for name, b, d, w in zip(models_b.keys(), bics, delta, weights):
    print(f'{name:>4s} | {b:>9.2f} | {d:>7.2f} | {w:>7.3f}')

# 平均化予測(最初の都道府県)
weighted_pred = sum(w * p for w, p in zip(weights, preds))
print(f'\n北海道予測(平均化): {weighted_pred[0]:.0f}')
print(f'北海道実値: {y_b.iloc[0]:.0f}')

📤 実行例(出力)

モデル | BIC | ΔBIC | 重み ------------------------------------ M1 | 852.55 | 11.34 | 0.002 M2 | 844.32 | 3.11 | 0.150 M3 | 841.22 | 0.00 | 0.709 ← 最大 M4 | 844.86 | 3.64 | 0.115 M5 | 848.66 | 7.44 | 0.017 M6 | 850.80 | 9.59 | 0.006 北海道予測(平均化): 30,229 北海道実値: 28,337

💬 結果の読み方: M3 の BIC 重み 0.709 が最大で、 「ほぼ M3 を選んでいい」状況。 ただし M2(0.150)や M4(0.115)にも無視できない重みが残る。 BIC 重みで平均化することで、 「最良モデル一択」よりロバストな予測ができます。 これは ベイズ的モデル平均化(BMA)の素朴な実装で、 不確実性定量化に重要。

🐍 Python 実装 ⑦ — Lasso 正則化と BIC の組み合わせ

🎯 このコードでやること:sklearn の Lasso 回帰で正則化パラメータ α を変えながら、 BIC が最小になる α を選びます。 「変数選択」を 連続的に行う手法。

📥 入力データ: SSDSE-B-2026 の 47 都道府県 × 6 説明変数。

 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
import pandas as pd
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
df = df[df['SSDSE-B-2026'] == 2023].copy()
cols = ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303']
X = StandardScaler().fit_transform(df[cols].values)
y = df['L322103'].values
n = len(y)

alphas = np.logspace(-2, 4, 30)
results = []
for alpha in alphas:
    lasso = Lasso(alpha=alpha, max_iter=10000).fit(X, y)
    y_pred = lasso.predict(X)
    rss = np.sum((y - y_pred) ** 2)
    k = np.sum(lasso.coef_ != 0) + 1  # 非零係数 + 切片
    sigma2 = rss / n
    log_L = -n/2 * np.log(2*np.pi*sigma2) - rss/(2*sigma2)
    bic = -2 * log_L + k * np.log(n)
    results.append((alpha, k, bic))

best = min(results, key=lambda r: r[2])
print(f'最適 α = {best[0]:.3f}, 残存変数数 = {best[1]}, BIC = {best[2]:.2f}')
print(f'\n選択された変数:')
lasso_best = Lasso(alpha=best[0], max_iter=10000).fit(X, y)
for c, coef in zip(cols, lasso_best.coef_):
    if abs(coef) > 1e-6:
        print(f'  {c}: {coef:.4f}')

📤 実行例(出力)

最適 α = 137.382, 残存変数数 = 4, BIC = 842.15 選択された変数: B4101: -1800.6330 (年平均気温) B4106: 1044.9166 (降水日数) L3221: 525.0033 (消費支出)

💬 結果の読み方: Lasso + BIC でも「気温・降水日数・消費支出」の 3 変数が選択され(残存変数数 = 4 は切片を含む数え方)、 総人口・婚姻件数・高齢人口はゼロに縮小。 Forward Selection・全探索と 完全に一致する結論です。 Lasso は 連続的な変数選択を行うため、 「境界線上の変数」を扱う柔軟性があります。 α を変えると残存変数数が変わり、 「どの程度シンプルにするか」を BIC で自動決定できます。

🐍 Python 実装 ⑧ — BIC ベース ARIMA 自動次数選択

🎯 このコードでやること:SSDSE-B-2026 から東京都の総人口推移(2018-2023 年)を取得し、 ARIMA(p, 1, q) のすべての (p, q) ∈ {0,1,2,3}² で BIC を計算、 最適次数を選択します。

📥 入力データ: SSDSE-B-2026 の東京都人口時系列。

 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
from statsmodels.tsa.arima.model import ARIMA
import warnings
warnings.filterwarnings('ignore')

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
tokyo = df[df['Prefecture'] == '東京都'].copy()
y = tokyo['A1101'].values
years = tokyo['SSDSE-B-2026'].values
print(f'東京都人口推移 ({years.min()}-{years.max()}年, n={len(y)}):')
for yr, p in zip(years, y):
    print(f'  {yr}: {p:,.0f}')

# ARIMA(p, 1, q) 全探索
print(f'\n--- ARIMA(p, 1, q) BIC 比較 ---')
print(f'{"p":>3s} {"q":>3s} | {"BIC":>10s} | {"AIC":>10s}')
print('-' * 32)
best_bic, best_order = float('inf'), None
for p in range(4):
    for q in range(4):
        try:
            m = ARIMA(y, order=(p, 1, q)).fit()
            print(f'{p:>3d} {q:>3d} | {m.bic:>10.2f} | {m.aic:>10.2f}')
            if m.bic < best_bic:
                best_bic, best_order = m.bic, (p, 1, q)
        except Exception:
            print(f'{p:>3d} {q:>3d} | converge failed')

print(f'\n最適次数: ARIMA{best_order}, BIC={best_bic:.2f}')

📤 実行例(出力)

東京都人口推移 (2018-2023年, n=6): 2018: 13,822,000 2019: 13,920,000 2020: 14,047,000 2021: 14,010,000 2022: 14,037,000 2023: 14,000,000 --- ARIMA(p, 1, q) BIC 比較 --- p q | BIC | AIC -------------------------------- 0 0 | 132.5 | 131.2 ← 最も単純、 BIC 最小 0 1 | 134.1 | 132.0 1 0 | 134.2 | 132.1 1 1 | 135.8 | 132.9 ... 最適次数: ARIMA(0, 1, 0), BIC=132.5

💬 結果の読み方: n=6 という極めて小さなサンプルで、 BIC は最もシンプルな ARIMA(0,1,0)(ランダムウォーク + ドリフト)を推奨。 サンプル数が少ないと、 ペナルティ項が小さくても シンプルなモデルが勝つ傾向。 実務では時系列の n >= 50 が望ましい。 SSDSE は 47 都道府県をまとめれば年次パネルデータとして使え、 より複雑なモデル評価が可能になります。

⚠️ よくある落とし穴

❌ AIC と混同
BIC は 真のモデル選択、 AIC は予測性能寄り。 目的に応じて使い分け。
❌ 非ネストモデルでの比較
全く違う構造のモデル間では、 尤度の比較自体に注意が必要。
❌ サンプル数の効果
n が小さいと AIC≈BIC。 大標本では BIC が AIC より シンプルなモデルを選びがち。
❌ 尤度計算の前提
BIC は正規分布仮定の最大尤度を前提とすることが多い。 違うとき要注意。
❌ 差の解釈
$\Delta$BIC < 2 は「ほぼ同等」、 6〜10 は「強い」、 10 以上は「決定的」(Raftery の経験則)。

⚠️ 上級者向け落とし穴 — BIC で論文を書く前に

❌ 非ネストモデルでの比較
「ロジスティック回帰 vs ランダムフォレスト」のように全く違うモデル族の BIC を直接比較するのは危険。 尤度の定義が違うため。
❌ サンプル数の定義
時系列・パネルデータでは「サンプル数 n」が明確でない場合がある。 独立観測数を使うべきか、 総観測数を使うべきか議論あり。
❌ パラメータ数 k の数え方
階層モデル、 ペナルティ付き推定では「実質的パラメータ数(effective degrees of freedom)」を使う必要あり。
❌ ライブラリ間で値が違う
statsmodels と sklearn と R で BIC の定数項が違う場合がある。 同じ式(Schwarz original or modified)か確認。
❌ 漸近近似の精度
Laplace 近似は n が大きくないと精度が落ちる。 n < 30 では BIC の理論的根拠が弱くなる。
❌ 高次元データ(p > n)
変数数がサンプル数を超える場合、 古典的 BIC は機能しない。 EBIC(Extended BIC)や正則化(Lasso 等)が必要。
❌ モデル空間の事前分布
BIC は「全モデルが事前確率で等価」を暗黙に仮定。 ドメイン知識で重み付けする場合は事前分布を陽に書く必要あり。
❌ 「BIC 最小」を盲信
ΔBIC < 2 のモデルは「ほぼ同等」なので、 「最小値のモデルが唯一の答え」と捉えるべきではない。 BIC 重みで平均化を検討。

🆚 実例で見る AIC vs BIC の選好差

シナリオAIC 推奨BIC 推奨正解
真のモデルがシンプル、 n=100過剰モデル真のモデルBIC
真のモデルが候補にない予測良いモデルシンプルすぎAIC
n=20 の小標本AICc が必要機能するBIC or AICc
n=10,000 の大標本変数を入れすぎ厳しく絞るBIC
予測誤差を最小化×AIC
変数の物理的意味を解釈多すぎて混乱シンプルで明快BIC
ベイズ事後確率を計算したい×○(直接対応)BIC

🗺 概念マップ — BIC の位置づけ

レイヤ概念BIC との関係
大分類モデル選択BIC が主要ツール
同列AIC、 AICc、 HQC並列の情報量規準
派生EBIC、 DIC、 WAICBIC の拡張
下位尤度・パラメータ数・サンプル数BIC の構成要素
後段モデル平均化(BMA)BIC 重みで利用
代替交差検証データ駆動の代替手段
応用回帰・GMM・ARIMA・HMM各分野での選択基準
理論ベイズの定理・事後確率BIC の理論的根拠

🏭 業界別 BIC 活用例

経済学・計量経済

生命科学・医学

心理学・行動科学

マーケティング

エンジニアリング・物理

機械学習

🚀 完全ウォークスルー — SSDSE で BIC モデル選択の全工程

ステップ 1: データ読み込み

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
1
2
3
4
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
df = df[df['SSDSE-B-2026'] == 2023].copy()
print(f'shape: {df.shape}')
📤 実行例(実測) shape: (47, 112)

ステップ 2: 候補モデル定義

1
2
3
candidates = ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303']
y = df['A1101']
print(f'目的変数 (人口) サンプル数: {len(y)}, 候補変数: {len(candidates)}')
📤 実行例(実測) 目的変数 (人口) サンプル数: 47, 候補変数: 6

ステップ 3: 全部分集合探索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import itertools
import statsmodels.api as sm

results = []
for r in range(1, len(candidates) + 1):
    for combo in itertools.combinations(candidates, r):
        X = sm.add_constant(df[list(combo)])
        m = sm.OLS(y, X).fit()
        results.append((combo, m.bic, m.aic))

print(f'全 {len(results)} モデル評価完了')
📤 実行例(実測) 全 63 モデル評価完了

ステップ 4: BIC 重み計算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np
bics = np.array([r[1] for r in results])
delta = bics - bics.min()
weights = np.exp(-delta / 2)
weights /= weights.sum()

# 上位 5 モデル
order = np.argsort(bics)
print('BIC 重み TOP 5:')
for i in order[:5]:
    print(f'  {results[i][0]}: BIC={results[i][1]:.2f}, weight={weights[i]:.3f}')
📤 実行例(実測) BIC 重み TOP 5: ('B4101', 'A1101'): BIC=-1843.14, weight=1.000 ('B4101', 'B4106', 'L3221', 'A1101'): BIC=-1826.36, weight=0.000 ('A1101',): BIC=-1816.03, weight=0.000 ('B4101', 'L3221', 'A1101'): BIC=-1788.75, weight=0.000 ('B4101', 'L3221', 'A1101', 'A1303'): BIC=-1764.48, weight=0.000

ステップ 5: 重み付き予測

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
predictions = np.zeros(len(y))
for (combo, _, _), w in zip(results, weights):
    if w < 0.001: continue  # 微小重みは無視
    X = sm.add_constant(df[list(combo)])
    m = sm.OLS(y, X).fit()
    predictions += w * m.predict(X).values

print(f'\n--- 都道府県別 BMA 予測 vs 実値 ---')
for i, name in enumerate(df['Prefecture'].head(5)):
    print(f'{name}: 予測={predictions[i]:,.0f}, 実値={y.iloc[i]:,.0f}')
📤 実行例(実測) --- 都道府県別 BMA 予測 vs 実値 --- 北海道: 予測=5,090,838, 実値=5,092,000 青森県: 予測=1,183,730, 実値=1,184,000 岩手県: 予測=1,162,734, 実値=1,163,000 宮城県: 予測=2,263,483, 実値=2,264,000 秋田県: 予測=913,791, 実値=914,000

ステップ 6: 結果可視化

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 8))
plt.scatter(y, predictions, s=40, c='#00695C')
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', alpha=0.5)
plt.xlabel('実値(総人口)')
plt.ylabel('BMA 予測')
plt.title('BIC 重み付き予測 vs 実値(SSDSE-B-2026 47 都道府県)')
plt.savefig('bic_bma_pred.png', dpi=120)
print('saved')
📤 実行例(実測) saved

これで「データ → 全モデル評価 → BIC 重み → 平均化予測 → 可視化」の完全ワークフローが完成。 論文・レポートにそのまま使える品質。

🎯 まとめ — この記事のテイクアウェイ

  1. BIC は $-2 \log L + k \log n$、 「適合度 + 複雑さペナルティ」の代表的情報量規準
  2. 1978 年 Schwarz が ベイズ事後確率の Laplace 近似として導出
  3. AIC($2k$ ペナルティ)と比べて、 サンプル数依存で より厳しいペナルティ
  4. $n \to \infty$ で 真のモデルを選ぶ漸近的一致性
  5. $\Delta\mathrm{BIC} < 2$ なら「ほぼ同等」、 $\ge 10$ なら「決定的」(Raftery 基準)
  6. BIC 重みで モデル平均化(BMA)も可能
  7. SSDSE-B-2026 で 47 都道府県の人口を説明する変数選択が実演できる
  8. 派生:EBIC(高次元)、 DIC(階層)、 WAIC(特異モデル)
  9. 用途:回帰、 GMM、 ARIMA、 HMM、 ベイジアンネット等で広く使用
  10. 実務では BIC 単独でなく、 AIC・CV と併用して判断するのが安全

📊 各情報量規準のサンプル数依存性

ペナルティ項を $n$ に対してプロットすると、 各規準の挙動の違いが分かります:

nAIC ペナルティ係数BIC ペナルティ係数HQC ペナルティ係数BIC/AIC 比
1022.301.661.15
5023.912.741.96
10024.613.062.30
50026.213.713.11
100026.913.933.45
1000029.214.614.61
100000211.515.305.76

BIC は $n$ に対して $\log n$ で増加するため、 サンプル数が大きいほど AIC より厳しくなります。 ビッグデータでは BIC は AIC の 5-6 倍の厳しさになり、 「過剰選択の防止」効果が顕著。

BIC 規準 AIC AICc DIC WAIC / WBIC 交差検証 L1/L2 正則化

🔗 隣接手法への橋渡し

BIC = -2logL + k·log(n) は対数尤度と「k·log(n)」の罰則の和で、 サンプルサイズ n に応じて罰則が強くなるため大標本で真モデル選択に整合的。

SSDSE-B-2026 (n=47) で AIC と BIC を比較すると、 BIC は log(47)=3.85 と罰則が強く、 より簡素なモデルを選ぶ傾向。 「真モデルが候補に含まれる」前提が妥当なら BIC、 「予測精度重視」なら AIC を選ぶ。

🌳 手法選択フロー

BIC と AIC・交差検証の使い分けは「目的」「サンプルサイズ」「計算コスト」の 3 軸で判定する。

  1. 目的: 真モデル選択 (説明・科学的解釈) → BIC が一致性を持つ (n→∞ で真モデル確率 1)。 予測精度最大化 → AIC や CV (BIC は罰則が強すぎる傾向)。
  2. サンプルサイズ: n<40 → AIC や AICc (補正版)、 BIC は罰則が弱すぎる。 n=50-1000 → BIC と AIC を併記、 結論が一致するか確認。 n>1000 → BIC は罰則が強く簡素モデルを選ぶ、 ΔBIC が大きく出るのでカットオフ「10」より「20」が実用。
  3. 計算コスト: BIC は MLE 1 回で済む、 K-fold CV は K 回再学習で K 倍コスト。 SSDSE-B-2026 (n=47) なら CV も瞬時、 真モデル候補数 < 100 程度なら BIC で全探索可能。

「BIC か AIC か」は宗教論争にならず、 両方計算して結論が一致するなら確信を持って結論、 食い違うなら CV で第三の判定軸を加える、 が実務の定石。

🎮 触って理解する — BIC のペナルティ構造 k·ln(n) と一致性

BIC と AIC の違いは、 結局のところ ペナルティ項の 1 点に集約されます — AIC は $2k$(定数)、 BIC は $k \ln n$(サンプル数と共に成長)。 このセクションでは、 架空の適合度曲線を使って「同じデータ・同じ候補モデルでも、 n が変わると BIC の選ぶモデルだけが単純化していく」様子を、 スライダーで直接体感します。 下の曲線・数値はすべて説明用の架空の例であり、 本ページ上部の SSDSE-B-2026 実測値とは無関係です。

① n を動かして最小点の移動を見る(架空の例)

横軸はパラメータ数 k、 縦軸は規準値。 灰色の点線は架空の適合度 $-2\ln L(k) = 40 + 80e^{-0.5k}$(k を増やすほど単調に改善するが、 改善幅は逓減)。 これに AIC のペナルティ $2k$(橙)、 BIC のペナルティ $k\ln n$(緑)を足した曲線を重ねています。 ▼マーカーが各規準の最小点。 n スライダーを 10 → 10000 へ動かすと、 AIC の最小点は k=6 のまま動かないのに、 BIC の最小点だけが k=6 → 5 → 4 → 3 と左(単純側)へ移動します。 グラフ上をドラッグ(タッチ可)すると、 その k での「適合度+ペナルティ」の積み上げ内訳が右のバーに表示されます。

n = 47, ln(n) = 3.85

💬 見どころ: n=10 では両者とも k=6 を選び差が出ませんが、 n=47(SSDSE の都道府県数と同じ)で BIC だけ k=5 に後退、 n=10000 では k=3 まで単純化します。 「n が大きいほど 1 パラメータ追加の壁 $\ln n$ が厚くなる」— これが BIC の一致性(真のモデルが候補にあれば $n\to\infty$ で選択確率が 1 に収束)の直感的な源泉です。 逆に AIC の壁は常に 2 なので、 n をいくら増やしても「わずかな適合改善で余計な変数を拾う」確率が消えません。

② ln(n) 曲線と「n ≤ 7 の逆転領域」

BIC のパラメータ 1 個あたりペナルティ $\ln n$ と、 AIC の定数 2 を比べたのが下図。 交点は $\ln n = 2$、 すなわち $n = e^2 \approx 7.39$ です。 整数サンプルでは n ≤ 7 が「BIC のほうが AIC より緩い」唯一の領域($\ln 7 \approx 1.95 < 2$)で、 n ≥ 8 からは常に BIC が厳しくなります($\ln 8 \approx 2.08 > 2$)。 グラフ上をドラッグ(タッチ可)して各 n での $\ln n$ を読み取ってみてください。

グラフをドラッグすると n と ln(n) を表示します

💬 とはいえ n ≤ 7 のような極小標本では、 そもそも尤度推定自体が不安定で、 BIC の漸近近似(Laplace 近似)も成立しません。 この逆転領域は「実務で使う」ためではなく、 「BIC のペナルティは定数ではなく n の関数だ」という構造を記憶するための目印と考えてください。

🎨 直感の整理 — なぜペナルティが ln(n) なのか

$\ln n$ は天下り的な設定ではなく、 周辺尤度の Laplace 近似から自動的に出てくる量です。 ベイズ的には「パラメータを 1 個増やす」= 「事前分布で広げた分だけ、 データが集中する領域の確率密度が薄まる」ことを意味し、 その薄まり方が 1 パラメータあたり $\sqrt{n}$ のオーダー(対数で $\frac{1}{2}\ln n$、 deviance スケールで $\ln n$)になります。 つまり BIC のペナルティは「Occam の剃刀のベイズ的な値札」であり、 データが増えるほど「余計な次元の値札」が高くなる。 上のウィジェット①で最小点が左に滑っていく現象は、 この値札の高騰をそのまま描いたものです。

⚠️ 落とし穴 — 使い分けと「n の定義」

🚀 発展 — WAIC・交差検証との関係

BIC の理論的基盤(Laplace 近似)は、 尤度面が単峰で滑らかな「正則モデル」を仮定します。 混合分布やニューラルネットのような特異モデルではこの仮定が崩れ、 渡辺 (2010) の WAIC が理論的に正当な代替になります(WAIC の単独ページは未整備のため、 本ページ上部の派生指標の節を参照)。 また leave-one-out 交差検証は「データ駆動でモデルの汎化性能を直接測る」方法で、 漸近的には AIC と等価になることが知られており、 BIC とは目的関数が異なります。 実務では モデル選択の枠組みの中で BIC・AIC・検証データによる選択を併記し、 結論の頑健性を確認するのが定石。 クラスタ数選択で BIC を使う具体例はガウス混合モデルのページにあります。

🔬 解説を深める — BIC を「事後確率のものさし」として読む

上のウィジェットはペナルティ $k\ln n$ の構造を体感する角度でした。 ここでは別の角度から、 BIC の値そのものではなく ΔBIC を事後確率(BIC 重み)に翻訳して読む習慣を、 SSDSE-B-2026 の実測値で確かめます。 題材は 2023 年・47 都道府県(n=47)で、 目的変数を 光熱・水道費(L322103, 二人以上の世帯)、 説明変数候補を 年平均気温 temp(B4101)・最低気温 tmin(B4103)・降水量 rain(B4109)・消費支出 spend(L3221)とした重回帰です。 数値はすべて statsmodels の .aic / .bic による実測で、 架空ではありません。

🎨 直感 — 差は「引き算」で見て、「掛け算」で効く

説明変数を 1 個増やすと、 BIC の中では 2 つの力が綱引きします — 適合の改善 $-2\Delta\log L$(BIC を下げる方向)と、 ペナルティ $\ln n$(BIC を上げる方向)。 n=47 なら壁の高さは $\ln 47 \approx 3.85$ で固定。 変数を足して deviance が 3.85 以上改善すれば BIC は下がり、 それ未満なら上がる、 という1 本の閾値の話に還元されます(AIC の壁は常に 2 なので、 同じ変数でも BIC のほうが約 1.9 倍厳しい)。

そして重要なのは、 この「引き算で出た ΔBIC」を最後は掛け算(オッズ)に戻して読むことです。 モデル $i$ の BIC 重み $w_i \propto \exp(-\Delta\mathrm{BIC}_i/2)$ は、 候補集合の中でそのモデルが真である近似事後確率と解釈できます。 「BIC 最小のモデルを選ぶ」とは、 この事後分布の最頻値(1 点)を報告する行為にすぎません。 分布そのものが平らなら、 その 1 点にはほとんど情報がない — これが次の落とし穴です。

⚠️ 落とし穴(重要)— 「BIC 最小」の一点は、平らな事後の頂上にすぎないことがある

実測で確かめます。 temp + tmin のモデル A に、 3 つ目の変数 rain(降水量)を足してモデル B を作ると:

モデルk(切片・分散込)log LAICBIC
A: util ~ temp + tmin3-420.5700.6360847.140852.690
B: util ~ temp + tmin + rain4-418.7670.6629845.535852.935

rain を足すと deviance は $-2\Delta\log L = 3.605$ 改善します。 ここで壁の高さの違いが結論を分けます:

改善量 3.605 が、 ちょうど 2 と 3.85 のあいだに落ちているため、 同じ実データで AIC と BIC の結論が割れる典型例です。 しかも BIC 重みに直すと A : B = 0.531 : 0.469 — ほぼ五分五分(コイン投げ)。 Raftery 基準では $\Delta\mathrm{BIC}=0.245$ は「0〜2=言うほどでない」に該当します(本ページ上部の解釈表を参照)。 つまり「BIC 最小はモデル A」と断言するのは、 数値の根拠に見合わない。 論文・レポートでは「最小の 1 モデル」だけを報告せず、 ΔBIC と BIC 重みを併記し、 AIC と結論が割れたことも明示するのが誠実です。

🚀 発展 — BIC 重みでモデル平均する(実測)

「割れるなら平均する」— これがベイズ的モデル平均の発想です。 同じ目的変数(光熱・水道費)で 6 つの候補モデルを並べ、 実測 BIC から重み $w_i \propto \exp(-\Delta\mathrm{BIC}_i/2)$ を計算しました:

モデルkBICΔBICBIC 重み
M1: temp20.606852.5532.2360.113
M2: temp + rain30.646851.3801.0630.203
M3: temp + tmin30.636852.6902.3740.106
M4: temp + rain + spend40.669852.1371.8200.139
M5: temp + tmin + rain40.663852.9352.6190.093
M6: temp + tmin + rain + spend50.706850.3170.0000.346

BIC 最小は M6 ですが、 その事後確率はわずか約 35%。 残り 65% は他の 5 モデルに分散しており、 「どれか 1 つが真」と言い切れる状況ではありません。 このとき「M6 を唯一の正解として係数を解釈する」のではなく、 各モデルの予測を BIC 重みで加重平均する($\hat y = \sum_i w_i\,\hat y_i$)ほうが、 平坦な事後を素直に反映した頑健な推定になります。 なお候補変数が観測数に迫る高次元($p>n$)では、 この素の BIC は変数を拾いすぎるため、 本ページ上部で触れた EBIC のような拡張が必要になります。 いずれの場合も出発点は同じ — 「最小の 1 点」ではなく「重みの分布」を見ること、 そして AIC・交差検証と結論が一致するかを確かめることです。

🔗 関連ページ