0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プロビット回帰分析

0
Last updated at Posted at 2023-11-15

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. 直感的な理解

処理の流れ:

  1. 線形結合を作る
    $z = β_0 + β_1X$

  2. 正規分布に通す
    → 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()

image.png

11.応用

12.その他

  • 2021年の統計検定1級の応用(理工学)でプロビットモデルの問題が出題されました。
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?