python PR

Pythonでデータ分析|ロジスティック回帰でバイナリ分類を習得しよう

Python データ分析 ロジスティック回帰分析
記事内に商品プロモーションを含む場合があります

ロジスティック回帰は、バイナリ分類問題に適した統計学上の手法であり、データ分析において広く利用されています

本記事では、Pythonでロジスティック回帰を実装する方法や、活用事例について解説し、今回の記事を参考に、Pythonでロジスティック回帰を実装できるようになっていきましょう

ロジスティック回帰をマスターできれば、マーケティングや医療、金融などの分野でバイナリ分類問題に取り組むことができます

さらに、Pythonのデータ分析に関心がある方は、Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップを参考に、データ分析の理解を深めていきましょう

ロジスティック回帰の基本概念

ロジスティック回帰の基本概念ロジスティック回帰は、線形回帰と同様に、説明変数と目的変数の関係をモデル化する手法ですが、目的変数がカテゴリカルデータ(2値データ)である場合に特化しています

例えば、クリック率予測や病気の有無判定など、2つのカテゴリに分類する問題に適している分析方法です

バイナリ分類問題

バイナリ分類問題バイナリ分類問題(二値分類問題とも呼ばれる)は、データ分析や機械学習において、与えられたデータを2つのクラス(カテゴリ)に分類するタイプの問題です

これは、データがある基準に基づいて、2つのグループに分けられる場合に適用されます

バイナリ分類問題の典型的な例としては、以下のようなものがあります

  1. スパムメールの検出:メールがスパム(不要なメール)か、そうでないかを判断する
  2. 顧客の離反予測:顧客が今後サービスを継続するか、離れていくかを予測する
  3. 病気の診断:患者がある病気にかかっているか、かかっていないかを判断する

バイナリ分類問題を解決するためには、様々な機械学習アルゴリズムが利用されます

主なアルゴリズムには、ロジスティック回帰、サポートベクターマシン(SVM)、決定木、ランダムフォレスト、ニューラルネットワークなどがあります

これらのアルゴリズムは、与えられたデータをもとに、最も適切なクラスに分類するためのモデルを学習します

シグモイド関数

シグモイド関数ロジスティック回帰では、シグモイド関数(ロジスティック関数)を使用して、線形関数の結果を確率(0から1の範囲)に変換します

シグモイド関数は以下の式で表されます

f(x) = 1 / (1 + exp(-x))

ソフトマックス関数

ソフトマックス関数ソフトマックス関数は、多クラス分類問題において、各クラスに属する確率を計算するために使用される関数です

ロジスティック回帰やニューラルネットワークなどの機械学習モデルの出力層でよく用いられます

ソフトマックス関数は、入力ベクトルの各要素に指数関数を適用し、正規化を行うことで、出力ベクトルの各要素が0から1の範囲の値を取り、その合計が1になるようにします

これにより、出力ベクトルは確率分布として解釈できます。

ソフトマックス関数は以下の式で表されます

softmax(x)_i = exp(x_i) / Σ exp(x_j)

Pythonでロジスティック回帰を実装する方法

Pythonでロジスティック回帰を実装する方法では、実際にPythonでロジスティック回帰を実装していきたいと思います

Pythonでロジスティック回帰分析を実装する大まかな流れとしては、次のようになります

  1. データの前処理: データセットのクリーニング、欠損値の処理、カテゴリカル変数のエンコーディング、標準化や正規化などのスケーリングを行います
  2. モデルの訓練: 説明変数と目的変数を用いて、ロジスティック回帰モデルを訓練します。最尤法や勾配降下法などの最適化アルゴリズムを用いて、モデルのパラメータを推定します
  3. モデルの評価: 一般的に、正解率(accuracy)、適合率(precision)、再現率(recall)、F1スコア(F1 score)などの指標を用いて、モデルの性能を評価します
  4. 予測: 新しいデータに対して、モデルを使用してカテゴリの予測を行います。予測された確率が閾値(通常は0.5)を超える場合、正のクラスと予測されます

データの正規化や標準化、エンコーディングについては、Pythonデータ分析の強力な味方|scikit-learn入門ガイドで解説しているので、そちらも参考にしてください

ライブラリのインポート

ライブラリのインポートまずはじめに、ロジスティック回帰分析を行うのに必要なライブラリをインポートします

今回は、pandasnumpymatplotlibsklearnを使用します

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import matplotlib.pyplot

データセットの読み込みと前処理

データセットの読み込みと前処理次に、分析するデータセットを読み込み、前処理を行います

データセットは、CSVファイルやExcelファイルなど、様々な形式のものを使用することができます

# データセットの読み込み
data = pd.read_csv('data.csv')

# データセットの前処理(欠損値処理、カテゴリ変数のエンコーディングなど)
data = data.dropna()
data['category'] = data['category'].astype('category').cat.codes

csvファイルがない場合には、Numpyを使って、サンプルデータを作成しましょう

# サンプルデータセットを作成します(ここでは、2つの特徴量と2つのクラスを持つデータセットを使用しています)。
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9]])
y = np.array([0, 0, 1, 1, 0, 1, 1, 1])

 

生成されたデータは、線形回帰やロジスティック回帰の例に使用できます

特徴量の数やサンプル数を変更して、検証に適したデータを作成できます

Numpyについて、理解を深めたい場合には、データ分析に必須のNumPy入門から活用までの完全ガイドも参考にしてください

訓練データとテストデータの分割

訓練データとテストデータの分割データセットを訓練データとテストデータに分割します

これにより、モデルの性能を正確に評価することができます

train_test_split関数を使用して、データを分割していきます

# データを訓練データとテストデータに分割します(この例では、訓練データが75%、テストデータが25%です)。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

ロジスティック回帰モデルの構築と学習

ロジスティック回帰モデルの構築と学習LogisticRegressionクラスを使用して、ロジスティック回帰モデルを構築し、学習させます

# ロジスティック回帰モデルをインスタンス化します。
logreg = LogisticRegression()

# 訓練データを使ってモデルを学習させます。
logreg.fit(X_train, y_train)

モデルの評価

モデルの評価モデルの性能を評価するために、classification_reportconfusion_matrixを使用して、精度、適合率、再現率、F1スコア、混同行列を表示します

# テストデータを使って予測を行います。
y_pred = logreg.predict(X_test)

# モデルの精度を評価します。
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {:.2f}".format(accuracy * 100))

# 詳細な分類レポートを表示します。
report = classification_report(y_test, y_pred)
print("\nClassification Report:\n", report)
# 訓練データの予測結果を取得
y_train_pred = logreg.predict(X_train)

# テストデータの予測結果を取得
y_test_pred = logreg.predict(X_test)

# 訓練データの精度、適合率、再現率、F1スコアを計算
train_accuracy = accuracy_score(y_train, y_train_pred)
train_precision = precision_score(y_train, y_train_pred)
train_recall = recall_score(y_train, y_train_pred)
train_f1 = f1_score(y_train, y_train_pred)

# テストデータの精度、適合率、再現率、F1スコアを計算
test_accuracy = accuracy_score(y_test, y_test_pred)
test_precision = precision_score(y_test, y_test_pred)
test_recall = recall_score(y_test, y_test_pred)
test_f1 = f1_score(y_test, y_test_pred)

# 混同行列を計算
cm_train = confusion_matrix(y_train, y_train_pred)
cm_test = confusion_matrix(y_test, y_test_pred)

# 結果を表示
print("Train Accuracy: {:.3f}".format(train_accuracy))
print("Train Precision: {:.3f}".format(train_precision))
print("Train Recall: {:.3f}".format(train_recall))
print("Train F1-score: {:.3f}".format(train_f1))
print("Train Confusion Matrix:\n", cm_train)

print("\nTest Accuracy: {:.3f}".format(test_accuracy))
print("Test Precision: {:.3f}".format(test_precision))
print("Test Recall: {:.3f}".format(test_recall))
print("Test F1-score: {:.3f}".format(test_f1))
print("Test Confusion Matrix:\n", cm_test)

可視化

データの可視化
# 可視化
# 訓練データとテストデータをプロットします。
plt.scatter(X_train[y_train == 0][:, 0], X_train[y_train == 0][:, 1], color='red', marker='o', label='Train Class 0')
plt.scatter(X_train[y_train == 1][:, 0], X_train[y_train == 1][:, 1], color='blue', marker='^', label='Train Class 1')
plt.scatter(X_test[y_test == 0][:, 0], X_test[y_test == 0][:, 1], color='red', marker='o', facecolors='none', s=100, label='Test Class 0')
plt.scatter(X_test[y_test == 1][:, 0], X_test[y_test == 1][:, 1], color='blue', marker='^', facecolors='none', s=100, label='Test Class 1')

# ロジスティック回帰の境界線をプロットします。
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max, 100),
np.linspace(x2_min, x2_max, 100))
Z = logreg.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)

#境界線をプロットします。
plt.contour(xx1, xx2, Z, colors='green', linewidths=0.5)

#グラフの見た目を整え、凡例を追加します。
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression Classifier')
plt.legend(loc='upper left')

#グラフを表示します。
plt.show()
ロジスティック回帰分析可視化

ハイパーパラメータチューニング

ハイパーパラメータチューニングこれでPythonを使って、ロジスティック回帰分析を実装することができました

ロジスティック回帰モデルの性能を向上させる方法の1つに、ハイパーパラメータチューニングがあります

ハイパーパラメータは、学習プロセスに影響を与えるが、データから直接学習されないパラメータです

scikit-learnのGridSearchCVを用いて、最適なハイパーパラメータの組み合わせを見つけましょう

ハイパーパラメータの候補の設定

ハイパーパラメータの候補の設定まず、調整したいハイパーパラメータとその候補の範囲を設定します

# ハイパーパラメータの候補
param_grid = {
    'penalty': ['l1', 'l2', 'elasticnet', 'none'],
    'C': [0.001, 0.01, 0.1, 1, 10, 100],
    'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
    'max_iter': [100, 200, 300, 400, 500]
}

グリッドサーチの実行

グリッドサーチの実行GridSearchCVを使用して、設定したハイパーパラメータの候補に対してグリッドサーチを実行します

# グリッドサーチの実行
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

最適なハイパーパラメータの取得とモデルの再学習

最適なハイパーパラメータの取得とモデルの再学習最適なハイパーパラメータを取得し、そのパラメータを使用してモデルを再学習します

# 最適なハイパーパラメータの取得
best_params = grid_search.best_params_
print("Best parameters: ", best_params)

# 最適なハイパーパラメータでモデルを再学習
best_model = LogisticRegression(**best_params)
best_model.fit(X_train, y_train)

チューニング後のモデルの評価

チューニング後のモデルの評価ハイパーパラメータチューニング後のモデルの性能を評価します

# テストデータに対する予測
y_pred_tuned = best_model.predict(X_test)

# 評価指標の表示
print(classification_report(y_test, y_pred_tuned))
print(confusion_matrix(y_test, y_pred_tuned))

ハイパーパラメータチューニングにより、モデルの性能が向上するとも限りませんが、より適切なハイパーパラメータの選択により、より良い予測結果が得られる可能性があります

ロジスティック回帰を活用したマーケティング戦略

ロジスティック回帰を活用したマーケティング戦略ここからはロジスティック回帰を活用して、マーケティング戦略に役立てる方法を紹介します

マーケティング分野に活用することができる、データ分析手法は、Pythonでマーケティングに活用できるデータ分析手法を公開【サンプルコードあり】で詳細に解説をしています

顧客セグメンテーション

顧客セグメンテーション顧客データを使用して、ロジスティック回帰モデルを構築し、顧客が特定の製品やサービスを購入する確率を予測します

予測された確率に基づいて、顧客をセグメント化し、異なるマーケティング戦略を適用することができます

顧客セグメンテーションをロジスティック回帰分析で実装する際の、サンプルコードです

この例では、顧客の年齢と収入を特徴量として、顧客が特定の商品を購入するかどうか(購入する=1、購入しない=0)を予測しています

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix

# データの作成 (年齢, 収入, 商品購入フラグ)
data = pd.DataFrame({
    'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
    'Income': [30000, 35000, 40000, 45000, 50000, 55000, 60000, 65000, 70000, 75000],
    'Purchased': [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
})

# 特徴量と目的変数に分割
X = data[['Age', 'Income']]
y = data['Purchased']

# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# ロジスティック回帰モデルのインスタンスを作成し、トレーニングデータで学習
lr_model = LogisticRegression()
lr_model.fit(X_train, y_train)

# テストデータで予測
y_pred = lr_model.predict(X_test)

# 結果の評価
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))

# 可視化
plt.scatter(data['Age'][data['Purchased'] == 0], data['Income'][data['Purchased'] == 0], c='blue', label='Not Purchased')
plt.scatter(data['Age'][data['Purchased'] == 1], data['Income'][data['Purchased'] == 1], c='red', label='Purchased')
plt.xlabel('Age')
plt.ylabel('Income')
plt.legend()
plt.show()

マーケティングキャンペーンの効果測定

マーケティングキャンペーンの効果測定過去のマーケティングキャンペーンのデータを使用して、ロジスティック回帰モデルを構築し、キャンペーンの効果を測定することができます

これにより、効果的なキャンペーンを特定し、今後のマーケティング戦略に活かすことができます

クロスセル・アップセルの最適化

クロスセル・アップセルの最適化ロジスティック回帰を使用して、顧客が特定の製品に対してクロスセル(関連商品の提案)やアップセル(高価なバージョンの提案)に興味を持つ可能性を予測します

これにより、個々の顧客に適切な商品を提案し、売上の向上を図ることができます

顧客離反の予測

顧客離反の予測ロジスティック回帰を用いて、顧客が離反する(サービスの利用を停止する)確率を予測することができます

離反の予測が高い顧客に対しては、特別なプロモーションやサポートを提供することで、顧客を維持する努力を行います

まとめ

まとめ本記事では、Pythonでロジスティック回帰分析を実装するために、ロジスティック回帰の概要やハイパーパラメータチューニング、マーケティングへの応用について解説しました

ロジスティック回帰は、データ分析を始める上で手軽に試すことができる手法であり、多くの分野で活用されています

今回の記事を参考に、Pythonでロジスティック回帰分析を実装してみてください

python データ分析
Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップこの記事では、「pythonを使ってデータ分析をできる様になりたい」「一からpythonを学び始めてデータ分析ができるようになるのか知りたい」と言った疑問に答えていきます。僕自身がpythonでデータ分析をゼロから始めたので、参考になると思います。...
おすすめプログラミングスクール

DMMWEBCAMP
  • WEBCAMPはコスパ最強
  • WEBCAMPは初心者に優しい充実したサポート付き
  • 16週間プランを選択して、返金してもらおう
WEBCAMPの公式ページはこちら WEBCAMPの口コミ・評価はこちら
テックアカデミー  
  • テックアカデミーは費用対効果抜群
  • テックアカデミーのサポートは個人の能力に応じつつ、python初心者に優しい
  • まずは無料体験でテックアカデミーを知ってから受講を決める
テックアカデミーの公式ページはこちら テックアカデミーの口コミ・評価はこちら
キカガク
  • 多種多様なスキルコース
  • 初心者から専門家まで対象
  • 給付金利用で費用を抑えられる
キカガクの公式ページはこちら キカガクの口コミ・評価はこちら
Aidemy Premium
  • 完全オンラインで、時間や場所に縛られず学習したい
  • マンツーマン学習サポートにより実践に近い経験をしたい
  • 未経験から機械学習エンジニアになりたい
Aidemy Premiumの公式ページはこちら Aidemy Premiumの口コミ・評価はこちら
My Agile Privacy
This website uses technical and profiling cookies. Clicking on "Accept" authorises all profiling cookies. Clicking on "Refuse" or the X will refuse all profiling cookies. By clicking on "Customise" you can select which profiling cookies to activate.