メインコンテンツへスキップ
StatPlay トピック 重回帰分析

重回帰分析 — 交絡を制御して本当の効果を見る

「勉強時間が長いほど成績が悪い」── 変数を1つ加えるだけで、結論がひっくり返る瞬間がある。これが交絡の正体。

M2 / 重回帰分析

重回帰分析 — 複数の変数で予測する

単回帰では「勉強時間だけ」で成績を予測した。でも待って——たくさん勉強する人ほど睡眠を削っているとしたら? 睡眠不足が成績を下げる分、勉強の本当の効果が隠れてしまう重回帰は「他の要因をコントロールして、各変数の本当の効果を取り出す」道具だ。

変数が1つなら直線、2つなら3D空間の平面。 でも大事なのは幾何ではなく「なぜ変数を加えるのか」——交絡(隠れた変数の影響)を取り除いて、各変数の純粋な効果を見るためだ。 まず左右の比較パネルで「β₁が変わる瞬間」を体感しよう。

実験ガイド — 交絡を体感する
  1. Step 1: デフォルト(相関 = −0.5)で左右のβ₁を見比べる。単回帰のほうが小さい——勉強の効果が過小評価されている。
  2. Step 2: 相関スライダーを0にする → 左右のβ₁がほぼ同じに。「交絡がなければ差は出ない」。
  3. Step 3: 相関を+0.5にする → 今度は単回帰のβ₁が大きすぎる。交絡の方向で過小にも過大にもなる。
  4. Step 4: R²の変化も確認。重回帰は常に単回帰以上——変数を加えて説明力が上がった。

▶ 単回帰 vs 重回帰 — β₁が変わる瞬間

同じデータで「勉強時間だけ」と「勉強+睡眠」で回帰する。相関スライダーで交絡の強さを変えてみよう。
単回帰 β₁
重回帰 β₁
差(交絡による歪み)
単回帰 R²
重回帰 R²
実験ガイド — 3Dで回帰平面を体感する
  1. Step 1: 3Dグラフをドラッグして回転。半透明の面が回帰平面——データ点がこの面に沿って並んでいる。
  2. Step 2: 勉強時間のスライダーを動かす → 予測点が平面の「x₁方向」に移動。傾き = β₁。
  3. Step 3: 睡眠時間も動かす → 「x₂方向」に移動。傾き = β₂。2つの変数それぞれの貢献が見える。
  4. Step 4: 再サンプリングを数回押す → β₁, β₂, R²が毎回少し変わる。推定値にも「ばらつき」がある。
β̂₁(勉強1hあたり)
β̂₂(睡眠1hあたり)

// 交絡って何が起きている?

上の比較パネルで「単回帰のβ₁」と「重回帰のβ₁」が違う値になったのを見た。
なぜ同じデータなのに、変数を1つ加えただけで傾きが変わるのか?

データの裏ではこういうことが起きている:

勉強時間↑ → 睡眠↓ → 成績↓(間接的なマイナス効果)

単回帰のβ₁は「直接効果+間接効果」のごちゃ混ぜ。
勉強の直接効果は+3点/hなのに、睡眠を削ることで間接的に点数が下がるから、単回帰では+2.2のように過小評価される。

重回帰のβ₁は「睡眠を統計的に固定した上での、勉強だけの効果」。
間接経路を遮断して、直接効果だけを取り出している——これが偏回帰係数の意味。

上のパネルで相関を0にすると、間接経路が消えて単回帰と重回帰のβ₁が一致する——これが「交絡がない状態」。

// ここで使われる公式

各パーツの役割
・β₀(切片):すべての変数が0のときの予測値。ベースライン
・β₁x₁:「x₂ を固定したまま x₁ が1増えたら y がいくつ変わるか」× x₁ の値
・β₂x₂:同様に「x₁ を固定したまま x₂ が1増えたら」の貢献分


単回帰との違い
・単回帰のβ₁ = x₁の直接効果 + x₂を経由した間接効果(ごちゃ混ぜ)
・重回帰のβ₁ = x₁の直接効果だけ(x₂の影響を「統計的に固定」して取り出す)
・上のパネルで相関=0にすると間接経路が消え、両者が一致するのはこのため

幾何的イメージ
・2変数なら予測面は平面(3Dグラフの半透明の面)。データ点と平面の距離(残差)の二乗和が最小になる傾きを選ぶ

// 手を動かしてみよう — 具体例

30人の学生のテスト成績を、勉強時間と睡眠時間で予測する。

① まず平均を確認
 勉強時間の平均 = 5.0h、睡眠時間の平均 = 7.0h、点数の平均 = 65点
 勉強と睡眠の相関 r = −0.45(たくさん勉強するほど睡眠が短い)

② 単回帰 y ~ x₁(勉強時間だけ)
 β₁ = +2.4 点/h、R² = 0.32
 → 勉強1時間あたり2.4点UP...でもこれは過小評価

③ 重回帰 y ~ x₁ + x₂(睡眠時間を追加)
 β₁ = +3.1 点/h、β₂ = +2.0 点/h、R² = 0.57
 → 睡眠をコントロールしたら、勉強の効果は3.1点に上がった

④ なぜ変わった?
 このデータでは 勉強↑ → 睡眠↓ (r = −0.45)。
 単回帰は「勉強が増えると同時に睡眠が減ることのマイナス」まで勉強のせいにしていた。
 重回帰が睡眠を分離したことで、勉強の本当の効果が見えた。

⑤ 予測してみる
 β₀ は ȳ − β₁x̄₁ − β₂x̄₂ = 65 − 3.1×5 − 2.0×7 = 35.5 と決まる(OLS回帰は必ず平均点を通る)。
 勉強6h・睡眠7hの学生 → ŷ = 35.5 + 3.1×6 + 2.0×7 = 35.5 + 18.6 + 14.0 = 68.1点
 β₀ は「勉強0h・睡眠0hの仮想スコア」で、ここでは直感的な意味を持たない(外挿に注意)。

// よくある誤解

❌「偏回帰係数が大きい変数ほど重要」

「勉強時間(0〜10時間)」と「睡眠時間(4〜10時間)」ではスケールが違う。係数の大きさを比べるには標準化偏回帰係数(どちらも標準偏差1に揃えた係数)を使う必要がある。

❌「説明変数は多ければ多いほど良い」

R² は変数を増やせば必ず上がるが、自由度調整済み R² は下がることがある。不要な変数はノイズを増やして推定を不安定にする。上のシミュレーションで、係数がほぼ0の変数があるなら、それは不要かもしれない。

❌「多重共線性は気にしなくていい」

「勉強時間」と「図書館にいた時間」のように強く相関する2変数を同時に入れると、個々の係数がガタつく(片方の符号が逆転することも)。VIF > 10 が危険信号。

// よく出会う形

重回帰のまわりでは、係数の解釈と検定の対比が同じ形で繰り返し顔を出します。

  • 偏回帰係数の絵:β₁ = 3 のとき、「x₂ を固定したまま x₁ を1増やすと y が平均3増える」という形に読める。「他の変数を止める」という条件付きが、いつもこの絵に張り付いている
  • 単回帰と重回帰でβ₁がずれる場面:変数間に相関があると、単回帰は直接効果と間接効果を一つの数字に混ぜてしまう。上のパネルで相関をゼロにすると両者が一致する形になる
  • R² と自由度調整済み R² の対比:変数を足したときに、R² は必ず上がるが、調整済みは下がることがある。「下がったら、その変数は分の悪い追加だった」という形がここに現れる
  • F検定と t検定の役割分担:F検定は「すべての偏回帰係数 = 0」を一括で見る形、t検定は「個別に 0 か」を見る形。モデル全体と個別係数で問いが分かれている
  • 多重共線性のシグナル:VIF > 10 が目安として顔を出し、係数がガタつく場面の前触れになる