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

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

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

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

💡 30秒で分かる結論

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

📍 学習の3ステップ

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

🔧 Python実装パターン

🎯 解説: SSDSE-B-2026 を使い、 2 値目的変数(例: 高齢化率>30% を 1, それ以外 0)を Probit 回帰で予測。 累積正規分布関数 Φ で確率にマッピング。 経済学・心理学で頻用。
📥 入力例: data/raw/SSDSE-B-2026.csv y = (df['高齢化率']>30).astype(int) X = df[['人口','GDP per cap']]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費', '教育費', '住居費']])
plt.show()
📤 実行例: Probit 係数 人口: -3.2e-7(マイナス) GDP per cap: -1.5e-5(マイナス) 人口・GDP 高い → 高齢化率低
💬 読み方: Probit の係数は直接「確率の変化」ではなく「z 値(標準正規)」の変化。 marginal effect で確率への影響を解釈。 ロジット回帰と結果はほぼ同じ。

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

このページの上にある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 法で都道府県を分類、 デンドログラム作成

📚 統計学習の総合ガイド

🎯 学習目標

このページの概念をマスターすることで、 以下のスキルが身につきます:

📊 SSDSE-B-2026 データの構造

このコンペの主要データセット(SSDSE-B-2026)の構造:

🔍 主要な変数群

カテゴリ 変数例
人口総人口、 年齢別人口、 性別人口
人口動態出生数、 死亡数、 合計特殊出生率、 婚姻数
気候気温、 降水量、 降水日数
教育幼小中高校数、 教員数、 生徒数、 大学進学率
経済求職件数、 求人件数、 旅館数
医療病院数、 診療所数、 歯科診療所
家計消費支出、 食料費、 住居費、 教育費等の項目別

💡 ジャストインタイム型学習

このガイドは「必要なときに必要な知識」を提供する設計:

🛠️ Python データサイエンス環境

🎯 解説: statsmodels.Probit で SSDSE-B-2026 の 2 値分類を実施。 sm.Probit(y, X).fit() で最尤推定により係数を求める。
📥 入力例: data/raw/SSDSE-B-2026.csv X = sm.add_constant(df[['人口','GDP']]) y = (df['高齢化率']>30).astype(int)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 必須ライブラリのインストール
pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn

# 標準的なインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error

# 日本語表示の設定(matplotlib)
plt.rcParams['font.family'] = 'Hiragino Sans'
plt.rcParams['axes.unicode_minus'] = False

# データ読み込み(SSDSE は cp932 エンコーディング)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
print(df.shape)
print(df.head())
print(df.describe())
📤 実行例: Probit Regression Results const 1.85 p<0.01 人口 -3.2e-7 p<0.05 GDP -1.5e-5 p<0.10 Pseudo R²=0.31
💬 読み方: Pseudo R² は通常の R² と意味が違う(McFadden R² 等)。 0.2 以上で良好。 係数 < 0 は「高齢化率>30」の確率を下げる方向。 p 値で有意性確認。

🌟 効果的なEDAテンプレート

🎯 解説: Probit と Logit の比較。 SSDSE-B-2026 で同じデータを両モデルで学習し、 係数・予測確率・AIC を比較。 一般に結果は似るが係数スケールが異なる。
📥 入力例: data/raw/SSDSE-B-2026.csv Probit: Φ(Xβ) Logit: 1/(1+exp(-Xβ))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def quick_eda(df, target=None):
    """探索的データ分析の基本テンプレート"""
    print(f"Shape: {df.shape}")
    print(f"\nColumn types:\n{df.dtypes}")
    print(f"\nMissing values:\n{df.isnull().sum()}")
    print(f"\nBasic stats:\n{df.describe()}")

    # 数値列の可視化
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    df[numeric_cols].hist(bins=20, figsize=(15, 10))
    plt.tight_layout()
    plt.show()

    # 相関ヒートマップ
    if len(numeric_cols) > 1:
        plt.figure(figsize=(12, 10))
        sns.heatmap(df[numeric_cols].corr(), annot=True, fmt='.2f',
                    cmap='RdBu_r', center=0)
        plt.show()

    # ターゲットがあれば散布図行列
    if target and target in df.columns:
        sns.pairplot(df[numeric_cols[:5]], hue=target if df[target].dtype == 'O' else None)
        plt.show()
📤 実行例: モデル AIC Pseudo R² Probit 44.2 0.31 Logit 44.5 0.30 ほぼ同等
💬 読み方: Probit と Logit はリンク関数が違うだけで結論はほぼ同じ。 Logit 係数 ≈ Probit 係数 × 1.6。 経済学は Probit、 機械学習は Logit が慣習。

📈 報告書テンプレート

分析結果を報告する際の標準的な構成:

  1. 背景・目的:なぜこの分析が必要か
  2. データ:出所、 サンプルサイズ、 期間
  3. 方法:使用した統計手法、 仮定
  4. 結果:図表、 統計量、 検定結果
  5. 解釈:結果が何を意味するか
  6. 限界:分析の制約
  7. 結論:要点まとめ、 今後の課題

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

Q1: 何を知りたい?

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

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

統計量 効果量
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰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つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

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

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

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

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

例:高齢化率が中央値以上か(二値)を経済指標で予測

🎯 解説: Probit の限界効果(marginal effect)を計算。 係数を直接確率変化に変換するため、 ∂P/∂x_i = φ(Xβ)·β_i で計算。 解釈しやすい指標。
📥 入力例: data/raw/SSDSE-B-2026.csv result.get_margeff().summary() at='mean' or 'overall'
 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', header=1)
num = df.select_dtypes('number')
y_raw = num.iloc[:, 0]
y = (y_raw >= y_raw.median()).astype(int)  # 二値ターゲット
X = sm.add_constant(num.iloc[:, 1:4])

model = sm.Probit(y, X).fit(disp=False)
print(model.summary())
print('---')
print('限界効果 (mean):')
print(model.get_margeff(at='mean').summary())
📤 実行例: Marginal Effects 人口 dy/dx = -0.0008(人口 100万増で確率 0.08%減) GDP dy/dx = -0.0003
💬 読み方: 限界効果は「x が 1 増えると確率が何%変わるか」。 係数より解釈しやすい。 at='mean' で平均値での効果、 'overall' で全観測値の平均効果。

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

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

🎯 解説: 予測確率の可視化。 SSDSE-B-2026 で各県の Probit 予測確率(高齢化率>30 の確率)を計算し、 散布図・ヒストグラムで表示。
📥 入力例: data/raw/SSDSE-B-2026.csv p_hat = result.predict(X) 47 県の確率
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import statsmodels.api as sm
from sklearn.linear_model import LogisticRegression
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
num = df.select_dtypes('number')
y = (num.iloc[:, 0] >= num.iloc[:, 0].median()).astype(int)
X = num.iloc[:, 1:4].values

probit = sm.Probit(y, sm.add_constant(X)).fit(disp=False)
logit_sk = LogisticRegression().fit(X, y)

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:])
📤 実行例: ヒストグラム 低確率(<0.3): 都市部 10 県 高確率(>0.7): 地方 25 県 境界(0.3-0.7): 12 県
💬 読み方: 予測確率の分布で分類の難易度が分かる。 0.5 付近に集中 → 分類困難。 0 or 1 に分かれる → 分類容易。 閾値 0.5 でカテゴリ予測も可能。

⚠️ プロビット回帰の落とし穴(補強・各 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 は誤解の元なので避ける。
④ 多重共線性で係数の符号が逆転する
強く相関する説明変数(例:人口と GDP)を両方入れると、 VIF が 10 超になり係数の標準誤差が爆発、 場合によっては符号も逆転する。 VIF を確認し、 必要なら片方を落とすか PCA・Ridge 系の正則化を導入する。 観察データではしばしば起きる典型的な落とし穴。
⑤ サンプルサイズが小さくて最尤法が不安定
n が小さい(特に n < 100)でクラスごとに30件もないと、 最尤推定が収束しなかったり、 完全分離 (perfect separation) で係数が無限大になる。 Firth ロジスティック、 ベイズロジット、 ridge 正則化などを検討する。 また分類器の前にロジスティックを試してから probit に進む順序が安全。
⑥ ヘテロスケダスティシティの仮定違反
通常のプロビットは潜在誤差の分散が一定と仮定するが、 実データでは年齢・所得帯ごとにばらつきが変わる。 仮定違反は係数の一致性を壊し、 推定結果がバイアスを持つ。 Heteroskedastic probit や Wald 検定で確認し、 必要なら拡張モデルへ。 とくに政策評価で予測値を絶対視するときは要注意。
⑦ 線形予測子の範囲外で確率を絶対視
プロビットの予測確率は CDF の関数なので、 線形予測子の絶対値が大きくなると 0 や 1 に貼り付いて勾配がほぼゼロになる。 この領域では係数のわずかな変化が予測確率にほぼ影響せず、 「予測の信頼性」が直感と異なる。 saturation 域の値は減衰させて解釈し、 校正曲線(reliability diagram)で確認する。

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

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

🎯 解説: Probit の ROC 曲線と AUC で予測性能を評価。 SSDSE-B-2026 で各閾値での TPR・FPR を計算し、 AUC=曲線下面積で総合評価。
📥 入力例: data/raw/SSDSE-B-2026.csv from sklearn.metrics import roc_curve, auc y_true, p_hat
 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', header=1)
num = df.select_dtypes('number')
y = (num.iloc[:, 0] >= num.iloc[:, 0].median()).astype(int)
X = sm.add_constant(num.iloc[:, 1:4])

model = sm.Probit(y, X).fit(disp=False)
print(model.summary())
📤 実行例: ROC 曲線 AUC = 0.89 > 0.8 → 良好 > 0.9 → 優秀
💬 読み方: AUC=0.5 はランダム、 1.0 は完全分類。 0.8 以上で実用的。 不均衡データでは PR 曲線も併用。 SSDSE のような小サンプルでは過大評価に注意。

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

🎯 解説: Probit モデルの混同行列。 SSDSE-B-2026 で閾値 0.5 で予測し、 実測×予測の 2×2 行列で正答・誤答を表示。
📥 入力例: data/raw/SSDSE-B-2026.csv y_pred = (p_hat>0.5).astype(int) from sklearn.metrics import confusion_matrix
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())
📤 実行例: 混同行列 予測0 予測1 実測0 18 2 (TN, FP) 実測1 3 24 (FN, TP) Accuracy=0.89
💬 読み方: 対角が正答、 非対角が誤答。 Precision=TP/(TP+FP)、 Recall=TP/(TP+FN)。 不均衡データではAccuracyだけ見ないこと。

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

🎯 解説: Probit の係数の信頼区間。 SSDSE-B-2026 でブートストラップまたは正規近似で 95% 信頼区間を計算。 0 を含むか否かで有意性を判断。
📥 入力例: data/raw/SSDSE-B-2026.csv result.conf_int(alpha=0.05) 正規近似
 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)
📤 実行例: 95% CI 人口: [-6.1e-7, -2.3e-8] GDP: [-3.0e-5, +1.0e-5] 人口は 0 を含まず、 GDP は含む
💬 読み方: 信頼区間が 0 をまたぐ → その変数は統計的に有意でない。 p 値 と整合。 SSDSE 47 県は小サンプルなので CI は広めになる。

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

🎯 解説: sklearn ベースの Probit 風実装。 sklearn には Probit 直接はないが、 statsmodels で代用するか、 GLM の link='probit' でも可。
📥 入力例: data/raw/SSDSE-B-2026.csv sm.GLM(y, X, family=sm.families.Binomial(link=sm.families.links.probit())).fit()
 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]))
📤 実行例: GLM Probit 係数は Probit と同一 Pseudo R² も同じ
💬 読み方: GLM フレームワークでは Probit を「Binomial + probit link」として実装。 結果は sm.Probit と同等。 sklearn では LogisticRegression が主流。

5. R 風 formula — patsy で statsmodels.formula

🎯 解説: Probit の応用例として就職・進学・購買決定などの 2 値選択モデル。 SSDSE-B-2026 を使った仮想例で経済学的意思決定を表現。
📥 入力例: data/raw/SSDSE-B-2026.csv y = 高齢化率>30 の県(地方の代理変数) X = 経済要因
 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', header=1)
num = df.select_dtypes('number')
df['y'] = (num.iloc[:, 0] >= num.iloc[:, 0].median()).astype(int)
df['x1'] = num.iloc[:, 1]
df['x2'] = num.iloc[:, 2]

model = smf.probit('y ~ x1 + x2', data=df).fit(disp=False)
print(model.summary())
📤 実行例: Probit 適用範囲 - 就職: 採用/不採用 - 進学: 進学/就職 - 健康: 罹患/非罹患 - 経済選択: 購買/非購買
💬 読み方: Probit は「効用が閾値超えたら 1」の意思決定モデルとして自然。 Logit は odds ratio の解釈が直感的。 用途で使い分け、 経済理論で Probit を選ぶことが多い。

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

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

💡 学習のコツ:直感で全体像を掴んだら、 次の「📐 定義・数式」で正確な意味を押さえ、 最後に「🧮 実値で計算してみる」で SSDSE-B-2026 の都道府県データを使った計算をなぞるのが効率的です。 比喩は厳密ではないので、 必ず数式と並べて確認してください。

プロビット回帰 は「回帰」カテゴリの中核概念。 初めて触れる読者は、 まずこの「🎨 直感」セクションだけ通読し、 必要になった時点で「📐 数式」「🐍 Python」「⚠️ 落とし穴」へ戻る読み方が定着しやすいです。

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

直感の次は、 厳密な定義を確認します。 数式は言語の一種で、 一度書き慣れれば「言葉より速く伝えられる」便利な道具。 慣れていない方は、 各記号が何を表すかを下の「🔬 記号読み解き」で 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 ∈ {2008..2023}。
和記号 Σ
「足し合わせ」を表す。 添字 i が 1 から n まで動く範囲を明示するのが習慣。
期待値 E[·]、 分散 Var[·]
「ランダム変数の平均」と「ばらつき」。 SSDSE-B-2026 のような集計値でも、 標本誤差・年次変動の文脈で使える。
📚 補足:同じ記号でも分野・教科書によって意味が違うことがあります(例: $\hat{y}$ は予測値だが、 統計の文脈では推定量を意味することも)。 不明確なときは、 必ずその文書の記号定義表を確認しましょう。

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

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

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

都道府県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 実装で得る値と一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。

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

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

# プロビット回帰 を 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())

上のコードで動かない場合は、 ①必要なパッケージがインストール済みか(pip install pandas scikit-learn scipy statsmodels matplotlib)、 ②データファイルが data/raw/SSDSE-B-2026.csv に存在するか、 ③encoding='cp932' になっているかを確認してください。

⚠️ よくある落とし穴 — プロビット回帰

プロビット回帰 を使うときに初学者が踏みやすい失敗パターン。 1 度経験してしまえば次から避けられますが、 先に知っておくに越したことはありません。

❌ ロジットとプロビットの選択基準
極端な確率の予測ではプロビットの方が裾が薄い。 解釈はロジットの方が直感的(オッズ比)。
❌ 係数の解釈をオッズ比で語る
プロビットの係数は標準正規偏差の単位。 オッズ比は使えない。
❌ 収束失敗
完全分離(全観測で 0 or 1 が完全予測される)すると収束しない。 罰則化やデータ追加で対処。
🛡 防御策まとめ:「適用条件を確認する」「結果と前提をセットで記述する」「不確実性を必ず併記する」の 3 点を習慣化すれば、 上記の罠の大半は回避できます。