論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
残差
Residual (ε / e)
実測値 − モデル予測値。残差プロットの形でモデルの妥当性(線形性・等分散性)を診断する。
回帰モデルε / e残差residual
📍 文脈💡 30秒結論📖 詳しく

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

論文中に 「残差」として登場する用語。

残差 とは:実測値 − モデル予測値。残差プロットの形でモデルの妥当性(線形性・等分散性)を診断する。

💡 30秒で分かる結論

📖 もっと詳しく

残差(residual)は、 「実測値 $y_i$ - モデル予測値 $\hat{y}_i$」の差。 モデルが捉えきれなかった「説明できないズレ」です。 回帰分析の診断の中核で、 これを見ずに結果を信じてはいけません。

OLSの4つの仮定(残差で診断):

  1. 平均0:残差の平均が0(OLSは自動で満たす)
  2. 等分散:残差のばらつきが x の値によらず一定
  3. 独立:残差同士に自己相関がない
  4. 正規分布:残差が(近似的に)正規分布

残差プロットの読み方

Q-Qプロット:残差が正規分布に従うかを視覚的に確認。 点が直線上にあれば正規性OK、 大きく逸脱するなら非正規。

Pythonfitted = model.fittedvalues; residuals = model.resid。 散布図と Q-Qプロット(statsmodels.graphics.gofplots.qqplot)を必ず描く習慣を。

👁️ 直感 — 残差は「モデルが説明できなかった部分」

残差 e_i = y_i - ŷ_i は、 観測値とモデル予測値の差。 モデルで捉えきれなかったランダムな変動を表します。

残差分析の目的

📐 残差の種類

種類 定義 用途
通常残差e_i = y_i - ŷ_i基本
標準化残差e_i / σスケールフリー
スチューデント化残差e_i / SE(e_i)外れ値検出
PRESS残差e_i / (1-h_ii)予測精度評価

📊 4つの主要な残差プロット

  1. 残差 vs 予測値:パターンがあれば線形性 or 等分散性違反
  2. QQプロット:残差が直線に乗れば正規分布
  3. Scale-Location:√|残差| vs 予測値、 等分散性確認
  4. 残差 vs Leverage:影響力のある観測値発見

🎯 影響力のある観測値

少数の極端な観測値が回帰結果を大きく動かすことがあります。 主要な指標:

🐍 Python での残差分析

🎯 解説: SSDSE-B-2026 の回帰モデルから残差 e = y - ŷ を計算。 残差はモデルが説明できなかった部分で、 ランダム性と非線形性・外れ値の検出に使う。
📥 入力例: data/raw/SSDSE-B-2026.csv y = 実測値(GDP) ŷ = 予測値(回帰直線から) e = y - ŷ
 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
import statsmodels.api as sm
import matplotlib.pyplot as plt
from scipy import stats

X = sm.add_constant(x)
model = sm.OLS(y, X).fit()

# 残差を取得
residuals = model.resid
fitted = model.fittedvalues
std_resid = model.get_influence().resid_studentized_internal

# 残差プロット
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes[0, 0].scatter(fitted, residuals)
axes[0, 0].axhline(0, color='red')
axes[0, 0].set_title('Residuals vs Fitted')

stats.probplot(residuals, plot=axes[0, 1])
axes[0, 1].set_title('Normal Q-Q')

# Cook's distance
inf = model.get_influence()
cook = inf.cooks_distance[0]
axes[1, 0].stem(cook)
axes[1, 0].axhline(4/len(x), color='red')
axes[1, 0].set_title("Cook's Distance")
📤 実行例: 残差統計 平均 ≈ 0(OLS の性質) SD ≈ 1,200 億円 最大正残差: 東京 +9,800 億 最大負残差: 大阪 -3,200 億
💬 読み方: OLS では残差平均=0、 残差と x の共分散=0 が成立。 残差 SD が y の SD より小さい → モデルが説明できている。 外れ値は要確認。

🚧 落とし穴と注意点

🔬 「残差」を深く理解する

残差の重要な性質

残差を見る習慣

「回帰した、 R² も高い」で満足せず、 必ず残差プロットを描く。 多くの研究者は残差分析を省略し、 重大なモデル誤指定を見逃しています。

📝 練習問題 — 理解度チェック

  1. この用語の基本定義を、 自分の言葉で説明できますか?
  2. この手法が使われる典型的なシナリオを3つ挙げられますか?
  3. この手法の前提条件・仮定を確認できますか?
  4. 結果を解釈する際の注意点は何ですか?
  5. 類似手法との違いを説明できますか?
  6. Python(または他言語)で実装できますか?
  7. SSDSE データで応用例を作成できますか?

📚 参考文献・さらなる学習

古典的教科書

実践書

オンラインリソース

💼 実務応用ガイド

データサイエンスプロジェクトでの位置づけ

  1. 探索的分析(EDA):基本統計量・可視化でデータを理解
  2. 前処理:標準化・正規化・欠損値処理
  3. モデリング:回帰・分類・クラスタリング
  4. 評価:CV、 指標計算、 統計的検定
  5. 解釈・報告:効果量・信頼区間・可視化

業界別ユースケース

📖 完全ガイド — 統計学習の参照表

分析の流れ — 8ステップ

  1. 問題定義:何を知りたいのか、 目的を明確に
  2. データ収集:信頼できるソースから(SSDSEなど公的データ)
  3. データクリーニング:欠損値、 外れ値、 入力ミスの確認
  4. 探索的分析(EDA):要約統計量、 ヒストグラム、 散布図
  5. 変数変換:標準化、 対数変換、 カテゴリのエンコード
  6. モデリング:適切な手法を選び、 学習
  7. 評価:CV、 指標、 統計的検定
  8. 解釈・報告:効果量、 信頼区間、 可視化

統計手法の選び方マトリクス

目的 1変数 2変数 多変量
記述平均, 中央値, 分散相関, 共分散PCA, 因子分析
可視化ヒストグラム, 箱ひげ散布図, ヒートマップ散布図行列, バイプロット
予測時系列モデル単回帰重回帰, Ridge, LASSO
分類ロジスティック回帰判別分析SVM, RF, NN
グループ化階級分け2次元クラスタリングk-means, 階層クラスタリング
検定1標本t検定2標本t検定, χ²ANOVA, MANOVA

サンプル数別の手法ガイド

n 推奨手法
n < 10記述統計のみ、 ノンパラ検定、 ベイズ統計
10 ≤ n < 30t検定, ブートストラップ, 単回帰
30 ≤ n < 200重回帰, ANOVA, 階層クラスタリング
200 ≤ n < 10000複雑な回帰, RF, GBM, k-means
n ≥ 10000深層学習, 大規模分散学習

Python 主要ライブラリ早見表

ライブラリ 用途
numpy数値計算の基礎、 行列演算
pandasデータフレーム、 表操作
scipy統計関数、 最適化、 線形代数
statsmodels古典統計、 検定、 回帰分析の詳細
scikit-learn機械学習、 前処理、 評価
matplotlib基本可視化
seaborn統計的可視化(高級)
plotlyインタラクティブ可視化
xgboost / lightgbm勾配ブースティング
PyTorch / TensorFlow深層学習

よくある質問(FAQ)

📓 用語のまとめ — 30秒で理解

このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。

必ず押さえるべき記号

記号 意味 読み方
μ母平均ミュー
σ母標準偏差シグマ
σ²母分散シグマ二乗
標本平均エックスバー
s標本標準偏差エス
n標本サイズエヌ
pp値、 比率ピー
α有意水準アルファ
β回帰係数、 第二種誤り率ベータ
r相関係数アール
決定係数アール二乗
Σ総和記号、 共分散行列シグマ大文字
N(μ, σ²)正規分布ノーマル ミュー シグマ二乗
t(df)t分布ティー
χ²(df)カイ二乗分布カイ二乗
F(d1, d2)F分布エフ
H₀, H₁帰無仮説、 対立仮説エイチゼロ、 エイチワン
E[X]期待値エクスペクタンス
Var(X)分散バリアンス
Cov(X, Y)共分散カバリアンス

💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。

🌐 データサイエンス全体像での位置づけ

データサイエンスのワークフロー

  1. ビジネス理解:何を解決したいか
  2. データ理解:どんなデータがあるか
  3. データ準備:前処理、 特徴量エンジニアリング
  4. モデリング:手法選択、 学習
  5. 評価:性能、 解釈性、 ビジネス価値
  6. 展開:実装、 運用、 監視

(CRISP-DM プロセスより)

主要分野のマッピング

分野 主要技術 代表ツール
記述統計要約量、 可視化pandas, matplotlib
推測統計検定、 信頼区間scipy.stats, statsmodels
機械学習予測、 分類、 クラスタリングscikit-learn, XGBoost
深層学習NN、 画像、 自然言語PyTorch, TensorFlow
時系列ARIMA、 状態空間、 LSTMstatsmodels, prophet
因果推論RCT、 IV、 DiD、 PSMDoWhy, EconML
ベイズ統計MCMC、 変分推論PyMC, Stan
最適化線形/凸/離散最適化scipy.optimize, cvxpy

キャリアパス

💎 良いデータ分析のための10のコツ

  1. 必ず可視化から始める:散布図、 ヒストグラム、 箱ひげ図
  2. 外れ値を意識する:除く前にドメイン的に理解
  3. 仮定を確認する:正規性、 独立性、 等分散性
  4. サンプルサイズに見合う複雑性:n=10 で深層学習はしない
  5. 効果量も併記する:p値だけでは不十分
  6. 信頼区間で不確実性を示す:点推定だけでは誤解の元
  7. 多重比較を補正する:探索的解析でも誠実に
  8. ホールドアウト or CV で評価する:訓練データの精度は意味がない
  9. 解釈可能性も重視する:ブラックボックスより white-box
  10. 再現可能なコードを書く:random_seed、 バージョン管理

🔗 用語間の関係 — 統計概念のネットワーク

記述統計の基本セット

これらは互いに深く関連します:

推測統計の基本セット

回帰モデルファミリー

クラスタリング・次元削減ファミリー

検定ファミリー

🗺️ 概念マップ — 3つの視点で体系を理解する

残差 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス関連・回帰回帰残差

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「残差」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「残差」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引(拡張)

残差・残差診断の重要語をクイックアクセス:

残差プロット 標準化残差 studentized 残差 てこ比 leverage Cook の距離 DFFITS / DFBETAS Q-Q プロット 不均一分散 系列相関(自己相関) 非線形パターン statsmodels OLS influence_plot Breusch-Pagan Durbin-Watson

🧮 SSDSE-B 実値計算 — 賃金回帰の残差を 4 プロットで診断

47都道府県の現金給与総額を「製造品出荷額(log)」「人口集中度(log)」で説明する OLS を当てはめ、 残差診断 4 プロット(残差 vs フィット、 Q-Q、 scale-location、 leverage-Cook)を作る。

🎯 解説: matplotlib で残差プロット(横軸: 予測値, 縦軸: 残差)を描画。 SSDSE-B-2026 で回帰モデルの妥当性を視覚的に診断。
📥 入力例: data/raw/SSDSE-B-2026.csv fitted = model.predict(X) residuals = y - fitted
 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
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import statsmodels.formula.api as smf
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df.columns = [c.strip() for c in df.columns]
df['log_mfg'] = np.log(df['製造品出荷額等'])
df['log_pop'] = np.log(df['総人口'])

res = smf.ols('現金給与総額 ~ log_mfg + log_pop', data=df).fit()
print(res.summary())

infl  = res.get_influence()
sresid = infl.resid_studentized_internal
fitted = res.fittedvalues
leverage = infl.hat_matrix_diag
cooks  = infl.cooks_distance[0]

fig, axes = plt.subplots(2, 2, figsize=(11, 9))
# (1) Residuals vs Fitted
axes[0,0].scatter(fitted, res.resid)
axes[0,0].axhline(0, ls='--', color='red')
axes[0,0].set_xlabel('Fitted'); axes[0,0].set_ylabel('Residual')
axes[0,0].set_title('Residuals vs Fitted')
# (2) Normal Q-Q
sm.qqplot(sresid, line='45', fit=True, ax=axes[0,1])
axes[0,1].set_title('Normal Q-Q')
# (3) Scale-Location
axes[1,0].scatter(fitted, np.sqrt(np.abs(sresid)))
axes[1,0].set_xlabel('Fitted'); axes[1,0].set_ylabel('√|standardized residual|')
axes[1,0].set_title('Scale-Location')
# (4) Residuals vs Leverage
axes[1,1].scatter(leverage, sresid)
for i, (h, r, c) in enumerate(zip(leverage, sresid, cooks)):
    if c > 4/len(df):
        axes[1,1].annotate(df.iloc[i]['都道府県'], (h, r), fontsize=8)
axes[1,1].set_xlabel('Leverage'); axes[1,1].set_ylabel('Std. residual')
axes[1,1].set_title('Residuals vs Leverage')
plt.tight_layout(); plt.savefig('residual_diag.png', dpi=140)
📤 実行例: 残差プロット 水平に散らばる → 線形性 OK 右上に東京の大正残差 全体的にランダム
💬 読み方: 残差プロットでパターン(U 字・扇形)が見えれば線形仮定違反。 ランダム雲なら OK。 0 の水平線を引いて偏りを確認。

典型的な観察例: Residual vs Fitted で東京・神奈川が右上に飛び出し、 Q-Q プロットの右裾も外れる。 Cook 距離も東京・神奈川が突出(> 4/n)。 つまり「賃金水準が高い大都市」は通常の OLS の仮定(等分散・線形)から外れており、 ロバスト回帰や層別モデルで補強する必要がある。

統計的な異常診断テスト

🎯 解説: Q-Q プロット(quantile-quantile)で残差の正規性を診断。 SSDSE-B-2026 の残差を正規分布の理論分位と比較し、 直線に乗るかチェック。
📥 入力例: data/raw/SSDSE-B-2026.csv from scipy import stats stats.probplot(residuals, plot=plt)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from statsmodels.stats.diagnostic import (
    het_breuschpagan, het_white, acorr_ljungbox)
from statsmodels.stats.stattools import durbin_watson

# 正規性
print('Shapiro:', stats.shapiro(res.resid))
# 不均一分散
bp = het_breuschpagan(res.resid, res.model.exog)
print(f'Breusch-Pagan : LM={bp[0]:.2f}, p={bp[1]:.4f}')
white = het_white(res.resid, res.model.exog)
print(f'White        : LM={white[0]:.2f}, p={white[1]:.4f}')
# 自己相関(時系列ならば)
print('Durbin-Watson :', durbin_watson(res.resid))
📤 実行例: Q-Q プロット 中央は直線に乗る 両端で外れ(裾が重い分布) Shapiro-Wilk p=0.04(要注意)
💬 読み方: Q-Q プロットが直線 → 正規分布。 端で外れる → 裾が重い・歪み。 47 サンプルは少なめなので外れに注意。 Shapiro-Wilk 検定も併用。

⚠️ 残差診断の落とし穴 — 6 つの典型ミス

① 生残差だけ見て分散の異質性を判断する

y のスケールが大きい観測ほど残差の絶対値が大きく見えるのは自然で、 これを「不均一分散だ」と判断するのは早計。 標準化残差(resid_studentized_internal)か外部スチューデント化残差(resid_studentized_external)を用いてスケールを除いた上で、 fitted 値との依存を見るのが正しい。 Breusch-Pagan / White の検定で形式的にも確認すること。 残差プロットは目視と検定を組み合わせて初めて意味を持つ。

② Q-Q プロットの裾の歪みを「正規性違反」と短絡する

Q-Q プロットは小サンプル(n < 30)では端点が大きく揺れるのが普通で、 「裾が反っているから非正規」と判断すると過検出になる。 中心極限定理により、 大標本では係数推定の頑健性は高い。 Shapiro-Wilk 検定や Kolmogorov-Smirnov 検定で形式的に確認し、 さらに「歪度・尖度」を数値で確認するのが安全。 残差の正規性は「予測区間の正確性」に効くが、 係数推定の不偏性には効かない点を分けて理解する。

③ Cook 距離だけで影響点を判定する

Cook 距離は便利だが「全係数への影響を 1 つの数値に圧縮」しているため、 個別係数への影響は見えない。 DFBETAS は係数ごとの影響、 DFFITS は予測値への影響、 leverage は X 空間上の極端さを別々に評価する。 大規模データで影響点を特定するには、 これら 4 指標を組み合わせる必要がある。 Cook の閾値も「4/n」と「1」の 2 流派があり、 解釈が割れる。

④ 時系列データに普通の OLS 残差診断を流用する

時系列回帰では残差に自己相関が残ることが多く、 OLS の標準誤差が過小評価される。 Durbin-Watson 統計量(≈ 2 ならOK、 < 1.5 or > 2.5 で系列相関の疑い)、 Ljung-Box 検定、 残差の ACF プロットで必ず確認する。 系列相関があれば Newey-West の HAC 標準誤差、 もしくは AR(1) 誤差付き GLS(ARMAX)に切り替える。 残差独立は線形回帰の四大仮定の一つで、 違反の影響は深刻。

⑤ 非線形パターンを線形項追加で誤魔化す

Residuals vs Fitted で U 字や逆 U 字のパターンが出るのは、 モデルが線形項だけでは捉えきれない非線形性のサイン。 これに対し「x² を追加する」だけで対応すると、 別の点で再び非線形パターンが出る。 根本対策は (a) 目的変数を log/sqrt 変換、 (b) 説明変数を spline / GAM で柔軟化、 (c) ツリー系モデルへ切り替え、 のいずれか。 「partial residual plot」「component-plus-residual plot」で個別変数の非線形性を確認する。

⑥ 残差を「予測誤差」と取り違える

学習データの残差は「フィット誤差」であって、 未知データへの「予測誤差」より楽観的になる。 RMSE を残差で計算しても汎化性能は分からない。 予測誤差を見るには交差検証 / hold-out / OOB(RF)/ test split のいずれかが必須。 「残差で良いから予測も良い」は過学習を見落とす典型ミス。 残差は仮定診断、 予測誤差は汎化能力評価、 と目的を切り分ける。

🐍 Python 実装バリエーション — statsmodels / scipy / sklearn

1. statsmodels の influence プロット(一発)

🎯 解説: 残差の分散均一性(homoscedasticity)を Breusch-Pagan 検定で確認。 SSDSE-B-2026 で残差の分散が x によらないかをチェック。
📥 入力例: data/raw/SSDSE-B-2026.csv from statsmodels.stats.diagnostic import het_breuschpagan het_breuschpagan(residuals, X)
1
2
3
4
import statsmodels.api as sm
import statsmodels.formula.api as smf
res = smf.ols('y ~ x1 + x2', data=df).fit()
fig = sm.graphics.influence_plot(res, criterion='cooks')
📤 実行例: BP 統計量=5.2 p=0.07 有意水準 0.05 でぎりぎり OK 扇形パターンを目視確認
💬 読み方: p>0.05 → 等分散仮定 OK。 違反していれば WLS(重み付き最小二乗)や log 変換。 SSDSE の人口・GDP は対数変換で改善することが多い。

2. 4 プロット診断を一括(plot_diagnostics)

🎯 解説: 残差の自己相関(Durbin-Watson 検定)。 SSDSE-B-2026 では時系列でないため通常不要だが、 県の並びに依存性がないか確認。
📥 入力例: data/raw/SSDSE-B-2026.csv from statsmodels.stats.stattools import durbin_watson durbin_watson(residuals)
1
2
3
4
5
6
# 時系列モデル(ARIMA 等)には組込みの plot_diagnostics があるが、
# 線形回帰は自作する必要がある(上の SSDSE 計算例を参照)
from statsmodels.graphics.regressionplots import (
    plot_leverage_resid2, plot_partregress_grid)
fig = plt.figure(figsize=(11, 8))
plot_partregress_grid(res, fig=fig)   # 部分回帰プロット
📤 実行例: DW 統計量=2.05 ≈ 2 → 自己相関なし < 1.5 → 正の自己相関 > 2.5 → 負の自己相関
💬 読み方: クロスセクション(県データ)では DW は通常気にしないが、 並びがランダムでないと自己相関が出ることも。 時系列回帰では必須チェック。

3. scipy.stats の正規性検定セット

🎯 解説: 標準化残差で外れ値を検出。 SSDSE-B-2026 で残差を SD で割った標準化値、 |z|>2 を要注意、 |z|>3 を強い外れ値として識別。
📥 入力例: data/raw/SSDSE-B-2026.csv std_resid = residuals / residuals.std() 外れ値: |std_resid| > 2
1
2
3
4
5
6
7
from scipy import stats
print('Shapiro-Wilk    :', stats.shapiro(res.resid))
print('Anderson-Darling:', stats.anderson(res.resid, dist='norm'))
print("D'Agostino K²   :", stats.normaltest(res.resid))
print('Jarque-Bera     :', stats.jarque_bera(res.resid))
print('Skewness        :', stats.skew(res.resid))
print('Kurtosis        :', stats.kurtosis(res.resid))
📤 実行例: 標準化残差 東京: +2.8(強い外れ値) 大阪: -1.9 愛知: +1.5 他: |z|<1.5
💬 読み方: |z|>2 は約 5% に該当、 |z|>3 は約 0.3%。 SSDSE では東京がよく強い外れ値。 削除でなく log 変換やロバスト回帰で対処。

4. sklearn で OOF 予測誤差を診断

🎯 解説: 影響度(Cook's distance)で重要な観測値を検出。 SSDSE-B-2026 で各県の Cook's D を計算し、 4/n を閾値として影響力大の県を特定。
📥 入力例: data/raw/SSDSE-B-2026.csv influence = model.get_influence() cooks_d = influence.cooks_distance[0] 閾値: 4/47 ≈ 0.085
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_predict, KFold

cv = KFold(n_splits=5, shuffle=True, random_state=0)
y_pred = cross_val_predict(LinearRegression(), X, y, cv=cv)
oof_resid = y - y_pred

fig, ax = plt.subplots(1, 2, figsize=(11, 4.5))
ax[0].scatter(y_pred, oof_resid); ax[0].axhline(0, ls='--', color='red')
ax[0].set_title('OOF Residuals')
sm.qqplot(oof_resid, line='45', fit=True, ax=ax[1])
📤 実行例: Cook's distance 東京: 0.45(極大) 大阪: 0.12 愛知: 0.09 他: <0.05
💬 読み方: Cook's D > 4/n で影響力大。 東京が突出 → モデル係数を強く左右。 除外シミュレーションで影響度確認。 ロバスト回帰で対処も可。

5. ロバスト回帰で残差を改善(HuberRegressor / RANSAC)

🎯 解説: 残差ヒストグラムで分布を確認。 SSDSE-B-2026 の残差ヒストグラム + 正規分布曲線を重ね、 視覚的に正規性をチェック。
📥 入力例: data/raw/SSDSE-B-2026.csv plt.hist(residuals, bins=20) 正規分布 PDF を重ね描き
1
2
3
4
5
from sklearn.linear_model import HuberRegressor, RANSACRegressor
huber = HuberRegressor().fit(X, y)
ransac = RANSACRegressor(random_state=0).fit(X, y)
# 外れ値判定マスク(RANSAC のみ)
inliers = ransac.inlier_mask_
📤 実行例: ヒストグラム 中央付近にピーク(0) 右に長い裾(東京の影響) 歪度=0.8(右歪み)
💬 読み方: 残差が正規分布から大きく逸れる → モデル不適切。 歪み大なら変換、 多峰なら層別解析。 47 サンプルは bin 数 10-15 が適切。

📌 補足セクション — 残差を SSDSE-B-2026 で確かめる

本セクションは「残差」を 47都道府県データ(SSDSE-B-2026)で具体的に確認するための追加教材です。 例として課税対象所得の実測値 − 回帰直線による予測値を扱います。

🎨 直感で掴む — 残差

残差を 47都道府県データで直感的に捉えるには、 まず「課税対象所得の実測値 − 回帰直線による予測値」を思い浮かべます。 東京都・大阪府・神奈川県のように総人口が大きい都道府県ほど、 課税対象所得や就業者数も大きくなる傾向があり、 こうしたデータの「形」を 残差 は要約します。

たとえば 47都道府県を散布図にすると、 右肩上がりの帯状にデータが並びます。 この「帯の傾き」「帯のばらつき」「帯から外れる外れ値」を表現する道具が、 ここで扱う 残差 だとイメージしてください。

🧮 実値で計算してみる — 残差

SSDSE-B-2026 の 47都道府県データから、 「課税対象所得の実測値 − 回帰直線による予測値」を Python で再現します。 まず一行で読み込めるよう、 引数を直書きしたシンプル版を示します:

# 最小コード(直書き)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv')

続いて、 列名はリポジトリ準拠(A1101 総人口、 A1102 男性人口、 D3201 課税対象所得、 等)の本番コードです。

import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=[0,1,2])
# 列名を 3 段ヘッダの最下段だけ採用(コード列: A1101, D3201 等)
df.columns = [c[-1] for c in df.columns]

# 2022 年の 47都道府県スナップショット
sub = df[df['年度コード'] == 2022].copy()
x = sub['A1101'].astype(float)   # 総人口
y = sub['D3201'].astype(float)   # 課税対象所得

# 残差の基礎統計
x_mean, y_mean = x.mean(), y.mean()
beta1 = ((x - x_mean) * (y - y_mean)).sum() / ((x - x_mean) ** 2).sum()
beta0 = y_mean - beta1 * x_mean

print(f'n = {len(x)}')             # 47
print(f'beta1 = {beta1:,.4f}')     # 傾き
print(f'beta0 = {beta0:,.4f}')     # 切片
print(f'相関係数 = {x.corr(y):.4f}')  # 0.95+ になる

# 残差・決定係数も計算
y_hat = beta0 + beta1 * x
resid = y - y_hat
ss_res = (resid ** 2).sum()
ss_tot = ((y - y_mean) ** 2).sum()
r2 = 1 - ss_res / ss_tot
print(f'R^2 = {r2:.4f}')

このコードを実行すると、 47都道府県データから 残差に関連する係数・指標が直接得られます。 SSDSE-B-2026 が手元にない場合は、 統計データ活用コンペティション公式ページからダウンロードしてください。

⚠️ 補足の落とし穴

🔗 関連用語(補足リンク)

相関係数 最小二乗法 残差 決定係数 共分散 p 値 標準誤差 多重共線性