論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
プロビット回帰
Probit Regression
ロジスティック回帰と似た二値モデルだが、リンク関数が正規分布の累積分布関数。
回帰モデルprobitプロビット

🔖 キーワード索引(補強)

プロビット回帰に関連する概念のチップ集。

二値分類 標準正規 CDF 潜在変数 最尤法 対数尤度 限界効果 疑似 R² McFadden Logit との比較 線形予測子 リンク関数 GLM ROC曲線 AUC 混同行列 prob → label 閾値 クラス不均衡 multinomial probit ordered probit Newton-Raphson

💡 30秒で分かる結論

🍰 まずはやさしく

2つの結果のどちらかが出る確率を出す道具です。

ある出来事が起きるかどうかを予測するために使います。

テストに合格するかどうかを予想するようなものです。

この章では、使い方の基本と計算の流れを読みます。

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

📍 学習の3ステップ

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

🔧 Python実装パターン

🎯 解説: SSDSE-B-2026 を使い、 2 値目的変数(例: 高齢化率>30% を 1, それ以外 0)を Probit 回帰で予測。 累積正規分布関数 Φ で確率にマッピング。 経済学・心理学で頻用。
📥 入力例: data/raw/SSDSE-B-2026.csv y = (df['A1303']/df['A1101']*100 > 30).astype(int) # 高齢化率>30%(A1303 65歳以上÷A1101 総人口) X = df[['A4101','L3221']] # 出生数・消費支出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 基本パターン: 高齢化率>30% を出生数・消費支出で Probit 回帰
import pandas as pd
import statsmodels.api as sm

# データ読み込み(2023 年の 47 都道府県)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]

y = (df['A1303'] / df['A1101'] * 100 > 30).astype(int)   # 高齢化率>30% を 1
X = sm.add_constant(df[['A4101', 'L3221']])              # 出生数・消費支出

model = sm.Probit(y, X).fit(disp=False)
print(f'y=1 の県数: {y.sum()} / {len(y)}')
print(pd.DataFrame({'係数': model.params, 'p値': model.pvalues}).round(6))
print(f'Pseudo R² = {model.prsquared:.3f}')
📤 実行例(実測) y=1 の県数: 35 / 47 係数 p値 const 1.315675 0.723715 A4101 -0.000120 0.002531 L3221 0.000004 0.761242 Pseudo R² = 0.549
💬 読み方: 高齢化率 30% 超は 47 県中 35 県。 出生数の係数 −0.000120(p=0.0025)は負で、 出生数が多い県ほど 30% 超になりにくい。 消費支出は係数 0.000004・p=0.76 で効いていない。 係数は確率ではなく潜在変数 z の単位なので、 出生数 1 人あたり −0.00012 と小さく見えても、 1 万人差なら z で −1.2 と大きい。 確率への効果は次の限界効果で読む。

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

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:

💡 よく使うコマンド集

機能 Python (pandas) Python (scipy)
要約統計df.describe()stats.describe()
平均df.mean()np.mean()
標準偏差df.std()np.std()
相関df.corr()stats.pearsonr()
t検定—stats.ttest_ind()
回帰—stats.linregress()
分布フィッティング—stats.norm.fit()

🚧 一般的な落とし穴と対策

📊 結果報告の標準フォーマット

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

主要な関連概念のグループ

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定t検定、 F検定、 χ²検定、 ノンパラ検定
回帰単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習クラスタリング、 PCA、 因子分析
時系列ARIMA、 VAR、 指数平滑法、 自己相関
因果推論DiD、 IV、 傾向スコア、 交絡変数
前処理標準化、 正規化、 欠損値処理、 多重共線性対策
評価R²、 残差、 CV、 RMSE、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

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

🍰 まずはやさしく

2つのグループに分けるための分析手法です。

データを使って、ある状態になる確率を調べます。

県が人口減少しているかどうかを判定する例です。

定義から実際のプログラムまで、6つの視点で読みます。

論文中に 「プロビット回帰」として登場する用語。

プロビット回帰 とは:ロジスティック回帰と似た二値モデルだが、リンク関数が正規分布の累積分布関数。

本ページは プロビットモデル を、 SSDSE-B-2026 の二値分類タスクで実演する。 statsmodels.discrete.Probit で「人口減少県か否か」を出生率・高齢化率で説明する。 推定係数の正負・ Φ() 変換による予測確率・限界効果 ∂P/∂x = φ(β⊤x)β を numpy で再現する。

「probit」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む — プロビット回帰

🍰 まずはやさしく

心の中にある「見えない傾向」を数値にする考え方です。

なぜその結果になったのかという理由を探ります。

スマホを買いたいという「気持ちの強さ」のようなものです。

似た手法との違いや、考え方の仕組みを読みます。

プロビットは「2 値の確率を標準正規分布の累積関数で表す」モデル。 ロジットとは関数形が違うだけで実用上の差は小さい。 経済学・心理学で伝統的に使われる。 SSDSE-B-2026 で「人口 100 万人超え」を予測する場合、 ロジット係数の約 0.62 倍がプロビット係数の目安。

隠れ変数 (latent variable) としての直感

プロビットは「観測されない連続的な傾向 $Y^*$ がしきい値 0 を超えたとき $Y=1$ と観測される」というモデルとして解釈できる。 SSDSE-B-2026 で「人口 100 万人超え」を例に取ると、 $Y^*_i = \beta_0 + \beta_1 \log(\text{A4101}_i) + \varepsilon_i$, $\varepsilon_i \sim N(0,1)$ という「潜在的な人口集積ポテンシャル」が背後にあり、 これが 0 を超えた県だけが $Y_i=1$ (人口 100 万超え) として観測される、 という構造を仮定する。

ロジットとの 3 つの違い

観点プロビット (Probit)ロジット (Logit)
リンク関数標準正規 CDF $\Phi(\cdot)$ロジスティック CDF $1/(1+e^{-z})$
誤差項分布標準正規 (分散 1)ロジスティック (分散 $\pi^2/3$)
係数解釈限界効果 $\phi(z)\beta_j$ で標準偏差単位オッズ比 $e^{\beta_j}$ で直接解釈可能
係数の数値スケールロジットの約 0.625 倍 ($\pi/\sqrt{3 \cdot 8/\pi^2}$)プロビットの約 1.6 倍

SSDSE-B-2026 で「人口 100 万人超え」を予測する文脈: A4101 (出生数) を説明変数にプロビット回帰を当てはめると、 ロジットで $\beta_1 = 1.85$ が出るなら、 プロビットでは概ね $1.85 \times 0.625 \approx 1.16$ になる。 fitted probability (47 県平均は標本比率 37/47 に一致し $\Phi(\cdot) \approx 0.79$) も判別境界もほぼ一致する。 経済学では「同僚はロジットを使うがプロビットは伝統的」、 心理学では「シグナル検出理論との整合性からプロビット」と分野別の慣例が強い。

📐 定義・数式 — プロビット回帰

🍰 まずはやさしく

確率を計算するための、数学的なルールです。

正確な予測をするために、数式で定義します。

部活の勝ちやすさを、数字で表すようなものです。

中心となる数式と、記号の意味について読みます。

やさしい説明で掴んだ感覚を、ここで プロビット回帰 の定義式に対応づけます。下の式は左辺 $\Pr(Y$ が何で決まるかを右辺で書き下したもので、β(回帰係数) が現れます。それぞれの記号が何の量を指すのかは、次の「🔬 数式を言葉で読み解く」で 1 つずつ確かめてください。

【プロビット回帰 の中心定義式】
$$ \Pr(Y=1 \mid X) = \Phi(\beta_0 + \beta_1 x_1 + \dots + \beta_k x_k) $$
この式が「プロビット回帰」の骨格。 派生形・拡張形はここから生まれる。
📌 読み方のコツ:数式を見たら「左辺は何を定義しているか」「右辺の各項は何の合計・積・比か」を声に出して読み下してみる。 これだけで理解が大きく進みます。

🔬 数式を言葉で読み解く — 数式を「言葉」に翻訳

上の数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。

左辺(結果側)
プロビット回帰 で定義したい量。 解釈の対象。 単位・スケールを必ず確認する。
右辺(構成要素)
観測できる入力変数(SSDSE-B-2026 でいえば A1101・L3221 など)と推定対象パラメータ(β, σ 等)の組合せ。
添字 i, j, t
i=サンプル(県)、 j=変数、 t=時点。 SSDSE-B-2026 は i ∈ {1..47} 県、 t ∈ {2012..2023}。
和記号 Σ
「足し合わせ」を表す。 添字 i が 1 から n まで動く範囲を明示するのが習慣。
期待値 E[·]、 分散 Var[·]
「ランダム変数の平均」と「ばらつき」。 SSDSE-B-2026 のような集計値でも、 標本誤差・年次変動の文脈で使える。
📚 補足:同じ記号でも分野・教科書によって意味が違うことがあります(例: $\hat{y}$ は予測値だが、 統計の文脈では推定量を意味することも)。 不明確なときは、 必ずその文書の記号定義表を確認しましょう。

🧮 SSDSE-B-2026 で実値計算 — プロビット回帰の実例

例:高齢化率が 30% を超えるか(二値)を出生数・消費支出で予測

🎯 解説: Probit の限界効果(marginal effect)を計算。 係数を直接確率変化に変換するため、 ∂P/∂x_i = φ(Xβ)·β_i で計算。 解釈しやすい指標。
📥 入力例: data/raw/SSDSE-B-2026.csv result.get_margeff().summary() at='mean' or 'overall'
📤 実行例: Marginal Effects (at='mean')
  A4101 出生数   dy/dx = -0.0000396  (p=0.023)
  L3221 消費支出 dy/dx =  0.0000013  (p=0.762)

💬 読み方: 説明変数を平均値に置いたとき、 出生数が 1,000 人多いと高齢化率 30% 超の確率は約 4.0 ポイント下がる(dy/dx = −0.0000396、 p=0.023)。 全 47 県で効果を平均する at='overall' では −0.0000160(1,000 人あたり約 1.6 ポイント)と半分以下になるのは、 予測確率が 0 や 1 に近い県では φ(Xβ) が小さく効果が薄まるため。 消費支出は p=0.762 で効果ありとは言えない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd
import numpy as np
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]                      # 2023年 47都道府県
y = (df['A1303'] / df['A1101'] * 100 > 30).astype(int)  # 高齢化率>30% を1
X = sm.add_constant(df[['A4101', 'L3221']])             # 出生数・消費支出

model = sm.Probit(y, X).fit(disp=False)
print(model.summary())
print('---')
print('限界効果 (mean):')
print(model.get_margeff(at='mean').summary())

例:scikit-learn 風(probit 同等の logit 二者比較)

scikit-learn には Probit 専用クラスはないが、 statsmodels で probit、 sklearn で logit を実行して比較すると、 係数は1.6倍程度のスケール違いで、 予測確率はほぼ一致することが分かる。

🎯 解説: 同じ 47 県・同じ説明変数(出生数・消費支出)を標準化し、 statsmodels の Probit と sklearn の正則化なし LogisticRegression で推定して、 係数の比が理論値 1.6 前後になるかを確かめる。
📥 入力例: data/raw/SSDSE-B-2026.csv(2023 年 47 行) y = 高齢化率>30% を 1(35 県) Xs = StandardScaler で標準化した [A4101 出生数, L3221 消費支出]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import statsmodels.api as sm
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]                      # 2023年 47都道府県
y = (df['A1303'] / df['A1101'] * 100 > 30).astype(int)  # 高齢化率>30% を1
X = df[['A4101', 'L3221']].values                       # 出生数・消費支出

# 出生数(千〜数万人)と消費支出(数十万円)は桁が違うので標準化し、
# sklearn の既定の L2 正則化(C=1.0)も外して最尤推定どうしで比べる。
# どちらかを怠ると logit 側の係数だけが 0 へ潰れ、係数比が意味を失う。
Xs = StandardScaler().fit_transform(X)

probit = sm.Probit(y, sm.add_constant(Xs)).fit(disp=False)
logit_sk = LogisticRegression(C=np.inf, max_iter=5000).fit(Xs, y)   # C=∞ で正則化なし

print('Probit 係数:', probit.params.values)
print('Logit 係数 (sklearn):', [logit_sk.intercept_[0], *logit_sk.coef_[0]])
print('係数比 (logit/probit ≈ 1.6 が理論値):',
      logit_sk.coef_[0] / probit.params.values[1:])
📤 実行例(実測) Probit 係数: [ 0.61224399 -2.03371249 0.092906 ] Logit 係数 (sklearn): [np.float64(1.0818516578571256), np.float64(-3.404067069380154), np.float64(0.1944845671698038)] 係数比 (logit/probit ≈ 1.6 が理論値): [1.67381922 2.09334785]

💬 両モデルとも標準化した説明変数・正則化なしで推定すると、出生数の係数は probit −2.034 に対して logit −3.404 で、比は 1.67 と理論値 1.6 前後に収まる。消費支出の比は 2.09 と外れているが、probit 係数 0.093 は標準誤差 0.31 に比べてほぼ 0 で、0 に近い数どうしの比は不安定になるだけ。標準化も正則化の解除もせずに sklearn の既定で当てると logit 側の係数が 0 へ潰れて比が 3.7 のような値になるので、係数比を比べるときは推定条件をそろえる。

🧮 実値で計算してみる — SSDSE-B-2026

数式だけでは「実感」が湧きにくいので、 実データ data/raw/SSDSE-B-2026.csv(47 都道府県 × 12 年)で 1 度手計算してみると理解が定着します。

SSDSE-B-2026 (2023) で y=(A1101>1,000,000), X=log(L3221) のプロビット回帰を行うと、 切片≈-58、 傾き≈4.6(参考。 ロジット係数 7.3 × 0.62 ≈ 4.6 と概ね一致)。 L3221=320,000 のとき P(Y=1) ≈ Φ(切片+傾き×log(320000)) ≈ 0.89 を得る。

都道府県A1101 総人口A1303 65 歳以上L3221 消費支出
東京都14,086,0003,205,000341,320
神奈川県9,229,0002,390,000306,565
大阪府8,763,0002,424,000271,246
愛知県7,477,0001,923,000300,221
埼玉県7,331,0002,012,000344,092
千葉県6,257,0001,756,000306,943

上記は SSDSE-B-2026 (2023) からの抜粋。 手計算で確認した値が、 後述の Python 実装で得る値と一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。

🧮 数式に値を入れて手で計算する: プロビット変換

合成 z 値を Φ(z) で確率に変換する。

Step 1: z と P

zP=Φ(z)
-1.960.025
00.500
1.00.841
1.960.975
2.580.995

Step 2: ロジット との比較

z=1 で: Probit (Φ) = 0.841 Logit (σ) = 1/(1+e^-1) ≈ 0.731 Probit は裾が薄く、 中央で似た形

🐍 Python で再現

1
2
3
4
5
6
7
import numpy as np
from scipy.stats import norm
z = np.array([-1.96, 0, 1.0, 1.96, 2.58])
probit = norm.cdf(z)
logit = 1/(1+np.exp(-z))
print(f"Probit: {probit.round(3)}")
print(f"Logit: {logit.round(3)}")

📤 実行結果

Probit: [0.025 0.5 0.841 0.975 0.995] Logit: [0.123 0.5 0.731 0.877 0.93 ]

💬 Probit の行は Step 1 の表(0.025・0.500・0.841・0.975・0.995)と、 z=1 の Logit 0.731 は Step 2 と一致する。 z=1.96 では Probit 0.975 に対して Logit は 0.877 にとどまり、 同じ z でもロジスティック関数の方が 1 に近づくのが遅い(裾が厚い)ことが数値で分かる。

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

1. statsmodels — 標準的なプロビット推定

🎯 解説: statsmodels の sm.Probit で最尤推定し、 summary() で係数・標準誤差・z 値・Pseudo R²・尤度比検定をまとめて表示する。 以下 2〜5 はこの y・X をそのまま使う。
📥 入力例: data/raw/SSDSE-B-2026.csv(2023 年 47 行) y = (A1303/A1101*100 > 30) → 1 が 35 県 X = const + A4101(出生数)+ L3221(消費支出)
 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]                      # 2023年 47都道府県
y = (df['A1303'] / df['A1101'] * 100 > 30).astype(int)  # 高齢化率>30% を1
X = sm.add_constant(df[['A4101', 'L3221']])             # 出生数・消費支出

model = sm.Probit(y, X).fit(disp=False)
print(model.summary())
📤 実行例(実測・主要部分) Dep. Variable: y No. Observations: 47 Pseudo R-squ.: 0.5494 Log-Likelihood: -12.032 LL-Null: -26.701 LLR p-value: 4.260e-07 coef std err z P>|z| [0.025 0.975] const 1.3157 3.722 0.353 0.724 -5.979 8.610 A4101 -0.0001 3.97e-05 -3.020 0.003 -0.000 -4.21e-05 L3221 3.89e-06 1.28e-05 0.304 0.761 -2.12e-05 2.9e-05

💬 対数尤度は定数だけのモデルの −26.701 から −12.032 へ上がり、 McFadden の Pseudo R² = 1 − 12.032/26.701 = 0.549。 尤度比検定の p=4.3×10⁻⁷ でモデル全体は効いている。 出生数の 95% 区間 [−0.000198, −0.0000421] は 0 を含まず、 消費支出の [−0.0000212, 0.000029] は 0 をまたぐ。 A4101 の係数が −0.0001 と 4 桁で丸められて見えるので、 正確な値は model.params で −0.000120 と確認する。

2. statsmodels GLM — リンク関数を明示

🎯 解説: 同じモデルを一般化線形モデル(GLM)の枠組みで、 Binomial 分布 + probit リンクとして IRLS で推定し、 sm.Probit と係数が一致することを確かめる。
📥 入力例: 1. で作った y(47 行の 0/1)と X(const・A4101・L3221)
1
2
3
4
5
6
7
import statsmodels.api as sm
from statsmodels.genmod.families import Binomial
from statsmodels.genmod.families.links import probit

# GLM で probit リンクを使う
model = sm.GLM(y, X, family=Binomial(link=probit())).fit()
print(model.summary())
📤 実行例(実測・主要部分) Model Family: Binomial Link Function: probit Method: IRLS Log-Likelihood: -12.032 Deviance: 24.064 Pearson chi2: 30.5 coef std err z P>|z| [0.025 0.975] const 1.3157 3.714 0.354 0.723 -5.963 8.595 A4101 -0.0001 3.81e-05 -3.145 0.002 -0.000 -4.51e-05 L3221 3.89e-06 1.28e-05 0.303 0.762 -2.12e-05 2.9e-05

💬 係数は 1.3157・−0.0001・3.89e-06 と sm.Probit と同じで、 対数尤度も −12.032、 逸脱度 24.064 はその −2 倍になっている。 標準誤差だけが A4101 で 3.97e-05 → 3.81e-05 とわずかに違うのは、 sm.Probit が観測情報行列、 GLM の IRLS が期待情報行列から分散を出すためで、 z 値も −3.020 と −3.145 で少しずれる。

3. scipy.optimize — 手書きの最尤推定

🎯 解説: プロビットの対数尤度 Σ[y log Φ(Xβ) + (1−y) log(1−Φ(Xβ))] を自分で書き、 scipy.optimize.minimize(BFGS)で最大化して係数を求める。 statsmodels の結果と一致するかを確かめる。
📥 入力例: 1. で作った y と X(const・A4101・L3221、 47 行)。 初期値は β=(0, 0, 0)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize

def neg_log_lik(beta, X, y):
    z = X @ beta
    p = norm.cdf(z)
    p = np.clip(p, 1e-9, 1-1e-9)
    return -np.sum(y*np.log(p) + (1-y)*np.log(1-p))

beta0 = np.zeros(X.shape[1])
res = minimize(neg_log_lik, beta0, args=(X.values, y.values), method='BFGS')
print('推定係数:', res.x)
📤 実行例(実測) 推定係数: [ 1.32949125e+00 -1.20513685e-04 3.87219106e-06]

💬 手書きの尤度を BFGS で最大化した係数は 1.3295・−0.0001205・3.87e-06 で、 statsmodels の 1.3157・−0.0001198・3.89e-06 と 3 桁目まで一致する。 定数項が 0.014 ずれるのは、 出生数(数千〜8 万)と消費支出(約 30 万)が桁違いのまま最適化しているため BFGS の収束判定が早めに止まるからで、 説明変数を標準化するか method='Newton-CG' などで勾配を渡すと一致が良くなる。

4. scikit-learn — 二値分類の代替(Logistic / Calibration)

🎯 解説: sklearn には Probit が無いので、 同じ 2 変数でロジスティック回帰を当てて AUC を測り、 さらに CalibratedClassifierCV(isotonic, 5 分割)で確率を校正したときの AUC と比べる。
📥 入力例: 1. の X から定数列を除いた 2 列(A4101・L3221, 47 行)と y
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from sklearn.linear_model import LogisticRegression
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import roc_auc_score

clf = LogisticRegression(max_iter=1000).fit(X.values[:, 1:], y)
pred = clf.predict_proba(X.values[:, 1:])[:, 1]
print('AUC:', roc_auc_score(y, pred))

# Probit に近い校正
cal = CalibratedClassifierCV(LogisticRegression(), method='isotonic', cv=5).fit(X.values[:,1:], y)
print('Calibrated AUC:', roc_auc_score(y, cal.predict_proba(X.values[:,1:])[:,1]))
📤 実行例(実測) AUC: 0.9380952380952381 Calibrated AUC: 0.942857142857143

💬 ロジスティック回帰の AUC は 0.938 で、 1. のプロビットの予測確率で測った AUC 0.940 とほぼ同じになる(リンク関数が違っても並び順はほとんど変わらない)。 isotonic で校正すると 0.943 とわずかに上がったが、 校正は確率の目盛りを直す処理で、 47 県・5 分割では 1 分割が 9〜10 県しかないので、 この 0.005 の差を性能向上と読むことはできない。 どちらも学習に使った 47 県そのもので測った値である点にも注意する。

5. R 風 formula — patsy で statsmodels.formula

🎯 解説: statsmodels.formula の smf.probit で、 R と同じ 'y ~ x1 + x2' の式から同じプロビット回帰を推定する。 列名を式に書くだけで定数項が自動で入る。
📥 入力例: data/raw/SSDSE-B-2026.csv(2023 年 47 行) y = 高齢化率>30% を 1 x1 = A4101(出生数), x2 = L3221(消費支出)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import statsmodels.formula.api as smf
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]                      # 2023年 47都道府県
df['y'] = (df['A1303'] / df['A1101'] * 100 > 30).astype(int)  # 高齢化率>30%
df['x1'] = df['A4101']   # 出生数
df['x2'] = df['L3221']   # 消費支出

model = smf.probit('y ~ x1 + x2', data=df).fit(disp=False)
print(model.summary())
📤 実行例(実測) Probit Regression Results ============================================================================== Dep. Variable: y No. Observations: 47 Model: Probit Df Residuals: 44 Method: MLE Df Model: 2 Date: Sun, 16 Aug 2026 Pseudo R-squ.: 0.5494 Time: 22:49:02 Log-Likelihood: -12.032 converged: True LL-Null: -26.701 Covariance Type: nonrobust LLR p-value: 4.260e-07 ============================================================================== coef std err z P>|z| [0.025 0.975] …

💬 高齢化率 30% 超の県(47 県中 35 県)を出生数と消費支出で判別すると、疑似 R² は 0.549、全係数 0 のモデルからの尤度比検定の p は 4.3×10⁻⁷ で、説明力ははっきりある。効いているのは出生数で、係数 −0.000120(z=−3.02)は出生数が多い県ほど高齢化率 30% 超になりにくいことを表す。消費支出は p=0.76 で効いていない。probit の係数は標準正規の z 値の単位なので、確率の変化として読むには get_margeff で限界効果(出生数 1,000 人あたり約 −1.6 ポイント)に直す。

🐍 Python 実装 — プロビット回帰

公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで プロビット回帰 を動作させます。 まずはこのまま実行してみてください。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 296,888 東京都 14,086,000 3,205,000 341,320 沖縄県 1,468,000 350,000 251,222 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# プロビット回帰 を SSDSE-B-2026 で実行する最小コード
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]  # 2023 年のみ抽出
print(df.shape)  # (47, 112)
print(df[['Prefecture','A1101','A1303','L3221']].head())

import statsmodels.api as sm
import numpy as np
y = (df['A1101'] > 1_000_000).astype(int)
X = sm.add_constant(np.log(df['L3221']))
pm = sm.GLM(y, X, family=sm.families.Binomial(link=sm.families.links.Probit())).fit()
print(pm.summary())
📤 実行例(実測) (47, 112) Prefecture A1101 A1303 L3221 0 北海道 5092000 1681000 296888 12 青森県 1184000 417000 263371 24 岩手県 1163000 407000 298536 36 宮城県 2264000 662000 305541 48 秋田県 914000 357000 272086 Generalized Linear Model Regression Results ============================================================================== Dep. Variable: A1101 No. Observations: 47 Model: GLM Df Residuals: 45 Model Family: Binomial Df Model: 1 Link Function: Probit Scale: 1.0000 Method: IRLS Log-Likelihood: -22.641 Date: Sat, 29 Aug 2026 Deviance: 45.282 Time: 10:13:23 Pearson chi2: 42.7 No. Iterations: 6 Pseudo R-squ. (CS): 0.06923 Covariance Type: nonrobust ============================================================================== coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------ const -57.6739 31.996 -1.803 0.071 -120.384 5.036 L3221 4.6479 2.544 1.827 0.068 -0.338 9.634 ==============================================================================

💬 2023 年度に絞って 47 行 × 112 列になり、head の行番号が 0, 12, 24… と 12 飛びなのは元の 564 行のうち各県の 2023 年度の行だけが残ったため。人口 100 万人超の県(47 県中 37 県)を log(消費支出) で説明すると、係数 4.65 は p=0.068 で 5% では有意にならず、疑似 R²(CS)も 0.069 と小さい。係数どおりに計算すると消費支出 25 万円で 100 万人超の確率 0.54、34 万円で 0.94 と上がるが、信頼区間が 0 をまたぐので「支出の多い県ほど大きい県」とまでは言えない。

▶ 実行 を押せばこのページの中でそのまま動きます(ライブラリもデータも同梱済みで、 準備は要りません)。 手元の Python に移して動かすときは pip install matplotlib numpy pandas scikit-learn scipy seaborn statsmodels が必要です。 読んでいるデータは data/raw/SSDSE-B-2026.csv。 日本語を含むので encoding='cp932' の指定を落とさないでください。

⚠️ プロビット回帰の落とし穴(補強・各 100 文字以上)

① 係数を「効果量」と勘違いする
プロビット回帰の係数 β は潜在変数 y* への影響であって、 確率への影響ではない。 「x が 1 単位増えると確率が β 増える」ではない。 確率への影響を見るには限界効果 (marginal effects) を計算する。 statsmodels の get_margeff(at='mean') を使うのが標準。 報告する数値は係数と限界効果の両方が望ましい。
② logit と probit を取り違えて解釈する
ロジット係数は対数オッズ比に対応するが、 プロビット係数は標準正規 CDF への入力。 同じ「係数 0.5」でも意味が違い、 確率への効果はロジット係数が大体プロビット係数の 1.6 倍に対応する。 論文や Excel から係数を引用するときは必ずどちらのモデルか確認。 自分の論文では明示する。
③ クラス不均衡を放置する
y=1 が 5% しかないデータでプロビットを当てはめると、 「全員 0 と予測」モデルが正答率 95% で出る。 ROC-AUC, 適合率・再現率、 Precision-Recall 曲線で評価し、 クラスウェイト、 oversampling, undersampling, focal loss などを検討する。 単純な accuracy は誤解の元なので避ける。
④ 多重共線性で係数の符号が逆転する
強く相関する説明変数(例:総人口 A1101 と 出生数 A4101)を両方入れると、 VIF が 10 超になり係数の標準誤差が爆発、 場合によっては符号も逆転する。 VIF を確認し、 必要なら片方を落とすか PCA・Ridge 系の正則化を導入する。 観察データではしばしば起きる典型的な落とし穴。
⑤ サンプルサイズが小さくて最尤法が不安定
n が小さい(特に n < 100)でクラスごとに30件もないと、 最尤推定が収束しなかったり、 完全分離 (perfect separation) で係数が無限大になる。 Firth ロジスティック、 ベイズロジット、 ridge 正則化などを検討する。 また分類器の前にロジスティックを試してから probit に進む順序が安全。
⑥ ヘテロスケダスティシティの仮定違反
通常のプロビットは潜在誤差の分散が一定と仮定するが、 実データでは年齢・所得帯ごとにばらつきが変わる。 仮定違反は係数の一致性を壊し、 推定結果がバイアスを持つ。 Heteroskedastic probit や Wald 検定で確認し、 必要なら拡張モデルへ。 とくに政策評価で予測値を絶対視するときは要注意。
⑦ 線形予測子の範囲外で確率を絶対視
プロビットの予測確率は CDF の関数なので、 線形予測子の絶対値が大きくなると 0 や 1 に貼り付いて勾配がほぼゼロになる。 この領域では係数のわずかな変化が予測確率にほぼ影響せず、 「予測の信頼性」が直感と異なる。 saturation 域の値は減衰させて解釈し、 校正曲線(reliability diagram)で確認する。

⚠️ プロビット固有の補足落とし穴(3 件、 各 100 文字超)

上の 7 件で抑えられないプロビット固有の罠を 3 件追加。 SSDSE-B-2026 を都道府県二値判定(人口 100 万人超 / 高齢化率 30% 超など)に使うときに踏みやすい順で並べた。

❌ probit と logit を「結果が同じ」と言って混在報告
予測確率は近いが係数のスケールが約 1.6 倍違うので、 1 つの論文で β_probit と β_logit を並べると読者が誤解する。 SSDSE-B-2026 の高齢化率二値で probit β = 0.5 と logit β = 0.8 はほぼ同じ意味だが、 説明なしで並べてはいけない。
❌ 47 都道府県データで oracle separation
SSDSE-B-2026 は n=47 と小さい。 「東京・大阪・神奈川だけ 1、 他は 0」のような閾値だと完全分離が起きて probit は収束しない(β が ±∞ へ発散)。 statsmodels が PerfectSeparationError を出したらクラス境界を緩めるか Firth probit に切り替える。
❌ 限界効果 (marginal effects) を出さずに係数だけ報告
probit 係数 0.5 は「x が 1 増えると確率が 0.5 増える」ではない。 SSDSE-B-2026 で「A4101 出生数が増えると確率が何%変わるか」を答えるには get_margeff(at='mean').summary() が必須。 係数のみの報告は読者を確実に誤解させる。
🛡 防御策まとめ:probit を選んだら必ず ① 限界効果を併記、 ② logit との比較表で 1.6 倍スケールを明示、 ③ 完全分離チェック (二値の cross-tab で 0 セルがないか) を pre-flight、 の 3 点を pipeline に組み込む。 これだけで 80% の事故は防げる。

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

Q1: 何を知りたい?

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:

統計量 効果量 小 中 大
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰R²0.020.130.26
ANOVAη² (eta²)0.010.060.14
χ²Cramér's V0.10.30.5
ロジスティックOdds Ratio1.52.54.0

🚀 実務応用の深掘り

典型的なプロジェクトの流れ

  1. 問題理解:ステークホルダーとの対話、 KGI/KPI 設定
  2. データ収集:内部DB、 公的データ(SSDSE等)、 API
  3. EDA:データの全体像把握、 異常検出
  4. 仮説立案:ドメイン知識からの仮説
  5. モデリング:シンプルから複雑へ段階的に
  6. 検証:CV、 ホールドアウト、 A/Bテスト
  7. 解釈:可視化、 SHAP、 部分依存プロット
  8. 展開:本番デプロイ、 監視

ベストプラクティス

論文・コンペでよく使う言い回し

日本語 英語
統計的に有意statistically significant
効果量effect size
95%信頼区間95% confidence interval (CI)
標本サイズsample size
検出力statistical power
第1種の誤りType I error / false positive
第2種の誤りType II error / false negative
多重比較問題multiple comparisons problem
過学習overfitting
汎化性能generalization
交差検証cross-validation (CV)

統計データ活用コンペでのコツ

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

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

📍 体系階層のパス

🌐 統計・データサイエンス › 関連・回帰 › 回帰 › プロビット回帰

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

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

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

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

大きな円が小さな円を包含する Circle Packing 図。 「プロビット回帰」は緑色でハイライト。

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

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

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「プロビット回帰」は緑色でハイライト。

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

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

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは プロビット回帰 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 回帰 → プロビット回帰 という入れ子の位置を示します。 「回帰には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

🔗 隣接手法への橋渡し

プロビット回帰は累積正規分布で 2 値結果を予測する GLM で、 ロジスティック回帰・潜在変数モデル・離散選択モデルと併用される。

SSDSE-B-2026 を用いた演習では、 「プロビット回帰」 を中核に据えて上記の上流・並列・下流の手法を実データで連結する経験を積むと、 単独の手法暗記より実務的応用力が身につく。

🌳 手法選択フロー

「probit」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。

典型シナリオ別の手法選択

シナリオ重視する観点候補手法
データが大規模 (n が多い、 高次元)計算コスト / メモリ / 並列化が必要ロジスティック回帰(閉形式で高速。 プロビットは Φ の積分が必要でやや重い)
外れ値が多い / ノイズあり頑健性 / 外れ値除去 / 中央値ベース頑健プロビット(heteroskedastic probit・ロバスト標準誤差)
解釈性を重視する線形 / 木構造 / ルールベースプロビット+限界効果 / 線形確率モデル (LPM)
予測精度を最優先するアンサンブル / ハイパラ調整 / 交差検証勾配ブースティング / RF(確率校正と併用)
データが少ない正則化 / ベイズ / 転移学習 / 簡素なモデルベイズプロビット(Albert-Chib)/ Firth ロジット
リアルタイム/オンライン処理ストリーミング / 軽量モデル / 逐次更新オンラインロジスティック(SGD による逐次更新)

選んだ後の検証ステップ

  1. 前処理確認: 標準化 / 欠損処理 / カテゴリ変数のエンコード が適切か
  2. ハイパラ調整: 交差検証で安定する値を選ぶ
  3. 性能評価: タスクに応じた指標 (RMSE / Accuracy / F1 / AUC / シルエット等) を複数併用
  4. 頑健性チェック: 別手法 / 別シードで結果が大きく違わないか確認
  5. 解釈: 結果を分野知識と照らし合わせ、 意味のある発見になっているか検討

🎮 触って理解する

スライダーで切片 $\beta_0$ と傾き $\beta_1$ を動かすと、 プロビットの当てはめ曲線 $\Pr(Y=1\mid x)=\Phi(\beta_0+\beta_1 x)$ がリアルタイムに変形します。 ロジット(シグモイド)曲線 $1/(1+e^{-(\beta_0+\beta_1 x)})$ を重ねて表示できるので、 裾(両端)の重さの違いを目で比べてください。 グラフ上をドラッグ / タップすると、 その $x$ での予測確率を読み取れます。 背景の丸は教材用の擬似データ点(上段=1/下段=0)で、 曲線がデータをどうなぞるかを確認できます。

選択点 x = 1.00 → 線形予測子 z = β₀+β₁x = 1.00
■ プロビット Φ(z) = 0.841  /  ■ ロジット σ(z) = 0.731
判別境界(P=0.5 となる x)= 0.00

💡 直感:潜在変数が閾値を超えると 1

背後に観測されない連続量 $Y^*=\beta_0+\beta_1 x+\varepsilon$($\varepsilon\sim N(0,1)$)があり、 $Y^*>0$ のとき $Y=1$ と観測される、 というのがプロビットの物語です。 $\Pr(Y=1)=\Pr(\varepsilon>-(\beta_0+\beta_1 x))=\Phi(\beta_0+\beta_1 x)$ と、 リンク関数が標準正規 CDF $\Phi$ になる理由が潜在変数から自然に導かれます。 スライダーで $\beta_1$ を大きくすると閾値付近の傾きが急になり、 「潜在変数の少しの差」で 0/1 が切り替わる様子が見えます。

🚧 よくある落とし穴

🚀 発展:順序プロビットとトービット

🎨 直感の深掘り(追記) — 潜在変数と 2 つの CDF

既存の「🎨 直感で掴む」「🎮 触って理解する」を壊さず、 潜在変数モデルとしての読み替えとロジットとの関数形の違いをもう一段深く言語化します。 プロビットの物語はたった 2 行で言えます。 (1) 各サンプルの背後に、 観測されない連続的な「なりやすさ」 $Y^*=\beta_0+\beta_1 x+\varepsilon$ がある。 (2) その $Y^*$ が閾値 0 を超えたとき、 私たちは $Y=1$ という 2 値だけを観測する。

【潜在変数からリンク関数が生まれる導出】
$$ \Pr(Y=1\mid x)=\Pr(Y^*>0)=\Pr\bigl(\varepsilon>-(\beta_0+\beta_1 x)\bigr)=\Phi(\beta_0+\beta_1 x) $$
最後の等号は $\varepsilon\sim N(0,1)$ の対称性($\Pr(\varepsilon>-z)=\Pr(\varepsilon<z)=\Phi(z)$)から。 誤差項に何の分布を仮定するかでリンク関数が決まる、 というのが核心です。

ここで誤差項 $\varepsilon$ の分布を「標準正規」ではなく「標準ロジスティック分布」に取り替えると、 同じ導出から $\Pr(Y=1\mid x)=1/(1+e^{-(\beta_0+\beta_1 x)})$、 すなわちロジスティック回帰が出てきます。 つまりプロビットとロジットは「潜在変数+閾値」という同じ骨格に、 違う誤差分布を差し込んだ兄弟です。 ロジスティック回帰・シグモイド関数・正規分布のページと合わせて読むと、 この対応関係が立体的に見えてきます。

なぜ「ほぼ同じ」なのに関数形が違うのか

標準正規と標準ロジスティックは、 分散が違うだけで形はよく似た釣鐘型です(ロジスティックの分散は $\pi^2/3\approx3.29$、 正規は 1)。 スケールを揃えると 2 つの CDF はほとんど重なり、 差が出るのは裾(両端)だけ。 プロビットの裾のほうが速く 0/1 に貼り付く(=軽い裾)ため、 極端な $x$ の外挿でだけ両者に差が現れます。 中央付近ではほぼ区別できません。 上の「🎮 触って理解する」でロジット曲線を重ねると、 まさにこの「中央は一致・裾だけ差」が目視できます。

📌 一言まとめ:プロビット=「正規誤差の潜在変数モデル」、 ロジット=「ロジスティック誤差の潜在変数モデル」。 分野の慣習(経済学・心理学=プロビット寄り、 機械学習・疫学=ロジット寄り)で選ぶことが多く、 予測精度で優劣がつくことはほぼありません。

⚠️ 落とし穴の深掘り(追記・重要) — スケール・分離・非線形

既存の「⚠️ 落とし穴」7+3 件を壊さず、 実務で最も事故が多い 6 点を「なぜ起きる/どう防ぐ」の形で圧縮して再整理します。 太字が結論、 その後が対処です。

A. 係数をそのまま「確率の変化」と読む
プロビット係数 $\beta_j$ は潜在変数(標準偏差単位)への効果であり、 確率への効果ではない。 確率への効果は限界効果 $\partial P/\partial x_j=\phi(\beta_0+\beta_1 x+\dots)\,\beta_j$ で、 $x$ の水準に依存して変わる($\phi$ は標準正規密度)。 対策:係数と限界効果を必ず併記する。 statsmodels なら get_margeff(at='mean')(代表点)と at='overall'(平均限界効果 AME)を両方見る。
B. プロビットとロジットの係数を同じ土俵で比較する
両者は予測はほぼ同じでも、 係数のスケールが約 1.6 倍違う(ロジット係数 ≈ プロビット係数 ×1.6、 理論値 $\pi/\sqrt3\approx1.81$ を経験的に約 1.6〜1.7 と見る)。 対策:数値を並べるときは必ずどちらのモデルか明示。 比べたいなら限界効果(確率スケール)に揃える。 このページ末尾の実測比較(SSDSE-B-2026)で A4101 の比が 1.67 になることを確認できる。
C. 完全分離(perfect separation)で推定が発散する
ある説明変数だけで 0/1 を完全に切り分けられると、 最尤推定は $\beta\to\pm\infty$ へ発散し収束しない(statsmodels は PerfectSeparationError)。 n が小さいほど起きやすい(SSDSE-B-2026 は n=47)。 対策:二値のクロス集計で 0 セルを事前確認、 Firth 罰則化プロビット/ベイズ事前分布で正則化、 分離を招く極端な閾値を避ける。
D. 潜在誤差の等分散(ホモスケダスティシティ)仮定を忘れる
標準プロビットは潜在誤差の分散を全観測で一定と仮定する。 群ごとに分散が違うと係数が一致性を失いバイアスが乗る。 単なる OLS の不均一分散(SE だけの問題)と違い、 プロビットでは点推定そのものが歪む点が厄介。 対策:Heteroskedastic probit(分散を別の変数でモデル化)や頑健化、 予測を絶対視せず校正曲線で確認。
E. 確率の非線形性を無視して「線形の直感」で語る
$\Phi$ は S 字なので、 同じ 1 単位の増加でも中央($P\approx0.5$)では確率が大きく動き、 裾($P\approx0$ または $1$)ではほとんど動かない。 線形予測子の絶対値が大きい領域では勾配がほぼ 0 で「効かない」。 対策:限界効果を必ず「どの $x$ 水準で評価したか」とセットで報告し、 saturation 域の予測は減衰して解釈する。
F. 標本サイズ・クラス不均衡に無頓着
n が小さい/片方のクラスが極端に少ないと、 最尤推定が不安定になり SE が過大、 accuracy だけ見ると「全部多数派と予測」で高得点という罠にはまる。 対策:クラス不均衡対策(重み付け・リサンプリング)、 ROC 曲線/AUC・適合率再現率で評価、 混同行列で誤りの内訳を確認する。
🛡 3 行チェックリスト:① 係数と限界効果(mean と overall)を併記したか。 ② logit と比べるなら確率スケールに揃えたか。 ③ 二値クロス集計で 0 セル(完全分離の芽)が無いか。 この 3 つを pipeline に入れるだけで大半の事故は防げます。

🚀 発展の深掘り(追記) — 限界効果・使い分け・拡張family

既存の「🌐 関連手法」「🔗 関連用語」を壊さず、 プロビットから伸びる発展トピックを 4 グループで整理します。

① 限界効果(marginal effect)の 2 つの流儀

係数を「確率の言葉」に翻訳する道具が限界効果です。 主に 2 種類あります。

種類定義使いどころ
代表値での限界効果 (MEM)説明変数を平均などに固定した 1 点で $\phi(\bar{x}^\top\hat\beta)\hat\beta_j$「平均的な県」での効果を一言で言いたいとき。 at='mean'
平均限界効果 (AME)各観測で限界効果を計算し全サンプル平均 $\frac1n\sum_i\phi(x_i^\top\hat\beta)\hat\beta_j$標本全体を代表させたいとき(推奨されることが多い)。 at='overall'

どちらも「$x_j$ が 1 単位増えると確率が何ポイント動くか」を返しますが、 非線形なので評価点で値が変わる点に注意(落とし穴 E と同じ理由)。

② プロビット vs ロジットの使い分け

③ 拡張family(潜在変数モデルの親戚)

④ 位置づけ(前提・並列・発展)

前提:正規分布(リンクの CDF)・分類の基礎・最尤法。 並列:ロジスティック回帰・線形確率モデル(LPM)。 発展:順序/多項プロビット・トービット・Heckman・パネルプロビット・機械学習分類。 評価は混同行列・ROC・AUC、 モデル比較はAIC・モデル選択で。

🧮 追記の実測 — SSDSE-B-2026 でプロビット×ロジット係数比較

既存の実測値(Pseudo R²=0.549、 限界効果 A4101≈−0.0000396 等)はそのままに、 「プロビットとロジットで係数がどれだけ違い、 予測がどれだけ一致するか」を新規に実測しました。 条件:SSDSE-B-2026(cp932, skiprows=[1])の 2023 年 47 都道府県、 目的変数 $y=\mathbb1[\text{高齢化率(A1303/A1101×100)}>30\%]$(該当 35/47 県)、 説明変数 A4101(出生数)・L3221(消費支出)+定数項。 同一の $y,X$ に sm.Probit と sm.Logit を当てはめた実測です。

項目プロビットロジットロジット / プロビット比
定数項+1.316+1.7671.34
A4101(出生数)係数−0.000120−0.0002011.67
L3221(消費支出)係数+0.0000040+0.00000852.10(両者とも非有意 p≈0.76)
McFadden 疑似 R²0.5490.539—
📤 実測サマリ(2023年・47都道府県) 有意な A4101 係数の比 logit/probit = 0.000201 / 0.000120 ≒ 1.67(理論のおおよそ 1.6〜1.8 に整合) 予測確率の相関 corr(P_probit, P_logit) = 0.9997 予測確率の最大差 max|P_probit − P_logit| = 0.021 閾値 0.5 での分類一致 = 47 / 47 県(完全一致) → 係数は約 1.6 倍スケールが違うが、予測・判別は実質同一

読み方:有意な係数 A4101 の比が 1.67 と、 教科書的な「ロジット係数はプロビットの約 1.6 倍」がこの実データでも成り立ちます(非有意な L3221 は分母が極小で比が不安定になるため参考外)。 一方で予測確率はほぼ完全に一致(相関 0.9997・最大差わずか 0.021)し、 0.5 閾値での判別は 47 県すべてで一致。 「係数の数値だけ見ると別物、 予測を見ると双子」というプロビット/ロジットの関係が、 SSDSE-B-2026 で具体的に確認できます。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 24,430 296,888 東京都 14,086,000 3,205,000 86,348 341,320 沖縄県 1,468,000 350,000 12,549 251,222 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
import numpy as np
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]            # 2023年 47都道府県
y = (df['A1303'] / df['A1101'] * 100 > 30).astype(int)
X = sm.add_constant(df[['A4101', 'L3221']])

pm = sm.Probit(y, X).fit(disp=False)
lm = sm.Logit(y, X).fit(disp=False)
print('ratio logit/probit:', (lm.params / pm.params).round(2).to_dict())
pp, lp = pm.predict(X), lm.predict(X)
print('corr:', round(np.corrcoef(pp, lp)[0, 1], 4),
      'agree:', int(((pp > 0.5) == (lp > 0.5)).sum()), '/ 47')
📤 実行例(実測) ratio logit/probit: {'const': 1.34, 'A4101': 1.67, 'L3221': 2.1} corr: 0.9997 agree: 47 / 47

💬 同じデータで logit と probit を当てると、係数比は出生数 1.67、消費支出 2.10、定数 1.34 で、理論値の 1.6 前後に近いのは有意な出生数だけ。予測確率どうしの相関は 0.9997、0.5 で切った判定は 47 県すべてで一致しており、どちらのリンク関数を選んでも結論は変わらない。係数の値そのものはモデル間で比べられないので、報告するときは限界効果か予測確率でそろえる。

※ 上記の数値はいずれも 2023 年 47 都道府県での実測(合成・架空データではない)。 既存セクションの実測値(Pseudo R²=0.549、 限界効果等)とも整合します。