ロジスティック回帰で
優先順位をつける
「このリードは商談化しそうか」「この顧客は来月解約しそうか」。Web マーケティングの現場では、こうした0/1 の未来を確率で言い当てる数字が欲しくなる場面が多くあります。ロジスティック回帰は、複数の要因(流入経路・利用状況・接触回数など)から 0〜1 の確率 を出す手法で、そのまま優先順位づけに使えます。
回帰分析の基礎では二値(0/1)のロジスティック回帰を要点だけ扱いましたが、本記事ではオッズ比の読み方と3カテゴリ以上を分類する多項ロジスティック回帰、そして混同行列・ROC-AUC でのモデル評価まで、実務で使うところを深掘りします。
回帰分析の基礎
単回帰・重回帰・多重共線性・log変換・Ridge/Lassoまで、回帰分析全体の基礎を整理しています。
ロジスティック回帰の実務価値は、0/1 の予測を確率のランキングに変換できることです。「商談化確率が高い順に営業が架電する」「解約リスクが高い順に CS が接触する」のように、限られたリソースを上位から割り振る運用にそのまま乗せられます。対象が2択なら二値ロジスティック回帰、3択以上なら多項ロジスティック回帰を使います。
- ロジスティック回帰:説明変数から 0〜1 の確率を予測する分類手法。目的変数が 0/1 の二値なら二値ロジスティック回帰、3カテゴリ以上なら多項ロジスティック回帰。
- オッズ:「起こる確率 ÷ 起こらない確率」(p / (1−p))。確率とは別の尺度で、係数はこのオッズへの効き方として推定される。
- オッズ比:ある変数が1単位増えたときにオッズが何倍になるか。係数 β を
exp(β)に直したもの。 - 多項ロジスティック回帰:目的変数が3カテゴリ以上(継続/アップセル候補/解約リスク、など)のときに使う拡張版。ソフトマックス関数で各クラスの確率を出す。
- 混同行列:実際の正解と予測を4マスに分けた表。適合率・再現率・F1スコアの計算元。
- ROC-AUC:分類モデルが陽性と陰性をどれだけ区別できるかを、特定の閾値に依存せず全閾値を通じて0〜1で評価する指標。
- class_weight / SMOTE:陽性(解約・CVなど)が少ない不均衡データで、少数クラスの学習を強める代表的な対策。
01.結論:確率で出すから『優先順位』に使える
ロジスティック回帰が営業・CS の現場で重宝されるのは、予測結果がそのままランキングになるからです。「解約する/しない」の二択だけを返すモデルより、「解約確率 82%」「解約確率 14%」のように連続的な確率を返すモデルの方が、限られた人員をどの顧客から回すかという意思決定に直結します。
図:シグモイド関数|log オッズを確率 0〜1 に押し込む
横軸は線形式 β0 + β1X(log オッズ)、縦軸は予測確率。中央(確率0.5)を境に、S字カーブで滑らかに 0〜1 へ収まる。
線形回帰の式 β0 + β1X1 + β2X2 + … は、そのままだとマイナスや1超の値も取り得るため確率として使えません。ロジスティック回帰はこの線形式をシグモイド関数に通すことで、出力を必ず 0〜1 に押し込みます。図の通り、線形式の値が大きくなるほど確率は1に近づき、小さくなるほど0に近づく、なめらかなS字カーブです。
| 目的変数の形 | 使う手法 | 実務シーン例 |
|---|---|---|
| 0/1(2択) | 二値ロジスティック回帰 | 「解約する/しない」「商談化する/しない」の確率を出す |
| 3カテゴリ以上(順序なし) | 多項ロジスティック回帰 | 「継続/アップセル候補/解約リスク」の3クラス分類 |
| 3カテゴリ以上(順序あり) | 順序ロジスティック回帰 | 「満足度:低・中・高」のように順序を持つカテゴリの分類 |
「満足度:低・中・高」のようにカテゴリ間に順序があるときは、順序ロジスティック回帰(比例オッズモデル)という専用の手法もあります。ただし実務では、順序を無視して多項ロジスティック回帰で扱ってもおおむね実用に耐えるため、本記事では特に断りなく多項ロジスティック回帰(順序なしの多クラス分類)を主に扱います。
02.オッズ比を正しく読む|係数からリスク要因を特定する
ロジスティック回帰の係数は、線形回帰のように「1単位増えると Y が β増える」とは読めません。係数 β を exp(β) に変換したオッズ比として、「1単位増えるとオッズが何倍になるか」で読みます。ここでつまずきやすいのが、オッズ比を確率の倍率と勘違いすることです。
たとえば「メルマガ開封あり」のオッズ比が 3.0 だったとします。これは「メルマガを開封した顧客は、開封していない顧客よりオッズが3倍」という意味であって、「CVする確率が3倍」ではありません。ベースの確率が低いとき(たとえば5%前後)はオッズ比と確率の倍率がほぼ近似しますが、ベースの確率が50%に近づくほど両者は乖離します。
| ベース確率 | オッズ比 3.0 のときの実際の確率 | 確率の倍率 |
|---|---|---|
| 5% | 約 13.6% | 約 2.7 倍(確率の倍率とオッズ比がほぼ近い) |
| 20% | 約 42.9% | 約 2.1 倍 |
| 50% | 75% | 1.5 倍(オッズ比 3.0 とは大きく乖離) |
オッズ比はレポートで目立つ数字ですが、ベース確率がどの水準かを併記しないと誤解を招きます。特に「解約率が数%程度」のような低確率イベントを扱う場面では、オッズ比と確率の倍率が近づくため実務上大きな問題になりにくい一方、CVR が20〜50%台のような中〜高確率イベントでは、オッズ比だけを見せると実態より効果が大きく見えてしまいます。レポートではオッズ比と一緒に「予測確率が何%から何%に変わるか」の具体値を添えるのが安全です。
ベース確率とオッズ比を入れ替えながら、実際の確率と確率の倍率がどれだけズレるかをその場で確認できます。
ベース確率とオッズ比を入れると、実際の確率と確率の倍率をその場で計算します(ブラウザ内で計算、サーバー送信なし)。
※ 数値は計算の仕組みを説明するための仮の設定で、実際の調査データではありません。
ベース確率が50%に近いほど、オッズ比と確率の倍率の差が大きくなります。ベース確率を50に変えて比べてみてください。
言い換えると:同じ条件の人が100人いたとすると、この要因が無ければ約5人が当てはまるところ、 この要因があると約14人に増える計算です(+9人)。 確率の倍率(2.7倍)だけを見ると大きな変化に見えても、 実際の人数で見比べると印象が変わることがあります。
注意:オッズ比が1から離れている(大きい、または小さい)ことは、あくまで入力した2つの事柄の 統計的な関連が強く見えることを示すだけで、現実の相関関係や因果関係を証明する ものではありません。両方に影響する別の要因(交絡)が背景にあるだけの疑似相関 かもしれませんし、原因と結果が逆(逆因果)の可能性もあります。上の「アイスクリームが 売れると水難事故が増える?」の例で試してみてください。相関と因果の見分け方は記事「相関分析(ピアソン・スピアマン)」で詳しく解説しています。
説明変数が複数あるロジスティック回帰(多重ロジスティック回帰と呼ぶこともあります)では、それぞれのオッズ比は「他の変数を固定したときの、その変数単独の効き」として推定されます。信頼区間(95%CI)も併せて確認し、区間が1をまたぐ変数は「効果があるとは言い切れない」と判断します。
# statsmodels でオッズ比と95%信頼区間を出す
import pandas as pd
import numpy as np
import statsmodels.api as sm
# df: 説明変数, 目的変数 churn_flag (0=継続, 1=解約)
X = df[["days_since_last_login", "support_tickets", "opened_newsletter"]]
y = df["churn_flag"]
X = sm.add_constant(X)
logit = sm.Logit(y, X).fit()
# 係数 → オッズ比、信頼区間もオッズ比のスケールに変換
odds_ratio = np.exp(logit.params)
conf_int = np.exp(logit.conf_int())
conf_int.columns = ["2.5%", "97.5%"]
result = pd.concat([odds_ratio.rename("odds_ratio"), conf_int], axis=1)
print(result)
# odds_ratio 2.5% 97.5%
# days_since_last_login 1.08 1.02 1.14 ← 未ログイン日数が長いほど解約オッズ増
# support_tickets 1.34 1.10 1.63 ← 問い合わせ件数が多いほど解約オッズ増
# opened_newsletter 0.61 0.42 0.88 ← メルマガ開封で解約オッズが減少03.多項ロジスティック回帰|3カテゴリ以上を分類する
解約予測やリードスコアリングは0/1の二値で足りますが、「継続」「アップセル候補」「解約リスク」のように3段階以上で顧客をランク分けしたい場面も少なくありません。このとき使うのが多項ロジスティック回帰です。
仕組みは、基準カテゴリ(たとえば「継続」)に対する各カテゴリの log オッズをそれぞれ推定し、ソフトマックス関数で全カテゴリの確率が合計100%になるように正規化します。二値ロジスティック回帰のシグモイド関数を、3カテゴリ以上に一般化したものと捉えると理解しやすくなります。
図:多項ロジスティック回帰の出力イメージ(3クラスの確率、合計100%)
ソフトマックス関数は各クラスのスコアを指数変換して正規化するため、全クラスの確率の合計が必ず1(100%)になる。
| 手順 | やること | ツール |
|---|---|---|
| 01. 目的変数を3カテゴリ以上に整える | 「継続/アップセル候補/解約リスク」のようなラベル列を作る。基準カテゴリを1つ決める | pandas |
| 02. 説明変数を選ぶ | 利用頻度・問い合わせ件数・契約プラン・流入経路など、カテゴリを分けそうな要因を選ぶ | pandas |
| 03. モデルに当てはめる | <code>statsmodels.MNLogit</code> または <code>sklearn.LogisticRegression</code>(目的変数が3クラス以上なら自動でソフトマックスを使う)で fit | statsmodels / scikit-learn |
| 04. 各クラスの確率を確認 | 顧客ごとに3クラスの確率が出力される(合計100%)。最大確率のクラスをラベルとして採用するか、確率のまま使うかを決める | pandas |
| 05. クラスごとに評価 | クラスごとの適合率・再現率を確認(04章)。少数クラスの見落としがないか特に確認 | scikit-learn |
# scikit-learn で多項ロジスティック回帰
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# df: 説明変数, 目的変数 segment("継続" / "アップセル候補" / "解約リスク")
X = df[["monthly_logins", "support_tickets", "plan_tier", "days_since_last_login"]]
y = df["segment"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=42
)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train) # 目的変数が3クラス以上なら自動でソフトマックス(多項ロジスティック回帰)になる
# 各クラスの確率(合計が1になる)
proba = model.predict_proba(X_test)
print(pd.DataFrame(proba, columns=model.classes_).head())
# アップセル候補 解約リスク 継続
# 0 0.27 0.11 0.62
# 1 0.08 0.71 0.21- カスタマーサクセスの対応優先度:「解約リスク」確率が高い順に接触リストを作る
- アップセルの営業リスト:「アップセル候補」確率が高い顧客を営業へ渡す
- 問い合わせの振り分け予測:フォーム内容から「電話対応要/チャット対応可/メール返信で十分」の3クラスを事前予測し、対応チームの割り振りを効率化
04.モデル評価|混同行列・ROC-AUC・閾値をビジネス要件で決める
ロジスティック回帰は確率を出す時点では終わりません。「確率何%以上を陽性と扱うか」という閾値の設計と、モデルの評価が実務では同じくらい重要です。分類モデルの評価指標(適合率・再現率・F1スコア・ROC-AUC・PR-AUC)は予測モデル評価の指標と使い分けで扱っている内容がそのまま当てはまるため、ここではロジスティック回帰特有の閾値設計を中心に整理します。
予測モデル評価
適合率・再現率・F1・ROC-AUC・PR-AUCなど、分類モデルの評価指標を整理しています。
| 観点 | 適合率(Precision)重視 | 再現率(Recall)重視 |
|---|---|---|
| 閾値の傾向 | 高め(0.7〜0.9など)に設定 | 低め(0.2〜0.4など)に設定 |
| 向く場面 | 架電・訪問などコストの高い接触。空振りを避けたい | 解約防止・不正検知など見逃しのコストが高い |
| リスク | 本来拾うべき対象を見逃す(再現率が下がる) | 対応リストが膨らみ、現場のリソースを圧迫する |
scikit-learn の predict() は既定で確率0.5を境に0/1を出しますが、これは統計的な理由ではなく単なる初期値です。実務では、営業・CS が1週間で対応できる件数(キャパシティ)から閾値を逆算する方が運用に合います。たとえば「営業が1日に架電できるのは30件」なら、確率が高い順に30件だけを抽出する上位k件方式の方が、固定閾値より現場に馴染みます。
# 閾値を固定せず「上位k件」で抽出する(リード架電リストの例)
import pandas as pd
proba = model.predict_proba(X_test)[:, 1] # 陽性クラスの確率
result = pd.DataFrame({"lead_id": X_test.index, "cv_probability": proba})
# 確率が高い順に、当日架電できる件数(例: 30件)だけ抽出
today_capacity = 30
call_list = result.sort_values("cv_probability", ascending=False).head(today_capacity)
print(call_list)なお、ここで扱う確率は「順位づけ」には十分でも、そのまま「解約確率62%」のように経営層へ報告する数値としては、モデルの出す確率が実際の頻度とズレていることがあります。この確率の信頼性そのものを検証したい場合は、別記事で詳しく整理しています。あわせてご覧ください。
確率較正(キャリブレーション)
モデルが出す確率が実際の頻度と一致しているかを扱っています。
05.不均衡データへの対策|class_weight と SMOTE
解約予測やコンバージョン予測では、陽性(解約する・CVする)が全体の数%しかない不均衡データになりがちです。何も対策せずに学習すると、モデルは「全員『解約しない』と予測する」だけで正解率(Accuracy)が高く見えてしまい、肝心の解約者をほとんど拾えなくなります。不正検知や異常検知も同じ「陽性が少ない」構造を持つ代表例で、対策の考え方は別記事で扱っています。
外れ値・異常検知
不正検知など、不均衡データを扱うもう1つの代表的なテーマです。
| 対策 | やること | 向く場面 |
|---|---|---|
| class_weight="balanced" | 少数クラスのサンプルに自動で重みを付けて学習する。実装がscikit-learnの引数1つで完結 | まず試す標準的な対策。データ加工が不要 |
| SMOTE(過剰サンプリング) | 少数クラスの近傍点を補間して人工的にサンプルを増やす | class_weightだけでは不十分なとき。imbalanced-learnライブラリが必要 |
| アンダーサンプリング | 多数クラス(継続顧客など)を間引いてバランスを取る | データ量が十分に多く、間引いても学習に支障がないとき |
SMOTE は学習用データ(train)にのみ適用し、評価用データ(test)には手を加えないのが鉄則です。分割前の全データに SMOTE をかけてから train/test に分けると、人工的に生成されたサンプルが test 側にも混入し、実際より高い精度が出るデータリークを引き起こします。Pipeline の中に SMOTE を組み込み、交差検証の各foldで学習データにだけ適用する実装が安全です。
# class_weight(まず試す標準対策)
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(class_weight="balanced", max_iter=1000)
model.fit(X_train, y_train)
# SMOTE(imbalanced-learn。学習データにのみ適用)
from imblearn.pipeline import Pipeline as ImbPipeline
from imblearn.over_sampling import SMOTE
from sklearn.preprocessing import StandardScaler
pipe = ImbPipeline([
("scaler", StandardScaler()),
("smote", SMOTE(random_state=42)), # 学習foldにのみ適用される
("model", LogisticRegression(max_iter=1000)),
])
pipe.fit(X_train, y_train)06.実務ユースケース|リードスコアリング・解約予測
ここまでの内容を、Web マーケティング・グロースハックの代表的な2場面に当てはめて整理します。
| ユースケース | 目的変数 | 主な説明変数 | 運用への落とし込み |
|---|---|---|---|
| リードスコアリング | フォーム送信・商談化する(1)/しない(0) | 流入経路・閲覧ページ数・滞在時間・資料DL有無 | 確率が高い順に営業へ配信。上位k件方式で当日対応可能な件数に合わせる |
| 解約予測(チャーン予測) | 翌月解約する(1)/継続する(0) | 未ログイン日数・問い合わせ件数・利用機能数・契約プラン | 確率が高い顧客からCSが先回りでフォロー。閾値は不均衡データ対策とセットで設計 |
| 顧客セグメント予測(多項) | 継続/アップセル候補/解約リスクの3クラス | 利用頻度・請求額の推移・サポート接触回数 | セグメントごとに施策を出し分け(アップセル提案・解約防止フォロー) |
いずれのユースケースでも、モデルの精度そのものより「確率をどう業務フローに接続するか」が成果を左右します。営業・CS のキャパシティに合わせた閾値設計、不均衡データへの対策、そしてオッズ比を経営層に説明するときの言い回し(確率の倍率と混同しない)まで含めて設計すると、モデルが実際の意思決定で使われ続けます。
statsmodels・scikit-learnでのコーディングが難しい場合、BigQuery MLならCREATE MODEL ... OPTIONS(model_type='LOGISTIC_REG')とSQLを書くだけでロジスティック回帰モデルを学習できます。GA4やCRMのデータをすでにBigQueryへ集約している会社なら、新しいインフラを組まずにそのまま試せるのが利点です。完全にノーコードで済ませたい場合は、Google CloudのVertex AI(現 Gemini Enterprise Agent Platform)が提供する表形式データ向けAutoML分類や、AWSのSageMaker Canvas(データを取り込み、目的変数の列を選ぶだけで二値分類モデルを構築できる)も選択肢になります。
AutoMLの仕組みや、Google CloudのVertex AI(現 Gemini Enterprise Agent Platform)をマーケティングに活用する方法は、それぞれ別記事で詳しく整理しています。
AutoMLとは
機械学習の構築工程を自動化する仕組みと、GoogleのAutoMLの使いどころを整理しています。
Vertex AIとは
Webマーケティングでの活用法と導入の始め方を整理しています。
07.よくある質問(FAQ)
オッズ比3倍は、確率も3倍になるという意味ですか?
いいえ。オッズ比は「オッズ(確率 ÷ (1−確率))が何倍になるか」であって、確率そのものの倍率ではありません。ベース確率が低い(数%程度)ときはオッズ比と確率の倍率がほぼ近似しますが、ベース確率が50%に近づくほど両者は乖離します。たとえばベース確率20%でオッズ比3.0なら、実際の確率は約42.9%(倍率は約2.1倍)にとどまります。レポートではオッズ比と一緒に具体的な予測確率も添えるのが安全です。
二値ロジスティック回帰と多項ロジスティック回帰はどう使い分けますか?
目的変数のカテゴリ数で決めます。「解約する/しない」のような2択なら二値ロジスティック回帰、「継続/アップセル候補/解約リスク」のように3カテゴリ以上なら多項ロジスティック回帰です。カテゴリに順序がある場合(満足度:低・中・高、など)は順序ロジスティック回帰という専用手法もありますが、実務では順序を無視して多項ロジスティック回帰で扱っても十分実用に耐えます。
閾値は0.5のままでよいですか?
統計的に0.5が正しいわけではなく、単なる初期値です。実務では、営業やCSが対応できる件数(キャパシティ)から逆算して閾値を決めるか、確率が高い順に上位k件だけ抽出する運用の方が現場に馴染みます。空振りを避けたいなら適合率重視で閾値を高めに、見逃しを避けたいなら再現率重視で閾値を低めに設定します。
不均衡データへの対策は、class_weightとSMOTEのどちらを先に試すべきですか?
まず class_weight="balanced" から試します。scikit-learnの引数1つで完結し、データ加工が不要なためです。それでも少数クラスの再現率が不十分なら、SMOTEなどの過剰サンプリングを検討します。SMOTEは学習データにのみ適用し、評価データに適用すると人工サンプルが混入してデータリークが起き、実際より高い精度が出てしまう点に注意してください。
ロジスティック回帰と決定木・ランダムフォレストはどちらを使うべきですか?
係数の解釈性(オッズ比で「どの要因がどれだけ効いたか」を説明できる)を重視するならロジスティック回帰、予測精度を最優先し変数間の非線形な関係も自動で拾いたいなら決定木系(ランダムフォレスト・勾配ブースティング)が向きます。実務では両方を試したうえで、精度差が小さければ経営層やCS・営業に説明しやすいロジスティック回帰を採用する判断もよくあります。
08.まとめ
ロジスティック回帰は、0/1 の分類を確率のランキングに変換できるのが最大の実務価値です。二値なら二値ロジスティック回帰、3カテゴリ以上なら多項ロジスティック回帰を使い、係数はオッズ比(確率の倍率とは別物)として読みます。モデルを作った後は、混同行列・ROC-AUC での評価、業務キャパシティに合わせた閾値設計、不均衡データへの対策(class_weight・SMOTE)まで含めて初めて、現場で使われ続けるモデルになります。
ロジスティック回帰を使ったリードスコアリング・解約予測の伴走支援を行っています
弊社ではAIフル活用のデータ分析支援を提供しています。リードスコアリングモデルの構築、解約予測の閾値設計、不均衡データ対策まで、実データで伴走しながら整えています。お気軽にお問い合わせください。
データ分析・アルゴリズム 基礎知識集
一覧に戻る →全体像とカテゴリ早見
データの可視化
個別指標カテゴリ
統計的推測の基礎
実務分析の手法
多変量解析
- ›多変量解析の基礎|目的で選ぶ手法マップ
- ›回帰分析の基礎|施策の 1 単位あたりの効きを数字で出す
- ›ロジスティック回帰分析|確率で出すから優先順位に使える(この記事)
- ›クラスタリング・顧客セグメンテーション
- ›構造方程式モデリングの基礎|パス解析でKPI波及を可視化

