3
1

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

Posted at

はじめに

本記事では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])))

実行結果

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

説明変数調整前

サマリ

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

image.png

  • Pseudo R-squ.
    擬似決定係数。値が高いほど説明変数が目的変数を説明できている。
  • coef
    ロジスティック回帰分析により推定された偏回帰係数。
  • P>|t|
    P値。一般的に0.05未満なら説明変数が目的変数に関係があり、0.05以上なら関係がない。

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

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

P値はstudentstay 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

擬似決定係数(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】

3
1
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
3
1