本ページは BIC(Bayesian Information Criterion)を多角的に解説します。 上のチップは、 検索・関連語の手がかりです。
「bic criterion」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「bic criterion」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「bic criterion の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
モデルの良さを測る物差しです。
最適なモデルを選ぶために使います。
スマホのプラン選びのように比較します。
結論を短くまとめて紹介します。
| 環境 | API | BIC 定義 |
|---|---|---|
| statsmodels (Python) | model.bic | $-2 \log L + k \log n$(標準) |
| sklearn GMM (Python) | gm.bic(X) | $-2 \log L + k \log n$(標準) |
| R lm/glm | BIC(model) | $-2 \log L + k \log n$(標準) |
| R forecast::auto.arima | 引数 ic='bic' | 状態空間モデル用に調整 |
| SPSS | Output に "Schwarz BC" | 標準と若干違う場合あり |
| Stata | estat ic | 標準 |
| SAS PROC REG | SBC オプション | 標準 |
同じデータでも、 ライブラリで定数項が異なる場合があります(特に切片・分散パラメータの数え方)。 同じ環境で再計算してから比較するのが安全。
日経平均の日次収益率に GARCH(p, q) を適用。 (1, 1), (2, 1), (1, 2), (2, 2) を BIC で比較し、 GARCH(1, 1) が選ばれることが多い。
EC サイト顧客の購買履歴(RFM 分析)を GMM で K=2〜10 クラスタリング、 BIC で最適 K を決定。 マーケティングセグメンテーションの自動化。
がん患者の生存時間データに Cox 回帰を適用、 候補リスク因子(年齢・性別・腫瘍ステージ等)から BIC で最重要因子を選択。
学習スタイル調査の応答パターンを LCA で分析、 「視覚型」「聴覚型」等のクラス数を BIC で決定。
月別気温データに ARIMA(p, 1, q) × 季節成分を適用、 BIC で最適次数を選び、 1 年先まで予測。
n-gram 言語モデル(bigram, trigram, 4-gram)で BIC を計算、 シンプルな bigram が選ばれることが多い(特に小コーパス)。
本ページで紹介した SSDSE-B-2026 を使った BIC 演習は、 次の特徴があります:
同じ手順を、 自分の業務データ(売上・顧客・センサ等)に適用すれば、 「実務での BIC 活用」がそのまま身につきます。
BIC は 1978 年の Schwarz 論文以来、 統計モデル選択の標準ツールとして君臨してきました。 ベイズ事後確率の漸近近似という美しい理論的根拠と、 「適合度 + ペナルティ」というシンプルな計算式の両方を備えており、 古典統計学とベイズ統計学の橋渡しとして稀有な存在です。 「真のモデルを選ぶ」という目的において、 AIC や交差検証では替えがたい役割を持っています。
本ページで紹介した SSDSE-B-2026 を使った演習は、 「モデル選択を数字で語る」感覚を養うのに最適です。 47 都道府県という親しみやすい題材で、 「過学習」「適合度ペナルティ」「AIC との違い」を体感してください。 BIC の理解は、 AIC・WAIC・交差検証など、 モデル選択全般への入口になります。 さらに、 ベイズ統計学・情報理論・モデル比較理論など、 統計学の中核領域への扉でもあります。
是非、 手元のデータで「BIC 重み付きアンサンブル」「ARIMA 自動次数選択」「GMM のクラスタ数決定」を試してください。 「データに語らせる」という統計学の本質的な楽しみを、 BIC は実現してくれます。
.bic 属性を使いこなせる.bic(X) でクラスタ数を決定できる「モデル選択」は統計学・機械学習の永遠のテーマです。 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 は表面的には「適合度 + 複雑さペナルティ」ですが、 ベイズの定理から導出される深い意味があります。 Schwarz (1978) の元論文では、 モデルの事後確率 $P(\mathcal{M} \mid \text{data})$ を最大化することと、 BIC 最小化が漸近的に等価であることが示されました。
具体的には、 ベイズ因子(Bayes Factor)$B_{12}$ — 2 つのモデル $\mathcal{M}_1, \mathcal{M}_2$ のどちらが「真らしいか」の比 — について、 サンプル数 $n \to \infty$ で:
つまり「BIC が 10 小さい」とは、 ベイズ因子で言えば「$e^5 \approx 148$ 倍そのモデルが真らしい」という意味。 Raftery(1995)の解釈ガイド:
| $\Delta$BIC | ベイズ因子 | 証拠の強さ |
|---|---|---|
| 0-2 | 1-3 | 言うほどでない |
| 2-6 | 3-20 | 正しいかもしれない |
| 6-10 | 20-150 | 強い証拠 |
| 10+ | 150+ | 決定的な証拠 |
この対応表が、 BIC の「数値の意味」を直感的に教えてくれます。
候補モデルを「変数数 k」順に並べ、 各モデルの BIC を点で表示。 「U 字形カーブ」が見えれば最適 k が明らか。
同じ x 軸(k)に AIC と BIC を重ねる。 AIC は緩く、 BIC は厳しい曲線になることが視覚化される。
上位 5-10 モデルの BIC 重みを棒グラフに。 「1 モデルが圧倒」か「複数が拮抗」かが一目瞭然。
変数の有無を行列で表現、 各セルに ΔBIC を色付き表示。 全部分集合の構造が見える。
ARIMA(p, q) の (p, q) ∈ {0,1,2,3}² で BIC を計算、 9 マスのヒートマップ。 最小マスが推奨次数。
🍰 まずはやさしく
計算式で表した評価基準です。
数値でモデルの良さを判定します。
テストの点数のように計算して比べます。
詳しい式と意味について解説します。
AIC との比較:
Schwarz (1978, Annals of Statistics) は、 モデル比較における 事後確率から BIC を導出しました。 ベイズ的にモデル $\mathcal{M}_k$ の事後確率は:
周辺尤度(evidence, marginal likelihood)は:
この積分を Laplace 近似(最尤推定値の周りで二次近似)すると:
両辺に $-2$ を掛けると:
これが BIC の ベイズ的解釈です。 「BIC を最小化する」≈「事後確率を最大化する」≈「最も真らしいモデルを選ぶ」。 この理論的正当化が、 BIC を強力にしています。
BIC は 漸近的一致性を持ちます:「真のモデルが候補に含まれているなら、 $n \to \infty$ で必ず真のモデルが選ばれる確率が 1 に収束」。 AIC は一致性を持たず、 過剰な変数を含めがち。 この性質が、 「真のモデル発見」を目的とするときの BIC の優位性。
逆に AIC は、 「平均的な予測誤差を最小化する」観点で優れます。 BIC が選ぶシンプルなモデルは、 適合は弱いが 過学習が少ない。 「真のモデルを探す」vs「予測を良くする」という目的の違いが、 BIC vs AIC の使い分けを決めます。
| 項目 | AIC | BIC |
|---|---|---|
| 提案者 | 赤池弘次(1973) | Schwarz(1978) |
| ペナルティ | $2k$ | $k \log n$ |
| 理論的基礎 | KL 発散最小化 | 事後確率最大化 |
| 目的 | 予測性能 | 真のモデル選択 |
| 一致性 | ×(過剰選択) | ○(漸近的一致) |
| 効率性 | ○(予測誤差最小) | △ |
| サンプル依存 | 定数 | $\log n$ で増加 |
| 小標本 | AICc 補正版が必要 | そのまま使える |
| 選びがちなモデル | 複雑寄り | シンプル寄り |
| 予測誤差 | 低い(汎化) | やや高い |
| 解釈性 | 低い | 高い(シンプル) |
使い分けの原則:
$$\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 比 |
|---|---|---|---|---|
| 10 | 2.30 | 2.30 | 2.00 | 1.15 |
| 47 (SSDSE) | 3.85 | 3.85 | 2.00 | 1.93 |
| 100 | 4.61 | 4.61 | 2.00 | 2.30 |
| 1,000 | 6.91 | 6.91 | 2.00 | 3.45 |
| 10,000 | 9.21 | 9.21 | 2.00 | 4.61 |
このコードでやること: SSDSE-B-2026(2023 年度)の 1 世帯あたり光熱・水道費(L322103)を被説明変数に、 実在する気候・経済指標を 1 個 → 5 個と増やして OLS を推定し、 AIC と BIC を同時にプロットして「どこで罰則が拮抗するか」を見る。
📥 入力データ (SSDSE-B-2026 / 2023 年度・実測値):
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)) |
📤 実行すると次の出力が得られる:
💬 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 は AIC と並ぶ「モデル選択基準」だが、 罰則項に log(n) を含むため サンプルサイズが大きくなるほどパラメータ数の多いモデルを厳しく排除する。 ここでは 3 枚の図と 1 つの Python 実装で、 BIC の挙動を可視化する。
BIC の根幹は 対数尤度 である。 残差が正規分布に近いほど対数尤度は大きくなり BIC は小さくなる。 ヒストグラムで残差の形状をまず確認することが BIC 計算の前提となる。
線形回帰モデルにパラメータを追加するほどフィット(RSS 低下)は改善するが、 BIC は k·log(n) の罰則で抑制する。 単純な OLS の図で「フィットの改善が罰則を上回るか」のトレードオフを直感的に掴む。
BIC は「離散的な変数選択」、 Ridge/Lasso は「連続的な係数収縮」という別アプローチでオーバーフィットに対抗する。 図は係数空間での収縮の様子を示しており、 BIC が選ぶ「サブセットモデル」と Lasso が選ぶ「スパース解」の違いを比較する助けになる。
| 基準 | 罰則項 | 性質 | n→∞ で選ぶモデル |
|---|---|---|---|
| AIC | 2k | 予測誤差最小(効率性) | 真のモデルに収束しない |
| BIC | k·log(n) | 真のモデル収束(一致性) | 真のモデルに収束する |
| AICc | 2k + 2k(k+1)/(n-k-1) | 小標本補正 | AIC に漸近 |
| HQC | 2k·log(log(n)) | AIC と BIC の中間 | 真のモデルに収束する |
| DIC | 有効パラメータ数 | ベイズ階層モデル用 | 事前分布に依存 |
| WAIC | 事後分散ベース | ベイズ予測一般化 | 真の予測分布に収束 |
このコードでやること: SSDSE-B-2026 の 47 都道府県データで、 サンプルサイズ n を 10, 47, 200, 1000 と変化させたときに BIC の罰則項 k·log(n) がどう変化するか計算する。
📥 入力データ (SSDSE-B-2026 抜粋):
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 → n=1000 に増えると罰則は log(1000)/log(10) ≈ 3 倍に。 つまり「大標本ではパラメータ追加への壁が約 3 倍厚くなる」。 SSDSE の n=47 では AIC(罰則 2k)の 1.93 倍だが、 全国市町村データ (n=1741) では 7.46 / 2 = 3.73 倍にまで拡大する。 BIC の「大標本で真のモデルに収束する一致性」はこの罰則の挙動から来ている。
log(n) ≈ 2 となる n=7.4 付近では AIC と BIC が一致する。 小標本では AICc を併用するのが安全。 具体的には n≤30 程度の場合、 BIC の罰則項 k·log(n) は AIC の 2k と近い値になり「BIC が真のモデルに収束する一致性」という理論的利点が事実上消える。 さらに小標本では対数尤度の推定自体が不安定で、 AICc の小標本補正項 2k(k+1)/(n-k-1) が必要になる。 SSDSE-B-2026 の 47 都道府県データは AICc を併用すべきギリギリの境界線であり、 もし複数年データを統合する余地があれば n を増やすことで 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 を変数選択に使う標準手順は以下のとおり。 (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 を単なる「罰則付き対数尤度」としてではなく、 「事後モデル確率の近似」として捉えると、 その意味がより明確になる。 ベイズの定理により、 データ 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(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 で除外された変数が「無意味」というわけではなく、 「追加の説明力が罰則を上回らない」というだけである点には注意したい。
BIC の式:
「モデルがデータを説明する度合い」を表します。 尤度 $L$ は 「このモデルが、 このデータを生成する確率」。 値が大きいほど良い適合だが、 慣習として $-2 \log$ を取り、 「小さいほど良い」尺度に変換します。 これは deviance(逸脱度)と呼ばれ、 統計学では標準的。
パラメータ数 $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 のペナルティは 定数 $2k$、 BIC は $k \log n$。 $n=100$ なら BIC のペナルティは AIC の 2.3 倍。 $n=1000$ なら 3.45 倍。 サンプルが大きいほど、 BIC は シンプルなモデルを選びがちです。
BIC を最小化することは、 「適合度を上げる」と「複雑さを下げる」のトレードオフで最適点を探すこと。 純粋に「適合度だけ」見ると 必ず複雑モデルが勝つ(過学習)。 BIC は パラメトリックな正則化として機能します。
$p \gg n$ の高次元データで、 BIC では選びすぎる問題に対処。 ゲノミクス・テキスト解析で使われます。
階層ベイズモデル・MCMC 推定で使う BIC のベイズ版。 階層構造で「真のパラメータ数」が曖昧な場合に対応。
特異モデル(混合モデル、 ニューラルネット等)でも一致性を持つ。 通常の AIC / BIC が機能しない場合の救世主。
GEE(Generalized Estimating Equations)など、 完全な尤度が定義できないモデルでの BIC 相当物。
$-2 \log L + k(\log n + 1)$。 BIC より少し厳しいペナルティで一致性を保証。
$-2 \log L + 2k \log \log n$。 AIC と BIC の中間。 時系列解析でよく使われる。
SSDSE-B-2026 で、 「総人口(A1101)」「出生数(A4101)」「婚姻件数(A9101)」をそれぞれ目的変数にして同じ説明変数群で重回帰し、 BIC 最小モデルがどう変わるか確認。
人口を log 変換して回帰してから BIC を計算。 変換しないモデルと BIC が比較可能か検討。
SSDSE-B-2026 の 47 都道府県を 3 変数で GMM クラスタリング、 K=1〜10 で BIC を計算し最適 K を見つけよ。
SSDSE データの一部(n=10, 20, 30, 47)で同じモデル比較を行い、 AIC と BIC の選好差をプロット。 サンプル数依存を確認。
複数モデルの BIC 重みを使って、 47 都道府県の予測値を平均化。 単一最良モデルとの予測誤差を比較。
SSDSE-B-2026 の時系列データ(例:年度別総人口推移)で ARIMA(p, 1, q) の (p, q) ∈ {0, 1, 2, 3}² で BIC を計算、 最適次数を選択。
「人口の二乗」「対数」など非線形項を追加すると、 BIC が下がるか調査。 過学習との線引きを意識。
「都市/地方」の二値分類で 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 は階層構造を扱えない。 DIC や WAIC を使うべき。
「人口を出生数だけで説明」vs「出生数 + 婚姻件数で説明」の 2 モデルを BIC で比較。 初学者向け。
SSDSE-B-2026 の 2018-2023 年度データから、 各都道府県の人口時系列で ARIMA を当て、 (p, d, q) を BIC で選択。
47 都道府県を 3-5 次元の社会経済指標で GMM クラスタリング、 BIC で最適 K を決定。
「人口 → 婚姻 → 出生 → 高齢化」のような因果グラフを pgmpy で構築、 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 | 意味 |
|---|---|
| 0-2 | 言うほどでない(事実上同等) |
| 2-6 | 正しいかもしれない |
| 6-10 | 強い証拠 |
| 10+ | 決定的な証拠 |
| ライブラリ | 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') |
例:3 つの回帰モデルを n=100 のデータで比較:
| モデル | 変数数 k | −2 log L | BIC | 選択 |
|---|---|---|---|---|
| 単回帰(k=2) | 2 | 180 | 180 + 2×4.6 = 189.2 | |
| 重回帰(k=5) | 5 | 150 | 150 + 5×4.6 = 173.0 | ✅ |
| 重回帰(k=10) | 10 | 140 | 140 + 10×4.6 = 186.0 |
k=10 は適合度は最高だが、 ペナルティで負ける。 k=5 が BIC 最小で 選択される。
SSDSE-B-2026 の 47 都道府県データを使い、 「1 世帯あたり光熱・水道費(L322103)を何の変数で説明できるか」を BIC で評価します。 説明変数の候補:
| 列コード | 意味 |
|---|---|
| B4101 | 年平均気温 |
| B4106 | 降水日数(年間) |
| L3221 | 消費支出(二人以上の世帯) |
| A1101 | 総人口 |
| A9101 | 婚姻件数 |
| A1303 | 65歳以上人口 |
| モデル | 説明変数(数 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 は次のように計算されます。
仮に M3 が $-2 \log L = 240$、 M4 が $-2 \log L = 235$ なら:
尤度が 5 改善されてもペナルティで 3.85 増えるので、 実質改善は 1.15 のみ。 これは「決定的な差ではない」ので、 シンプルな M3 を選ぶのが BIC の推奨です。
合成データ (n=100) で 3 モデルの BIC を比較する。
| モデル | logL | k | BIC |
|---|---|---|---|
| M1 | -50 | 1 | 104.61 |
| M2 | -42 | 2 | 93.21 |
| M3 | -40 | 3 | 93.82 |
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()}") |
💬 手計算 (Step 2) M2 が最良 (BIC=93.21) と Python 出力が完全一致。
最小コードで動かしてみる例:
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}') |
🎯 このコードでやること:SSDSE-B-2026 の 47 都道府県データから 6 変数の組み合わせで重回帰モデルを構築、 statsmodels の .bic 属性で各モデルの BIC を取得して最適モデルを選択します。
📥 入力データ(SSDSE-B-2026.csv 抜粋):
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}') |
📤 実行例(出力):
💬 結果の読み方: 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 のペナルティが緩い)。
🎯 このコードでやること:候補変数 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})') |
📤 実行例(出力):
💬 結果の読み方: 前進選択で「気温・降水日数・消費支出」の 3 変数が選ばれ、 これ以上追加しても BIC は下がりません。 全変数 6 個を試した上のセクション(M3)と同じ結論で、 網羅探索(下記)とも一致します。 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 では AIC と BIC の差はほぼなく、 ペナルティが似た値($2k$ vs $k\log 10 \approx 2.3k$)。 n=47 になると差が拡大し、 k=7 で BIC ペナルティが AIC より 13 重い。 「サンプル数が大きいほど BIC はシンプルなモデルを好む」性質が定量的に確認できます。
🎯 このコードでやること: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}') |
📤 実行例(出力):
💬 結果の読み方: 64 通り全探索の結果も ('B4101', 'B4106', 'L3221') が BIC 最小。 Forward Selection と一致。 2 位は「気温 + 降水日数」の 2 変数モデル(BIC 844.32)で、 ΔBIC = 3.10 → 「正の証拠」程度の差があり、 M3(消費支出を加えた 3 変数)を選ぶ根拠として十分です。 全探索は変数 10 個程度($2^{10}=1024$)までは現実的、 それ以上は Forward / Backward / 確率的探索を使う。
🎯 このコードでやること: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) |
📤 実行例(出力):
💬 結果の読み方: この出力は 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 を決めず、 成分の中身を必ず目視すること。
🎯 このコードでやること:単一の「最良モデル」を選ぶ代わりに、 全候補モデルを 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}') |
📤 実行例(出力):
💬 結果の読み方: M3 の BIC 重み 0.709 が最大で、 「ほぼ M3 を選んでいい」状況。 ただし M2(0.150)や M4(0.115)にも無視できない重みが残る。 BIC 重みで平均化することで、 「最良モデル一択」よりロバストな予測ができます。 これは ベイズ的モデル平均化(BMA)の素朴な実装で、 不確実性定量化に重要。
🎯 このコードでやること: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}') |
📤 実行例(出力):
💬 結果の読み方: Lasso + BIC でも「気温・降水日数・消費支出」の 3 変数が選択され(残存変数数 = 4 は切片を含む数え方)、 総人口・婚姻件数・高齢人口はゼロに縮小。 Forward Selection・全探索と 完全に一致する結論です。 Lasso は 連続的な変数選択を行うため、 「境界線上の変数」を扱う柔軟性があります。 α を変えると残存変数数が変わり、 「どの程度シンプルにするか」を BIC で自動決定できます。
🎯 このコードでやること: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}') |
📤 実行例(出力):
💬 結果の読み方: n=6 という極めて小さなサンプルで、 BIC は最もシンプルな ARIMA(0,1,0)(ランダムウォーク + ドリフト)を推奨。 サンプル数が少ないと、 ペナルティ項が小さくても シンプルなモデルが勝つ傾向。 実務では時系列の n >= 50 が望ましい。 SSDSE は 47 都道府県をまとめれば年次パネルデータとして使え、 より複雑なモデル評価が可能になります。
| シナリオ | AIC 推奨 | BIC 推奨 | 正解 |
|---|---|---|---|
| 真のモデルがシンプル、 n=100 | 過剰モデル | 真のモデル | BIC |
| 真のモデルが候補にない | 予測良いモデル | シンプルすぎ | AIC |
| n=20 の小標本 | AICc が必要 | 機能する | BIC or AICc |
| n=10,000 の大標本 | 変数を入れすぎ | 厳しく絞る | BIC |
| 予測誤差を最小化 | ○ | × | AIC |
| 変数の物理的意味を解釈 | 多すぎて混乱 | シンプルで明快 | BIC |
| ベイズ事後確率を計算したい | × | ○(直接対応) | BIC |
| レイヤ | 概念 | BIC との関係 |
|---|---|---|
| 大分類 | モデル選択 | BIC が主要ツール |
| 同列 | AIC、 AICc、 HQC | 並列の情報量規準 |
| 派生 | EBIC、 DIC、 WAIC | BIC の拡張 |
| 下位 | 尤度・パラメータ数・サンプル数 | BIC の構成要素 |
| 後段 | モデル平均化(BMA) | BIC 重みで利用 |
| 代替 | 交差検証 | データ駆動の代替手段 |
| 応用 | 回帰・GMM・ARIMA・HMM | 各分野での選択基準 |
| 理論 | ベイズの定理・事後確率 | BIC の理論的根拠 |
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}') |
1 2 3 | candidates = ['B4101', 'B4106', 'L3221', 'A1101', 'A9101', 'A1303'] y = df['A1101'] print(f'目的変数 (人口) サンプル数: {len(y)}, 候補変数: {len(candidates)}') |
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)} モデル評価完了') |
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}') |
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}') |
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') |
これで「データ → 全モデル評価 → BIC 重み → 平均化予測 → 可視化」の完全ワークフローが完成。 論文・レポートにそのまま使える品質。
ペナルティ項を $n$ に対してプロットすると、 各規準の挙動の違いが分かります:
| n | AIC ペナルティ係数 | BIC ペナルティ係数 | HQC ペナルティ係数 | BIC/AIC 比 |
|---|---|---|---|---|
| 10 | 2 | 2.30 | 1.66 | 1.15 |
| 50 | 2 | 3.91 | 2.74 | 1.96 |
| 100 | 2 | 4.61 | 3.06 | 2.30 |
| 500 | 2 | 6.21 | 3.71 | 3.11 |
| 1000 | 2 | 6.91 | 3.93 | 3.45 |
| 10000 | 2 | 9.21 | 4.61 | 4.61 |
| 100000 | 2 | 11.51 | 5.30 | 5.76 |
BIC は $n$ に対して $\log n$ で増加するため、 サンプル数が大きいほど AIC より厳しくなります。 ビッグデータでは BIC は AIC の 5-6 倍の厳しさになり、 「過剰選択の防止」効果が顕著。
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 軸で判定する。
「BIC か AIC か」は宗教論争にならず、 両方計算して結論が一致するなら確信を持って結論、 食い違うなら CV で第三の判定軸を加える、 が実務の定石。
BIC と AIC の違いは、 結局のところ ペナルティ項の 1 点に集約されます — AIC は $2k$(定数)、 BIC は $k \ln n$(サンプル数と共に成長)。 このセクションでは、 架空の適合度曲線を使って「同じデータ・同じ候補モデルでも、 n が変わると BIC の選ぶモデルだけが単純化していく」様子を、 スライダーで直接体感します。 下の曲線・数値はすべて説明用の架空の例であり、 本ページ上部の SSDSE-B-2026 実測値とは無関係です。
横軸はパラメータ数 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=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 をいくら増やしても「わずかな適合改善で余計な変数を拾う」確率が消えません。
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 ≤ 7 のような極小標本では、 そもそも尤度推定自体が不安定で、 BIC の漸近近似(Laplace 近似)も成立しません。 この逆転領域は「実務で使う」ためではなく、 「BIC のペナルティは定数ではなく n の関数だ」という構造を記憶するための目印と考えてください。
$\ln n$ は天下り的な設定ではなく、 周辺尤度の Laplace 近似から自動的に出てくる量です。 ベイズ的には「パラメータを 1 個増やす」= 「事前分布で広げた分だけ、 データが集中する領域の確率密度が薄まる」ことを意味し、 その薄まり方が 1 パラメータあたり $\sqrt{n}$ のオーダー(対数で $\frac{1}{2}\ln n$、 deviance スケールで $\ln n$)になります。 つまり BIC のペナルティは「Occam の剃刀のベイズ的な値札」であり、 データが増えるほど「余計な次元の値札」が高くなる。 上のウィジェット①で最小点が左に滑っていく現象は、 この値札の高騰をそのまま描いたものです。
BIC の理論的基盤(Laplace 近似)は、 尤度面が単峰で滑らかな「正則モデル」を仮定します。 混合分布やニューラルネットのような特異モデルではこの仮定が崩れ、 渡辺 (2010) の WAIC が理論的に正当な代替になります(WAIC の単独ページは未整備のため、 本ページ上部の派生指標の節を参照)。 また leave-one-out 交差検証は「データ駆動でモデルの汎化性能を直接測る」方法で、 漸近的には AIC と等価になることが知られており、 BIC とは目的関数が異なります。 実務では モデル選択の枠組みの中で BIC・AIC・検証データによる選択を併記し、 結論の頑健性を確認するのが定石。 クラスタ数選択で 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 点にはほとんど情報がない — これが次の落とし穴です。
実測で確かめます。 temp + tmin のモデル A に、 3 つ目の変数 rain(降水量)を足してモデル B を作ると:
| モデル | k(切片・分散込) | log L | R² | AIC | BIC |
|---|---|---|---|---|---|
| A: util ~ temp + tmin | 3 | -420.570 | 0.6360 | 847.140 | 852.690 |
| B: util ~ temp + tmin + rain | 4 | -418.767 | 0.6629 | 845.535 | 852.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 と結論が割れたことも明示するのが誠実です。
「割れるなら平均する」— これがベイズ的モデル平均の発想です。 同じ目的変数(光熱・水道費)で 6 つの候補モデルを並べ、 実測 BIC から重み $w_i \propto \exp(-\Delta\mathrm{BIC}_i/2)$ を計算しました:
| モデル | k | R² | BIC | ΔBIC | BIC 重み |
|---|---|---|---|---|---|
| M1: temp | 2 | 0.606 | 852.553 | 2.236 | 0.113 |
| M2: temp + rain | 3 | 0.646 | 851.380 | 1.063 | 0.203 |
| M3: temp + tmin | 3 | 0.636 | 852.690 | 2.374 | 0.106 |
| M4: temp + rain + spend | 4 | 0.669 | 852.137 | 1.820 | 0.139 |
| M5: temp + tmin + rain | 4 | 0.663 | 852.935 | 2.619 | 0.093 |
| M6: temp + tmin + rain + spend | 5 | 0.706 | 850.317 | 0.000 | 0.346 |
BIC 最小は M6 ですが、 その事後確率はわずか約 35%。 残り 65% は他の 5 モデルに分散しており、 「どれか 1 つが真」と言い切れる状況ではありません。 このとき「M6 を唯一の正解として係数を解釈する」のではなく、 各モデルの予測を BIC 重みで加重平均する($\hat y = \sum_i w_i\,\hat y_i$)ほうが、 平坦な事後を素直に反映した頑健な推定になります。 なお候補変数が観測数に迫る高次元($p>n$)では、 この素の BIC は変数を拾いすぎるため、 本ページ上部で触れた EBIC のような拡張が必要になります。 いずれの場合も出発点は同じ — 「最小の 1 点」ではなく「重みの分布」を見ること、 そして AIC・交差検証と結論が一致するかを確かめることです。