🍰 まずはやさしく
データに合う直線を引くルールです。
一番いい直線の位置を決めるために使います。
スマホの利用時間と成績の関係を調べます。
この方法の結論を短くまとめました。
statsmodels.api.OLS(y, X).fit() — summary() で詳細な結果表🍰 まずはやさしく
分析結果の最初に出てくる基本の手法です。
データの傾向を正しく読み取るために使います。
部活の練習量と試合結果の関係を調べます。
この手法がどこで使われるかを確認します。
回帰分析の出力で最初に出てくる「OLS Regression Results」。 また論文の手法説明で「OLS重回帰」「最小二乗法による推定」と書かれている部分。 ほぼ全ての回帰分析の出発点となる推定法。
最小二乗法(OLS) とは:残差(実測値 − 予測値)の二乗和を最小化して回帰係数を推定する古典的手法。
「直線をデータに当てはめる」のが回帰分析の本質。 ですが、 47都道府県の散布図を見ると点は綺麗に直線に並んでいません。 ばらつきがある中で、 「どの直線が最もよく当てはまるか」を一意に決めるルールが必要です。 そのルールが 最小二乗法(Ordinary Least Squares, OLS)。
OLSの核心アイデア: 各データ点の 「予測値とのズレ(=残差)」を 2乗して、 全部足したもの(=残差平方和、 RSS)が 最小 になるような直線を選ぶ、というルールです。 なぜ2乗するかは:(i) 正のズレと負のズレが相殺しないように、 (ii) 大きいズレほどより重く罰するため、 (iii) 数学的に解析的解が出るため。
OLSは19世紀初頭(ガウス、ルジャンドルら)に天体観測の誤差処理として開発された古典中の古典。 ですが、 一定の仮定(線形性・等分散性・独立性・正規性)を満たせば、 現代でも最良線形不偏推定量(BLUE: Best Linear Unbiased Estimator)として最強の推定法です(ガウス-マルコフの定理)。
🍰 まずはやさしく
点と直線のズレを小さくするイメージです。
最もズレが少ない直線を引くために使います。
買い物で予算と支出のバランスを考えます。
なぜズレを2乗して計算するのかを学びます。

図の点線が各点での 残差(residual) です。 直線をどこに引くかで残差は変わります。 OLSは「残差の2乗を全部足した値」が最小になる位置に直線を置きます。
なぜ「2乗」なのかを直感で説明すると:
🍰 まずはやさしく
ズレの合計を最小にする計算式です。
正確な数値を導き出すために使います。
テストの点数の平均的な上がり方を調べます。
計算の手順を数式で詳しく見ていきましょう。
簡単な5都道府県のデータで、 OLSの仕組みを手で追ってみましょう(高齢化率 x → 死亡率 y)。
5つの古典的仮定(線形性、 誤差の独立、 等分散、 期待値0、 説明変数と誤差の無相関)が全て成立するとき、 OLS推定量は次の意味で「最強」と証明されています:
不偏性(unbiasedness):$E[\hat{\beta}] = \beta$。 平均すれば真の値を当てる。
分散最小(efficiency):他の線形不偏推定量と比べて、 OLSの分散が最小。 つまり最も精度が高い。
これを BLUE: Best Linear Unbiased Estimator と呼びます。 「線形」「不偏」の枠内で「best」、 という条件付き最強です。 非線形でもよいなら別の推定量(リッジ回帰、 LASSO、 木モデル)の方が良いこともあります。
仮定が破れたら:
最小二乗法(Ordinary Least Squares, OLS)は、 「観測データに最もよく当てはまる直線」を見つける方法。 各観測値の予測値からのズレ(残差)の二乗を全て足した値を最小化するのが基本原理。
47都道府県の食料費(x)から教育費(y)を予測する単回帰。 赤い直線が OLS の解 y = 0.525x + -32.71。 黄色い縦線が残差(観測値と予測値の差)。 この縦線の二乗を全部足した値を最小にする直線を選んでいます。
💡 なぜ「二乗」を最小化する? 単なる距離だと符号が混ざる、 絶対値は微分困難、 二乗なら滑らかで唯一の解が得られる。 加えてガウス分布の最尤推定と一致するため、 統計理論的にも自然。
OLS は数学的には「観測ベクトル y を、 説明変数が張る部分空間に直交射影する」操作。 射影された点が予測値 ŷ、 ズレが残差 e。
残差ベクトル e と説明変数空間が直交するのが OLS の特徴。 これが「最小二乗 = 直交射影」と呼ばれる所以。
$$ y_i = \beta_0 + \beta_1 x_i + \varepsilon_i $$
$$ S(\beta_0, \beta_1) = \sum_{i=1}^{n} (y_i - \beta_0 - \beta_1 x_i)^2 $$
これを最小化する β を求めるのが OLS。
$$ \hat{\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)} = r \cdot \frac{s_y}{s_x} $$
$$ \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} $$
$$ \mathbf{y} = \mathbf{X} \boldsymbol{\beta} + \boldsymbol{\varepsilon} $$
正規方程式の解:
$$ \hat{\boldsymbol{\beta}} = (X^T X)^{-1} X^T y $$
「エックス転置エックスの逆 エックス転置ワイ」 — OLSの最も重要な公式。 機械学習・統計学の基本。
OLS が「最良線形不偏推定量(BLUE)」となるための仮定:
「線形性・独立性・等分散性を満たすとき、 OLS推定量は最良線形不偏推定量(BLUE: Best Linear Unbiased Estimator)」。 同じ条件下で他の線形不偏推定量より分散が小さい。
| 違反 | 影響 | 対処 |
|---|---|---|
| 非線形 | 推定量がバイアス | 多項式項、 ログ変換、 GAM |
| 不等分散 | SEが不正確 | WLS、 ロバストSE |
| 自己相関 | SEが不正確 | GLS、 時系列モデル |
| 多重共線性 | 係数が不安定 | Ridge、 LASSO、 PCR |
| 外れ値 | 回帰直線が歪む | ロバスト回帰 |
OLS の仮定をチェックする最重要ツールが残差分析。 残差 e_i = y_i - ŷ_i を様々な角度から見る。
$$ R^2 = 1 - \frac{SS_{\text{res}}}{SS_{\text{tot}}} = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} $$
「説明変数 x が y のばらつきの何%を説明できるか」。 0〜1の値。 本ページの SSDSE 例(死亡数 A4200 ~ 65歳以上人口 A1303、 2023 年)では R² = 0.998(99.8%を説明)。
変数を増やすと R² は単調に増加する → 過学習の温床。 これを補正:
$$ R^2_{\text{adj}} = 1 - (1 - R^2) \cdot \frac{n - 1}{n - p - 1} $$
p(説明変数数)が多いほど R² から差し引かれる量が増える。
$$ \text{RMSE} = \sqrt{\frac{1}{n} \sum (y_i - \hat{y}_i)^2} $$
元の単位での誤差の大きさ。 「予測が平均的に何単位ずれているか」が分かる。
$$ \text{MAE} = \frac{1}{n} \sum |y_i - \hat{y}_i| $$
外れ値に強い。 中央値回帰と相性が良い。
モデル選択指標。 AIC = -2 ln(L) + 2p、 BIC = -2 ln(L) + p ln(n)。 小さいほど良い。 複雑性ペナルティ付き。
$$ SE(\hat{\beta}_1) = \frac{\sigma_\varepsilon}{\sqrt{n} \cdot s_x} $$
標準誤差を使って t統計量と p値が計算可能:
$$ t = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim t(n - p - 1) $$
$$ \hat{\beta}_j \pm t_{n-p-1, \alpha/2} \cdot SE(\hat{\beta}_j) $$
全係数が0かどうかを検定:
$$ F = \frac{SS_{\text{reg}} / p}{SS_{\text{res}} / (n - p - 1)} \sim F(p, n-p-1) $$
SSDSE-B-2026(2023 年度・47 都道府県)の実データで「死亡数(A4200)~ 65歳以上人口(A1303)」を OLS 単回帰し、 ①statsmodels → ②scikit-learn → ③scipy → ④numpy の順に、 同じ推定値が別ツールでも再現されることを確認します。
data/raw/SSDSE-B-2026.csv(cp932・skiprows=[1] で日本語ラベル行を除去)。 説明変数:A1303(65歳以上人口)。 目的変数:A4200(死亡数)。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 pandas as pd import statsmodels.api as sm import statsmodels.formula.api as smf df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].dropna() # formula API — R 風(死亡数 A4200 ~ 65歳以上人口 A1303) model = smf.ols('A4200 ~ A1303', data=df).fit() print(model.summary()) # 出力情報の取り出し print(f'beta: {model.params.values}') print(f'SE: {model.bse.values}') print(f'p: {model.pvalues.values}') print(f'CI(95%): {model.conf_int().values}') print(f'R2: {model.rsquared:.4f}') print(f'adj R2: {model.rsquared_adj:.4f}') print(f'AIC: {model.aic:.2f}, BIC: {model.bic:.2f}') # 残差診断(等分散の検定) from statsmodels.stats.diagnostic import het_breuschpagan bp = het_breuschpagan(model.resid, model.model.exog) print(f'Breusch-Pagan: stat={bp[0]:.3f}, p={bp[1]:.4f}') # Influence diagnostics(外れ値・leverage) infl = model.get_influence() print(infl.summary_frame()[['cooks_d', 'hat_diag']].sort_values('cooks_d', ascending=False).head()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | from sklearn.linear_model import LinearRegression, HuberRegressor, RANSACRegressor from sklearn.model_selection import cross_val_score X = df[['A1303']].values # 65歳以上人口 y = df['A4200'].values # 死亡数 # 標準 OLS ols = LinearRegression().fit(X, y) print(f'OLS: b0={ols.intercept_:.3f}, b1={ols.coef_[0]:.4f}, R2={ols.score(X, y):.4f}') # Huber ロバスト回帰(外れ値に頑健) huber = HuberRegressor().fit(X, y) print(f'Huber: b1={huber.coef_[0]:.4f}') # RANSAC(極端な外れ値があるとき) ransac = RANSACRegressor(random_state=42).fit(X, y) print(f'RANSAC: b1={ransac.estimator_.coef_[0]:.4f}') # 5-fold CV による汎化性能 scores = cross_val_score(LinearRegression(), X, y, cv=5, scoring='r2') print(f'CV R2: {scores.mean():.3f} +/- {scores.std():.3f}') |
1 2 3 4 5 6 7 8 9 10 | from scipy import stats # linregress — 単回帰なら1行で OLS と検定 result = stats.linregress(df['A1303'], df['A4200']) print(f'切片: {result.intercept:.3f}') print(f'傾き: {result.slope:.4f}') print(f'R2: {result.rvalue**2:.4f}') print(f'p: {result.pvalue:.2e}') print(f'SE: {result.stderr:.5f}') print(f'95% CI (傾き): [{result.slope - 1.96*result.stderr:.4f}, {result.slope + 1.96*result.stderr:.4f}]') |
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 x = df['A1303'].values.astype(float) # 65歳以上人口 y = df['A4200'].values.astype(float) # 死亡数 # 設計行列 X = [1, x] X = np.column_stack([np.ones(len(x)), x]) # 正規方程式 beta = (X'X)^(-1) X'y beta_hat = np.linalg.solve(X.T @ X, X.T @ y) print(f'beta (正規方程式): {beta_hat}') # QR 分解で安定性向上 Q, R = np.linalg.qr(X) beta_qr = np.linalg.solve(R, Q.T @ y) print(f'beta (QR分解): {beta_qr}') # SVD(最も数値的に安定、 lstsq の実装) beta_svd, residuals, rank, sv = np.linalg.lstsq(X, y, rcond=None) print(f'beta (SVD/lstsq): {beta_svd}') # 各種統計量 y_pred = X @ beta_hat resid = y - y_pred TSS = np.sum((y - y.mean())**2) RSS = np.sum(resid**2) R_sq = 1 - RSS/TSS print(f'R2: {R_sq:.4f}') |
最小二乗法は、 18 世紀末から 19 世紀初頭にかけて、 ガウス (Carl Friedrich Gauss, 1777-1855)、 ルジャンドル (Adrien-Marie Legendre, 1752-1833)、 ラプラス (Pierre-Simon Laplace, 1749-1827) らによって独立に提案・発展された推定法です。 直接のきっかけは 1801 年の小惑星セレス (Ceres) の発見と再観測問題でした。 1801 年 1 月にイタリアの天文学者ピアッツィが新しい天体を発見しましたが、 観測データは 41 日分しかなく、 太陽の背後に隠れた後で再発見するには、 限られたデータから軌道を高精度に推定する必要がありました。 ガウスは当時 24 歳で、 自ら考案した最小二乗法を用いて軌道を計算し、 1801 年 12 月末、 ピアッツィの最後の観測から 1 年弱経った時点で、 ガウスの予測に従って観測した結果、 ほぼ予測通りの位置にセレスを再発見することができました。 この劇的な成功が、 最小二乗法を一気に 科学的計算の中核ツール として確立しました。
公式の最初の発表はルジャンドルが 1805 年の著書『彗星の軌道決定の新方法』で行いましたが、 ガウスは「自分は 1795 年から使っていた」と主張し、 優先権争いが起こりました。 真相は今も決着していませんが、 ガウスは 1809 年に 誤差の正規分布を仮定すれば最小二乗法が最尤推定と一致する という、 統計学史に残る重要な理論的基礎づけを行いました。 これが現代まで続く「正規分布 + OLS」セットの起源です。
19 世紀後半、 ゴルトン (Francis Galton) は両親と子供の身長の関係を最小二乗法で分析する中で、 「平均への回帰 (regression toward the mean)」という現象を発見しました。 高身長の親の子供は親より平均寄り、 低身長の親の子供も親より平均寄りに「回帰」する、 という統計的性質です。 「回帰 (regression)」という用語はここから来ていて、 現代の機械学習で「回帰モデル」と呼ぶのも、 元をたどればこの語源にたどり着きます。 ピアソン (Karl Pearson) はゴルトンの研究を理論化し、 相関係数 と 回帰係数 の関係を整理し、 現代統計学の基礎を築きました。 20 世紀に入ると、 フィッシャー (R.A. Fisher) が 分散分析 (ANOVA) や 最尤推定 の理論を完成させ、 OLS は単なる計算手法から、 統計的推測の体系の中核 へと位置づけが昇格しました。 こうして、 18 世紀の天体観測ツールが、 21 世紀のビッグデータ・機械学習時代まで生き残る「不滅の方法」になったのです。
200 年以上前に確立されながら、 なぜ最小二乗法は色褪せないのでしょうか。 理由は 3 つに集約できます。 第 1 に、 「残差を 2 乗して足す」という非常にシンプルな数学が、 線形代数の枠組み(正規方程式・射影・特異値分解)と美しく結びついていること。 第 2 に、 仮定が満たされる限り「最良線形不偏推定量 (BLUE)」という最強の理論保証が付いてくること。 第 3 に、 仮定が破れた時の 診断ツールと対処法 が整備されており、 失敗のリカバリーまで含めて「再現可能な分析プロセス」を提供してくれること。 現代のディープラーニングの最終層、 ベイズ階層モデルの事前分布、 制約付き最適化の双対問題 — どこを開けても OLS の影が見えるほど、 この方法は統計学・データ科学の 原子 として機能し続けています。
| 分野 | 代表的な使われ方 | 注意される点 |
|---|---|---|
| 計量経済学 | 需要関数、 供給関数、 賃金関数(ミンサー方程式)の推定。 因果効果の識別。 | 内生性、 操作変数、 自然実験。 ロバスト標準誤差。 |
| 心理学・教育学 | テスト得点と学習時間の関係、 心理尺度の項目分析、 階層線形モデル。 | クラスター標準誤差(学校・クラス)、 マルチレベル分析。 |
| 物理学・工学 | 実験データへの理論曲線フィット、 校正曲線、 信号処理。 | 測定誤差が x にもある場合は TLS(直交回帰)が望ましい。 |
| 疫学・公衆衛生 | 死亡率・罹患率と社会経済指標の関連分析、 環境暴露評価。 | エコロジカルな誤謬、 個人レベルと集団レベルの相違。 |
| 機械学習 | ベースラインモデル、 ニューラルネットの最終層、 線形 SVM の双対問題。 | 特徴量数 >> サンプル数の場合は Ridge/LASSO 必須。 |
| ファイナンス | CAPM のベータ推定、 リスクファクター分析、 イベントスタディ。 | 時系列の自己相関、 異分散、 GARCH モデルとの併用。 |
| 政治学・社会学 | 投票率・選好の決定要因、 国別比較、 サーベイデータ分析。 | 標本ウエイト、 複雑な調査設計に対応した分散推定。 |
最小二乗法(OLS)は、 統計学・機械学習・経済学・心理学など、 ほぼあらゆる定量分野で「最初に学ぶ」推定法であり、 同時に、 より高度な推定法(一般化線形モデル、 罰則付き回帰、 ベイズ推定、 因果推論)の基礎でもあります。 ここでは、 OLS の上位概念・並列概念・派生概念・周辺概念をツリーで整理します。
OLS は「等分散・独立・線形・誤差期待値 0」の仮定が満たされる時に BLUE(最良線形不偏推定量)になりますが、 仮定が崩れると派生法に切り替える必要があります。 どの仮定が崩れた時に、 どの拡張へ進むかを整理しましょう。
| 崩れる仮定 | 症状(残差プロットなど) | 推奨される代替推定法 | Python ライブラリ |
|---|---|---|---|
| 等分散性 (homoscedasticity) | 残差プロットが「ラッパ型」 | WLS, HC3 ロバスト標準誤差 | statsmodels.WLS, fit(cov_type='HC3') |
| 誤差の独立性 | Durbin-Watson が 2 から大きく外れる、 時系列のラグ相関 | GLS, ARIMA, クラスター標準誤差 | statsmodels.GLS, statsmodels.tsa.arima |
| 線形性 | 残差 vs 予測値プロットが曲線パターン | 多項式回帰, GAM, 非線形回帰, 機械学習 | sklearn.preprocessing.PolynomialFeatures, pyGAM |
| 説明変数と誤差の無相関(内生性なし) | パラメータがバイアス、 因果効果と相関効果がズレる | 2SLS (操作変数法), 差分の差分法 (DID), 傾向スコア | linearmodels.IV2SLS, statsmodels |
| 多重共線性が低い | VIF > 10, 係数の符号が直感に反する、 標準誤差が爆発 | Ridge, LASSO, 主成分回帰 (PCR) | sklearn.linear_model.Ridge/Lasso |
| 外れ値に頑健 | 数件の異常値が回帰直線を大きく動かす | Huber 回帰, RANSAC, 分位点回帰 | sklearn.linear_model.HuberRegressor/RANSACRegressor |
| 目的変数が連続値 | y が 2 値、 カウント、 順序など | ロジスティック回帰, ポアソン回帰, 順序ロジット(GLM 系) | statsmodels.GLM, sklearn.linear_model.LogisticRegression |
OLS を本当に使いこなすには、 前提となる線形代数・統計学・確率論を押さえた上で、 派生手法へ展開していく順序が大切です。 SSDSE-B-2026 を題材に、 おすすめの学習ステップを示します。
| 段階 | 学ぶ内容 | SSDSE-B-2026 を使った演習例 |
|---|---|---|
| ① | 線形代数の基礎(行列、 ベクトル、 内積、 逆行列) | 人口・面積・所得の 3 列を X 行列にして、 X.T @ X の意味を考える |
| ② | 平均・分散・共分散・相関の意味と計算 | 高齢化率と死亡率の相関係数 r を計算(OLS の傾きと一致することを確認) |
| ③ | 単回帰 OLS(このページの中心) | 総人口(A1101)→ 出生数(A4101)で scipy.stats.linregress を実行、 R² を確認 |
| ④ | 重回帰 OLS と多重共線性 | 死亡率 ~ 高齢化率 + 医師数 + 一人当たり所得 の 3 変数モデルで VIF をチェック |
| ⑤ | 残差診断(線形性、 等分散、 正規性、 独立性) | 残差プロット、 Q-Q プロット、 Breusch-Pagan 検定を可視化 |
| ⑥ | 仮定が崩れた時の対処(WLS, ロバスト SE) | 東京を外れ値として影響を見る、 HC3 標準誤差で再推定 |
| ⑦ | 罰則付き回帰(Ridge, LASSO)と交差検証 | SSDSE-B の数値列を全て説明変数にし、 LASSO で変数選択 |
| ⑧ | GLM への拡張(ロジスティック、 ポアソン) | 「高齢化率 30% 以上か否か」を 2 値化してロジスティック回帰 |
| ⑨ | 因果推論(IV, DID, 傾向スコア) | 医師数が死亡率に与える因果効果を、 内生性を意識して推定する |
ここまでの学習を「使える知識」に変えるための確認問題。 答えはクリック(タップ)で表示。 全問正解なら、 OLS の核心は押さえたと言ってよいでしょう。
答え:残差の 2 乗和(RSS, Residual Sum of Squares)。 単なる和ではなく、 単なる絶対値の和でもなく、 「(実測値 − 予測値) の 2 乗」を全観測点で合計した値。 2 乗するのは ① 正負を相殺しない、 ② 大きいズレを重く罰する、 ③ 数学的に解析解が出る、 という 3 つの利点があるため。
答え:Best Linear Unbiased Estimator(最良線形不偏推定量)。 ここで「最良」とは「分散が最小」という意味で、 「線形」「不偏」という枠の中で他のどんな推定量よりも分散が小さい、 という条件付き最強の地位。 仮定が満たされなければ BLUE ではなくなる。
答え:$\hat{\boldsymbol{\beta}} = (X^\top X)^{-1} X^\top \mathbf{y}$。 説明変数行列 X の転置と X 自身の積の逆行列に、 X の転置と目的変数ベクトル y を掛けたもの。 これは閉形式の解で、 反復計算なしに 1 回の行列演算で求まる。 ただし $X^\top X$ が特異(多重共線性が完全)だと逆行列が存在せず計算できない。
答え:必ずしも言えない。 R² は「データの分散を説明できた割合」だが、 ① 説明変数を増やせば必ず上がる(過学習)、 ② 時系列で y にトレンドがあれば自動的に高くなる(疑似回帰)、 ③ 因果関係を保証しない、 という落とし穴がある。 調整済み R²、 AIC/BIC、 交差検証スコア、 残差診断 を合わせて評価することが重要。
答え:等分散性(homoscedasticity)の仮定が崩れている、 つまり 異分散(heteroscedasticity)。 OLS の点推定(係数)自体は不偏のままだが、 標準誤差が誤って計算されるので t 検定や信頼区間が信頼できなくなる。 対処:① HC3 ロバスト標準誤差に切り替える、 ② WLS(加重最小二乗法)で重みづけする、 ③ y を対数変換するなど分散を安定化する。
答え:多重共線性が 深刻(一般的な目安:VIF>10 は問題、 VIF>5 で警戒)。 対処の選択肢:① その変数を 除外 する、 ② 強く相関する 2 変数を 主成分 にまとめる(PCA → PCR)、 ③ Ridge 回帰 で係数を縮小して安定化、 ④ LASSO で自動的にどちらかを 0 にする、 ⑤ ドメイン知識でどちらが「より根本的な」変数か判断して残す。 ただ、 予測精度自体に大きな影響はない(係数の解釈と標準誤差だけが歪む)ので、 予測タスクなら無視してもよいことも多い。
答え:3 つの可能性を順に検討する。 ① 多重共線性:他の説明変数と強く相関しているため係数が不安定。 VIF を確認し、 単回帰した時の符号と比較する。 ② 欠落変数バイアス(交絡):本来必要な第 3 の変数が抜けているため、 因果関係が表面化していない。 例:「アイスクリーム売上 → 溺死数」の正の相関は「気温」という交絡因子による。 ③ サンプルサイズが小さい:47 都道府県だけだと、 偶然の符号反転も起こり得る(信頼区間を確認、 0 を跨いでいないか)。 最後の手段として、 ④ 本当にドメイン知識の方が誤っている場合もある(新発見)。
最後に、 OLS の周りで頻繁に飛び交う「もっともらしいけれど不正確な」言説を 5 つピックアップして、 正しい理解を整理しておきます。 これらは初学者だけでなく、 一定の経験を積んだ実務家でも勘違いしやすいポイントです。
合成データで β̂ = (X'X)⁻¹X'y を計算する。
1 2 3 4 5 6 | import numpy as np x = np.array([2,4,7,5,3]) y = np.array([3,7,12,9,4]) X = np.column_stack([np.ones(5), x]) beta = np.linalg.inv(X.T @ X) @ X.T @ y print(f"β̂: {beta.round(3)}") |
💬 手計算 (Step 3) と Python 出力が完全一致。
「最小二乗法(OLS)」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。
OLS は前提が満たされていれば最良の線形不偏推定量だが、 前提の確認をしないなら単なる直線当てはめ。 係数を解釈する前に、 必ず残差を見る。
「最小二乗法 (OLS)」は単独で完結せず、 前後の手法と組み合わさって価値が発揮される。 入力データの準備 (上流)・同目的の代替手法との比較 (並列)・結果の活用 (下流) という 3 軸で隣接領域を整理する。
この上流・並列・下流の対応を地図化することで、 「最小二乗法 (OLS)」を中核に据えた分析パイプライン (データ準備 → 手法選択 → 結果の検証と展開) の全体像が見えてくる。
OLS は単体で完結する手法ではなく、 「回帰」という大きな流れの入口にある。 全体像を掴むには、 次の教材を横断的に読むのが効率的である。
回帰の教材は「単回帰 → 重回帰 → 診断」の順に進む。 その 3 段階を 同じデータ・同じ OLS で並べると、 各段階で何が変わるのかが一目で分かる。
📥 入力: SSDSE-B-2026 の 2023 年 47 都道府県。 目的変数は出生数 (A4101)。
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 32 | import pandas as pd import numpy as np import statsmodels.api as sm df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023] y = d['A4101'].astype(float).values # 出生数 # 同じ OLS でも「何を説明変数に入れるか」で結論が変わる。 # 回帰グループ教材が扱う 3 段階を 1 つの表にして見比べる。 specs = { '① 単回帰(総人口のみ)': ['A1101'], '② 重回帰(+15歳未満人口)': ['A1101', 'A1301'], '③ 重回帰(+65歳以上人口)': ['A1101', 'A1301', 'A1303'], } print(f'{"モデル":<26}{"R²":>8}{"補正 R²":>9}{"AIC":>9} 総人口の係数') for name, cols in specs.items(): X = sm.add_constant(d[cols].astype(float).values) r = sm.OLS(y, X).fit() print(f'{name:<26}{r.rsquared:>8.4f}{r.rsquared_adj:>9.4f}{r.aic:>9.1f} {r.params[1]:>+9.5f}') print('\n→ 説明変数を足すと R² は必ず上がるが、 総人口の係数は符号や大きさが動く。') print(' 「係数の解釈」はモデルの中身とセットでしか意味を持たない。') # 多重共線性の確認(回帰グループ教材の必修項目) from numpy.linalg import inv X = d[['A1101', 'A1301', 'A1303']].astype(float).values Xc = (X - X.mean(0)) / X.std(0) vif = np.diag(inv(np.corrcoef(Xc, rowvar=False))) print('\nVIF(分散拡大係数, 10 超で多重共線性を疑う)') for c, v in zip(['総人口', '15歳未満人口', '65歳以上人口'], vif): print(f' {c:<14} VIF = {v:8.2f} {"← 危険" if v > 10 else ""}') |
📤 実行するとこの出力が得られる:
💬 結果の読み方: R² は 0.9909 → 0.9956 → 0.9979 と説明変数を足せば必ず上がる(補正 R² と AIC も改善しているので、 この 3 変数は無意味な追加ではない)。 一方で総人口の係数は +0.00610 → +0.00093 → +0.00299 と 6 倍以上動く。 「総人口が 1 人増えると出生数が何人増えるか」という問いに、 モデルを指定せずに 答えることはできない。
理由は VIF が示している。 3 変数の VIF は 200.7 / 150.9 / 55.7 と、 危険水準の 10 を 大きく超えた強い多重共線性がある。 総人口・15 歳未満人口・65 歳以上人口は 定義上ほぼ足し算の関係にあるので当然で、 係数を個別に解釈してはいけない状態である。 予測だけが目的なら問題にならないが、 「どの変数がどれだけ効くか」を語るなら 変数を絞るか、 リッジ回帰のような正則化に切り替える必要がある。
最小二乗法(OLS)の核心は 「残差(実測値 − 予測値)の二乗和 SSE を最小にする直線を選ぶ」 こと。 下の散布図で、 スライダーを動かして直線を当てはめ、 各点に描かれる オレンジの正方形(=残差の二乗=面積)の合計をできるだけ小さくしてみましょう。 「最小二乗解」ボタンを押すと、 正規方程式 $\hat{\beta}=(X^\top X)^{-1}X^\top y$ で計算した厳密な最適解と比べられます。
操作:空白をタップ=点を追加/点をドラッグ=移動(マウス・タッチ対応)。 「削除モード」をONにすると点をタップで削除。
各点から直線までまっすぐ下ろした縦の長さが残差。 それを一辺とする正方形の面積がまさに残差の二乗であり、 SSE はその面積の総和です。 直線を動かすと正方形が伸び縮みし、 合計面積が最小になる位置で手を止めたくなる — これが最小二乗法の気持ちです。 二乗を使う理由は、 (i) 正負のズレが相殺しない、 (ii) 大きなズレを重く罰する、 (iii) 微分すると 残差 と説明変数が直交する線形方程式(正規方程式)になり閉形式で一発で解ける、 の3点。 手で最小化しようとすると、 厳密解(緑の線)に驚くほど近づけないことも体感できます。
OLS の一言まとめは 「残差平方和 (RSS) を最小にする=データに最も近い直線を選ぶ」。 ここで「近い」の意味を掘り下げると、 単なる散布図の見た目の話ではなく、 ベクトル空間での距離の話であることが見えてきます。 目的変数 $\mathbf{y}$($n$ 次元ベクトル)を、 説明変数の列が張る部分空間 $\mathrm{col}(X)$(=X で作れる予測値の集合)の中で「最も近い点」に置き換える操作、 それが OLS です。 その最も近い点が予測値 $\hat{\mathbf{y}}=X\hat{\boldsymbol{\beta}}$、 そこへ届かなかったズレが残差ベクトル $\mathbf{e}=\mathbf{y}-\hat{\mathbf{y}}$ になります。
部分空間 $\mathrm{col}(X)$ 上の点で $\mathbf{y}$ に最も近いのは、 $\mathbf{y}$ から部分空間へ垂直に足を下ろした点(正射影)です。 三角形の斜辺より垂線のほうが短いのと同じ理屈で、 「最短距離=直交」。 したがって残差ベクトル $\mathbf{e}$ は説明変数が張る空間と直交します。 これを式にしたものがまさに正規方程式 (normal equations) です。
正規方程式が語っていることを言葉にすると:
💡 ページ上部の 🎮 触って理解するウィジェット は、 各点の残差を一辺とする正方形(=残差の二乗=面積)を描き、 その総面積 SSE を最小化する体験でした。 ここで学んだ「直交射影」は、 その正方形の総面積が最小になる位置=残差が説明変数と直交する位置、 という同じ現象をベクトルの言葉で言い換えたものです。 単回帰・重回帰・多項式回帰まで、 OLS はすべて「$\mathbf{y}$ を $\mathrm{col}(X)$ に直交射影する」一つの操作に統一できます。
OLS が「最良線形不偏推定量 (BLUE)」であるためには、 ガウス・マルコフの仮定(線形性・外生性=説明変数と誤差の無相関・等分散・誤差間の無相関)が必要でした。 大切なのは どの仮定が破れると「点推定(係数)」が壊れ、 どれが破れると「標準誤差(不確実性の評価)」だけが壊れるか を区別すること。 ここを混同すると、 「係数はバイアスなのに標準誤差だけ直して満足する」「本当は無バイアスなのに係数を捨ててしまう」といった誤対応につながります。
| 破れる前提 | 壊れるのは? | 中身の説明 | 対処 |
|---|---|---|---|
| 線形性 | 係数がバイアス | 真の関係が曲線なのに直線を当てると、 傾き自体が誤った値に。 残差 vs 予測値プロットに曲線パターンが残る。 | 多項式項・対数変換・GAM |
| 外生性(説明変数と誤差の無相関) | 係数がバイアス(最重症) | 説明変数が誤差と相関する=内生性。 欠落変数(交絡)・逆因果・測定誤差が原因。 いくらデータを増やしても真値に収束しない。 | 操作変数法 (IV)・交絡の統制・自然実験 |
| 等分散 | 標準誤差だけ壊れる | 不均一分散(heteroscedasticity)。 残差の散らばりが予測値とともに変わる「ラッパ型」。 係数は無バイアスのままだが t 検定・信頼区間が誤る。 | HC3 ロバスト標準誤差・WLS(加重最小二乗) |
| 誤差の無相関 | 標準誤差だけ壊れる | 時系列の自己相関やパネル・クラスタ構造。 やはり係数は無バイアスだが、 独立でない分だけ実効的な情報量が減るのに標準誤差はそれを見落として過小評価しがち。 | GLS・クラスター/HAC 標準誤差・時系列モデル |
ガウス・マルコフの定理は「仮定が満たされるとき OLS は BLUE」と述べます。 4 文字を分解すると:
つまり BLUE は「線形かつ不偏」という枠の中での条件付きチャンピオンであって、 無条件の最強ではありません。 枠を外せば OLS より「良い」推定量が存在しえます — わざと少しバイアスを入れて分散を大きく減らす Ridge はその代表で、 平均二乗誤差 (MSE) では OLS を上回ることがあります(バイアス・分散トレードオフ)。 また誤差が正規分布なら OLS は最尤推定 (MLE) と一致し、 「線形」の枠すら外した全推定量の中で有効になります。
等分散・無相関が破れると OLS は BLUE でなくなります。 そこで誤差の分散共分散構造 $\mathrm{Var}(\boldsymbol{\varepsilon})=\sigma^2\Omega$ を明示的に取り込み、 再び BLUE を取り戻すのが一般化最小二乗 (GLS) です。
WLS(加重最小二乗)は不均一分散に、 GLS の非対角版は自己相関(時系列・パネル)に対応します。 直感的には「情報の質が高い観測ほど強く信じる」重み付けの射影です。
$\Omega$ の形が分からない・特定したくないときは、 係数はそのまま OLS を使い、 不確実性の評価(標準誤差)だけを不均一分散や相関に頑健な形に差し替えます。 これがロバスト標準誤差(White/HC0–HC3、 クラスター、 HAC=Newey–West)です。 「点推定は無バイアスなのに標準誤差だけ壊れる」タイプの破れ(上の落とし穴表の下 2 行)に対する、 最も軽量で実務的な処方箋。 statsmodels なら fit(cov_type='HC3') の一行で済みます。 なお名前が似た ロバスト回帰(M 推定など)は外れ値への頑健化で、 目的が異なる点に注意。
多重共線性や「変数が多すぎる」状況では、 RSS に係数の大きさへの罰則を足して解を安定させます。 これが正則化であり、 OLS の自然な一般化として読めます。
🧭 まとめると、 OLS を中心に「IV(外生性の破れ)」「GLS・WLS/ロバストSE(等分散・無相関の破れ)」「Ridge・Lasso(共線性・高次元)」「GAM(線形性の破れ)」が、 それぞれどの仮定が破れたかに応じて枝分かれしていきます。 破れの診断(残差プロット・VIF・Breusch-Pagan・Durbin-Watson)が、 どの枝へ進むべきかの地図になります。