論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
線形回帰
Linear Regression
回帰モデル
別称: 線形回帰モデル

🔖 キーワード索引

最小二乗法OLS回帰係数切片残差F検定t検定重回帰正規方程式

別名・略称:線形回帰モデル

線形回帰 (linear regression)」はy = β0 + β1x + ε で連続量を予測する最も基本的な回帰モデル。 本ページの中核キーワードを以下に整理する。

OLS 最小二乗回帰係数 β残差 ε正規方程式 (X'X)⁻¹X'yR² / 自由度調整済 R²F 検定 / t 検定Gauss-Markov 定理 BLUE線形性・等分散・独立・正規性多重共線性 VIF外れ値 Cook's distanceSSDSE-B-2026 都道府県

これらのキーワードは「linear regression の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

データから直線を作る方法です。

ある値を使って別の値を予測します。

勉強時間でテストの点数を予想します。

この章では基本の仕組みを学びます。

線形回帰(Linear Regression):応答を説明変数の線形結合でモデル化する基本的回帰手法。

📍 あなたが今見ているもの

🍰 まずはやさしく

統計で最初に学ぶ重要な道具です。

データがどう関係しているか調べます。

高齢化率で死亡率を説明します。

学習のレベルと使い方のコツを読みます。

線形回帰は統計・機械学習で最初に学ぶ重要モデル。 SSDSE データで 「都道府県の死亡率は高齢化率でどれくらい説明できるか?」 といった問いに答えるのに使います。 シンプルなのに 解釈しやすく、 多くの場面で十分機能 するため、 最初に試すベースラインとして常に第一選択。

📍 学習レベルの確認

  1. レベル 1: $y = ax + b$ の傾き $a$ を最小二乗法で求められる
  2. レベル 2: 決定係数 $R^2$ を「説明できた変動の割合」と理解
  3. レベル 3: t 検定で係数の有意性を判断できる
  4. レベル 4: 残差プロット・QQ プロット・Cook 距離で前提条件を診断
  5. レベル 5: 多重共線性を VIF で検出し、 Ridge / Lasso で対処
  6. レベル 6: 信頼区間と予測区間の違いを説明できる
  7. レベル 7: 対数変換・多項式項で非線形性を捉えられる
  8. レベル 8: K-Fold CV で過剰適合を防ぎ、 汎化性能を測れる
  9. レベル 9: GLM(ロジスティック・ポアソン)に拡張できる
  10. レベル 10: ベイジアン回帰で不確かさを完全にモデル化できる

📍 実務 Tips — 仕事で使う線形回帰

線形回帰は「シンプル = 弱い」ではない。 「シンプル = 説明可能で頑健」と捉えると、 ビジネス現場での価値が見えてくる。

🎨 直感で掴む

🍰 まずはやさしく

点の間を通る一番いい線を引くことです。

データの平均的な傾向を線で表します。

人口から住宅の数を予想します。

直線の引き方とズレの意味を読みます。

直線フィッティング

2 次元なら散布図に 「最も良くフィットする直線」 を引く操作。 数式 $y = \beta_0 + \beta_1 x$ の $\beta_0$(切片)と $\beta_1$(傾き)を、 残差の二乗和が最小 になるよう決めるのが最小二乗法(OLS)。 SSDSE-B-2026 で「人口(x)→ 着工新設住宅戸数(y)」を回帰すると、 47 都道府県の散布図に右上がりの直線が引け、 傾き β₁ ≒ 0.0081(戸/人)=人口 100 万人あたり約 8,100 戸が「人口の住宅着工への平均的な寄与」を表します。

「平均」を線で延ばすイメージ:x の各値で y の条件付き期待値 E[y|x] を直線で近似していると考えると分かりやすい。 ヒストグラムは 1 変数の中心傾向、 線形回帰は 2 変数間の中心傾向を表現する道具です。

残差(実測 − 予測)がモデルの「説明できなかった部分」。 これがランダムに見え、 平均ゼロで、 x に依存しないなら良い回帰です。 残差にパターン(U 字、 ファン状の広がり、 時系列の周期)が残っていたら、 説明変数の追加・非線形変換・別モデルへの切り替えを検討する合図です。

単回帰と重回帰

種類説明変数数式SSDSE 例
単回帰1 個y = β₀ + β₁x住宅戸数 = β₀ + β₁ × 人口
重回帰2 個以上y = β₀ + β₁x₁ + ... + βₚxₚ住宅戸数 = β₀ + β₁人口 + β₂出生率 + β₃大学生数

🎮 点を打って回帰直線を引く

下のグレーの領域をクリックすると点が追加され、 点をドラッグすると移動できます(点をダブルクリックで削除)。 点を動かすたびに 最小二乗回帰直線がリアルタイムで再計算され、 傾き・切片・$R^2$・残差二乗和(SSE)が更新されます。 各点から直線へ下ろした縦の赤線が残差で、 最小二乗法はこの赤線の長さの二乗の合計を最小化しています。

点の数:0 個  /  空白をクリックで追加、 点をドラッグで移動、 ダブルクリックで削除
最小二乗解(OLS)
傾き β₁ =
切片 β₀ =
R² =
SSE =

💡 手動フィットモードにすると、 スライダーで自分の直線(オレンジ)を引けます。 どんなに頑張っても、 あなたの直線の SSE は最小二乗直線(緑)の SSE を絶対に下回れません。 これが「最小二乗解が SSE を最小にする唯一の直線」であることの体感です。

📐 最小二乗の幾何的意味

残差二乗和 $\sum_i (y_i-\hat y_i)^2$ を最小化する操作は、 幾何的には 観測ベクトル $\mathbf{y}$ を説明変数が張る空間へ「垂直に射影」することと同じです。 予測値ベクトル $\hat{\mathbf y}$ は「$\mathbf{1}$ と $\mathbf{x}$ が張る平面」上の点のうち $\mathbf{y}$ に最も近い点で、 残差ベクトル $\mathbf{y}-\hat{\mathbf y}$ はその平面に直交します。 だから正規方程式は「残差が説明変数と直交する($X^\top(\mathbf{y}-X\hat\beta)=0$)」という条件そのものです。 上のインタラクティブで赤い残差線を眺めると、 直線を少し傾けても切片を上げても、 二乗和がそれ以上減らない「底」に緑の直線がいることが分かります。

🎲 残差に置く 3 つの仮定

最小二乗解を「推定量」として信頼する(検定・信頼区間を計算する)には、 残差 $\epsilon_i$ に次を仮定します。 上の散布図で残差の赤線を見ながら、 これらが崩れていないかを想像してみてください。

  • 等分散性(homoscedasticity):残差のばらつきが $x$ の値によらず一定。 右に行くほど赤線が長くなる「ファン状」なら等分散性が崩れています → ロバスト標準誤差や対数変換。
  • 独立性(independence):ある点の残差が別の点の残差を予言しない。 時系列や空間データでは隣同士が似た残差を持ちやすく、 標準誤差が過小評価されます → Durbin-Watson 検定・GLS。
  • 正規性(normality):残差が平均 0 の正規分布 $\epsilon_i\sim N(0,\sigma^2)$。 これは点推定には不要だが、 p 値・信頼区間の正確さに効きます → QQ プロット・Shapiro-Wilk 検定。

※ 傾き・切片の点推定そのものは正規性を仮定しなくても計算できます(最小二乗は純粋に幾何的な操作)。 正規性が要るのは「その推定値がどれくらいブレるか」を言うときだけ、 という区別が重要です。

📊 R² の解釈と限界

$R^2 = 1 - \mathrm{SSE}/\mathrm{SST}$ は「$y$ の全変動のうち、 直線で説明できた割合」。 上のツールで点を一直線に並べると $R^2\to 1$、 バラバラに散らすと $R^2\to 0$ に近づきます。 ただし $R^2$ には落とし穴があります。

  • 説明変数を増やすと必ず上がる:無意味な変数でも $R^2$ は下がらないので、 変数選択には自由度調整済み $R^2$ を使う。
  • 高い $R^2$ = 正しいモデルではない:曲線関係を直線で当てても、 見かけ上 $R^2$ が高いことがある。 残差プロットで曲率を確認する。
  • 外れ値に弱い:上のツールで 1 点だけ遠くに置くと $R^2$ が乱高下します。 Anscombe の 4 データセットは「$R^2$ が同じでも中身が全く違う」有名な例。
  • 因果を意味しない:$R^2$ が高くても $x$ が $y$ の原因とは限らない(交絡・逆因果)。

🌉 過学習への橋渡し

「SSE をもっと下げたい」なら、 直線をやめて高次の曲線(多項式)を使えば、 全ての点をほぼ通せて SSE を 0 に近づけられます。 しかしそれは手元のデータの偶然のノイズまで暗記した状態で、 新しいデータでの予測は逆に悪化します。 これが 過学習(overfitting) です。 線形回帰の「シンプルさ」は、 訓練データへの当てはまり(低い SSE)と未知データへの汎化のバランスを取るための強力な正則化とも言え、 だからこそ最初のベースラインとして常に第一選択になります。 上のツールで点を 3〜4 個だけにすると、 直線でも簡単に SSE≈0 にできてしまうことに気づくでしょう — 少ないデータで複雑なモデルを当てる危うさの縮図です。

🗾 実データ例 — SSDSE-B-2026「総人口 → 出生数」

政府統計の教育用標準データセット SSDSE-B-2026 から、 2023 年・47 都道府県で「総人口 $x$(A1101)→ 出生数 $y$(A4101)」を単回帰した実測結果です(encoding='cp932', skiprows=[1] で 2 行目の項目名行を除外して読み込み、 各県の最新年のみ抽出)。

n = 47 都道府県(2023年) 傾き β₁ = 0.006104 (人口 1 人あたり 出生 0.0061 → 人口1000人あたり約 6.1 人) 切片 β₀ = -676.9 R² = 0.9909 (相関係数 r = 0.9954) SST = 1.354×10¹⁰ SSR = 1.341×10¹⁰ SSE = 1.236×10⁸ x̄ = 2,645,809 人 ȳ = 15,474 人

$R^2=0.99$ は「都道府県の出生数のばらつきの 99% は人口規模だけでほぼ説明できる」ことを意味します。 これは当然といえば当然で、 人口が多い県ほど生まれる子どもも多いという規模効果が支配的だからです。 むしろ興味深いのは残る 1%(SSE の部分)で、 回帰直線より上(予測より出生数が多い)/下(少ない)に位置する県の差こそが、 出生率や年齢構成といった人口規模以外の要因を映します。 「説明できた 99%」より「説明できなかった 1%」に問いが宿る、 という線形回帰の使い方の好例です。 なお切片 β₀ が負なのは、 データが人口 50 万〜1400 万人の範囲に集中しているための外挿にすぎず、 「人口 0 で出生 -677 人」という物理的意味はありません(回帰式を観測範囲外へ延ばして解釈しないという原則の実例)。

📐 定義 / 数式

🍰 まずはやさしく

予測するための数式のことです。

ズレを最小にする計算で線を決めます。

買い物などのデータに式を当てはめます。

計算式と評価の方法について読みます。

【線形回帰モデル】
$$y_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} + \epsilon_i$$
【最小二乗推定(正規方程式)】
$$\hat\beta = (X^\top X)^{-1} X^\top y$$
【決定係数 R²】
$$R^2 = 1 - \frac{\sum (y_i - \hat y_i)^2}{\sum (y_i - \bar y)^2}$$

📐 最小二乗法の導出 — 数式で正解直線を求める

$n$ 個のサンプル $(x_i, y_i)$ に対して、 直線 $\hat{y} = \beta_0 + \beta_1 x$ の「残差平方和」を最小化する $\beta_0, \beta_1$ を探します。

$$L(\beta_0, \beta_1) = \sum_{i=1}^{n} (y_i - \beta_0 - \beta_1 x_i)^2$$

数式を言葉で読み解く(再掲)

解析解(閉形式)

$L$ を $\beta_0, \beta_1$ で偏微分して 0 と置くと、 次の閉形式解が得られます。

$$\beta_1 = \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2} = \frac{\text{Cov}(X, Y)}{\text{Var}(X)}, \quad \beta_0 = \bar{y} - \beta_1 \bar{x}$$

「傾き $\beta_1$ は共分散を分散で割った値」「切片 $\beta_0$ は平均を通る条件で決まる」と覚えると忘れない。 重回帰では行列形式 $\boldsymbol{\beta} = (X^T X)^{-1} X^T \mathbf{y}$ に一般化される。

🔬 記号・式を言葉で読み解く

$\beta_0$(切片)
全説明変数が 0 のときの y の予測値。
$\beta_j$(偏回帰係数)
他変数を固定して $x_j$ を 1 増やしたときの y の変化量。
$\epsilon_i$(残差)
観測値 $y_i$ と予測値 $\hat y_i$ の差。 平均 0 のノイズを仮定。
$R^2$(決定係数)
y の分散のうち、 モデルで説明される割合。 0〜1。
p 値
「真の係数が 0」という帰無仮説の検定。 p < 0.05 なら有意。

🔬 OLS の前提条件と検証方法

線形回帰が「最良線形不偏推定量(BLUE)」となるための古典的仮定(ガウス・マルコフ条件):

仮定 内容 違反時の影響 対処
線形性 $E[y|x]$ が $x$ の線形関数 バイアスのある推定 残差プロットで曲線確認、 多項式回帰へ拡張
独立性 残差 $\epsilon_i$ が互いに独立 標準誤差が過小評価 Durbin-Watson 検定、 GLS や時系列モデルへ
等分散性 $\text{Var}(\epsilon_i)$ が一定 標準誤差が誤計算 Breusch-Pagan 検定、 ロバスト標準誤差
正規性(残差) $\epsilon_i \sim N(0, \sigma^2)$ p 値・信頼区間が不正確 QQ プロット、 Shapiro-Wilk 検定、 ロバスト回帰
多重共線性なし 説明変数同士の相関が弱い 係数の符号が不安定 VIF 計算、 Ridge / 主成分回帰
外生性 $E[\epsilon_i | x_i] = 0$ 因果効果の歪み 操作変数法、 差分の差分法 (DID)

実務では「完全に満たす」ことは少なく、 「どの程度の違反まで許容できるか」を判断することが大切。 SSDSE-B-2026 の人口 → 住宅戸数モデルでは、 東京都が大きな外れ値となり、 等分散性と正規性の検定で警告が出る可能性が高い。

🔬 対数変換で線形性を回復する

SSDSE-B-2026 の人口と住宅戸数は、 値の幅が広い(住宅戸数 2,396〜124,810 戸)。 こうした「正の値で広い分布」のデータは、 対数変換 $\log H = \alpha + \beta \log P$ で線形性が大きく改善することが多い。 これは べき関数 $H = A P^\beta$ を線形化したもの。

対数変換前: H = 0.008135·P − 4497.48, R² = 0.9753 対数変換後: log H = -7.71 + 1.173·log P, R² = 0.9740 → 弾力性 1.173(人口が 1% 増えると住宅が 1.17% 増) → 残差の正規性 Shapiro p = 0.95(正規分布と矛盾しない) → 等分散性 Breusch-Pagan p = 0.25(等分散の仮定 OK)

対数モデルでは「比例的な関係」になり、 弾力性 $\beta = 1.17$ は「住宅戸数の人口弾力性」を直接表す。 統計検定もパスし、 OLS の前提条件が満たされる。 経済学では Cobb-Douglas 関数の推定など、 対数線形モデルが標準的に使われる。

🔬 分散分解 — 全変動を「説明された変動」と「残差変動」に分ける

線形回帰の核心は 分散分解

$$\underbrace{\sum (y_i - \bar{y})^2}_{SS_T \text{ 総変動}} = \underbrace{\sum (\hat{y}_i - \bar{y})^2}_{SS_R \text{ 回帰変動}} + \underbrace{\sum (y_i - \hat{y}_i)^2}_{SS_E \text{ 残差変動}}$$

決定係数 $R^2 = SS_R / SS_T = 1 - SS_E / SS_T$ は「全変動のうち、 モデルで説明された割合」。 SSDSE-B-2026 の人口 → 住宅戸数の例では:

SS_T (総変動) = 2.44 × 10¹⁰ SS_R (回帰変動) = 2.38 × 10¹⁰ (97.5%) SS_E (残差変動) = 6.04 × 10⁸ (2.5%) F = MS_R/MS_E ≈ 1774 (p ≈ 8.5e-38)

F 検定は「回帰モデル全体が役立つか」のテスト。 $F = 1774$ は極めて大きく、 帰無仮説(全係数 = 0)は強く棄却される。 重回帰では各係数の t 検定とは別に、 モデル全体の F 検定が必須。

🔬 回帰係数の解釈 — 偏回帰係数と弾力性

偏回帰係数

重回帰の係数 $\beta_i$ は「他の説明変数を一定に保ったとき、 $x_i$ が 1 単位増えると $y$ が $\beta_i$ 単位増える」という偏微分的解釈。 ただし「他を一定に保つ」が物理的に可能かは別問題。 例えば「総人口を変えずに 65 歳以上人口だけ変える」のは現実的でない。

標準化偏回帰係数

説明変数を平均 0・分散 1 に標準化してから回帰すると、 標準化係数は「相対的な影響度」を比較可能にする。 単位が異なる変数(人口 vs. 出生率)でも、 標準化係数で「どちらの影響が大きいか」を直接判断できる。

弾力性

経済学では 弾力性 $\eta = (\partial y/\partial x) \cdot (x/y) = \beta \cdot \bar{x}/\bar{y}$ を使う。 SSDSE-B-2026 の人口 → 住宅戸数の弾力性は $\eta = 0.008135 \times 2.646 \times 10^6 / 17{,}026 \approx 1.26$。 「人口 1% 増 → 住宅 1.26% 増」。 対数変換モデルではこの $\eta$ が直接 $\beta$ として推定される(前出 1.17 と近い値になり、 平均点まわりの局所弾力性と対数線形の大域弾力性がほぼ一致する)。

🧮 実データで計算してみる

SSDSE 47 都道府県で「死亡率 ~ 高齢化率」の単回帰:

パラメータ推定値p 値
切片 β₀-5.2< 0.001 ***
高齢化率 β₁+0.61< 0.001 ***
0.945

解釈:高齢化率が 1% 上がると、 死亡率は約 0.61‰ 上がる。 95% を説明できる強いモデル。

🧮 「東京除外」で何が変わるか — 外れ値の影響を実測

SSDSE-B-2026 では東京都(人口 1,408 万人)が極端に大きい。 これを除外した場合と含めた場合で、 回帰係数がどう変わるかを比較する。

[全 47 都道府県] β₀ = -4497.48 β₁ = 0.008135 R² = 0.9753 [東京除外 46 都道府県] β₀ = -2994.97 β₁ = 0.007375 R² = 0.9799 [東京・大阪・神奈川 除外 44 都道府県] β₀ = -2674.44 β₁ = 0.007179 R² = 0.9683

大都市を除外すると傾き $\beta_1$ はやや小さくなる(0.00814 → 0.00718)。 これは「大都市の住宅着工は人口あたりでより活発」を意味する。 R² は東京単独を除くと 0.9799 へわずかに上がり(東京は高レバレッジだが回帰直線によく乗る点)、 上位 3 都市をまとめて除くと 0.9683 へ下がる。 東京は「線形関係を乱す外れ値」というより、 高レバレッジで直線を安定させる端点と解釈するのが実態に近い。

機械学習の前処理では「外れ値を除外すべきか、 残すべきか」はドメイン知識次第。 「東京は人口分布のレアな端点でモデルに含めるべき」とも、 「平均的な県の挙動を見たいから除外すべき」とも判断できる。

🧮 確認クイズ — 線形回帰の理解度を測る

  1. Q1. $\hat{y} = 5 + 2x$ で $x = 3$ のときの予測値は?
    解答:$\hat{y} = 5 + 2 \times 3 = 11$。
  2. Q2. 決定係数 $R^2 = 0.85$ が意味するのは?
    解答:「$y$ の全変動の 85% が回帰モデルで説明できる」。 残り 15% は説明変数で捉えられない変動(残差)。
  3. Q3. SSDSE-B-2026 で「人口」と「住宅戸数」の傾き 0.0081 を読み解け。
    解答:「人口が 100 万人増えると、 年間住宅着工が 8,100 戸増える」傾向。 ただし因果関係は別問題。
  4. Q4. 残差プロットに右肩上がりの傾向があるとき、 何が疑われる?
    解答:「異分散性」(誤差分散が説明変数に依存)。 ロバスト標準誤差や対数変換を検討する。
  5. Q5. VIF が 15 の変数があったらどう対処する?
    解答:多重共線性が深刻。 (1) 変数を削除、 (2) 主成分回帰、 (3) Ridge 回帰、 のいずれかで対処。
  6. Q6. Lasso が Ridge より優れる場面は?
    解答:「特徴量選択をしたい」「スパース解(多くの係数が 0)が欲しい」場面。 解釈性が高くなる。
  7. Q7. 信頼区間と予測区間の違いは?
    解答:信頼区間は「平均応答」の不確かさ、 予測区間は「個別観測」の不確かさ。 後者の方が広い(残差ばらつきも含むため)。
  8. Q8. Cook 距離 5 のサンプルをどう扱う?
    解答:カットオフ 4/n を大きく超えるので「影響力が極端に大きい」。 除外検証、 ロバスト回帰、 ドメイン知識での精査が必要。

🧮 数式に値を入れて手で計算する: 単回帰の最小二乗

合成データで β = Sxy/Sxx, α = ȳ - β·x̄ を計算する。

Step 1: データと平均

x = [2, 4, 7, 5, 3] y = [3, 7, 12, 9, 4] x̄ = 4.2, ȳ = 7.0

Step 2: 偏差の和

Sxy = Σ(x-x̄)(y-ȳ) = 28.0 Sxx = Σ(x-x̄)² = 14.8 β = 28.0 / 14.8 ≈ 1.892 α = 7.0 - 1.892 · 4.2 ≈ -0.946

Step 3: R²

Syy = Σ(y-ȳ)² = 54 R² = β² · Sxx / Syy = (1.892)² · 14.8 / 54 = 3.580 · 14.8 / 54 ≈ 0.981

🐍 Python で再現

1
2
3
4
5
6
7
8
import numpy as np
x = np.array([2,4,7,5,3])
y = np.array([3,7,12,9,4])
beta, alpha = np.polyfit(x, y, 1)
r2 = np.corrcoef(x, y)[0,1]**2
print(f"β = {beta:.3f}")
print(f"α = {alpha:.3f}")
print(f"R² = {r2:.3f}")

📤 実行結果

β = 1.892 α = -0.946 R² = 0.981

💬 手計算 (Step 2,3) と Python 出力が完全一致。

🐍 Python 実装

SSDSE-B-2026(47 都道府県・2023 年データ)を題材にした最小コード:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4200(死亡数) 北海道 5,092,000 1,681,000 75,120 東京都 14,086,000 3,205,000 137,241 沖縄県 1,468,000 350,000 15,110 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]  # 2023年・47都道府県

# 派生列を定義: 高齢化率=A1303/A1101(%), 死亡率=A4200/A1101(‰)
df['高齢化率'] = df['A1303'] / df['A1101'] * 100
df['死亡率'] = df['A4200'] / df['A1101'] * 1000

X = df[['高齢化率']]
y = df['死亡率']
X = sm.add_constant(X)  # 切片項追加

model = sm.OLS(y, X).fit()
print(model.summary())  # 係数、 p値、 R² が全部見える

実測結果(2023 年・47 都道府県):切片 β₀ ≈ −5.17、 高齢化率の係数 β₁ ≈ 0.61(‰/%, p < 0.001)、 R² ≈ 0.945。 「高齢化率が 1% 上がると死亡率が約 0.61‰ 上がる」という上記の表と一致する。

🐍 sklearn で SSDSE-B-2026 を線形回帰する

🎯 このコードでやること:47 都道府県 2023 年データから「総人口 $P$ → 着工新設住宅戸数 $H$」を予測する単回帰モデルを sklearn で学習し、 係数・$R^2$・標準誤差を求める。 さらに広島県のサンプルで予測値と実値を比較する。

📥 入力データ(SSDSE-B-2026 抜粋):

Prefecture A1101 (人口) H1800 (住宅戸数) 北海道 5,092,000 28,469 東京都 14,086,000 124,810 大阪府 8,763,000 65,927 広島県 2,738,000 16,032 沖縄県 1,468,000 10,007 (全 47 都道府県、 2023 年)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# ── この抜粋で使うデータを用意します(英字の項目コードで読み込み)──
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=0)
df = df[df['Code'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')
df = df[df['SSDSE-B-2026'] == df['SSDSE-B-2026'].max()]

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error, root_mean_squared_error

df['year'] = df['SSDSE-B-2026'].astype(int)
df['pop']     = pd.to_numeric(df['A1101'])
df['housing'] = pd.to_numeric(df['H1800'])   # 着工新設住宅戸数
d = df[df['year'] == 2023].dropna(subset=['pop', 'housing'])

X = d[['pop']].values
y = d['housing'].values

model = LinearRegression().fit(X, y)
pred = model.predict(X)

print(f"切片 β₀ = {model.intercept_:.2f}")
print(f"傾き β₁ = {model.coef_[0]:.6f}")
print(f"R²       = {r2_score(y, pred):.4f}")
print(f"RMSE     = {root_mean_squared_error(y, pred):.1f}")

# 広島県の予測
hiroshima_pop = 2_738_000
print(f"広島予測: {model.predict([[hiroshima_pop]])[0]:.0f} 戸 (実値 16,032)")

📤 実行結果

切片 β₀ = -4497.48 傾き β₁ = 0.008135 R² = 0.9753 RMSE = 3585.5 広島予測: 17,776 戸 (実値 16,032)

💬 結果の読み方:$R^2 = 0.975$ は強い線形関係を示す。 広島県の予測値 17,776 戸は実値 16,032 戸に対して +11% の誤差。 47 県全体での RMSE は 3,586 戸で、 「平均的に予測が ±3,600 戸ずれる」程度の精度。 切片 $\beta_0 = -4{,}497$ は「人口 0 なら住宅着工 −4,497 戸」と物理的にあり得ない値だが、 これは外挿の範囲外なので問題ない。

🐍 statsmodels で詳細な統計量を取得する

🎯 このコードでやること:sklearn は予測に強いが、 統計推測(p 値、 信頼区間、 F 検定など)は statsmodels が便利。 同じデータで OLS を実行し、 サマリ表を表示する。

📥 入力データ:上記の $X$(人口)と $y$(住宅戸数)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import statsmodels.api as sm
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
X = sm.add_constant(pd.to_numeric(df['A1101']))
y = pd.to_numeric(df['H1800'])

res = sm.OLS(y, X, missing='drop').fit()
print(res.summary().tables[1])
print("F 値 =", round(res.fvalue, 2), " p =", f"{res.f_pvalue:.2e}")
print("信頼区間 (95%):")
print(res.conf_int())

📤 実行結果

coef std err t P>|t| const -4497.48 739.4 -6.08 0.000 A1101 0.0081 0.0002 42.12 0.000 F 値 = 1774.40 p = 8.45e-38 信頼区間 (95%): 0 1 const -5986.8 -3008.2 A1101 0.00775 0.00852

💬 結果の読み方:傾き $\beta_1$ の 95% 信頼区間は $[0.00775, 0.00852]$ で 0 を含まないため、 統計的に有意 ($p < 0.001$)。 t 値 42.12 は非常に大きく、 「人口と住宅戸数の関係は偶然ではない」と強く主張できる。 F 検定($p = 8.45 \times 10^{-38}$)はモデル全体の有意性。 切片の信頼区間も 0 を含まないが、 物理的意味より「平均ゼロからの基準点」と解釈する。

🐍 残差プロットで前提条件を診断する

🎯 このコードでやること:SSDSE-B-2026 で当てはめた回帰の残差を「予測値 vs 残差」「QQ プロット」「scale-location プロット」「Cook 距離」の 4 枚で可視化し、 外れ値や系統的バイアスを検出する。

📥 入力データ:上記 $X = P$ と $y = H$ の 47 サンプル。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
X = sm.add_constant(pd.to_numeric(df['A1101']))
y = pd.to_numeric(df['H1800'])
res = sm.OLS(y, X, missing='drop').fit()

resid = res.resid
fitted = res.fittedvalues
stand = (resid - resid.mean()) / resid.std()

print("残差の Shapiro-Wilk p =", round(stats.shapiro(resid).pvalue, 4))
print("Breusch-Pagan p =", round(sm.stats.het_breuschpagan(resid, X)[1], 4))
print("最大 Cook 距離 =", round(res.get_influence().cooks_distance[0].max(), 3))

📤 実行結果

残差の Shapiro-Wilk p = 0.0 Breusch-Pagan p = 0.0 最大 Cook 距離 = 8.203

💬 結果の読み方:Shapiro-Wilk $p < 0.001$ で正規性は棄却(残差は正規分布ではない)。 Breusch-Pagan $p < 0.001$ で等分散性も棄却(人口が大きいほど残差のばらつきが大きい異分散)。 最大 Cook 距離 8.20 は東京都の点(カットオフ 4/n = 0.085 を大きく超える)で、 「東京都が回帰係数に過大な影響を与えている」ことを示す。 対処:東京除外で再回帰 / 対数変換 $\log H \sim \log P$ / ロバスト回帰。

🐍 多変数回帰 — 説明変数を増やして説明力を高める

🎯 このコードでやること:人口 $P$ だけでなく、 「合計特殊出生率 $T$」「大学生数 $U$」を加えた重回帰 $H = \beta_0 + \beta_1 P + \beta_2 T + \beta_3 U$ で住宅着工戸数を予測する。 単回帰と比較し、 調整済み $R^2$ で過剰適合のリスクも考える。

📥 入力データ:A1101 (人口), A4103 (出生率), E6302 (大学学生数), H1800 (住宅戸数)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
for c in ['A1101', 'A4103', 'E6302', 'H1800']:
    df[c] = pd.to_numeric(df[c], errors='coerce')
df = df.dropna(subset=['A1101', 'A4103', 'E6302', 'H1800'])

X = sm.add_constant(df[['A1101', 'A4103', 'E6302']])
y = df['H1800']
res = sm.OLS(y, X).fit()

print("係数:", dict(res.params.round(4)))
print("R²       =", round(res.rsquared, 4))
print("調整済 R² =", round(res.rsquared_adj, 4))
print("AIC      =", round(res.aic, 1))

📤 実行結果

係数: {'const': -14443.9582, 'A1101': 0.0065, 'A4103': 8686.4366, 'E6302': 0.0559} R² = 0.9912 調整済 R² = 0.9905 AIC = 862.4

💬 結果の読み方:単回帰の $R^2 = 0.975$ から多変数で $0.991$ に上昇。 調整済み $R^2$ も 0.99 で改善。 「人口」だけでなく「大学生数」「出生率」も住宅着工に寄与していることが分かる。 ただし $\beta_1$(人口)と $\beta_3$(大学生数)の相関が 0.89 程度と高く、 多重共線性のため個別係数の解釈は慎重に。

🐍 Ridge 回帰と Lasso — 正則化で多重共線性に対処する

🎯 このコードでやること:SSDSE-B-2026 多変数モデルに Ridge / Lasso を適用し、 通常の OLS と係数を比較する。 Ridge は係数を縮小し、 Lasso は不要な変数の係数を 0 にする(特徴量選択)。

📥 入力データ:A1101 (人口), A4103 (出生率), E6302 (大学生数), L3221 (消費), H1800 (住宅戸数)。 5 変数 47 サンプル。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
feats = ['A1101', 'A4103', 'E6302', 'L3221']
for c in feats + ['H1800']:
    df[c] = pd.to_numeric(df[c], errors='coerce')
df = df.dropna(subset=feats + ['H1800'])

scaler = StandardScaler()
X = scaler.fit_transform(df[feats])
y = df['H1800'].values

for name, mdl in [("OLS",   LinearRegression()),
                  ("Ridge", Ridge(alpha=1.0)),
                  ("Lasso", Lasso(alpha=500.0))]:
    mdl.fit(X, y)
    print(f"{name:6s}: 係数={mdl.coef_.round(1)}  R²={mdl.score(X, y):.3f}")

📤 実行結果

OLS : 係数=[17883.9 1303.3 5898.2 376.6] R²=0.991 Ridge : 係数=[16627.6 984.4 6709.7 381.4] R²=0.991 Lasso : 係数=[16999.6 0. 5645.3 0. ] R²=0.989

💬 結果の読み方:OLS と Ridge はほぼ同じ係数だが、 Ridge は係数の絶対値が少し小さい(正則化の効果)。 Lasso は「出生率」と「消費」の係数を完全に 0 にし、 人口と大学生数だけで予測する。 R² は OLS 0.991 → Lasso 0.989 とほぼ変わらず、 「シンプルなモデルで同等の性能」を実現。 機械学習では Lasso でモデル解釈性を高める使い方が定番。

🐍 信頼区間と予測区間 — 不確かさを定量化する

🎯 このコードでやること:「広島県の住宅戸数を予測する」とき、 単純な点予測ではなく「95% の確率でこの範囲に入る」予測区間も提供する。 平均応答の信頼区間と、 個別予測の予測区間は意味が異なる。

📥 入力データ:上記の単回帰モデル、 予測点 $P = 2{,}738{,}000$(広島県)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import numpy as np
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
X = sm.add_constant(pd.to_numeric(df['A1101']))
y = pd.to_numeric(df['H1800'])
res = sm.OLS(y, X, missing='drop').fit()

new_X = sm.add_constant(pd.Series([2_738_000], name='A1101'), has_constant='add')
pred = res.get_prediction(new_X)
summary = pred.summary_frame(alpha=0.05)
print(summary.round(1))

📤 実行結果

mean mean_se mean_ci_lower mean_ci_upper obs_ci_lower obs_ci_upper 0 17776.1 534.8 16698.9 18853.2 10317.7 25234.5

💬 結果の読み方:点予測 17,776 戸。 「平均応答の信頼区間」(mean_ci) は [16,699, 18,853] で、 「全国で人口 274 万人の県を平均的に観測したらこの範囲に入る」幅。 「予測区間」(obs_ci) は [10,318, 25,234] で大きく広い。 これは「広島県 1 つの個別予測なら、 平均からのばらつき(残差)も含むため」。 実値 16,032 は両区間内に収まる。 機械学習の予測では「予測区間で不確かさを示す」のが理想。

🐍 多項式回帰 — 線形モデルで非線形関係を捉える

🎯 このコードでやること:SSDSE-B-2026 の「人口」と「ごみ排出量」(H5609) の関係に、 1 次・2 次・3 次の多項式モデルを当てはめて、 BIC で適切な次数を選ぶ。 「線形回帰」は説明変数を多項式に拡張しても、 係数に対しては依然として線形なので OLS が使える。

📥 入力データ:A1101 (人口) と H5609 (ごみ排出量) の 47 都道府県 2023 年データ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import numpy as np
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
P = pd.to_numeric(df['A1101'], errors='coerce').values / 1e6
G = pd.to_numeric(df['H5609'], errors='coerce').values / 1e3
mask = ~np.isnan(P) & ~np.isnan(G)
P, G = P[mask], G[mask]

for deg in [1, 2, 3]:
    X = np.column_stack([P**k for k in range(deg+1)])
    res = sm.OLS(G, X).fit()
    print(f"deg={deg}  R²={res.rsquared:.4f}  AIC={res.aic:.1f}  BIC={res.bic:.1f}")

📤 実行結果

deg=1 R²=0.9937 AIC=528.9 BIC=532.6 deg=2 R²=0.9952 AIC=517.9 BIC=523.5 deg=3 R²=0.9953 AIC=519.7 BIC=527.1

💬 結果の読み方:2 次の BIC が最小(523.5)→ モデル選択基準では 2 次がわずかに優る。 ただし 1 次(BIC 532.6)からの R² 改善は 0.9937 → 0.9952 とごく僅かで、 3 次(BIC 527.1)にすると過剰適合のペナルティで再び悪化する。 「人口とごみ排出量はほぼ線形で、 わずかな曲率だけを 2 次項が拾う」と読める。 機械学習でも「複雑なモデルが必ず良いとは限らない」典型例で、 BIC のような情報量規準で次数を選ぶ意義を示す。

🐍 交差検証(CV)で汎化性能を測る

🎯 このコードでやること:「訓練データでの R² が高い」だけでは、 未知データへの予測性能(汎化性能)を保証できない。 47 都道府県データを 5 分割し、 各分割で「4 つで学習、 1 つでテスト」を繰り返す K-Fold CV を行い、 安定的な評価指標を得る。

📥 入力データ:A1101 (人口), A4103 (出生率), E6302 (大学生数) → H1800 (住宅戸数)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold, cross_val_score

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
for c in ['A1101', 'A4103', 'E6302', 'H1800']:
    df[c] = pd.to_numeric(df[c], errors='coerce')
df = df.dropna()

X = df[['A1101', 'A4103', 'E6302']].values
y = df['H1800'].values

scores = cross_val_score(LinearRegression(), X, y,
                         cv=KFold(5, shuffle=True, random_state=42), scoring='r2')
print("各 fold の R²:", scores.round(3))
print("平均 R²    :", round(scores.mean(), 3))
print("標準偏差   :", round(scores.std(), 3))

📤 実行結果

各 fold の R²: [0.971 0.994 0.977 0.982 0.978] 平均 R² : 0.98 標準偏差 : 0.008

💬 結果の読み方:5 つの fold での R² はすべて 0.97 以上で、 平均 0.980・標準偏差 0.008。 訓練全体での R² とほぼ同水準で、 fold 間のばらつきが小さく、 モデルが安定して機能している。 最小 0.971 (fold 1) と最大 0.994 (fold 2) の差が 0.023 しかないのは、 どの 9〜10 県を検証に回しても同じ関係が成り立つということで、 過学習していない証拠になる。 もし fold 間で R² の差が大きければ「データに依存性が強い」「サンプル数が不足」を示唆する。

🐍 勾配降下法で線形回帰を解く(ベクトル化版)

🎯 このコードでやること:閉形式解 $\boldsymbol{\beta} = (X^TX)^{-1}X^T\mathbf{y}$ が使えない大規模データを想定し、 勾配降下法で線形回帰を解く。 大規模機械学習の基礎。

📥 入力データ:SSDSE-B-2026 47 都道府県 2023 年の (A1101, A4103, E6302) → H1800。 標準化済み。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
df = df.iloc[1:]
df = df[df['SSDSE-B-2026'].astype(int) == 2023]
for c in ['A1101', 'A4103', 'E6302', 'H1800']:
    df[c] = pd.to_numeric(df[c], errors='coerce')
df = df.dropna()

X = StandardScaler().fit_transform(df[['A1101', 'A4103', 'E6302']])
y = StandardScaler().fit_transform(df[['H1800']]).flatten()
X = np.column_stack([np.ones(len(X)), X])     # 切片列を追加

beta = np.zeros(X.shape[1])
eta, n = 0.05, len(y)
for step in range(300):
    pred  = X @ beta
    grad  = -2/n * X.T @ (y - pred)
    beta -= eta * grad
    if step in [0, 10, 50, 100, 299]:
        loss = np.mean((y - pred)**2)
        print(f"step {step:3d}: β={beta.round(3)}  loss={loss:.4f}")

# 閉形式解と比較
beta_closed = np.linalg.solve(X.T @ X, X.T @ y)
print("閉形式  :", beta_closed.round(3))

📤 実行結果

step 0: β=[-0. 0.099 -0.052 0.093] loss=1.0000 step 10: β=[ 0. 0.449 -0.131 0.399] loss=0.0525 step 50: β=[0. 0.614 0.017 0.408] loss=0.0148 step 100: β=[-0. 0.688 0.039 0.35 ] loss=0.0108 step 299: β=[-0. 0.774 0.049 0.27 ] loss=0.0089 閉形式 : [0. 0.785 0.05 0.26 ]

💬 結果の読み方:300 ステップで閉形式解にほぼ収束(step299 と閉形式解がほぼ一致)。 標準化済みなので係数は無次元で比較可能:「人口 0.785」「出生率 0.05」「大学生数 0.26」 → 住宅着工への影響度は「人口 > 大学生数 >> 出生率」と読める。 大規模データでは閉形式の逆行列計算がコスト過大になるため、 確率的勾配降下 (SGD)・ミニバッチ SGD・Adam で代替する。 これがニューラルネットの学習と同じ仕組み。

⚠️ よくある落とし穴

⚠️ 外れ値で係数が動く
1 点で傾きが大きく変わる。 → 残差プロットで外れ値確認。
⚠️ 非線形関係を無視
曲線関係を直線でフィットすると R² が下がる。 → 散布図で確認、 多項式項追加。
⚠️ 多重共線性
説明変数が強く相関すると係数の解釈が不安定。 → VIF を確認、 変数選択。
⚠️ p 値の有意性のみで判断
n が大きいと小さな効果でも有意に。 効果量(係数の大きさ)も見る。
⚠️ 外挿の危険
訓練データの範囲外の予測は信頼できない。

⚠️ 線形回帰の典型的な落とし穴(深掘り版)

落とし穴 SSDSE-B-2026 での例 対処法
外挿の危険 人口 0 → 住宅 −4,497 戸(あり得ない値) 予測範囲を学習データ範囲内に限定
外れ値の影響 東京都が回帰係数を引っ張る(Cook 距離 8.2) ロバスト回帰、 トリミング、 外れ値除外検証
多重共線性 「人口」と「大学生数」の相関 0.89 VIF > 10 で警告、 Ridge 回帰や主成分回帰
異分散 人口が大きい県ほど予測誤差のばらつきが大 ロバスト標準誤差、 重み付け最小二乗、 対数変換
非線形性の無視 残差プロットに曲線パターン 多項式項、 スプライン、 GAM (Generalized Additive Models)
相関と因果の混同 「人口 → 住宅」は逆方向(住宅増加が人口を呼ぶ)も成立 操作変数法、 自然実験、 DAG で因果構造を明示
時系列の自己相関 同じ県の年次データを混ぜると独立性が崩れる パネルデータ分析、 固定効果モデル

⚠️ 時系列データへの線形回帰の注意点

SSDSE-B-2026 は 2014〜2023 の各年データを含む。 同じ県の年次データを混ぜて単純に OLS すると、 「独立性」の仮定が崩れる。 例えば「北海道 2020 年」と「北海道 2021 年」の人口は強く相関するため、 残差も相関する(自己相関)。

対処法は以下の通り:

単年(2023 年)のクロスセクション解析なら独立性は概ね保たれるが、 パネルデータでは必ず適切な手法を選ぶこと。

🗺 概念マップ

線形回帰を中心に、 最小二乗法 OLS (推定方法)、 重回帰・Ridge / Lasso (発展)、 残差診断・相関係数 (前提・後段) を並べた回帰分析マップ。

linear regression 最小二乗法 (OLS) 重回帰 (発展) Ridge / Lasso 正則化 GLM / ロジスティック 残差診断 相関係数 (前提)

線形回帰は「説明変数と目的変数の関係を直線 (または超平面) で近似する」最も基本的な統計モデルで、 残差分布の形状 (正規・歪み・二峰・平坦) が前提検証の鍵となる。 概念マップでは最小二乗法・最尤推定・正則化 (Ridge / Lasso)・重回帰・多項式回帰・GLM が周辺ノード、 残差ヒストグラムが正規型でない場合は変数変換 (log) や GLM への切替を検討する。

🔗 隣接手法への橋渡し

線形回帰は最小二乗法による直線当てはめであり、 前段の散布図・相関係数による関係性確認と後段の残差診断を組み合わせて初めて統計的に妥当な結論が得られる。

上流の散布図と相関係数で線形性の前提を可視化し、 並列の多項式回帰/Ridge/Lasso と比較して正則化や非線形拡張の必要性を判断し、 下流の残差プロット・QQ プロットで仮定 (正規性・等分散性) を点検する流れで「線形回帰の信頼性」が確保される。

🌳 手法選択フロー

線形回帰 を実際の課題に当てはめるとき、 用語固有の判断軸に沿って次の 3 段階で適切な選択を行う。

  1. 説明変数は 1 つか複数か? 1 つ → 単回帰、 複数 → 重回帰
  2. 多重共線性 (VIF>10) はないか? 問題あり → Ridge/Lasso で正則化、 問題なし → 通常 OLS
  3. 残差は等分散・正規か? Yes → OLS で OK、 No → 重み付き回帰 (WLS) / 一般化線形モデル (GLM) を検討

このフローは線形回帰の前提検証フロー。 単純な「Yes/No 課題定義」ではなく、 「変数の数 → 多重共線性 → 残差の性質」の 3 段階で実務適用可否を判断する。

🔎 解説を深める — 回帰直線は「1 本」ではない

💡 直感 — 「回帰」という名前の正体(平均への回帰)

なぜこの手法は「回帰(regression)」と呼ばれるのか。 Galton が親子の身長で発見したのは、 極端な親からは、 親ほど極端でない子が生まれる(平均へ「退行=回帰」する)という現象でした。 これは回帰直線の数式に最初から組み込まれています。 $x$ と $y$ を両方とも標準化(平均 0・標準偏差 1 に変換)してから単回帰すると、 切片は 0 になり、 傾きは相関係数 $r$ そのものになります:$\hat z_y = r \cdot z_x$。 $|r| < 1$ である限り、 予測値は必ず入力より平均寄りに「縮む」のです。

SSDSE-B-2026(2023 年・47 都道府県)の実測で確かめます。 人口規模の影響を除くため、 婚姻件数(A9101)と出生数(A4101)をそれぞれ総人口(A1101)で割った「人口千人あたりの率」で回帰しました。

x = 婚姻率(件/千人) x̄ = 3.457, sx = 0.449 y = 出生率(人/千人) ȳ = 5.726, sy = 0.704 r = 0.6674 r² = 0.4454 (n = 47, 2023 年) 回帰式(y を x で予測): ŷ = 1.048 x + 2.104 標準化座標では: ẑy = 0.667 zx

婚姻率が全国で最も高いのは東京都の 5.095(平均から +3.65σ の極端な値)。 標準化回帰式は東京都の出生率を $0.667 \times 3.65 = +2.44\sigma$ と予測します — 入力の +3.65σ よりすでに平均寄りに縮んでいます。 これが平均への回帰です。 なお実際の東京都の出生率は 6.130(+0.57σ)で、 予測よりさらに低い。 この大きな負の残差こそ「婚姻は多いのに出生は伸びない」という東京都固有の構造(未婚期の若年流入・晩産化など)への問いの入口になります。

⚠️ 落とし穴(重要)— 回帰直線は 2 本あり、逆向きに使えない

最小二乗法は「y 方向の残差」だけを最小化します。 だから「x から y を予測する直線」と「y から x を予測する直線」は別物です。 同じ 47 都道府県データで両方向を実測すると:

① 出生率 ~ 婚姻率 : ŷ = 1.048 x + 2.104 ② 婚姻率 ~ 出生率 : x̂ = 0.425 y + 1.023 ②を同じ散布図上の直線に直すと y = 2.352 x − 2.406 ・2 本の直線は重ならない(傾き 1.048 vs 2.352、 約 2.2 倍差) ・ただし両方とも平均点 (x̄, ȳ) = (3.457, 5.726) は必ず通る ・傾きの積 1.048 × 0.425 = 0.4454 = r²(一致は r = ±1 のときだけ)

🚀 発展 — 「縦の距離」をやめると何が変わるか

直交回帰(orthogonal / Deming 回帰):OLS が縦距離を最小化するのは「x は誤差なく観測できる」という暗黙の前提があるからです。 x にも測定誤差がある場合(例:どちらも測定値である 2 つの検査値の関係)は、 点から直線への垂直距離を最小化する直交回帰や主成分の第 1 主軸が候補になります。 その直線は、 上で見た 2 本の OLS 直線(傾き 1.048 と 2.352)のに入ります。

希釈バイアス(attenuation):説明変数 x が誤差込みで観測されると、 OLS の傾きは真の値よりゼロ方向に縮んで推定されます(誤差分散が大きいほど縮む)。 「x の測定が雑だと効果が小さく見える」という系統的な偏りで、 疫学・心理測定では信頼性係数による補正が使われます。

標準化偏回帰係数への橋:単回帰では「標準化すると傾き=r」でしたが、 重回帰では標準化係数は単純な相関ではなく「他の変数を固定した部分的な関係」に変わります。 単位の異なる説明変数の影響力比較に標準化係数が使われるのは、 この単回帰の性質の自然な拡張です。

🔗 関連ページ