AI × データ分析基礎知識集 / 回帰分析

回帰分析の基礎|線形・ロジスティック・log 変換で『要因の寄与』を分解する


複数要因が同時に動くとき、相関だけでは「どれがどれだけ効いたか」を切り分けられません。本記事では、単回帰・重回帰の係数解釈、多重共線性と分散拡大要因、ロジスティック回帰、対数変換、残差プロット、Ridge/Lasso 正則化までを、コード例とともに整理します。

公開2026.05.15
最終更新2026.06.11
読了 16 分 / 約6,800字
この記事をシェアポスト
AI × データ分析『広告費 +10 万円で CV が何件増えるか』を数字で答える

施策の 1 単位あたりの
効きを数字で出す

「広告費を 10 万円増やしたら CV は何件増えるのか」「ページの表示速度が 100ms 速くなったら CVR は何ポイント上がるか」「価格を 5% 下げたら解約率はどう動くか」。マーケ・PdM・経営が知りたいのはいつも、施策を 1 単位動かしたとき、結果がいくつ動くか の数字です。回帰分析はこの「1 単位あたりの効き」を、共通要因を取り除いたうえで係数として出してくれます。

相関係数(0.7、0.5 など)だけだと「連動している」しか分かりません。回帰なら、広告費の係数 β1 = 2.3 件 / 万円 のような数字が出るので、そのまま予算の意思決定に持ち込めます。複数の要因が同時に動く局面(広告・CTA・記事制作を並列で回している会社)ほど、回帰の出番が多くなります。

C
結論
施策の「1 単位あたりの効き」を係数で出す。意思決定に直接使える数字が出る道具

回帰分析が他の指標と違うのは、係数の単位が意思決定にそのまま使えること。「広告費 1 万円 → CV +2.3 件」「価格 100 円下げ → 解約率 −0.4pt」のように、施策の費用対効果と直結する形で結果が出ます。連続値(売上・CV 数・滞在時間)には重回帰、0/1(CV する/しない)にはロジスティック回帰、変数が多すぎて係数が不安定なときには Ridge / Lasso、と形を切り替えます。

i
用語の整理
本記事で押さえる主要用語
  • 回帰分析:説明変数(X、施策側)と目的変数(Y、結果側)の関係を式で要約する手法。出てくる係数が「X を 1 単位増やすと Y がいくつ変わるか」を表す。
  • 単回帰/重回帰:説明変数が 1 つなら単回帰、複数なら重回帰。実務で要因分解したいなら重回帰。
  • 偏回帰係数:重回帰の係数。「他の変数を固定したときの、その変数の純粋な効き」を表す。
  • 多重共線性 / VIF:説明変数同士が似すぎて係数が信用できなくなる現象。VIF が 10 を超える変数は対処が必要。
  • ロジスティック回帰:0/1(CV する/しない、解約する/しない)の確率を予測する形。係数を exp() でオッズ比に直して読む。
  • 対数変換:売上・滞在時間のように一部に大きな値が偏るデータを扱う前処理。np.log() 1 行で正規分布に近づく。
  • 残差プロット:観測 − 予測 を散布図に。雲のように散らばっていればモデルは妥当。系統パターンが残っていたら修正必要。
  • 決定係数(R²):モデルが説明できた割合(0〜1)。マーケ領域では 0.2〜0.4 でも実務的に使える。
  • Ridge / Lasso(正則化):変数が多すぎる時に係数を抑えて過学習を防ぐ。Lasso は不要変数を 0 にして自動選別。

01.まず結論:施策の「1 単位あたりの効き」を数字で出す道具

回帰分析が他のデータ分析と違う最大のポイントは、係数の数字をそのまま意思決定に使える こと。「広告費 1 万円 → CV +2.3 件」「価格 100 円下げ → 解約率 −0.4pt」「記事 1 本 → セッション +180」のような単位付きの係数が出るので、費用対効果の議論にそのまま乗せられます。目的変数の形で次のように使い分けます。

手法目的変数実務シーン例
重回帰連続値(CV 数・売上・滞在時間)「広告費・CTA 表示数・新規記事数のどれが CV を動かしたか」を係数で分解
ロジスティック回帰0/1(CV する・解約する・離反する)「来月解約しそうな顧客リスト」「フォーム送信確率の高いユーザー」をスコアで予測
Ridge / Lasso 回帰連続値・変数が多い「マーケ施策 20 種類のうち、本当に効いているのはどれか」を自動で絞る(Lasso)
Poisson 回帰件数・カウント「問い合わせ件数」「店舗訪問回数」のように 0 や 1, 2, 3… のカウント予測

図:最小二乗法のイメージ(点と直線の距離を最小化する)

回帰直線は、各データ点から直線までの縦の距離(残差)の二乗和が最小になるように引かれます。点線がそれぞれの残差。

X(説明変数)YY = β0 + β1·X残差(点線)

この図と同じデータを、下のツールに読み込んであります。傾き・切片・決定係数(R²)が実際にどう出るか、手元のデータに貼り替えながら確認してみてください。

単回帰分析ツール
ツール単体ページで開く

2列の数値データを貼り付けると、散布図と回帰直線・回帰式・相関係数・決定係数をその場で計算します(ブラウザ内で計算、サーバー送信なし)。

入力フォーマットの例を見る

Excel・Googleスプレッドシートで範囲をコピーしてそのまま貼り付け(タブ区切り)できるほか、CSV(カンマ区切り)・スペース区切りにも対応しています。1行目が見出しの場合は自動で判定します。日付や文字列など数値でないセルは自動的に除外されるので、きれいに整形してから貼り付ける必要はありません。

広告費,売上
10,182
12,210
15,250

02.重回帰|「どの施策がいくら効いたか」を数字で出す

重回帰は、複数の施策を同時にモデルに入れて、他の施策の影響を取り除いたうえで「その施策単独の効き」 を係数として出してくれます。

たとえば広告費(X1)・CTA 表示数(X2)・新規記事数(X3)を同時に動かしている会社で、重回帰を回した結果が β1 = 2.3、β2 = 0.04、β3 = 8.1 だったとします。読み方は次のとおりです。

  • 広告費 1 万円増 → CV +2.3 件(CTA 表示と記事数を一定にしたとき)
  • CTA 表示 100 回増 → CV +4 件(広告費と記事数を一定にしたとき)
  • 新規記事 1 本増 → CV +8.1 件(広告費と CTA 表示を一定にしたとき)

この係数の数字をそのまま、次のような意思決定に使えます。

  • 「広告 +10 万円」vs「記事 +3 本」のどちらが CV 増に効くか比較(前者で +23 件、後者で +24 件、コストとあわせて判断)
  • 来期の予算配分のシミュレーション(「広告 +20% で CV はどう動くか」を係数 × 予算増分で試算)
  • 施策の費用対効果レポート(「広告は CV 1 件あたり 4,300 円」「記事は CV 1 件あたり 6,200 円」など、係数を CAC に翻訳)

この「1 単位あたりの効き」を 偏回帰係数 と呼びます。式そのものは Y = β0 + β1·X1 + β2·X2 + … ですが、ビジネス目線で重要なのは式ではなく 係数の解釈と、どの数字を意思決定に持ち込むか です。

手順やることツール
01. 説明変数を 3〜6 個に絞る目的変数を動かしそうな要因を、ドメイン知識で選ぶ(広告費・CTA 表示・新規記事数など)BigQuery / pandas で抽出
02. 相関と分布を確認<code>df.corr()</code> で相関を見る。0.8 以上のペアは多重共線性の警戒対象(03 章へ)pandas / seaborn
03. OLS で当てはめ<code>statsmodels.OLS</code> で 1 行。<code>summary()</code> で係数 / t 値 / p 値 / R² を読むstatsmodels
04. 残差プロットで妥当性確認残差 vs 予測値が雲のように散らばっているか目視。U 字や扇状なら 06 章を参照statsmodels / matplotlib
05. 係数を意思決定に持ち込む係数の符号・95% 信頼区間・残差を 3 点セットで報告。p 値だけで判断しない—
出力意味読み方の目安
係数 βY への寄与(他の変数固定)符号と大きさが意思決定の中心。単位は X と Y の単位に依存
標準誤差(SE)係数推定値のばらつき小さいほど推定が安定
t 値β / SE。係数が 0 から何 SE 離れているか目安として |t| が 2 以上なら統計的に有意(n が十分なとき)
p 値係数が偶然 0 でない値を取った確率0.05 未満を有意とする運用が定番。p 値だけで判断しない
R²(決定係数)モデルが説明できた分散の割合(0〜1)1 に近いほど当てはまりが良い。ただし変数を増やすだけで上がる
修正 R²説明変数の数で R² を補正重回帰で変数追加の妥当性を見るときの主指標
i
R² の解釈
R² は『説明できた分散の割合』であって、予測精度の絶対値ではない

R² は 1 − (残差平方和 / 全変動) で定義され、モデルが目的変数の分散をどれだけ説明できたかを 0〜1 で示します。R² = 0.7 なら「Y の変動の 70% をモデルで説明できた」と読みます。

ただし、R² は説明変数を増やすだけで機械的に上がります(無関係な変数でも下がらない)。重回帰で変数を比較するときは 修正 R²、あるいはテストデータでの R² を併用します。R² が低くても、係数の符号や有意性が安定していれば「説明力は弱いが要因の方向性は読める」モデルとして使う場面もあります。

# statsmodels で重回帰(OLS: 最小二乗法)
import pandas as pd
import statsmodels.api as sm

# df: 広告費 ad_cost, CTA 表示数 cta_views, 新規記事数 new_posts, 目的変数 cv
X = df[["ad_cost", "cta_views", "new_posts"]]
y = df["cv"]

X = sm.add_constant(X)           # 切片 β0 用の列を追加
model = sm.OLS(y, X).fit()
print(model.summary())

# summary 出力で確認するもの
#  - coef      : 各説明変数の偏回帰係数 β
#  - std err   : 標準誤差 SE
#  - t         : t 値(β / SE)
#  - P>|t|     : p 値
#  - [0.025  0.975] : 95% 信頼区間
#  - R-squared / Adj. R-squared : R² と 修正 R²

03.係数の数字が信用できない時のチェック|多重共線性と VIF

重回帰の係数を意思決定に使う前に、必ず確認するのが 多重共線性。要は 「説明変数同士が似すぎていると、係数の数字が信用できなくなる」 現象です。

たとえば「広告費」と「広告インプレッション数」は連動するため、両方を同時にモデルに入れると、係数の符号が逆転したり、桁が極端にぶれたりします。これに気づかず「広告費の係数がマイナスだから、広告は CV を下げる」のような誤った報告が出る——これが多重共線性の落とし穴です。VIF はその強さを測る指標で、変数ごとに 1 つの数字が出ます。

手順やることツール
01. 相関行列を出す<code>df.corr()</code> で説明変数同士の相関を一覧化するpandas
02. 警戒対象を記録相関係数 0.8 以上のペアを抜き出して、後で確認するリストに置くpandas / メモ
03. VIF を計算<code>variance_inflation_factor</code> で各変数の VIF を出すstatsmodels
04. 変数を 1 つずつ外すVIF 10 以上の変数を順番に外して、残った係数の符号と p 値が安定するか確認statsmodels
05. 削除 or 合成不要な変数を削除、または合成(広告費+インプレッション → 露出指数)して 1 本化pandas
VIF の値解釈対処
1.0他の変数と相関なしそのまま使用
1〜5問題なしと扱うのが定番そのまま使用
5〜10中程度の多重共線性。要注意変数の意味を確認、必要に応じて統合や除外を検討
10 以上強い多重共線性。基本的に要対処片方を削る/合成変数を作る/正則化(Ridge)を使う
!
VIF の閾値は『絶対値』ではなく目安
10 超で要注意、5 以下で問題なし。ただし数値だけで切らない

VIF の閾値「10 超で深刻 / 5 以下で問題なし」は便利ですが、絶対基準ではなく 分野・データサイズに依存する目安です。社会科学や経済学のような観測データでは VIF = 4〜5 でも警戒する研究があり、予測のみが目的で係数の解釈を捨てるなら VIF = 20 でもそのまま使う判断もあります。

数値だけで切らず、「VIF が大きい変数の係数の符号や有意性が、別変数の追加・削除で大きくぶれていないか」 を併せて確認するのが現実的です。係数が安定しているなら、VIF が大きくても解釈は維持できます。

# VIF を計算(statsmodels)
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.api as sm

X = df[["ad_cost", "ad_impressions", "cta_views", "new_posts"]]
X = sm.add_constant(X)

vif = pd.DataFrame({
    "feature": X.columns,
    "VIF": [variance_inflation_factor(X.values, i) for i in range(X.shape[1])],
})
print(vif)

# 出力イメージ(const は除いて読む)
#  feature           VIF
#  const             ...
#  ad_cost           12.4   ← 強い共線性
#  ad_impressions    11.8   ← ad_cost と相関 → どちらかを削る or 統合
#  cta_views         1.6
#  new_posts         1.2

04.ロジスティック回帰|「CV する確率・解約する確率」を出す

ロジスティック回帰は、0/1 の予測 をしたい時に使います。「来月この顧客は解約しそうか」「このリードはフォームを送信しそうか」を 0〜1 の確率 で出してくれるので、優先順位付けに直結します。

係数の読み方は 「exp(β) で倍率」。たとえば「再訪フラグありで β = 0.83」なら、exp(0.83) ≒ 2.30 倍 → 「再訪している顧客は、初訪問の顧客よりオッズで 2.3 倍 CV しやすい」と読みます。重回帰の「1 単位あたり +β」とは違って 「1 単位あたり倍率 exp(β)」 なので、報告時はオッズ比に変換する手間が必要です。オッズ比の詳しい読み方、3カテゴリ以上を扱う多項ロジスティック回帰、閾値設計や不均衡データ対策までは、ロジスティック回帰分析の記事で深掘りしています。

関連記事

ロジスティック回帰分析(深掘り)

オッズ比の読み方、多項ロジスティック回帰、閾値設計、不均衡データ対策を整理しています。

続きを読む
手順やることツール
01. 目的変数を 0/1 に整えるCV する=1 / しない=0 のフラグ列を作る。NULL や空文字を除外しておくpandas
02. 説明変数を 3〜5 個に絞る流入経路・滞在時間・再訪フラグなど、効きそうな要因を 3〜5 個で出発pandas
03. モデルに当てはめる<code>statsmodels.Logit</code> で <code>fit()</code>、<code>summary()</code> で係数を確認statsmodels
04. オッズ比に変換<code>np.exp(logit.params)</code> で係数を倍率に直して読む(再訪ありで 2.3 倍など)numpy
05. 予測精度を評価ROC-AUC・適合率・再現率を見る。閾値 0.5 を機械的に使わずビジネス要件で決めるscikit-learn
観点線形回帰ロジスティック回帰
目的変数連続値(売上、CV 数など)0/1 の二値(CV する/しない)
式Y = β0 + β1·X1 + ...log(p / (1−p)) = β0 + β1·X1 + ...
予測値Y 自身確率 p(0〜1)
係数の解釈X が 1 増えると Y が β 増えるX が 1 増えるとオッズが exp(β) 倍になる
評価指標R²、MAE、RMSE など正解率、F1スコア、ROC-AUC など
i
ビジネスでの典型ユースケース
解約予測・リード優先度・フォーム完了率の予測などに直結する

ロジスティック回帰は、係数の解釈と確率出力の両方を持つのがビジネス向け。次のような場面でそのまま使えます。

  • 解約予測:「この顧客は来月解約する確率 18%」リストを CS が優先対応
  • リードスコアリング:「フォーム送信確率 62%」リストを営業が優先架電
  • 要因分解:「再訪あり・滞在 60 秒超・3PV 以上の組み合わせで CV 確率が 5 倍」のような顧客プロファイル抽出
# statsmodels でロジスティック回帰
import pandas as pd
import numpy as np
import statsmodels.api as sm

# df: 説明変数, 目的変数 cv_flag (0 or 1)
X = df[["session_duration", "page_views", "is_returning"]]
y = df["cv_flag"]

X = sm.add_constant(X)
logit = sm.Logit(y, X).fit()
print(logit.summary())

# オッズ比に変換して読みやすくする
odds_ratio = np.exp(logit.params)
print(odds_ratio)
#  const              0.02   ← 切片はそのまま読まない
#  session_duration   1.45   ← 滞在 1 単位増でオッズ 1.45 倍
#  page_views         1.12
#  is_returning       2.30   ← 再訪フラグありでオッズ 2.3 倍

05.log 変換|売上・滞在時間など『偏ったデータ』を扱う前処理

売上・滞在時間・PV のような「ほとんどは小さい数字、一部だけ桁違いに大きい」データは、そのまま回帰に入れると数件の極端値で係数がぶれます。np.log() を 1 行噛ませると分布がきれいな山型に近づき、係数の推定が安定します。

図:log 変換で右裾の長い分布を正規に近づける

売上・滞在時間・PV のような「正の値で、ごく一部に大きな外れ値がある」分布は、log を取ると山型の正規分布に近づきます。回帰の前提を満たすための代表的な前処理。

変換前(右裾長)売上・滞在時間などlog 変換後log(売上・滞在時間 …)
i
いつ使うか・どう使うか
log 変換を入れる前の 4 つのチェック
  • ヒストグラムを描いて右に裾が長いか → Yes なら log 候補。No(左右対称)なら無理に変換しない。
  • 最小値が 0 を含むか → Yes なら log(Y + 1)(np.log1p)を使う。負値が混じるなら別アプローチに切り替える。
  • 予測値を元のスケールに戻したいか → Yes なら np.exp()。ただし Jensen の不等式で「log の平均 ≠ 元の平均」となるため、中央値で戻すか、exp(ŷ + σ² / 2) で平均補正するかを使い分ける。
  • 両方を log にすると弾力性(% 変化)になる → 価格弾力性や広告弾力性を見たいときは X も Y も log を取る。
変換の形係数の解釈向く場面
log(Y) を左辺に置くX が 1 単位増えると Y が約 (β × 100)% 変化(β が小さいとき)Y が右に裾を引く(売上・滞在時間・PV)
log(X) を右辺に置くX が 1% 増えると Y が β/100 増えるX が広い桁数にまたがる(広告費 1 万〜1000 万)
log(Y) と log(X) 両方X が 1% 増えると Y が β% 変化(弾力性)両方が桁違いに広い。需要の価格弾力性など
log(Y + 1)log 変換とほぼ同じ。0 値が混じるときの安全策Y に 0 が含まれる(PV 数、エラー件数)
!
log 変換は『分布が右に裾を引いている』ことを確認してから使う
正規に近い分布を log 変換すると、かえって歪む

log 変換は「右裾長 → 正規」に近づける前処理であって、万能の正規化ではありません。すでに正規に近い変数を log 変換すると、左裾長の歪んだ分布になります。ヒストグラム・Q-Q プロット・歪度(skewness)で右裾の偏りを確認してから適用してください。

また、log 変換後の係数を「X が 1 増えると Y が β 増える」と素直に読んではいけません。log(Y) の世界での係数なので、意思決定に使うときは exp(β) や Y への戻し計算を必ず行います。

# log 変換と線形回帰(numpy + scikit-learn)
import numpy as np
from sklearn.linear_model import LinearRegression

# 売上 sales が対数正規分布的。log を取って正規に近づける
y_log = np.log(df["sales"].values)
X = df[["ad_cost", "cta_views", "new_posts"]].values

model = LinearRegression().fit(X, y_log)
print("係数(log スケール):", model.coef_)
print("切片(log スケール):", model.intercept_)

# 予測値を元のスケールに戻す
y_pred_log = model.predict(X)
y_pred = np.exp(y_pred_log)

# 注意: log の平均と元の平均は一致しない(Jensen の不等式)
# 期待値で戻すなら exp(y_pred_log + sigma^2 / 2) で補正する手法もある

06.係数を信じる前に|残差プロットの 3 つの目視

係数の数字を意思決定に使う前に、モデル自体が信用できるかを 30 秒で目視確認します。R² や p 値だけでは見抜けない問題が、残差プロット(観測 − 予測の散布図)で一発で分かります。

i
まずやる目視チェック
残差プロットは 3 つを見れば足りる
  • チェック 1:雲のように散らばっているか → 横軸 = 予測値、縦軸 = 残差で散布図を描く。0 を中心に幅一定の雲なら OK。
  • チェック 2:扇状に広がっていないか → 予測値が大きいほど残差の幅が広がるなら不等分散。Y に log を入れるか、WLS(重み付き最小二乗)に切り替える。
  • チェック 3:Q-Q プロットで両端が直線から離れていないか → 両端が大きく外れるなら正規性が崩れている。log 変換やロバスト回帰を検討。
チェック見る図問題があるサイン
線形性残差 vs 予測値プロットU 字・逆 U 字の系統的なパターンが残る → 非線形項が必要
等分散性(ホモスケダスティシティ)残差 vs 予測値プロット予測値が大きいほど残差が広がる扇状 → log 変換 or WLS
残差の正規性Q-Q プロット、残差のヒストグラム両端で直線から大きく外れる → log 変換、ロバスト回帰
外れ値・影響点Cook 距離、レバレッジプロットCook 距離が大きい点があれば、データの確認・除外を検討
自己相関(時系列)Durbin-Watson 統計量2 から大きく離れる(0 付近・4 付近)→ 時系列モデルを検討
# 残差プロットと Q-Q プロット
import statsmodels.api as sm
import matplotlib.pyplot as plt

# model = sm.OLS(y, X).fit() で fit 済みとする
resid = model.resid
fitted = model.fittedvalues

# 残差 vs 予測値
plt.scatter(fitted, resid, alpha=0.5)
plt.axhline(0, color="red", linestyle="--")
plt.xlabel("予測値"); plt.ylabel("残差")

# Q-Q プロット(残差の正規性)
sm.qqplot(resid, line="45", fit=True)

# Durbin-Watson(自己相関)
from statsmodels.stats.stattools import durbin_watson
print("DW:", durbin_watson(resid))
# 2 付近なら自己相関なし、0 or 4 付近なら時系列構造の検討が必要

07.変数が多すぎる時|Ridge と Lasso で『効いている変数だけ残す』

マーケ施策が 20 種類・データ列が 50 個、というように変数が多すぎると、回帰モデルは「学習データに過剰に合わせる」状態(過学習)に陥ります。学習データでは R² が 0.95 でも、新しい月のデータで予測すると外れる。こうなると意思決定に使えません。

対処は Ridge(係数を全体的に縮める)と Lasso(不要な変数の係数を 0 にして自動選別)。とくに Lasso は、20 個の施策のうち 実際に効いているのはどれか を自動で残してくれるので、ビジネス側にも説明しやすい。

手法ペナルティ性質向く場面
Ridge 回帰係数の二乗和(L2 ノルム)すべての係数を一様に小さくする。0 にはしない変数を全部残したい。多重共線性が強いとき
Lasso 回帰係数の絶対値の和(L1 ノルム)一部の係数を厳密に 0 にする → 変数選択も同時にできる重要な変数だけ残して整理したい
Elastic NetL1 と L2 の混合Lasso と Ridge の中間。相関の強い変数群を一緒に残しやすい変数が多く相関も強い、現実的な業務データ

どちらも 正則化の強さ α(lambda とも書く) を持ち、α が大きいほどペナルティが強く、係数は 0 に近づきます。α は交差検証(cross_val_score / GridSearchCV)でテストデータの誤差が最小になる値を選ぶのが定番です。

i
Ridge と Lasso の選び方
3 行で決め切る
  • 全変数を残したい / 多重共線性が強い → Ridge。係数は一様に縮むが 0 にはならない。
  • 重要な変数だけ選びたい → Lasso。不要な変数の係数を 0 に落として変数選択も兼ねる。
  • 迷ったら ElasticNet。α と l1_ratio を GridSearchCV で CV 選定すれば、L1 と L2 の比率もデータから決まる。
!
正則化の前に標準化を必須にする
スケールが違う変数を混ぜると、ペナルティが片寄る

Ridge と Lasso は係数の大きさそのものにペナルティをかけるため、説明変数のスケールが揃っていないと「単位が大きい変数の係数」が過小評価されます。例えば広告費(円、桁が大きい)と CTA 表示率(0〜1 の比率)を一緒に入れると、広告費の係数が不当に小さくなって 0 に押し戻されます。

正則化を使うときは、必ず StandardScaler で平均 0・標準偏差 1 に標準化してから fit します。scikit-learn の Pipeline で StandardScaler → Ridge / Lasso をつなぐのが安全です。

# Ridge / Lasso と α の交差検証選定
import numpy as np
from sklearn.linear_model import Ridge, Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score

X = df[["ad_cost", "cta_views", "new_posts", "session_duration"]].values
y = df["cv"].values

alphas = [0.01, 0.1, 1.0, 10.0, 100.0]
for alpha in alphas:
    pipe_ridge = Pipeline([
        ("scaler", StandardScaler()),
        ("model", Ridge(alpha=alpha)),
    ])
    scores = cross_val_score(pipe_ridge, X, y, cv=5, scoring="r2")
    print(f"Ridge alpha={alpha}: R^2 = {scores.mean():.3f} (+/- {scores.std():.3f})")

# Lasso は係数が 0 になるかも確認
pipe_lasso = Pipeline([
    ("scaler", StandardScaler()),
    ("model", Lasso(alpha=0.5)),
]).fit(X, y)
print("Lasso 係数:", pipe_lasso.named_steps["model"].coef_)
# 例: [ 1.20  0.00  0.85  0.30 ]  ← cta_views が 0 → 変数選択で落ちた
i
自前 vs ツール
回帰分析はどう実装するか

回帰分析は基本ツールがそろっているので、目的に合わせて選びます。

  • Python(汎用・第一選択):statsmodels(OLS / Logit / GLM、summary 出力で係数・p 値・R² を一覧できる)/ scikit-learn(Ridge / Lasso / ElasticNet、機械学習寄り)。BI 担当・データサイエンティストの定番。
  • R:lm()・glm()・car::vif() の組み合わせ。論文や統計教科書の文法に最も近い。アカデミック寄りの分析チームで使われる。
  • BI ツールでの可視化:Tableau・Power BI・Looker Studio に簡易の回帰機能あり。係数推定の精度はそこそこなので、確認には別途 Python / R を回すのが安全。
  • Excel:データ分析アドインの「回帰分析」で重回帰まで一通り出せる。100〜1,000 件のデータなら Excel で十分なケースも多い。意思決定者と画面共有しながら係数を読むのにも向く。
  • クラウド / ノートブック:Google Colab・Databricks・Hex・Deepnote なら、Python の statsmodels をブラウザだけで動かせる。共有もしやすい。
  • マーケティング MMM 系:Robyn(Meta)/ LightweightMMM(Google)/ Meridian(Google)は中身が回帰の応用。広告費 → 売上の効果分解に特化。

選び方の指針:(a) 自社で本格的に回すなら Python の statsmodels から始める、(b) 経営報告まで 1 枚で完結させたいなら Excel、(c) BI ダッシュボードに係数を載せたいなら Tableau / Looker Studio、というのが現場での切り分けです。

08.よくある質問(FAQ)

線形回帰とロジスティック回帰はいつ使い分けますか?

目的変数の形で使い分けます。連続値(売上・CV 数・滞在時間など)なら線形回帰、0/1 の二値(CV する/しない、解約する/しない)ならロジスティック回帰。二値を線形回帰で当てると、予測確率が 0 未満や 1 超になって解釈できなくなります。ロジスティック回帰なら log オッズを線形で当てて、確率を 0〜1 に押し込むシグモイドが自然に出てきます。

多重共線性があると具体的に何がダメですか?

係数の推定が不安定になります。具体的には標準誤差が大きく膨らみ、p 値が高くなるため、本来効いている変数が「有意ではない」と判定されたり、変数を 1 つ加減するだけで係数の符号が逆転したりします。予測精度(R² や RMSE)自体は大きく落ちないことが多いのですが、係数を「広告費 1 万円増で CV が β 件増える」と解釈する用途では使えなくなります。予測だけが目的なら気にしすぎなくてよく、要因分解が目的なら VIF を確認して整理する、が実務の切り分けです。

log 変換はいつすべきですか?

目的変数や説明変数が 正の値で、右に裾を長く引く対数正規分布 のときに使います。売上・滞在時間・PV・広告費のような「桁数が広く、一部に大きな値が偏る」データが典型です。log を取ると山型の正規分布に近づき、線形回帰の前提が守られて係数の推定が安定します。すでに正規に近い変数や、負の値・0 を含む変数にはそのまま使えません(0 を含むときは log(Y+1) で代用します)。ヒストグラムや Q-Q プロットで右裾の偏りを確認してから適用してください。

R² が低いモデルは使う価値がないですか?

目的によります。予測精度が主目的なら、R² の低いモデルは弱いです。一方で 要因の寄与の方向性を見る ことが目的なら、R² = 0.2〜0.3 でも係数の符号と信頼区間が安定していれば実務で十分使えます。社会科学・マーケティング領域は人間行動が絡む分、R² が低いのが普通です。R² を過度に追って変数を増やすと 過学習 に陥り、テストデータでの精度が逆に落ちます。修正 R² や交差検証のスコアを併用してください。

Ridge と Lasso はどう使い分けますか?

すべての変数を残したい(一様に係数を縮める)なら Ridge、重要な変数だけ残したい(一部の係数を 0 にして変数選択も兼ねる)なら Lasso です。両者の中間が欲しいなら Elastic Net(L1 と L2 を混ぜたペナルティ)が選択肢になります。実務では Ridge / Lasso / ElasticNet を GridSearchCV や cross_val_score で並列に評価して、テストデータでの誤差が最小の手法・α を選ぶのが定番です。なお、いずれも 標準化を必ず先に 行ってください。

09.まとめ

回帰分析の基礎は、説明変数と目的変数の関係を 線形または非線形の式で要約し、係数として要因の寄与を取り出す ことに集約されます。単回帰・重回帰で係数の意味を読み、VIF で多重共線性を確認し、目的変数が 0/1 ならロジスティック回帰、対数正規分布なら log 変換、変数が多すぎるなら Ridge / Lasso、と用途で形を切り替えます。

どの場合でも、残差プロットでモデルの前提が守られているかを目視する習慣を持つと、R² や p 値だけでは見抜けない問題に気付けます。回帰係数を意思決定に持ち込む前に、係数の符号・信頼区間・残差の3点を確認するのが、実務で迷わないための最短ルートです。

お問い合わせ

回帰分析を使ったKPI要因分解の伴走支援を行っています

広告費・コンテンツ施策・サイト改善が CV にどれだけ寄与しているかの要因分解、ロジスティック回帰によるリード予測、Ridge / Lasso での変数選定などを、実データで伴走しながら整えています。お気軽にお問い合わせください。

お問い合わせはこちら

データ分析・アルゴリズム 基礎知識集

一覧に戻る →
07

モデル構築の自動化

この記事をシェア
澤田 翔太(Shota Sawada)
この記事を書いた人

澤田 翔太

株式会社クリプタル 代表取締役

1988年生まれ、慶應義塾大学卒。創業メンバーとして関わった株式会社セールスサポートを株式会社ネオマーケティング(東証STD 4196)に売却。株式会社クリプタルでも複数の事業立ち上げと売却を経験し、2022年9月には婚活・恋愛メディア「シッテク」「婚活会議」を株式会社ベビーカレンダー(東証GRT 7363)へ売却。現在はAI業務支援事業、TANTOU事業、グロースハック支援事業、メディア事業、SEOコンサルティング事業を手がける。