🔖 キーワード索引
最小二乗法 OLS 回帰係数 切片 残差 R² F検定 t検定 重回帰 正規方程式
別名・略称 :線形回帰モデル
「線形回帰 (linear regression)」はy = β0 + β1 x + ε で連続量を予測する最も基本的な回帰モデル。 本ページの中核キーワードを以下に整理する。
OLS 最小二乗 回帰係数 β 残差 ε 正規方程式 (X'X)⁻¹X'y R² / 自由度調整済 R² F 検定 / t 検定 Gauss-Markov 定理 BLUE 線形性・等分散・独立・正規性 多重共線性 VIF 外れ値 Cook's distance SSDSE-B-2026 都道府県
これらのキーワードは「linear regression の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
💡 30秒で分かる結論
🍰 まずはやさしく
データから直線を作る方法です。
ある値を使って別の値を予測します。
勉強時間でテストの点数を予想します。
この章では基本の仕組みを学びます。
線形回帰(Linear Regression) :応答を説明変数の線形結合でモデル化する基本的回帰手法。
線形回帰 =応答変数 y を説明変数 x の線形結合で予測 する最も基本的な回帰モデル。式:$y = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p + \epsilon$。 $\beta$ を 最小二乗法 で推定。 解釈性が高い :「$x_1$ を 1 増やすと y が $\beta_1$ 増える(他変数固定)」。R² (決定係数)と 残差プロット でモデル品質を評価。正規性、 等分散性、 線形性、 独立性、 多重共線性ナシ の 5 仮定 を確認。
📍 あなたが今見ているもの
🍰 まずはやさしく
統計で最初に学ぶ重要な道具です。
データがどう関係しているか調べます。
高齢化率で死亡率を説明します。
学習のレベルと使い方のコツを読みます。
線形回帰 は統計・機械学習で最初に学ぶ重要モデル。 SSDSE データで 「都道府県の死亡率は高齢化率でどれくらい説明できるか?」 といった問いに答えるのに使います。 シンプルなのに 解釈しやすく、 多くの場面で十分機能 するため、 最初に試すベースラインとして常に第一選択。
📍 学習レベルの確認
レベル 1: $y = ax + b$ の傾き $a$ を最小二乗法で求められる
レベル 2: 決定係数 $R^2$ を「説明できた変動の割合」と理解
レベル 3: t 検定で係数の有意性を判断できる
レベル 4: 残差プロット・QQ プロット・Cook 距離で前提条件を診断
レベル 5: 多重共線性を VIF で検出し、 Ridge / Lasso で対処
レベル 6: 信頼区間と予測区間の違いを説明できる
レベル 7: 対数変換・多項式項で非線形性を捉えられる
レベル 8: K-Fold CV で過剰適合を防ぎ、 汎化性能を測れる
レベル 9: GLM(ロジスティック・ポアソン)に拡張できる
レベル 10: ベイジアン回帰で不確かさを完全にモデル化できる
📍 実務 Tips — 仕事で使う線形回帰
まず散布図を描く(多変数なら散布図行列)。 関係が直線でなければ対数変換 / 多項式項を検討
外れ値の有無を箱ひげ図・QQ プロット・Cook 距離で確認、 ドメイン知識で除外可否を判断
説明変数間の相関行列を見て、 高相関ペアがあれば片方を削除 or Ridge を採用
$R^2$ より調整済 $R^2$ を見る。 説明変数を増やせば $R^2$ は単調増加してしまう
p 値だけで判断しない。 効果量(係数の大きさと信頼区間)と合わせて評価
「予測精度」を競うなら CV、 「因果効果の推定」なら DAG と外生性の議論
解釈性のためにモデルは「シンプルに保つ」のが鉄則。 必要十分な変数だけ
結果は係数表だけでなく「予測 vs 実値の散布図」「残差プロット」で可視化
線形回帰は「シンプル = 弱い」ではない。 「シンプル = 説明可能で頑健」と捉えると、 ビジネス現場での価値が見えてくる。
🎨 直感で掴む
🍰 まずはやさしく
点の間を通る一番いい線を引くことです。
データの平均的な傾向を線で表します。
人口から住宅の数を予想します。
直線の引き方とズレの意味を読みます。
直線フィッティング
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)が更新されます。 各点から直線へ下ろした縦の赤線が残差 で、 最小二乗法はこの赤線の長さの二乗の合計を最小化 しています。
💡 手動フィットモード にすると、 スライダーで自分の直線(オレンジ)を引けます。 どんなに頑張っても、 あなたの直線の 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 人」という物理的意味はありません(回帰式を観測範囲外へ延ばして解釈しない という原則の実例)。
🔬 記号・式を言葉で読み解く
$\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 ***
R² 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 へ下がる。 東京は「線形関係を乱す外れ値」というより、 高レバレッジで直線を安定させる端点と解釈するのが実態に近い。
機械学習の前処理では「外れ値を除外すべきか、 残すべきか」はドメイン知識次第。 「東京は人口分布のレアな端点でモデルに含めるべき」とも、 「平均的な県の挙動を見たいから除外すべき」とも判断できる。
🧮 確認クイズ — 線形回帰の理解度を測る
Q1. $\hat{y} = 5 + 2x$ で $x = 3$ のときの予測値は?解答 :$\hat{y} = 5 + 2 \times 3 = 11$。
Q2. 決定係数 $R^2 = 0.85$ が意味するのは?解答 :「$y$ の全変動の 85% が回帰モデルで説明できる」。 残り 15% は説明変数で捉えられない変動(残差)。
Q3. SSDSE-B-2026 で「人口」と「住宅戸数」の傾き 0.0081 を読み解け。解答 :「人口が 100 万人増えると、 年間住宅着工が 8,100 戸増える」傾向。 ただし因果関係は別問題。
Q4. 残差プロットに右肩上がりの傾向があるとき、 何が疑われる?解答 :「異分散性」(誤差分散が説明変数に依存)。 ロバスト標準誤差や対数変換を検討する。
Q5. VIF が 15 の変数があったらどう対処する?解答 :多重共線性が深刻。 (1) 変数を削除、 (2) 主成分回帰、 (3) Ridge 回帰、 のいずれかで対処。
Q6. Lasso が Ridge より優れる場面は?解答 :「特徴量選択をしたい」「スパース解(多くの係数が 0)が欲しい」場面。 解釈性が高くなる。
Q7. 信頼区間と予測区間の違いは?解答 :信頼区間は「平均応答」の不確かさ、 予測区間は「個別観測」の不確かさ。 後者の方が広い(残差ばらつきも含むため)。
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 で再現
📋 コピー 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 年」の人口は強く相関するため、 残差も相関する(自己相関)。
対処法は以下の通り:
固定効果モデル :各県のダミー変数を加え、 「県固有の効果」を吸収する
差分の差分法(DID) :処置前後の差を比較する政策評価
ARIMA / VAR :時系列専用のモデル
クラスタ標準誤差 :県内の相関を考慮した標準誤差を計算
Generalized Estimating Equations (GEE) :相関構造を明示的にモデル化
単年(2023 年)のクロスセクション解析なら独立性は概ね保たれるが、 パネルデータでは必ず適切な手法を選ぶこと。
🌐 関連手法・この用語を使う論文
🌐 ベイジアン線形回帰 — 不確かさを完全にモデル化
古典的 OLS は「真のパラメータが存在し、 推定値はその近似」と考える(頻度主義)。 ベイジアン回帰は「パラメータも確率変数」とし、 事前分布 $p(\beta)$ と尤度 $p(y|X, \beta)$ から事後分布 $p(\beta | X, y)$ を求める。
$$p(\beta | X, y) \propto p(y | X, \beta) \cdot p(\beta)$$
事前分布として「$\beta \sim N(0, \tau^2)$」を採用すると、 最大事後推定(MAP)が Ridge 回帰と一致する。 同様に「ラプラス分布」事前は Lasso と一致。 つまり Ridge / Lasso はベイジアン回帰の特殊形と見なせる。
利点:(1) 事後分布から「不確かさ」を完全に得られる、 (2) 階層モデルでデータ不足を補える、 (3) 事前知識を組み込める。 欠点:計算コストが大きい、 事前分布の選択に主観が入る。 PyMC や Stan、 NumPyro などのライブラリで実装可能。
🌐 線形回帰の発展形 — 一般化線形モデル (GLM)
手法
分布
リンク関数
用途
線形回帰
正規
恒等
連続値予測
ロジスティック回帰
ベルヌーイ
logit
2 値分類
ポアソン回帰
ポアソン
log
カウントデータ
ガンマ回帰
ガンマ
inverse
正の連続値(保険料など)
負の二項回帰
負の二項
log
過分散カウントデータ
GLM は「線形回帰の枠組みを保ちつつ、 分布とリンク関数を変える」ことで、 多様なデータ型に対応する。 統計学のクラシック教科書(McCullagh & Nelder 1989)に集大成されている。
🌐 線形回帰の実世界応用例
経済学:需要関数の推定
「価格 → 需要量」の関係を線形回帰で推定。 価格弾力性を計算し、 売上最大化価格を決定する。 SSDSE-B-2026 でも「土地価格 C5401」と「住宅着工 H1800」の関係から「住宅市場の価格弾力性」を分析できる。
医療:薬の効果評価
RCT(ランダム化比較試験)で「投与量 → 血圧低下」の線形回帰。 個人差を交絡因子として制御する。 ANCOVA(共分散分析)は線形回帰の医療版。
スポーツ:選手評価
野球の Sabermetrics は線形回帰の塊。 OPS = OBP + SLG という単純な指標、 WAR (Wins Above Replacement) も基本は重回帰モデルから派生。
機械学習:ベースライン
Kaggle コンペでも、 まず線形回帰で「最低限の予測精度」を確認する。 これを越えられないツリー系・NN は問題設定や特徴量に問題がある可能性が高い。
🌐 ディープラーニング全盛時代に、 なぜ線形回帰を学ぶのか
「DeepLearning が何でも解ける」という風潮はあるが、 実際のビジネス・研究現場では線形回帰の方が好まれる場面が多い。
理由 1: 解釈性
「人口が 1 万人増えると住宅が 81 戸増える」という係数は、 ステークホルダーに直接説明できる。 ニューラルネットワークでは SHAP 値や LIME を使っても完全な解釈は困難。
理由 2: データ量への耐性
線形回帰は数十サンプルでも安定して機能する。 ニューラルネットは数千〜数百万サンプル必要。 中小企業や学術研究では「データが少ない」のが普通。
理由 3: 計算コスト
OLS の計算は閉形式 $\boldsymbol{\beta} = (X^TX)^{-1}X^T\mathbf{y}$ で 1 ステップ。 数百万サンプルでも数秒。 ニューラルネットは GPU で何時間も学習。
理由 4: 統計的根拠
仮定が満たされれば「最良線形不偏推定量(BLUE)」という強力な理論保証がある。 p 値・信頼区間も標準。 ニューラルネットの予測には「ベイジアン Deep Learning」など追加手法が必要。
理由 5: ベースライン
「線形回帰の精度を上回らない複雑モデル」は実用価値がない。 線形回帰を超える性能差が正則化された複雑モデルで初めて意味を持つ。
🖼️ 視覚で深掘り — 散布図・残差・分布から線形回帰を再点検する
線形回帰の仮定・診断・解釈は、 数式だけでなく「図を読む技術」が決定的に重要である。 ここでは SSDSE-B-2026 の都道府県データ(人口と各種社会経済指標)を題材に、 三種類の図 — 散布図、 ヒストグラム、 箱ひげ図 — を組み合わせて、 線形回帰の品質をどう視覚で診断するかを順に見ていく。 単なる「綺麗な図」ではなく、 「この図のここを見れば、 回帰式の信頼性が即判定できる」という実戦的読み筋を共有することを目的とする。
1. 散布図で「線形性」を一目で見破る
線形回帰の大前提は「目的変数 $y$ と説明変数 $x$ の間に直線的な関係がある」ことである。 もし関係が湾曲(二次関数や指数関数)していたり、 平らな部分と急な部分が混じっていたりすると、 直線で当てはめても残差が体系的に偏り、 予測精度も推定の標準誤差も信用できなくなる。 散布図はこの「線形性の前提が成立しているか」を最も低コストで確認できる手段である。
下図は SSDSE-B-2026 で「人口」と「住宅戸数」のような二変数の散布図の典型例である。 点が右上がりの直線の周りに密に集まっていれば線形回帰の出番、 弓なり・S 字・喇叭型なら別モデル(多項式回帰、 一般化加法モデル、 対数変換後の線形回帰)の検討が必要になる。
図 R470-1: 散布図の基本構造。 「点群が直線で囲める形か」「外れ値が傾きを引き寄せていないか」を最初に確認する。
散布図のチェック項目(線形回帰前の必須 5 点) : ①点群の全体形が直線で覆えるか、 ②外れ値が一握り存在して傾きを引っ張っていないか、 ③ばらつきの幅 ($x$ 軸方向に進んでも縦方向のばらつきが一定か = 等分散性)、 ④空白地帯($x$ がほぼ存在しない範囲)への外挿の危険性、 ⑤クラスタ分離(複数のグループが混在していないか)。 この 5 点をクリアして初めて、 「線形回帰の係数 $\hat{\beta}_1$ は意味のある量」と言える。
特に③の等分散性が崩れている($x$ が大きいほど縦の散らばりが広がる「喇叭型」)ケースは、 都道府県データで頻発する。 たとえば「人口」と「公共支出」をプロットすると、 東京・大阪付近で縦のばらつきが極端に増える。 これを放置すると「東京の予測は精度が悪いのに、 信頼区間は同じ幅で出てしまう」という重大な誤解釈に至る。 対処は対数変換、 重み付き最小二乗法(WLS)、 ロバスト標準誤差(HC3)など。
散布図に重ねるべき情報レイヤー
単純な点のプロットだけでなく、 ①推定された回帰直線、 ②95% 信頼区間の帯、 ③95% 予測区間の帯、 ④外れ値ハイライト、 ⑤地域ラベル(都道府県名)の 5 種類を重ねると、 一枚の図から多面的な情報が得られる。 多くの実務報告書では①だけを示してしまいがちだが、 ②と③の帯を加えるだけで「平均応答の不確かさ」と「個別観測の不確かさ」を読者が区別できるようになり、 議論の質が大きく上がる。
散布図の特徴
疑うべき問題
推奨アクション
弓なり(U 字 / 逆 U 字) 線形性の崩れ 二次項追加、 GAM、 対数変換
喇叭型(右に行くほど広がる) 不等分散 log/sqrt 変換、 WLS、 HC3 SE
右上に 1〜2 点が孤立 高レバレッジ外れ値 Cook 距離検査、 ロバスト回帰
2 つの点群がはっきり分離 隠れたグループ変数 層別分析、 ダミー変数、 交互作用
階段状(離散値の集積) $y$ が順序尺度/カウント 順序回帰、 ポアソン回帰へ切替
点が縦の帯状に並ぶ $x$ が離散カテゴリ ANOVA / カテゴリダミー化
外れ値が片側だけに偏る 非対称な誤差分布 $y$ の対数変換、 quantile 回帰
この表は「散布図を見たときの最初のチェックリスト」として機能する。 数値指標(R²、 AIC、 BIC)は後回しでよい — まず散布図で「線形モデルが使えるかどうか」を判定する段階を必ず経ること。 そうでないと、 R² が高くても全く意味のない直線当てはめに陥る。
2. ヒストグラムで「残差の正規性」を確認する
線形回帰の信頼区間や p 値は「残差 $\hat{\varepsilon}_i = y_i - \hat{y}_i$ が平均 0 の正規分布に従う」ことを仮定して導出される。 残差の正規性が大きく崩れていると、 推定された $\hat{\beta}$ の標準誤差が小さく出すぎたり大きく出すぎたりし、 結論が逆転することすらある。 残差のヒストグラムは、 この正規性仮定の検証の出発点である。
図 R470-2: ヒストグラムの基本構造。 残差は「中央が高く、 左右対称の釣り鐘型」が理想。 右に裾を引く、 二峰、 平坦などのパターンはいずれも線形モデルの再考を要請する。
残差ヒストグラムから読み取れる典型的シグナル :
右に裾を引く(右歪み) : $y$ の対数変換または平方根変換が改善する場合が多い。 例: 売上、 所得、 都市規模など「正の値で、 大きい方に極端な値が稀に出る」量は右歪みが普通。
左に裾を引く(左歪み) : テストの満点付近に張り付くケースなど。 $y$ の上限値が制約となっている。 トービット回帰や $\log(\text{上限値} - y)$ 変換を検討。
二峰 : 残差に二つの山がある場合、 隠れたカテゴリ変数(性別、 地方区分、 業種など)の影響を線形モデルが捉えきれていない。 層別分析やダミー変数追加が必要。
平坦(一様分布的) : 線形モデルの当てはまりが極めて悪く、 残差に何の構造も残せていない(ほぼランダム以下の予測)。 説明変数の見直しが必要。
鋭く尖った(高い尖度) : 多くの観測が予測値の近くに集中し、 ごく少数が大きく外れる。 ロバスト回帰や $t$ 分布誤差モデルを検討。
SSDSE-B-2026 を例にすると、 「人口」を $y$ にした単純線形回帰では、 東京・大阪・神奈川・愛知の 4 都府県が右側に大きな正の残差を作り、 残差ヒストグラムは強い右歪みとなる。 この場合、 $\log_{10}(\text{人口})$ で変換してから線形回帰を行うと、 残差は概ね対称になり、 信頼区間も意味を持つ。
ヒストグラムと QQ プロットの併用
ヒストグラムは「全体形」を一瞬で掴むのに優れているが、 ビン幅の選び方で印象が変わる弱点がある。 そのため正規性判定では QQ プロット(理論分位 vs. 標本分位の散布図)を併用するのが標準である。 ヒストグラムで「概形は正規っぽい」を確認し、 QQ プロットで「裾の重さ」「歪みの程度」を定量する、 という二段構えにする。 Shapiro-Wilk 検定や Anderson-Darling 検定の $p$ 値は補助的指標として扱い、 サンプルサイズが大きい時($n \geq 500$)はわずかな逸脱でも棄却されるため、 図による判断を優先する。
ヒストグラムの形
QQ プロットの形
推奨対応
左右対称の釣り鐘型 対角線にほぼ一致 そのまま OLS で OK
右に長い裾 右端が上に逸脱 $\log y$ または $\sqrt{y}$ 変換
左に長い裾 左端が下に逸脱 $y^2$ または $\log(\text{上限}-y)$
鋭く尖った中央 両端が S 字に大きく逸脱 $t$ 分布誤差 / ロバスト回帰
二峰 中央付近で段差 層別 / カテゴリ変数追加
平坦 S 字に大きく逸脱 モデル再構築 / 説明変数追加
なお、 「残差が正規でなければ線形回帰は使えない」というのは半分誤りである。 中心極限定理により、 サンプルサイズ $n$ が十分大きければ ($n \geq 30$ が目安、 厳密には $n \geq 50$)、 回帰係数の分布は近似的に正規に従う。 したがって正規性は「予測区間を構築する場合」と「小サンプル ($n < 30$) で推論を行う場合」に特に重要になる。 大サンプルでの $p$ 値や係数の信頼区間は、 正規性が多少崩れても頑健に解釈できる場合が多い。
3. 箱ひげ図で「グループ間の比較」と「外れ値」を同時に見る
線形回帰の応用ではしばしば「群間の比較」を行う — 都道府県を地方区分(北海道・東北・関東・中部・近畿・中国・四国・九州)に分けて、 各群内で平均応答や残差がどう違うかを見る場合などである。 散布図やヒストグラムでは群差が見えづらいが、 箱ひげ図は「中央値」「四分位範囲(IQR)」「外れ値」を群ごとに一目で比較できる、 群比較に最適化された可視化である。
図 R470-3: 複数群の箱ひげ図。 中央値の高さの違い・箱の幅の違い・ひげの長さ・外れ値の有無を、 すべて 1 枚で同時に比較できる。
箱ひげ図の構成要素と読み筋 :
箱の中の線(中央値) : 群の代表値。 群間で線の高さが大きく違えば「群効果」が存在することを示唆。
箱の上下(第 3・第 1 四分位) : 中央 50% の幅。 箱が広い群はばらつきが大きい。
ひげ(通常 1.5×IQR 以内の最大・最小) : 主要な変動範囲。 ひげが片側に長い群は歪みあり。
外れ値(点) : ひげの外に出る個別観測。 ドメイン的に「想定外」のサンプルを発見する手段。
箱の高さの群差 : 群によって分散が大きく異なれば「等分散性」の仮定が崩れている兆候。 ANOVA でなく Welch ANOVA を選ぶ判断材料。
SSDSE-B-2026 を地方区分で箱ひげ化すると、 たとえば「関東」は中央値が高く外れ値(東京)が突出、 「四国」は中央値が低く箱の幅も狭い、 といった構造が見える。 この群差を線形回帰でモデル化する場合、 地方区分のダミー変数を投入し、 さらに「人口 × 地方区分」の交互作用項を加えるかどうかを判断する材料になる。
箱ひげ図とバイオリンプロット・ストリッププロットの使い分け
箱ひげ図は「五数要約と外れ値」だけを示すため、 「分布の形(多峰性など)」は捨象される。 もし「群内の分布の形」まで見たいなら、 バイオリンプロット(箱ひげにカーネル密度を重ねたもの)やストリッププロット(個別点をジッターで散らしたもの)が有用である。 サンプル数が少ない群($n < 20$)では箱ひげの中央値や IQR の解釈が不安定になるため、 ストリッププロットで個別点を明示する方が誤解が少ない。
可視化手法
得意な情報
推奨サンプルサイズ
箱ひげ図 中央値・IQR・外れ値の群比較 $n \geq 20$ 群あたり
バイオリンプロット 分布の形(多峰性も含む) $n \geq 30$ 群あたり
ストリッププロット 個別観測の散らばり $n \leq 50$ 推奨
スウォームプロット 個別点の重複なし配置 $n \leq 100$ 推奨
箱ひげ + ストリップ重ね 五数要約と個別点を同時表示 $n \geq 10$ で可
バイオリン + ストリップ重ね 分布形と個別点を同時表示 $n \geq 20$ で可
4. 「散布図 → ヒストグラム → 箱ひげ図」の三段確認パイプライン
線形回帰を業務で運用する場合、 「とりあえずモデルを当てはめて R² を見る」ではなく、 次の三段確認パイプラインを必ず通すことを推奨する。
段階 1 — 散布図 : $y$ vs. 各 $x$ の散布図を全部描く。 線形性、 外れ値、 等分散性、 クラスタ分離を視覚で判定。 必要なら変数変換(log, sqrt, Box-Cox)を施す。
段階 2 — モデル当てはめ後の残差ヒストグラム : $\hat{\varepsilon}$ の分布形を確認。 右歪み、 二峰、 鋭い尖りがあれば、 説明変数の見落とし・カテゴリ変数の必要性・分布族の変更を検討。
段階 3 — 残差の群別箱ひげ図 : 残差を「想定される群分け」(地域、 業種、 性別、 年齢区分など)で層別箱ひげ化。 群間で中央値や IQR が大きく違えば、 その群分けを線形モデルに組み込むべきというシグナル。
この三段で「目で見て問題なし」を確認できたら、 はじめて $\hat{\beta}$ の数値と $p$ 値を読み始める。 順序を逆にすると、 統計量だけ見て「有意です」と報告した後で「実は外れ値 1 つに支配されていた」「実は非線形でした」「実は別の層が混じっていた」と判明し、 結論を全面撤回する羽目になる。
三段確認パイプラインの Python 実装スケッチ
このコードでやること : SSDSE-B-2026 を読み込み、 「総人口(A1101)」を説明変数、 「着工新設住宅戸数(H1800)」を目的変数として、 散布図 → 線形回帰 → 残差ヒストグラム → 残差箱ひげ図(地方区分別)の三段確認パイプラインを 1 つのスクリプトで実行する。
📥 入力データ (SSDSE-B-2026 抜粋):
SSDSE-B-2026 Prefecture A1101 (総人口) H1800 (住宅戸数)
2023 北海道 5092000 28469
2023 東京都 14086000 124810
2023 大阪府 8763000 65927
2023 沖縄県 1468000 10007
... (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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
# 1. データ読み込み(先頭列 'SSDSE-B-2026' が年度)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' )
df = df . iloc [ 1 :] # 2行目の日本語列名を除去
df = df [ df [ 'SSDSE-B-2026' ] . astype ( int ) == 2023 ] # 2023年で抽出
for c in [ 'A1101' , 'H1800' ]:
df [ c ] = pd . to_numeric ( df [ c ], errors = 'coerce' )
df = df . dropna ( subset = [ 'A1101' , 'H1800' , 'Prefecture' ])
# 地方区分の付与(簡易マッピング)
region_map = {
'北海道' : '北海道' , '青森県' : '東北' , '岩手県' : '東北' , '宮城県' : '東北' , '秋田県' : '東北' , '山形県' : '東北' , '福島県' : '東北' ,
'茨城県' : '関東' , '栃木県' : '関東' , '群馬県' : '関東' , '埼玉県' : '関東' , '千葉県' : '関東' , '東京都' : '関東' , '神奈川県' : '関東' ,
'新潟県' : '中部' , '富山県' : '中部' , '石川県' : '中部' , '福井県' : '中部' , '山梨県' : '中部' , '長野県' : '中部' , '岐阜県' : '中部' , '静岡県' : '中部' , '愛知県' : '中部' ,
'三重県' : '近畿' , '滋賀県' : '近畿' , '京都府' : '近畿' , '大阪府' : '近畿' , '兵庫県' : '近畿' , '奈良県' : '近畿' , '和歌山県' : '近畿' ,
'鳥取県' : '中国' , '島根県' : '中国' , '岡山県' : '中国' , '広島県' : '中国' , '山口県' : '中国' ,
'徳島県' : '四国' , '香川県' : '四国' , '愛媛県' : '四国' , '高知県' : '四国' ,
'福岡県' : '九州' , '佐賀県' : '九州' , '長崎県' : '九州' , '熊本県' : '九州' , '大分県' : '九州' , '宮崎県' : '九州' , '鹿児島県' : '九州' , '沖縄県' : '九州'
}
df [ 'region' ] = df [ 'Prefecture' ] . map ( region_map )
# 2. 段階1: 散布図
fig , ax = plt . subplots ( figsize = ( 7 , 5 ))
ax . scatter ( df [ 'A1101' ], df [ 'H1800' ], alpha = 0.7 )
ax . set_xlabel ( '総人口 (人)' )
ax . set_ylabel ( '着工新設住宅戸数 (戸)' )
ax . set_title ( '散布図:総人口 vs. 住宅戸数' )
plt . tight_layout (); plt . savefig ( 'step1_scatter.png' )
# 3. 線形回帰の当てはめ
X = sm . add_constant ( df [ 'A1101' ])
model = sm . OLS ( df [ 'H1800' ], X ) . fit ()
df [ 'resid' ] = model . resid
print ( model . summary () . tables [ 1 ])
# 4. 段階2: 残差ヒストグラム
fig , ax = plt . subplots ( figsize = ( 7 , 5 ))
ax . hist ( df [ 'resid' ], bins = 15 , edgecolor = 'black' , alpha = 0.8 )
ax . set_xlabel ( '残差 (戸)' )
ax . set_ylabel ( '頻度' )
ax . set_title ( '残差ヒストグラム' )
plt . tight_layout (); plt . savefig ( 'step2_residhist.png' )
# 5. 段階3: 地方区分別の残差箱ひげ図
fig , ax = plt . subplots ( figsize = ( 8 , 5 ))
df . boxplot ( column = 'resid' , by = 'region' , ax = ax )
ax . set_xlabel ( '地方区分' )
ax . set_ylabel ( '残差 (戸)' )
ax . set_title ( '地方区分別の残差箱ひげ図' )
plt . suptitle ( '' )
plt . tight_layout (); plt . savefig ( 'step3_residbox.png' )
📤 実行例(model.summary().tables[1] の抜粋):
coef std err t P>|t|
const -4497.48 739.43 -6.08 0.000
A1101 0.008135 0.000193 42.12 0.000
R-squared: 0.9753
F-statistic: 1774
Prob (F-stat): 8.45e-38
💬 結果の読み方 : 人口 1 人あたり住宅着工は約 0.008 戸増(人口 100 万人あたり約 8,100 戸)、 R² = 0.975 で非常に高い説明力。 ただし散布図で東京・大阪が右上に孤立し、 残差ヒストグラムは右歪み、 地方区分別箱ひげ図では「関東」だけ大きな正の残差を示す。 → 「人口だけで住宅着工は概ね説明できるが、 東京・大阪は通常モデルから上振れする特殊例」と結論。 政策議論では「全国平均では人口比、 大都市圏は別途上振れ要因あり」と二段階で語る必要がある。
最後に、 散布図・ヒストグラム・箱ひげ図を使った線形回帰診断でしばしば見られる誤解と、 その回避策をまとめておく。 これらは初学者の報告書で頻発する間違いであり、 一度知っておけば自分の解析を見直すときの強力なチェックリストになる。
誤解 1 : 「R² が高ければ図を見なくて良い」 → R² は線形当てはめの平均的良さしか測らない。 R² = 0.99 でも残差に体系的パターンがあれば、 個別予測は全くダメな場合がある。
誤解 2 : 「点が直線に乗っていれば線形回帰で OK」 → 等分散性、 正規性、 独立性も同時にチェックしないと、 信頼区間や $p$ 値は誤り。
誤解 3 : 「外れ値は無条件で除外」 → 外れ値はモデルの欠陥(説明変数不足)を示している場合がある。 必ずドメイン的に「なぜ外れているか」を考えてから除外判断する。
誤解 4 : 「ヒストグラムで正規っぽければ OK」 → ビン幅次第で印象が変わるので、 QQ プロットや Shapiro-Wilk と併用。
誤解 5 : 「箱ひげ図に外れ値マークがあれば異常値」 → 1.5×IQR ルールは経験則。 数学的な「異常」基準ではない。 群サイズが小さい場合は特に過剰検出する傾向あり。
誤解 6 : 「散布図に直線を引けば回帰完了」 → 直線・信頼帯・予測帯の 3 種類を明示しないと、 「平均応答と個別予測の不確かさ」を読者が区別できない。
誤解 7 : 「全体のヒストグラムが正規ならば残差も正規」 → これは別の話。 $y$ そのものが正規である必要は線形回帰にはない。 検証対象はあくまで「残差」。
線形回帰は「単純さゆえに強力」というモデルだが、 単純さに油断して「数字だけ報告」してしまうと、 上記の誤解が複合して結論を歪める。 「散布図 → 残差ヒストグラム → 群別残差箱ひげ図」の三点セットを毎回出す習慣を作れば、 これらの誤解の多くは未然に防げる。 特に SSDSE-B-2026 のような社会経済データでは、 東京や大阪といった大都市の影響、 地方区分による系統差、 人口対数スケールの必要性など、 視覚診断なしには発見できない構造が多数存在する。
6. このセクションの 5 行まとめ
線形回帰の品質は R² より図で判定 する方が信頼性が高い。
散布図 で「線形性・等分散性・外れ値・クラスタ分離」を確認する。
残差ヒストグラム で「正規性・歪み・多峰性」を確認する。
群別残差箱ひげ図 で「隠れたグループ変数の影響」を確認する。
この三段確認を毎回行えば、 線形回帰の典型的誤解はほぼ防げる。
🌐 学際的視点 — 線形回帰の用語マトリクス
分野
$\beta_1$ の呼び方
$R^2$ の呼び方
推定法の名称
統計学 回帰係数 決定係数 最小二乗法 (OLS)
計量経済学 弾力性 / 限界効果 適合度 OLS / GLS / IV
機械学習 重み (weight) 精度指標の一つ 学習 / フィット
物理学 傾き / 感度係数 相関の強さ フィッティング
医療統計 効果量 説明分散割合 回帰分析
マーケティング 寄与度 説明力 マーケティングミックス・モデル
名前は違っても数学的中身は同じ。 分野横断的に学ぶことで、 「これも線形回帰なのか」という発見が増える。
🌐 Kaggle・実競技で線形回帰が活きる場面
Kaggle の住宅価格予測 (House Prices) コンペでは、 多くのトップソリューションが「特徴量エンジニアリング + Lasso / Ridge + LightGBM のアンサンブル」という構成。 線形モデルは「ツリーモデルが捉えにくい線形的なシグナル」を補完し、 アンサンブル全体の予測精度を底上げする。
実例:Mercedes-Benz Greener Manufacturing コンペで 1 位を獲得したソリューションは、 主成分回帰 + Lasso + XGBoost のスタッキングだった。 線形モデルは「ノイズに頑健」「解釈可能な特徴量重要度」を提供し、 ツリー系の弱点を補う。
Tips: 特徴量エンジニアリングこそ命
線形回帰の限界は「線形仮定」だが、 説明変数側を工夫すれば多くの非線形関係をカバーできる:
多項式項 :$x^2, x^3, xy$ を追加
ログ変換 :$\log x$ で「比例的な効果」を線形化
カテゴリ変数のダミー化 :one-hot encoding
交互作用項 :「人口 × 出生率」のような乗算項
スプライン :区分多項式で滑らかな非線形を表現
ターゲットエンコーディング :高カーディナリティのカテゴリ変数を平均値で置換
これら全部入れた「拡張線形モデル」は、 ニューラルネットに匹敵する性能を出すことが多い。
🛠 GLS・ロバスト回帰・残差診断(深掘り)
OLS(通常最小二乗法)は「誤差項が等分散・独立・正規」という前提に立つ。 SSDSE-B-2026 の都道府県データのように東京や大阪が外れ値 になりやすい現実データでは、 この前提が崩れる。 そのとき登場するのが GLS(一般化最小二乗法) 、 WLS(重み付き最小二乗法) 、 ロバスト回帰(Huber, RANSAC) である。
📊 OLS / WLS / GLS / Huber の比較表
手法 前提 外れ値耐性 代表的用途
OLS 等分散・独立・正規 弱い 標準的な線形回帰
WLS 分散が既知(点ごと異なる) 中 分散不均一の補正
GLS 誤差共分散行列 Σ が既知 中 時系列・空間相関の補正
Huber 回帰 少数の外れ値を許容 強い 東京・大阪のような極端値あり
RANSAC 大半は inlier 最強 外れ値が 30% 以上
🔬 GLS の数式を言葉で読み解く
GLS の推定量は $\hat{\beta}_{GLS} = (X^T \Sigma^{-1} X)^{-1} X^T \Sigma^{-1} y$ で与えられる。 ここで $\Sigma$ は誤差の共分散行列で、 「点ごとの誤差の大きさ」と「点同士の相関」を表す。 OLS は $\Sigma = \sigma^2 I$(等分散・無相関)を仮定する特殊ケース。 $\Sigma^{-1}$ で重み付けすることで、 分散が大きい点の影響を抑え、 相関のある点の重複カウントを補正する。
🐍 statsmodels で GLS と Huber 回帰
🎯 このコードでやること :SSDSE-B-2026 都道府県データで OLS と Huber 回帰を比較し、 東京・大阪を含む推定がどう変わるかを観察する。
📥 入力データ(SSDSE-B-2026 抜粋、 47 都道府県):
SSDSE-B-2026 Prefecture A1101 (総人口) H1800 (住宅戸数)
2023 北海道 5092000 28469
2023 東京都 14086000 124810
2023 大阪府 8763000 65927
... ... ... ...
📋 コピー 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
33
34 # ── この抜粋で使うデータを用意します(英字の項目コードで読み込み)──
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 ()]
import pandas as pd
import numpy as np
import statsmodels.api as sm
from sklearn.linear_model import HuberRegressor
# 上の準備コードで ^R\d{5}$ による絞り込みを済ませているので、
# ここで iloc[1:] を掛けると日本語行ではなく北海道が消えてしまう(47 → 46 行)。
x = pd . to_numeric ( df [ 'A1101' ]) . values . reshape ( - 1 , 1 ) # 総人口
y = pd . to_numeric ( df [ 'H1800' ]) . values # 着工新設住宅戸数
# OLS
X = sm . add_constant ( x )
ols = sm . OLS ( y , X ) . fit ()
print ( 'OLS slope =' , round ( ols . params [ 1 ], 6 ), ' R^2 =' , round ( ols . rsquared , 4 ))
# Huber 回帰(東京の過大なレバレッジをロバストに抑える)
# 総人口は 1e7、 住宅着工は 1e5 とスケールが大きく違い、 生の値のままだと
# l-BFGS-B ソルバが収束せず ValueError になる。 x を標準化して解き、 傾きを元スケールへ戻す。
sx = x . std ()
huber = HuberRegressor ( max_iter = 1000 ) . fit ( x / sx , y )
huber_slope = huber . coef_ [ 0 ] / sx
print ( 'Huber slope =' , round ( huber_slope , 6 ))
# 残差診断(DW 検定 = 残差の自己相関)
print ( 'Durbin-Watson =' , round ( sm . stats . durbin_watson ( ols . resid ), 2 ))
📤 実行例の出力:
OLS slope = 0.008135 R^2 = 0.9753
Huber slope = 0.007532
Durbin-Watson = 1.97
💬 結果の読み方 : OLS は全 47 県で傾き 0.008135。 Huber 回帰は東京都の過大なレバレッジを割り引くため、 東京を除いた大多数の県に近い 0.007532 を返す(東京除外 OLS 0.007375 と整合)。 3 つの値が 0.007375 < 0.007532 < 0.008135 の順に並ぶことが、 「東京がどれだけ傾きを押し上げているか」の定量的な答えである。実装上の注意 : HuberRegressor を生の値のまま呼ぶと、 総人口 (約 10⁷) と住宅着工数 (約 10⁵) のスケール差で l-BFGS-B ソルバが収束せず ValueError で落ちる。 max_iter をいくら増やしても解決しない ── 説明変数を標準化してから当てはめ、 傾きを元のスケールに戻す のが正しい対処である。 「東京を典型例として扱うか、 外れ値として割り引くか」で結論が変わる。 Durbin-Watson は 2 に近いほど残差に自己相関がない指標(1.97 はほぼ理想的)。
⚠️ 残差診断の 4 大チェック
① 残差プロット :予測値 vs 残差。 ファネル状なら分散不均一 → WLS/GLS 検討
② Q-Q プロット :残差の正規性。 端が反り上がるなら裾が重い → Huber 検討
③ Cook の距離 :1 点除外で係数がどれだけ動くか。 > 1 で要注意 → 東京・大阪が典型
④ DW 検定 :残差の時系列自己相関。 1.5 未満や 2.5 超で自己相関疑い → GLS 検討
これら 4 つを毎回確認するだけで、 線形回帰の信頼度は劇的に向上する。
🏭 実務応用ケーススタディ:線形回帰が活きる 5 つの現場
線形回帰は「シンプルすぎる」と侮られがちだが、 実務では 解釈可能性・運用コスト・モデル更新の容易さ で他手法を凌駕する場面が多い。 ここでは SSDSE-B-2026 と関連公的データを念頭に、 線形回帰が第一選択になる 5 つの典型ケースをまとめる。
① 自治体の人口・税収予測
SSDSE-B-2026 のような公的都道府県データに市町村決算カード等を突き合わせ、 「総人口」や「消費支出」を説明変数、 「地方税収」(決算カード側の外部データ)を目的変数とする線形回帰は、 自治体の中期財政計画で実際に使われている。 ニューラルネットを持ち出すまでもなく、 R² > 0.95 が容易に出る。 何より「人口 1 万人増加で税収が約 X 億円増える」という係数の解釈 がそのまま政策説明資料になる。
用途 目的変数 主要説明変数 想定 R²
税収予測 地方税収(外部データ) 総人口・消費支出・着工建築物数 0.96
高齢化費用 医療費 65 歳以上人口・受診率 0.92
教育施設 小中学生数 0-14 歳人口・出生率 0.89
廃棄物量 一般廃棄物量 人口・世帯数・商業床面積 0.94
② 不動産・住宅価格の AVM(自動評価モデル)
国土交通省の不動産取引価格情報を用いた価格推定では、 床面積・築年・最寄駅徒歩分・容積率などを線形回帰でモデル化する。 ランダムフォレストや LightGBM の方が精度は高いが、 金融機関の担保評価 では「なぜこの価格になったか」を説明する義務があるため、 線形回帰(or 一般化加法モデル)が今も主流である。 対数変換 + 線形回帰の組み合わせは、 価格弾力性をそのまま読める利点もある。
③ A/B テストの効果検証(CUPED 補正)
Web 系の A/B テストでは、 純粋なグループ比較より 線形回帰による共変量調整(CUPED: Controlled-experiment Using Pre-Experiment Data) が標準になりつつある。 過去 1 ヶ月の購買額を共変量として線形回帰すれば、 検定の分散が 30-60% 削減され、 同じサンプル数で検出力が劇的に上がる。 これは Microsoft・Netflix・LinkedIn など大手で公式採用されている手法。
④ 製造業の歩留まり・品質予測
半導体製造の歩留まり予測では、 装置のセンサー値(温度・圧力・流量)を説明変数に取り、 線形回帰で歩留まり率を予測する。 ここでも「どのセンサーが歩留まりに最も影響したか」を係数で読みたいため、 ブラックボックスモデルより線形回帰が好まれる。 多重共線性は PCA や Ridge で対処する。
⑤ 因果推論の補助としての線形回帰
差分の差分法(DiD)・回帰不連続デザイン(RDD)・操作変数法(IV)のすべての中核に線形回帰がある 。 「最低賃金引き上げで雇用がどう変わったか」「補助金で売上がどう増えたか」など、 政策評価論文の 80% 以上は線形回帰ベースで書かれている。 ML 手法のあとで線形回帰に戻る研究者が後を絶たない理由は、 係数 = 因果効果 として読める強さがあるから。
線形回帰を「古い」と切り捨てる前に
XGBoost や DNN が流行する中で、 線形回帰は地味に見える。 だが「データ不足・説明責任・更新頻度・運用コスト」の 4 軸では、 線形回帰が依然として勝つ場面が多い。 Kaggle で勝つには非線形が要るが、 行政・金融・製薬・法務では線形回帰がデファクトであり続けている。 ジュニアデータサイエンティストほど、 線形回帰の引き出しを増やしておくと汎用性が高い。
🧠 線形回帰を支える数学:最小二乗法と射影の幾何
線形回帰は「データに直線を当てはめる」と説明されるが、 数学的には説明変数が張る部分空間に目的変数ベクトルを射影する という幾何的操作である。 この見方を持つと、 多重共線性・正則化・一般化加法モデルなどの拡張が驚くほどスッキリ理解できる。
最小二乗法の正規方程式
線形回帰 $y = X\beta + \varepsilon$ の最小二乗解は、 残差二乗和 $\|y - X\beta\|^2$ を最小化することで得られる。 偏微分してゼロとおくと 正規方程式 $X^\top X \beta = X^\top y$ が出る。 ここから $\hat{\beta} = (X^\top X)^{-1} X^\top y$ という閉形式解が導かれる。
この閉形式解は「逆行列が計算できる 」=「説明変数同士が独立 」を仮定している。 多重共線性が強いと $X^\top X$ が特異行列に近づき、 数値的に不安定になる。 そこで Ridge 回帰では $X^\top X + \lambda I$ と単位行列を足して必ず正則行列にする。 これが $\hat{\beta}_{\text{ridge}} = (X^\top X + \lambda I)^{-1} X^\top y$ の正体である。
射影行列としてのハット行列 H
予測値 $\hat{y} = X\hat{\beta} = X(X^\top X)^{-1} X^\top y = Hy$ における $H = X(X^\top X)^{-1} X^\top$ をハット行列(または射影行列) と呼ぶ。 これは $y$ を「説明変数が張る列空間」に射影する行列。 性質として $H^2 = H$(冪等)と $H^\top = H$(対称)が成り立つ。
対角要素 $h_{ii}$ はレバレッジ (leverage)と呼ばれ、 そのサンプルが予測にどれだけ影響するかを表す。 $h_{ii}$ が大きい点(典型的には説明変数の端、 SSDSE-B-2026 なら東京や鳥取)は回帰直線を強く引っぱる。 これが Cook の距離など影響度診断の理論的根拠。
残差は H の補空間に住む
残差 $e = y - \hat{y} = (I - H)y$ は、 説明変数空間の直交補空間 に住むベクトルである。 これは「残差は説明変数とは無相関 」という性質を意味し、 統計検定の理論的基盤となる。 残差の平方和は $\|e\|^2 = y^\top (I - H) y$ で表され、 これが分散分析や F 検定の基礎量になる。
行列・量 記号 役割 対応する診断
ハット行列 $H$ $y \to \hat{y}$ の射影 レバレッジ $h_{ii}$
補射影 $I - H$ $y \to e$(残差) 残差プロット
共分散行列 $\sigma^2 (X^\top X)^{-1}$ 係数の不確実性 標準誤差・t 値
VIF 行列 $\text{diag}((X^\top X)^{-1})$ 由来 多重共線性検出 VIF > 10 警告
なぜ「二乗」誤差なのか
「絶対値誤差ではなく、 なぜわざわざ二乗するのか」は初学者の素朴な疑問。 答えは (1) 微分可能で閉形式解が出る、 (2) 大きな誤差を強く罰せる、 (3) 誤差が正規分布なら最尤推定と一致する の 3 つ。 ただし外れ値に弱いという欠点があり、 そこで 絶対値誤差(LAD 回帰) や Huber 損失 といったロバスト回帰が用意されている。
線形回帰と PCA の意外な関係
線形回帰は「説明変数 → 目的変数の方向に誤差最小化」、 PCA は「全変数の総分散を最大化する方向」。 似ているが目的が違う。 多重共線性に対しては「説明変数を PCA で主成分に変換 → 主成分で回帰」する主成分回帰(PCR) がある。 さらに目的変数との共分散も考慮するのが PLS(Partial Least Squares) 。 SSDSE-B-2026 のような相関の強い指標群に強力。
📈 線形回帰の拡張ロードマップ:単回帰から GLM・GAM・階層モデルまで
線形回帰は孤立した手法ではなく、 「線形性」「正規分布残差」「独立サンプル」という 3 つの仮定をひとつずつ緩めることで、 統計モデリングの巨大なファミリーへと拡張できる。 ここでは現場で使える主要な拡張をマップ的に整理し、 SSDSE-B-2026 のシナリオでどの手法を選ぶべきかを示す。
レベル 0: 単回帰・重回帰
説明変数 1 つが単回帰、 複数が重回帰。 SSDSE-B-2026 で「人口 → 住宅戸数」だけなら単回帰。 「人口 + 就業者数 + 大学進学率」と複数取れば重回帰。 まずはここからスタートし、 残差プロット・多重共線性(VIF)・係数の符号妥当性を確認する。
レベル 1: 多項式・スプライン回帰
直線では曲線的な関係を捉えられない。 二乗項 $x^2$ や三乗項 $x^3$ を追加すれば「曲がる線形回帰」になる。 ただし高次項は外挿に弱い。 そこで スプライン(区分多項式) を使えば、 局所的に柔軟、 全体的に滑らかな曲線を引ける。 sklearn なら SplineTransformer、 R なら splines::bs()。
レベル 2: 正則化回帰(Ridge・Lasso・ElasticNet)
説明変数の数が多い・多重共線性がある場合、 通常の OLS は係数の分散が大きくなる。 そこで罰則項を加える: Ridge(L2 罰則) は全係数を縮小、 Lasso(L1 罰則) は不要な変数の係数を 0 にする(特徴量選択)、 ElasticNet は両者の折衷。 SSDSE-B-2026 の指標は相関が強いため、 重回帰には Ridge or ElasticNet が安全。
手法 罰則項 特徴量選択 推奨場面
OLS なし なし 変数少・独立
Ridge $\lambda \sum \beta_j^2$ ×(縮小のみ) 多重共線性あり
Lasso $\lambda \sum |\beta_j|$ ○(自動) 変数多・スパース期待
ElasticNet L1 + L2 混合 ○(部分的) 相関のある多変数
レベル 3: 一般化線形モデル(GLM)
目的変数が連続でない場合、 線形回帰は使えない。 二値(買う/買わない)ならロジスティック回帰 、 カウント(来店回数)ならポアソン回帰 、 過分散があれば負の二項回帰 。 これらは「リンク関数」を介して線形予測子 $X\beta$ を目的変数の期待値に対応づける枠組み(GLM)にまとめられる。 statsmodels の GLM クラスや R の glm() で統一的に扱える。
レベル 4: 一般化加法モデル(GAM)
「線形」の仮定を緩め、 各説明変数を平滑関数 $f_j(x_j)$ で表現するのが GAM。 $y = \beta_0 + f_1(x_1) + f_2(x_2) + \dots + \varepsilon$。 各 $f_j$ はスプラインで推定される。 解釈可能性を保ったまま非線形を取り込めるため、 「線形回帰では曲線が見えるが、 ブラックボックスは避けたい」場面で重宝する。 Python なら pyGAM、 R なら mgcv::gam()。
レベル 5: 混合効果モデル・階層ベイズ
SSDSE-B-2026 を地域別(東日本/西日本)に分けて分析したい場合、 単純に線形回帰すると「地域差を無視」か「地域別に分けて推定」の極端な選択になる。 そこで 混合効果モデル(mixed effects) では、 全体共通の固定効果と、 地域ごとの変量効果を同時に推定する。 これを Bayes 化したのが階層ベイズモデル で、 PyMC・Stan で実装する。 サンプルが少ない都道府県も、 全体の傾向から情報を借りて推定できる(部分プーリング)。
レベル 6: 因果推論への応用
「処置を受けたグループと受けないグループで Y の差を比較」する DiD は線形回帰の交互作用項 で書ける。 「閾値を境に処置が切り替わる」RDD は閾値前後で別々の線形回帰 。 「内生性がある」場合は2 段階最小二乗(2SLS) 。 つまり因果推論の主要な道具はすべて線形回帰の応用 であり、 線形回帰を深く理解することは、 そのまま因果推論の入り口になる。
どこから手をつけるか
初学者は レベル 0 → 残差診断 → レベル 2(Ridge)→ レベル 3(ロジスティック回帰) の順で習得すると効率がよい。 この 4 段階を SSDSE-B-2026 で実装して身につければ、 行政・ビジネス・研究のほとんどの定量分析に対応できる。 GAM・混合効果・因果推論は、 必要になったタイミングで個別に学べばよい。 まずは線形回帰の「骨格」を完全に押さえることが、 すべての出発点である。
線形回帰を学ぶことの本当の価値
線形回帰の知識は単一の手法スキル ではなく、 統計モデリング全体への言語 である。 「説明変数」「係数」「残差」「適合度」「過学習」「正則化」という語彙はすべて線形回帰から生まれ、 ニューラルネットの「重み」「損失関数」「正則化項」もこの語彙の延長線上にある。 つまり、 線形回帰の理解は機械学習・深層学習のすべての基礎を支える。 シンプルだから侮るのではなく、 シンプルだから徹底的に味わうのが正しい付き合い方である。
📝 線形回帰 FAQ:現場で必ず聞かれる 10 の疑問
線形回帰のレビューや会議で頻出する 10 の疑問と回答をまとめる。 ジュニアからシニアまで、 これらの問いに即答できるかどうかが、 線形回帰を「使える」状態にあるかの試金石。
Q1. R² が高いのに残差プロットが偏っている。 信用していい?
いいえ。 R² は「分散をどれだけ説明したか」の指標であって、 「適切なモデルか」は別問題。 R² = 0.95 でも残差にパターンがあれば、 線形性の仮定が破れている。 説明変数の対数変換・二乗項追加・スプライン化を試すべき。 SSDSE-B-2026 で「人口 → 飲食費」を見ると、 単純な線形回帰では大都市が過大予測されることが多い。
Q2. 係数の符号が直感と逆になった。 どう解釈する?
多くは多重共線性 のサイン。 強く相関する説明変数が並ぶと、 係数が不安定になり符号が反転することがある。 VIF を計算し、 10 を超える変数があれば、 (a) 一つに絞る、 (b) Ridge にする、 (c) PCA で主成分化する、 のいずれかで対処する。 「単変量で見ると正、 重回帰だと負」は典型的な現象で、 これを抑制(suppression) とも呼ぶ。
Q3. サンプル数が少ない(n < 30)。 線形回帰してよい?
説明変数の数 p に対して「n / p ≥ 10」が目安。 n=20 で p=5 だと n/p=4 で危険。 t 検定の有意性は当てにならず、 過学習しやすい。 対策は (1) p を減らす、 (2) Ridge/Lasso で罰則を入れる、 (3) ベイズ的に事前分布で縛る、 (4) leave-one-out CV で汎化性能を確認 。
Q4. 切片を 0 にするべき?
原則として切片はそのまま残す。 「x=0 のとき y=0 が物理的に明らか」な場合だけ切片なしを選ぶ(例: 単位を揃えた比率データ)。 切片を 0 に強制すると、 R² の定義が変わり、 ほぼ常に「見かけの R²」が異常に高く出る。 これは比較してはいけない罠。
Q5. 説明変数のスケールを揃えるべき?
OLS だけなら不要(係数のスケールが変わるだけで、 予測は同じ)。 ただし正則化(Ridge/Lasso)を使うなら必須 。 罰則項が「係数の大きさ」を見るので、 スケールが揃っていないと特定の変数だけ過剰に罰されてしまう。 標準化(平均 0・分散 1)または min-max スケーリングで揃える。
Q6. カテゴリ変数はどう扱う?
ダミー変数化(one-hot encoding) が標準。 ただし「ダミー変数の罠」に注意: k 個のカテゴリなら k-1 個のダミーで十分(残り 1 個は基準になる)。 pandas の pd.get_dummies(drop_first=True) で対応。 順序のあるカテゴリ(小・中・大)は数値化(1・2・3)してもよいが、 等間隔仮定が成立するかを必ず吟味する。
Q7. 異常値・外れ値はどうする?
まず除外する前に必ず理由を考える 。 SSDSE-B-2026 の「東京都」は人口でも経済でも極端だが、 これを除いた回帰は「東京を含む日本」を予測するモデルにはならない。 対処の選択肢: (a) ロバスト回帰(Huber 損失)、 (b) 対数変換で裾を圧縮、 (c) 影響度(Cook 距離)でフラグだけ立てて係数を比較、 (d) 異常値専用のダミー変数を追加。
Q8. 予測区間と信頼区間の違いは?
信頼区間 は「平均的な予測値」の不確実性、 予測区間 は「個別の観測値」の不確実性。 後者は前者より必ず広い(個別観測の誤差分散が加わる)。 statsmodels では get_prediction().conf_int() と get_prediction().summary_frame()['obs_ci'] で別々に取得できる。 報告書でこれを混同すると致命的なミスになる。
Q9. 時系列データに線形回帰を使ってよい?
残差の自己相関に注意(DW 検定で確認)。 自己相関があれば標準誤差が過小評価され、 t 検定が誤って有意になる。 対策は (1) Newey-West 補正の標準誤差、 (2) ARIMA や状態空間モデルへ移行、 (3) ラグ変数を追加、 (4) Cochrane-Orcutt 法で逐次補正 。 また非定常性(単位根) がある場合は階差を取ってから回帰する。
Q10. 機械学習モデルと比べて線形回帰はどこまで有効?
経験則として、 (a) サンプル数が少ない(n < 1000)、 (b) 説明変数が少ない(p < 50)、 (c) 非線形性が弱い、 (d) 解釈性が重要 のいずれかが当てはまれば、 線形回帰が GBM や DNN に拮抗する、 あるいは勝つことが多い。 Kaggle のような「予測精度競争」では負けがちだが、 実務では上記条件のどれかは必ず当てはまるため、 線形回帰は永遠に第一選択の候補に残り続ける。
最後に: 線形回帰の習熟度チェックリスト
□ 残差プロットを見て「線形性・等分散性・正規性」を判定できる
□ VIF を計算し、 多重共線性を検出できる
□ Cook の距離・レバレッジで影響点を特定できる
□ 信頼区間と予測区間を区別して報告できる
□ Ridge / Lasso / ElasticNet の使い分けができる
□ ロジスティック回帰・ポアソン回帰へ自然に拡張できる
□ ダミー変数化・交互作用項・対数変換の使いどころを説明できる
□ 時系列の自己相関を診断し、 必要なら ARIMA に移行できる
□ クロスバリデーションで汎化性能を評価できる
□ 「相関 ≠ 因果」を踏まえ、 因果推論的解釈の限界を語れる
10 項目すべてに自信を持って「はい」と言えるなら、 あなたは線形回帰を「使える」段階にいる。 言えない項目があれば、 そこが次に学ぶべきポイント。 線形回帰の世界は浅いようで深く、 何年経っても新しい発見がある。
🛠 線形回帰のハンズオン演習:SSDSE-B-2026 で身につける 7 ステップ
線形回帰は手を動かして初めて身につく。 このセクションでは SSDSE-B-2026 を題材に、 入門者が最初の 1 ヶ月で押さえるべき 7 ステップの演習を提示する。 すべての演習は pandas + statsmodels + sklearn の組み合わせで実装でき、 Google Colab でも動く。
ステップ 1: データを読み込み、 散布図で関係を眺める
まず SSDSE-B-2026 を読み込み、 「人口」と「住宅戸数」の散布図を描く。 直線関係が見えるか、 外れ値があるか、 ばらつきが大きいかを目で確認する。 統計学はモデルに飛びつく前に「データを見る」のが鉄則。
ステップ 2: 単回帰を当てはめる
statsmodels.api.OLS で単回帰を実行し、 係数・標準誤差・p 値・R² を確認。 「人口 1 万人増加で住宅着工が X 戸増える」と言葉で説明できるようにする。
ステップ 3: 残差プロットで仮定をチェックする
予測値と残差の散布図、 Q-Q プロット、 残差ヒストグラムの 3 種類を描く。 ファネル状になっていれば等分散性違反、 Q-Q プロットが反れば正規性違反。 SSDSE-B-2026 では「東京が常に外れ値」となる現象を体感しよう。
ステップ 4: 対数変換でスケールを整える
人口・住宅規模は桁が大きく違う。 両軸を対数化(log10)してから線形回帰すると、 「人口が 2 倍になると住宅戸数が k 倍になる」という弾力性として読める。 SSDSE-B-2026 の「総人口 → 着工新設住宅戸数」では log-log 回帰の傾きが約 1.17 で、 ほぼ比例に近い関係を示唆する。
ステップ 5: 重回帰に拡張する
説明変数を 3-5 個に増やし、 重回帰を組む。 候補は「人口」「就業者数」「大学進学率」「事業所数」「製造品出荷額」など。 増やしすぎると過学習する。 VIF を計算し、 多重共線性をチェック。
ステップ 6: Ridge / Lasso と比較する
同じ説明変数で sklearn.linear_model.Ridge と Lasso を試し、 交差検証で alpha をチューニング。 OLS と係数を比較し、 罰則がどう作用したかを観察する。 Lasso が 0 にした変数は何かを確認。
ステップ 7: 予測区間を計算し、 報告書にする
最後に、 ある仮想の県(例: 人口 100 万人・就業者数 60 万人)について、 予測値とその 95% 予測区間を出す。 これを「政策評価レポート」風にまとめる。 ここまでできれば、 線形回帰の入門は卒業。 統計検定 2 級・データサイエンティスト検定の出題範囲をすべてカバーしている。
学習後に挑戦すべき発展課題
7 ステップを終えたら、 (A) 都道府県間のクラスタリング後にクラスタ別回帰、 (B) 時系列データ(経済センサス各年)でラグ変数つき回帰、 (C) ロジスティック回帰で「人口減少県/増加県」を分類、 (D) 階層ベイズで「地域差を吸収した上での全国平均効果」推定、 などの発展課題が待っている。 これらは一気にやろうとせず、 興味のあるものから 1 つずつ深掘りすればよい。 線形回帰は、 一生の付き合いになる道具である。
演習を進める上での 3 つの落とし穴
第一に、 精度の追求にこだわりすぎないこと 。 入門段階で R² を 0.99 に上げるために変数を盛りまくると、 過学習の感覚が身につかない。 むしろ R² = 0.85 で止めて「説明できない 15% は何か」を考える方が、 統計家としての視点が育つ。
第二に、 係数の符号と大きさを常に物語として読むこと 。 「総人口 1 万人増加で着工新設住宅戸数が約 81 戸増える」という言葉化ができないと、 ステークホルダーに価値を伝えられない。 数式から自然言語への翻訳力こそが、 データサイエンティストの差別化要素である。
第三に、 外れ値を機械的に除外しないこと 。 東京・大阪は SSDSE-B-2026 では外れ値になりがちだが、 政策議論ではむしろ「東京を含む日本全体」をモデル化する必要がある。 外れ値を除いた瞬間、 モデルの説明対象が変わってしまう点に常に自覚的でなければならない。 これら 3 つの罠を避けるだけで、 線形回帰の理解は飛躍的に深まる。
演習を 1 ヶ月で完走するためのスケジュール例
週 1 で「ステップ 1-2: データを眺める・単回帰」、 週 2 で「ステップ 3-4: 残差診断・対数変換」、 週 3 で「ステップ 5-6: 重回帰・正則化」、 週 4 で「ステップ 7 + 発展課題のいずれか 1 つ」を目標にすると、 無理なく 1 ヶ月で完走できる。 重要なのは「毎週、 結果を 1 ページのスライドにまとめる」習慣をつけること。 アウトプット前提の学習は、 単なるコードを写経する学習の 5 倍効率がよい。 1 ヶ月後には、 SSDSE-B-2026 を用いた予測レポートが 1 本完成しているはずだ。
演習の各ステップで身につく主要スキル一覧
各ステップで身につくスキルを言語化しておくと、 学習の到達度を可視化しやすい。 ステップ 1 では「散布図・記述統計から仮説を立てる力」、 ステップ 2 では「statsmodels の出力を読み解く力」、 ステップ 3 では「残差の挙動を診断する眼」、 ステップ 4 では「対数変換などのデータ前処理判断」、 ステップ 5 では「変数選択と多重共線性への対処」、 ステップ 6 では「正則化のハイパーパラメータチューニング」、 ステップ 7 では「不確実性を含めた予測値の報告」が身につく。 これらは全て、 機械学習に進んだ後も繰り返し使う基礎スキルである。
学習成果をポートフォリオ化する
7 ステップを終えたら、 GitHub に Jupyter Notebook をまとめて公開しよう。 README に「使用データ・分析目的・主要な発見・限界・参考文献」を書く。 これは就活・転職時の強力なポートフォリオになる。 SSDSE-B-2026 は誰でも入手できる公的データなので、 採用担当者も再現性を確認できる。 「予測精度の高いノートブック」よりも「考察が深いノートブック」の方が高く評価される傾向にある。 単なる手法の実装ではなく、 「なぜこの手法を選んだか・どのような限界があるか・次に何を試したいか」を明文化することが、 線形回帰の学習の本当のゴールである。
理解度チェック
最後に、 自分の理解度を以下の問いで確認しよう。 (1) なぜ最小二乗法は「二乗」誤差を使うのか、 微分・確率分布・幾何の 3 つの観点から説明できるか。 (2) 多重共線性が起きると何が困るのか、 数式と直感の両方で語れるか。 (3) R² が高い回帰が必ずしも良いモデルではない理由を 3 つ挙げられるか。 (4) Ridge と Lasso の違いを、 罰則項・特徴量選択・幾何の 3 観点で比較できるか。 (5) 線形回帰を時系列に適用する際の落とし穴を 2 つ以上挙げられるか。 すべてに自信を持って答えられたら、 線形回帰の入門は卒業である。
これらの問いに答えるプロセスで、 自分が「言葉で説明できないが、 計算はできる」部分が浮き彫りになる。 統計や機械学習は、 計算手順を覚えるだけでは半人前。 概念を言語化し、 他者に教えられて初めて自分のものになる。 SSDSE-B-2026 の都道府県データを例にして、 友人や同僚に説明してみるのが最高の理解度テストである。 説明に詰まった部分こそが、 次に深掘りすべき学習テーマである。
🗺 概念マップ
線形回帰を中心に、 最小二乗法 OLS (推定方法)、 重回帰・Ridge / Lasso (発展)、 残差診断・相関係数 (前提・後段) を並べた回帰分析マップ。
linear regression
最小二乗法 (OLS)
重回帰 (発展)
Ridge / Lasso 正則化
GLM / ロジスティック
残差診断
相関係数 (前提)
線形回帰は「説明変数と目的変数の関係を直線 (または超平面) で近似する」最も基本的な統計モデルで、 残差分布の形状 (正規・歪み・二峰・平坦) が前提検証の鍵となる。 概念マップでは最小二乗法・最尤推定・正則化 (Ridge / Lasso)・重回帰・多項式回帰・GLM が周辺ノード、 残差ヒストグラムが正規型でない場合は変数変換 (log) や GLM への切替を検討する。
🔗 隣接手法への橋渡し
線形回帰は最小二乗法による直線当てはめであり、 前段の散布図・相関係数による関係性確認と後段の残差診断を組み合わせて初めて統計的に妥当な結論が得られる。
上流の散布図と相関係数で線形性の前提を可視化し、 並列の多項式回帰/Ridge/Lasso と比較して正則化や非線形拡張の必要性を判断し、 下流の残差プロット・QQ プロットで仮定 (正規性・等分散性) を点検する流れで「線形回帰の信頼性」が確保される。
🌳 手法選択フロー
線形回帰 を実際の課題に当てはめるとき、 用語固有の判断軸に沿って次の 3 段階で適切な選択を行う。
説明変数は 1 つか複数か? 1 つ → 単回帰、 複数 → 重回帰 へ
多重共線性 (VIF>10) はないか? 問題あり → Ridge /Lasso で正則化、 問題なし → 通常 OLS
残差は等分散・正規か? 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 のときだけ)
逆算の誤り :①の式 ŷ = 1.048x + 2.104 を x について解き直して「出生率から婚姻率を推定」してはいけません(それは②とは別の直線)。 どちらを予測したいかで回帰する向きを最初に決める のが原則です。 逆向きの推定が本当に必要な場面(検量線から濃度を求める等)は「逆推定(calibration)」という別の問題設定になります。
生態学的誤謬 :この r = 0.667 は「都道府県という集団単位 」の相関です。 「婚姻した個人は出生しやすい」という個人レベルの主張は、 この回帰からは一切導けません。 集計単位の結論を個人に降ろす誤りを生態学的誤謬(ecological fallacy)と呼び、 都道府県データを扱う SSDSE 分析では特に注意が必要です。
共通分母による見かけの相関 :今回のように 2 変数を同じ分母(総人口)で割る と、 分母のばらつきだけで相関が生まれることがあります(比率の疑似相関、 Pearson が 19 世紀に指摘)。 率どうしの回帰では「その相関は分子の関係か、 分母の共有か」を一度疑ってください(→ 疑似相関 )。
🚀 発展 — 「縦の距離」をやめると何が変わるか
直交回帰(orthogonal / Deming 回帰) :OLS が縦距離を最小化するのは「x は誤差なく観測できる」という暗黙の前提があるからです。 x にも測定誤差がある場合(例:どちらも測定値である 2 つの検査値の関係)は、 点から直線への垂直距離 を最小化する直交回帰や主成分の第 1 主軸が候補になります。 その直線は、 上で見た 2 本の OLS 直線(傾き 1.048 と 2.352)の間 に入ります。
希釈バイアス(attenuation) :説明変数 x が誤差込みで観測されると、 OLS の傾きは真の値よりゼロ方向に縮んで 推定されます(誤差分散が大きいほど縮む)。 「x の測定が雑だと効果が小さく見える」という系統的な偏りで、 疫学・心理測定では信頼性係数による補正が使われます。
標準化偏回帰係数への橋 :単回帰では「標準化すると傾き=r」でしたが、 重回帰 では標準化係数は単純な相関ではなく「他の変数を固定した部分的な関係」に変わります。 単位の異なる説明変数の影響力比較に標準化係数が使われるのは、 この単回帰の性質の自然な拡張です。
🔗 関連ページ
相関係数 — 標準化座標での回帰直線の傾きそのもの
標準化 — 「傾き=r」を成立させる変換
疑似相関 — 共通分母・第三変数による見かけの相関
因果関係 — 回帰の向きと因果の向きは別問題
最小二乗法 / 残差 — 「縦距離の二乗和」という設計の中身
散布図 — 2 本の回帰直線を描き分ける土台
直交回帰・逆推定(calibration)は本用語集に個別ページがないため、 上記の発展解説を参照