Pythonでロジスティック回帰分析をやってみる

# はじめに
本記事ではPythonでロジスティック回帰分析を行います。データは「[YouTubeで学ぶPythonデータ分析・講座一覧][logistic]」からお借りしました。

[logistic]:https://analysis-navi.com/?p=3868#google_vignette

# 環境
python 3.10.4
Windows 11 Home

# ロジスティック回帰分析とは
ロジスティック回帰分析とは、予測したいデータ（目的変数）に対して、複数の要因データ（説明変数）との関係を数式で表現する統計的な手法で、教師あり学習のひとつである回帰分析に分類されます。
[前回の記事][double]で取り上げた重回帰分析（線形回帰）との違いは、目的変数が数値ではなく2値になることです。
線形回帰は売上等の数値の予測に使用しましたが、ロジスティック回帰は「健康か不健康か」等の2値の予測に使用することができます。

[double]:https://qiita.com/yuya2220/items/cb75762540bb880ebbab

# 使用するデータの構造
会員登録をしたかを示すサンプルデータで、実績データ、予測データは以下のような構造になっています。

## 実績データ
| sex (男女) | student (学生か) | stay time (閲覧時間) | registration (会員登録をしたか) |
| ---- | ---- | ---- | ---- |
| 1 | 0 | 34 | 0 | 
| 1 | 0 | 28 | 0 | 
| 0 | 0 | 98 | 0 | 
| 1 | 0 | 70 | 0 | 
| 0 | 1 | 67 | 1 | 
| 以降データが続く |  | | |

## 予測データ
| sex (男女) | student (学生か) | stay time (閲覧時間) | 
| ---- | ---- | ---- |
| 0 | 1 | 67 | 
| 0 | 0 | 80 | 
| 1 | 0 | 19 | 
| 0 | 1 | 92 | 
| 1 | 1 | 56 | 
| 以降データが続く |  | |

# 使用するライブラリ
使用するライブラリは以下の3つで、「scikit-learn」、「statsmodels」はロジスティック回帰分析を行うのに使用します。

```python
pip install pandas
pip install scikit-learn
pip install statsmodels
```
# 作成コード
作成したコードは以下になります。

```python
import pandas as pd
import statsmodels.api as sm
from sklearn.linear_model import LogisticRegression

df_past = pd.read_csv("4-5_user_data.csv") #実績データ

#説明変数の設定
exp_val = ["sex","student","stay time"]
x = df_past[exp_val]
x2 = sm.add_constant(x) #切片を計算するために説明変数のデータの中に全て1からなる列を追加

#目的変数の設定
obj_val = ["registration"]
y = df_past[obj_val]

#ロジスティック回帰モデルを作る
model = sm.Logit(y,x2)
result = model.fit()

#サマリを表示する
print(result.summary())

#予測データ
df_future = pd.read_csv("4-5_user_data_future.csv")
#予測結果を表示する
print(result.predict(sm.add_constant(df_future[exp_val])))
```

# 実行結果
プログラムを実行し、サマリと会員登録をする確率を取得しました。

## 説明変数調整前

### サマリ
サマリは以下の通りです。
※重要な項目を赤枠で囲んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292716/a432033a-f633-02b0-b250-e181bf34c293.png)
- `Pseudo R-squ.`
擬似決定係数。値が高いほど説明変数が目的変数を説明できている。
- `coef`
ロジスティック回帰分析により推定された偏回帰係数。
- `P>|t|`
P値。一般的に0.05未満なら説明変数が目的変数に関係があり、0.05以上なら関係がない。

偏回帰係数の結果から、会員登録をする確率は以下の式で推定できます。

`(会員登録をする確率) = -4.2982 + 0.5251 × (男女) + 2.0147 × (学生か) + 0.0390 × (閲覧時間)`

P値は`student`、`stay time`が0.05未満のため、会員登録に関係があり、`sex`は0.05以上のため、会員登録に関係がないことが分かります。そのため、`sex`は説明変数から削除するのが良さそうです。

### 予測結果
会員登録をする確率を予測データの情報と並べた結果は、以下のようになります。

| sex (男女) | student (学生か) | stay time (閲覧時間) | 会員登録をする確率 | 
| ---- | ---- | ---- | ---- | 
| 0 | 1 | 67 | 0.581287 |  
| 0 | 0 | 80 | 0.235077 | 
| 1 | 0 | 19 | 0.045979 |
| 0 | 1 | 92 | 0.786263 |
| 1 | 1 | 56 | 0.604531 |
| 以降データが続く |  | | |

## 説明変数調整後
`sex`のP値が0.05以上であったため、説明変数から`sex`を削除して再度実行しました。

### サマリ
サマリは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292716/db7490d6-ead2-22e9-915b-d867b152c135.png)

擬似決定係数（`Pseudo R-squ.`）の値が0.2588から0.2513と少し減少しました。
しかし、目的変数を説明するのに、どの説明変数が重要なのかを認識しやすくするために、説明変数は極力減らした方が良いとされているため、このくらいの減少幅であれば`sex`は削除して良さそうです。

### 予測結果
会員登録をする確率を予測データの情報と並べた結果は、以下のようになります。
| sex (男女) | student (学生か) | stay time (閲覧時間) | 会員登録をする確率 | 
| ---- | ---- | ---- | ---- | 
| 0 | 1 | 67 | 0.617041 |  
| 0 | 0 | 80 | 0.292847 | 
| 1 | 0 | 19 | 0.034132 |
| 0 | 1 | 92 | 0.815431 |
| 1 | 1 | 56 | 0.508296 |
| 以降データが続く |  | | |


# 終わりに
今回はPythonでロジスティック回帰分析をやってみました。
実際に分析を行う際は、もっとたくさんの説明変数の候補があると考えられるため、説明変数の選択を効率よく行う方法を調べてみたいと思いました。

# 参考
この記事は以下の動画・記事を参考にして執筆しました。
・[Pythonでロジスティック回帰分析をしてみよう【Python機械学習#5】](https://www.youtube.com/watch?v=DYo2vUWwDBk)