はじめに
本記事ではPythonでロジスティック回帰分析を行います。データは「YouTubeで学ぶPythonデータ分析・講座一覧」からお借りしました。
環境
python 3.10.4
Windows 11 Home
ロジスティック回帰分析とは
ロジスティック回帰分析とは、予測したいデータ(目的変数)に対して、複数の要因データ(説明変数)との関係を数式で表現する統計的な手法で、教師あり学習のひとつである回帰分析に分類されます。
前回の記事で取り上げた重回帰分析(線形回帰)との違いは、目的変数が数値ではなく2値になることです。
線形回帰は売上等の数値の予測に使用しましたが、ロジスティック回帰は「健康か不健康か」等の2値の予測に使用することができます。
使用するデータの構造
会員登録をしたかを示すサンプルデータで、実績データ、予測データは以下のような構造になっています。
実績データ
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」はロジスティック回帰分析を行うのに使用します。
pip install pandas
pip install scikit-learn
pip install statsmodels
作成コード
作成したコードは以下になります。
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])))
実行結果
プログラムを実行し、サマリと会員登録をする確率を取得しました。
説明変数調整前
サマリ
サマリは以下の通りです。
※重要な項目を赤枠で囲んでいます。
-
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
を削除して再度実行しました。
サマリ
サマリは以下の通りです。
擬似決定係数(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】