1. プロビット分析とは
プロビット分析とは、
「ある出来事が起きる確率(0 or 1)」を説明変数から予測する手法です。
例えば:
- メールを開封するか(1:する / 0:しない)
- 商品を購入するか(1:する / 0:しない)
- 試験に合格するか(1:合格 / 0:不合格)
学術的に言うと、プロビット分析とは、重回帰分析において被説明変数をダミー変数(0と1など)に置き換えることにより、被説明変数$Y$が1になる確率が他の説明変数$X$に影響されているかどうかを調べる手法です。
2. なぜ普通の回帰ではダメなのか
通常の線形回帰:
$$
Y = β_0 + β_1X
$$
しかしこれには問題があります:
- 予測値が1を超える
- 予測値が0未満になる
→ 確率として成立しない
3. リンク関数という考え方
そこで登場するのが リンク関数(連結関数、link function) です。
考え方はシンプル:
確率そのものではなく、変換した値を線形にする
つまり通常、回帰モデルでは、予測変数と応答変数の間の関係を線形にすることが期待されます。しかし、応答変数が線形ではなく、例えば0から1の範囲に制約されている場合や、指数的に増加する場合などがあります。そのようなときに、リンク関数を使って、応答変数を予測変数の線形結合と関連付けます。
4. プロビットモデルの基本式
$$
P(Y = 1|X) = \Phi(β_0 + β_1X)
$$
ここで、$\Phi(x)$ は標準正規分布の累積分布関数:
$$
\Phi(x) = \int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}t^2} dt
$$
プロビット回帰は 連結関数 として$\Phi^{-1}$を用いた場合の一般化線形モデルの例ということもできます。
5. 直感的な理解
処理の流れ:
-
線形結合を作る
$z = β_0 + β_1X$ -
正規分布に通す
→ 0〜1の確率になる
6. 使用例
例1:試験の合格確率
- X:勉強時間
- Y:合格(1)/ 不合格(0)
$$
P(合格) = \Phi(β_0 + β_1 × 勉強時間)
$$
特徴:
- 勉強時間が増えるほど合格確率は上がる
- S字カーブ的に増加する
例2:広告クリック
- X:広告表示回数
- Y:クリックしたか
挙動:
- 少ないとほぼ0
- 一定を超えると急に上がる
- 最後は1に近づく
7. 尤度関数
観測値$y_1, \cdots, y_n$が与えられた時の尤度関数は
$$L(β_0,β_1) = \prod^n_{i=1} \Phi(β_0 + β_1x_i)^{y_i}(1-\Phi(β_0 + β_1x_i))^{1-y_i}$$となる。ロビットモデルの尤度関数も同様です。
8. 説明変数が複数の場合
$$
P(Y = 1|X_1,X_2) = \Phi(β_0 + β_1X_1 + β_2X_2)
$$
単に線形部分が増えるだけ。
例:
- $X_1$:年収
- $X_2$:年齢
9. ロジスティック回帰との違い
| モデル | 関数 |
|---|---|
| プロビット | 正規分布($\Phi$) |
| ロジット | ロジスティック関数 |
違い:
- 実務ではほぼ同じ結果
- プロビット:統計・経済学寄り
- ロジット:実務・機械学習寄り
10.コードの例
import numpy as np
import statsmodels.api as sm
import seaborn as sns
import matplotlib.pyplot as plt
# ダミーデータの生成
np.random.seed(42)
X = np.random.randn(100, 2)
# 係数
beta = np.array([0.5, -0.5])
# ノイズ項
epsilon = np.random.randn(100)
# 線形予測子
linear_predictor = X.dot(beta) + epsilon
# 応答変数の生成(0または1に変換)
y = (linear_predictor > 0).astype(int)
# プロビット回帰モデルの推定
X_with_intercept = sm.add_constant(X) # 定数項を追加
probit_model = sm.Probit(y, X_with_intercept)
result = probit_model.fit()
# 結果の表示
print(result.summary())
# ダミーデータの可視化
plt.figure(figsize=(8, 6))
sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, palette='viridis', marker='o', s=100, alpha=0.8)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Dummy Data and True Decision Boundary')
plt.legend()
plt.show()
# モデルの予測
y_prob = result.predict(X_with_intercept)
# 予測された確率とデータの散布図
plt.figure(figsize=(8, 6))
sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y_prob, palette='viridis', marker='o', s=100, alpha=0.8)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Predicted Probabilities and True Decision Boundary')
plt.legend()
plt.show()
11.応用
12.その他
- 2021年の統計検定1級の応用(理工学)でプロビットモデルの問題が出題されました。
