ロジスティック回帰分析のやり方(実践練習)

この記事を読んでわかること

・ロジスティック回帰分析の意味
・ロジスティック回帰分析のやり方
・ロジスティック回帰分析のサンプルコード

この記事は、実際にロジスティック回帰分析を手を動かしながら覚えたいという方向けに書いているので、理論のところの説明は省きいきなり実践方法を説明するようにしました。
今回実践練習として扱う例題はタイタニックの乗客員の生存予測です。

※ロジスティック回帰分析とは?
ロジスティック回帰分析とは与えられた数値データから、ある特定の事象が起きる確率を予測する分析手法です。例えば、血糖値やコレステロール値、BIMなどの数値から、その人がガンを発症するかどうかを予測する手法です。

用意するパッケージ

まずは以下のパッケージを用意しましょう。

・numpy … 数値の計算を効率化するパッケージ
・pandas … 集めたデータをcsvファイル化するパッケージ
・seaborn … タイタニックのサンプルデータが収録されたパッケージ
・scikit-learn … ロジスティック回帰分析を行うパッケージ

ロジスティック回帰分析は以下の手順で進めてください。

ロジスティック回帰分析の流れ

① 必要なパッケージのインストール
② seabornから「タイタニックデータ」を取得し俯瞰
③ データの加工
④ ロジスティック回帰分析の実施
⑤ 予測精度の確認

1つずつ見ていきましょう。

① 必要なパッケージのインストール

# 基本的に必要なパッケージ
import numpy as np
import pandas as pd

# タイタニックデータが収録されたパッケージ
import seaborn as sns

# ロジスティック回帰分析に必要なパッケージ
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

今回用いるデータは、グラフを可視化する際に使用するパッケージであるseabornに、練習用に収録してある「タイタニックデータ」を使用して生存予測を行います。

② seabornから「タイタニックデータ」を取得し俯瞰

# データを取得して俯瞰
dataset = sns.load_dataset("titanic")
dataset.head()

それぞれのカラムについて詳しく見ていきます。

・survived … 今回の目的変数に当たる生存の安否(0:死亡,1:生存)
・pclass … 客室の階級
・sex … 性別
・age … 年齢
・silbsp … 同乗してる兄弟、配偶者の数
・parch … 同乗してる親、子供の数
・fare … 料金
・embarked … 乗船した港
・class … 客室の階級
・who … 性別
・adult_male … 大人と子供の区別
・deck … 当時居た場所
・embark_town … 乗船した港
・alive … 生存の安否
・alone … 1人で乗船したか否か

見てわかる通り、survivedやaliveは同じ変数であり、その他欠損値や目的変数にあまり影響の少ない変数も多くあるため次にそれらを調節していきます。

③ データの加工

重複して居たり、影響の少ない説明変数を削除します。

# 重複しているカラムと影響の少ない変数の削除
df = ["sibsp","parch","fare","embarked","class","who","adult_male","deck","embark_town","alive","alone"]
dataset1 = dataset.drop(df,axis = 1)
dataset1.head()

次に欠損値の有無を確認します。

# 欠損値の確認
dataset1.isnull().sum()

上記のように、年齢に欠損値が多く見られるため、今回はタイタニック号に乗客している人々の平均値を補完し、ダミー変数に変更していきます。(0:女性,1:男性)

# 欠損値に平均を補完し性別をダミー変数に変更(男性:1,女性:0)
dataset1["age"] = dataset1["age"].fillna(dataset1["age"].mean())
dataset1["sex"] = dataset1["sex"].map({"male":1, "female":0})
dataset1.isnull().sum()

欠損値の補完も完了したのでロジスティック回帰分析の測定器の作成に移ります。

④ ロジスティック回帰分析の実施

“survived”を目的変数に、”survived”以外を説明変数に指定した後、それぞれ訓練データと検証データに8対2の割合で分割して測定器を作成します。

# データを説明変数と目的変数に分割
X = dataset1.drop("survived",axis = 1)
Y = dataset1["survived"]

# 分割したデータを訓練データと検証データ(8:2)に分割
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)

# 測定器を作成してモデリング
clf = LogisticRegression()
clf.fit(X_train, Y_train)

次に、予測精度の確認をしていきます。

⑤ ロジスティック回帰モデルの精度の確認

# 結果のアウトプット
print("係数は", clf.coef_ , "で、")
print("切片は", clf.intercept_ , "で、")
print("予測精度は" , clf.score(X_test,Y_test) ,"%です。")

予測精度は約79%と、思ったより高くはないですね。

まとめ

以上がロジスティック回帰分析の実践練習です。
今回のモデルは精度があまり高くなかったので、もっと説明変数を増やしたり欠損値の処置を工夫したら精度はもっと上がるかもしれないですね。

このコードはそのまま他のデータでもお使い可能なので、エラーが出るところだけ修正して使ってみてもいいかもしれないですね!

ぜひみなさんのロジスティック回帰分析ライフを応援しています!

それでは最後に今回使ったコードを下に載せておきます。

今回使用したコード

# 必要なパッケージのインポート
import numpy as np
import pandas as pd
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# データを取得して俯瞰
dataset = sns.load_dataset("titanic")
dataset.head()

# 重複しているカラムと影響の少ない変数の削除
df = ["sibsp","parch","fare","embarked","class","who","adult_male","deck","embark_town","alive","alone"]
dataset1 = dataset.drop(df,axis = 1)
dataset1.head()

# 欠損値の確認
dataset1.isnull().sum()

# 欠損値に平均を補完し性別をダミー変数に変更(男性:1,女性:0)
dataset1["age"] = dataset1["age"].fillna(dataset1["age"].mean())
dataset1["sex"] = dataset1["sex"].map({"male":1, "female":0})
dataset1.isnull().sum()

# データを説明変数と目的変数に分割
X = dataset1.drop("survived",axis = 1)
Y = dataset1["survived"]

# 分割したデータを訓練データと検証データ(8:2)に分割
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)

# 測定器を作成してモデリング
clf = LogisticRegression()
clf.fit(X_train, Y_train)

# 結果のアウトプット
print("係数は", clf.coef_ , "で、")
print("切片は", clf.intercept_ , "で、")
print("予測精度は" , clf.score(X_test,Y_test) ,"%です。")

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA