論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
平均絶対誤差 (MAE)
Mean Absolute Error
回帰評価指標

🔖 キーワード索引

本ページのトピックを 1 タップで移動できます。 「MAE(平均絶対誤差)」を学ぶうえで押さえたい論点はすべてここに集約しました。

30秒で結論文脈ボックス直感で掴む数式・定義記号の意味実値で計算Python実装落とし穴関連手法関連用語グループ教材歴史背景応用例FAQ

MAE (Mean Absolute Error、 平均絶対誤差) は回帰モデルの評価指標で、 予測値と真値の差の絶対値の平均。 RMSE と違って二乗しないため 外れ値の影響を受けにくい。 損失関数として使うと中央値回帰になり、 単位は真値と同じ(円・人)で解釈しやすい。

MAE平均絶対誤差L1 loss中央値回帰RMSE との比較MAPEHuber loss頑健回帰評価指標scikit-learn mean_absolute_error

「MAE の定義 → RMSE/MAPE との使い分け → 損失関数としての性質」を構成する核キーワード。

💡 30秒で分かる結論

🍰 まずはやさしく

予測のズレを測る定規のようなものです。

平均的にどれくらい外れたかを知るために使います。

テストの予想点数と実際の点数の差に似ています。

この章ではMAEの基本的な意味を学びます。

予測値と実測値の 絶対差を平均した回帰誤差指標。 目的変数と同じ単位で「平均的にどれくらいズレているか」を示す。

💡 MAE トラブルシューティング Q&A 拡張版

Q. MAE が同じならモデルは同等?
A. No。 MAE が同じでも誤差の分布形状が違えば実用性は異なる。 RMSE・残差プロット・最大誤差を併せて見る必要があります。 たとえばモデル A が「全県 ±2000 人均一」、 モデル B が「45 県は ±100 人だが東京・沖縄で ±20000 人」は同じ MAE になり得ますが、 実用性は天と地。
Q. MAE を %(パーセント)で表示できる?
A. それは MAPE(Mean Absolute Percentage Error)= \( \frac{1}{n}\sum |y_i - \hat y_i|/|y_i| \)。 ただし \( y_i \) が 0 に近いとき発散する弱点があるため、 SSDSE-B-2026 の小規模県(鳥取・島根など)では不安定。 SMAPE(対称版)が代替案。
Q. MAE と回帰係数の関係は?
A. MAE 最小化(中央値回帰)の回帰係数は、 OLS(MSE 最小化、 平均回帰)の係数と 異なる値になります。 SSDSE-B-2026(2023 年度)で「総人口 → 出生数」を MAE で回帰すると傾き 0.0062、 MSE では 0.0061 のように微妙に違う(実測値)。 大きな差はないが、 外れ値があるほど差が広がる。
Q. ニューラルネットで MAE 損失を使うべき?
A. データに外れ値が多いなら有効。 ただし収束が遅いため、 学習率スケジュールを慎重に設定。 実務では Smooth L1 Loss(Huber) が中庸として人気。 PyTorch なら nn.SmoothL1Loss
Q. MAE のベンチマークはどこに公開?
A. Kaggle のコンペページで類似タスクの MAE スコアが公開されているので、 比較材料になります。 SSDSE-B のような国内データは、 提供元である独立行政法人統計センターの解説資料や統計検定の過去問・参考解答集が参考に。

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

🍰 まずはやさしく

予測モデルの正しさを判定する指標です。

どの予測方法が一番良いかを選ぶために使います。

スマホの充電持ちの予測精度を比べる時に役立ちます。

他の似た指標との違いについて解説します。

分野:機械学習・回帰分析の 評価指標。 モデル選択・ハイパーパラメータ調整・最終評価の場面で使う。

位置づけ:MSE / RMSE / R² と並ぶ 回帰モデル誤差指標の四天王。 MAE は 「平均的にどれくらいズレているか」 を人間に分かりやすい単位で示す。

関連MSE(二乗誤差)、 RMSE(MSE の平方根)、 (決定係数)。

🎨 直感で掴む

🍰 まずはやさしく

待ち合わせの遅刻時間の平均のようなものです。

予測がどれくらい外れたかを直感的に知るために使います。

部活の練習時間が予想とどれだけズレたかで考えます。

具体的にどう計算して考えるかを説明します。

MAE(Mean Absolute Error、 平均絶対誤差)は、 回帰モデルの予測がどれくらい外れているかを 「外れた量の平均」 で測る指標。 「人口から出生数を予測するモデル」を SSDSE-B-2026 で作ったとき、 47 都道府県それぞれの予測値と実測値の差を絶対値で平均したものが MAE。

日常の比喩でいえば、 MAE は 「待ち合わせの遅刻時間の平均」 に近い。 「2 分早く着いた」も「8 分遅刻した」も 絶対値 で 2 分・8 分として扱い、 平均値 5 分が MAE。 一方、 MSE はこれを二乗するので 4 + 64 = 68、 平均 34 = 「6 分弱の二乗」となり、 大きな遅刻ほど不釣り合いに重く効く

SSDSE-B-2026(2023 年度、 47 都道府県)で「人口 → 出生数」を線形回帰した場合、 MAE は実測で約 1,100 人になる。 これは「平均的に出生数を ±千人強の精度で当てている」と直感的に解釈できる。 単位が目的変数と同じなので、 ステークホルダーへの報告がしやすい。 たとえば「うちの自治体の出生予測 MAE は 800 人です」と言えば、 政策担当者は「800 人ぶんの保育所準備にバッファを持つ」のように 具体的な意思決定に直結する。

もう少し丁寧に:MAE は「中央値志向」の指標と言われる。 これは MAE 最小化が 条件付き中央値 を推定することと対応しているため。 一方の MSE 最小化は 条件付き平均 を推定する。 「中央値」は外れ値に強く、 「平均」は外れ値に弱い。 この統計的な性質の違いが、 MAE と MSE の振る舞いの違いに直結している。

誤解しやすいポイント:MAE が小さいからといって「モデルが良い」とは限らない。 たとえば「予測 = 全データの中央値」というナイーブなモデルでも、 偏った分布のデータでは意外と低い MAE を出すことがある。 したがって MAE は必ず ベースラインモデル(平均値予測・中央値予測)と比較して評価する。

📐 数式・定義

🍰 まずはやさしく

ズレの大きさを足して平均した数値です。

正確な誤差を計算するために使います。

買い物で予算と実際の金額がどれだけ違うかと考えます。

計算式と他の指標との関係について学びます。

サンプル数 \(n\)、 実測値 \(y_i\)、 予測値 \(\hat y_i\) としたとき、 平均絶対誤差は次で定義される。

$$ \text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat y_i| $$

MSE / RMSE / MAE の関係は次の通り。

$$ \text{MSE} = \frac{1}{n}\sum (y_i - \hat y_i)^2, \quad \text{RMSE} = \sqrt{\text{MSE}}, \quad \text{MAE} \le \text{RMSE} $$

不等式 \( \text{MAE} \le \text{RMSE} \) は Cauchy–Schwarz の不等式から従い、 等号成立は 全誤差の絶対値が等しいときのみ。 ばらつきが大きい予測ほど MAE と RMSE の差が広がる。

幾何学的解釈:MAE 最小化は 条件付き中央値 を推定すること、 MSE 最小化は 条件付き期待値 を推定すること。 つまり MAE と MSE はそれぞれ 中央値回帰平均値回帰 に対応する。

📐 MAE と関連数式集

MAE 周辺で覚えておくべき主要な数式を一覧。

定義:$$ \text{MAE} = \frac{1}{n}\sum_{i=1}^n |y_i - \hat y_i| $$

MSE:$$ \text{MSE} = \frac{1}{n}\sum_{i=1}^n (y_i - \hat y_i)^2 $$

RMSE:$$ \text{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^n (y_i - \hat y_i)^2} $$

不等式(Cauchy-Schwarz):$$ \text{MAE} \le \text{RMSE} $$

R²(決定係数):$$ R^2 = 1 - \frac{\sum (y_i - \hat y_i)^2}{\sum (y_i - \bar y)^2} $$

MAPE:$$ \text{MAPE} = \frac{1}{n}\sum_{i=1}^n \left|\frac{y_i - \hat y_i}{y_i}\right| \times 100\% $$

SMAPE:$$ \text{SMAPE} = \frac{1}{n}\sum_{i=1}^n \frac{2|y_i - \hat y_i|}{|y_i| + |\hat y_i|} \times 100\% $$

Huber 損失:$$ L_\delta(u) = \begin{cases} \frac{1}{2}u^2 & |u| \le \delta \\ \delta(|u| - \frac{1}{2}\delta) & |u| > \delta \end{cases} $$

Quantile 損失:$$ \rho_\tau(u) = u(\tau - \mathbb{1}\{u < 0\}) $$

劣勾配(MAE の最適化用):$$ \partial |u| = \begin{cases} \{1\} & u > 0 \\ [-1, 1] & u = 0 \\ \{-1\} & u < 0 \end{cases} $$

🔬 数式を言葉で読み解く

記号意味
nサンプル数。 SSDSE-B-2026 全国で集計するなら 47(都道府県)。
y_ii 番目のサンプルの実測値。 例:i = 東京都の出生数 = 86,348 人(2023 年度)など。
ŷ_iモデルが予測した値。 線形回帰の場合 \(\hat y_i = a x_i + b\)。
|·|絶対値。 「予測のズレ」を符号によらず正の値として扱う。
Σ総和。 全サンプルで誤差を足し上げる。
MAE平均絶対誤差。 単位は y と同じ(出生数なら「人」)。
MSE平均二乗誤差。 単位は y² 。「人²」では解釈しにくいので RMSE で y 単位に戻す。
RMSEMSE の平方根。 MAE と同じ単位だが、 外れ値の影響をより重く受ける。

🔬 深掘り:MAE のさらに詳細な数理

MAE 損失の劣勾配と SGD 収束

MAE 損失 \( L = \frac{1}{n}\sum|y_i - \hat y_i| \) は、 予測値 \( \hat y_i = y_i \) で微分不可能です。 この点では 劣勾配(subgradient)という拡張概念を使い、 \( \partial_{\hat y} L = -\frac{1}{n}\sum \text{sgn}(y_i - \hat y_i) \) と書きます。 ここで \( \text{sgn}(0) \in [-1, 1] \) は劣勾配の集合です。 確率的勾配降下法(SGD)でこれを使うと、 各ステップで勾配の符号だけが効くため、 学習率を慎重に設定しないと振動します。 実務では PyTorch の nn.L1Loss が MAE 損失で、 内部的には sign 関数で劣勾配を計算しています。

中央値推定との等価性の証明スケッチ

「定数 \( c \) でサンプル \( \{x_1, \dots, x_n\} \) を代表する」最適化問題で \( c^* = \arg\min_c \sum|x_i - c| \) を考えます。 \( c \) の微小変化に対する目的関数の変化は \( \frac{dL}{dc} = -\#\{x_i > c\} + \#\{x_i < c\} \) です。 これが 0 になるのは \( \#\{x_i > c\} = \#\{x_i < c\} \) のとき、 つまり \( c \) が中央値のときです。 一方、 MSE 損失 \( \sum(x_i - c)^2 \) の微分は \( -2\sum(x_i - c) = 0 \) より \( c = \bar x \)(平均)になります。 この対比が「MAE は中央値、 MSE は平均」と呼ばれる所以です。

分位点回帰との関係

MAE は分位点回帰(quantile regression)で \( \tau = 0.5 \)(中央値分位点)の特殊ケースです。 一般の分位点 \( \tau \in (0, 1) \) では、 損失関数は \( \rho_\tau(u) = u(\tau - \mathbb{1}\{u < 0\}) \) というピン関数になり、 \( \tau = 0.5 \) のとき \( \rho_{0.5}(u) = 0.5|u| \) となって MAE と比例します。 SSDSE-B-2026 で「90% 分位点回帰」を行えば、 「最悪ケースの予測誤差」を最適化でき、 リスク管理に応用できます。 scikit-learn の QuantileRegressor で実装可能です。

影響関数とロバスト性

統計量の 影響関数(influence function)とは「1 サンプルを微小に変えたときに推定値がどれだけ変わるか」を表す関数です。 MAE の影響関数は 有界(最大 1)ですが、 MSE の影響関数は 非有界(誤差に比例して無限大)です。 これが「MAE は外れ値にロバスト、 MSE はロバストでない」という主張の数理的な根拠です。 SSDSE-B-2026 のように東京・沖縄のような特異な観測値を含むデータでは、 MAE のロバスト性が活きる場面が多いです。

Huber 損失:MAE と MSE のハイブリッド

Huber 損失は \( L_\delta(u) = \begin{cases} \frac{1}{2}u^2 & |u| \le \delta \\ \delta(|u| - \frac{1}{2}\delta) & |u| > \delta \end{cases} \) で定義されます。 小さい誤差は MSE のように二次関数、 大きい誤差は MAE のように線形関数として扱います。 \( \delta \) はハイパーパラメータで、 経験的には目的変数の標準偏差の 1.345 倍が「ガウス分布で 95% 効率」のロバスト推定量を与えます。 SSDSE-B-2026(2023 年度)の出生数予測では、 出生数の標準偏差 ≒ 17,000 人なので \( \delta = 23,000 \) 程度が目安です。

MAE と Median AE の違い

類似の指標として Median Absolute Error(MedianAE)があります。 MAE が「絶対誤差の平均」なのに対し、 MedianAE は「絶対誤差の中央値」です。 SSDSE-B-2026 で 47 都道府県の絶対誤差を並べたとき、 MAE は全 47 県の平均、 MedianAE は 24 番目(中央順位)の県の絶対誤差です。 外れ値が極端に大きいデータでは、 MedianAE のほうが「典型的な誤差」を反映しやすいと言われます。 ただし MedianAE は感度が低く、 「半分以上の県の誤差が改善した」場合のみ動くため、 モデル比較の感度が落ちる弱点があります。

重み付き MAE(Weighted MAE)

サンプルごとに重要度が異なる場合、 重み付き MAE \( \text{WMAE} = \sum w_i |y_i - \hat y_i| / \sum w_i \) を使います。 SSDSE-B-2026 で「人口比例で重み付けする」と、 東京都の予測誤差が小さい県の 20 倍以上の重みを持ち、 「全国民の総体としての誤差」を最小化することになります。 これは政策評価で重要で、 「住民数の多い県の予測精度を優先する」場合に有効です。

MAE と評価指標の選択フローチャート

評価指標の選択は ① 単位の解釈性、 ② 外れ値感度、 ③ 最適化の容易さ、 ④ 比較の文脈の 4 軸で決めます。 SSDSE-B-2026 の出生数予測なら、 ① 単位が「人」で読みやすい → MAE / RMSE、 ② 外れ値(北海道・沖縄)を緩和したい → MAE、 ③ 線形回帰でフィット → どちらでも OK(OLS は MSE 最適化)、 ④ ステークホルダー報告 → MAE(人間が読める)、 という流れで MAE が選ばれます。 一方、 ニューラルネット学習なら ③ で MSE / Huber が選ばれます。

🧪 SSDSE-B-2026 完全実装例

「総人口 → 出生数」予測の完全な再現コード(読み込みから可視化まで)。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A4101(出生数) 北海道 5,092,000 24,430 東京都 14,086,000 86,348 沖縄県 1,468,000 12,549 …(全 47 行)
 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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, HuberRegressor, QuantileRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, median_absolute_error
from sklearn.model_selection import KFold

# 1) データ読み込み(SSDSE-B-2026、先頭列は年度)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)  # 2023 年度・47 都道府県
print(f'読み込み: {len(df)} 都道府県')

# 2) 説明変数・目的変数
X = df[['A1101']].values  # 総人口
y = df['A4101'].values    # 出生数
prefs = df['Prefecture'].values

# 3) 複数モデルで MAE を比較
models = {
    '線形回帰 (MSE 最適化)': LinearRegression(),
    'Huber 回帰 (ロバスト)': HuberRegressor(epsilon=1.35),
    '分位点回帰 τ=0.5 (MAE 最適化)': QuantileRegressor(quantile=0.5, alpha=0),
    '分位点回帰 τ=0.9 (上位予測)': QuantileRegressor(quantile=0.9, alpha=0),
}

results = []
for name, model in models.items():
    model.fit(X, y)
    y_pred = model.predict(X)
    mae = mean_absolute_error(y, y_pred)
    rmse = np.sqrt(mean_squared_error(y, y_pred))
    medae = median_absolute_error(y, y_pred)
    r2 = r2_score(y, y_pred)
    results.append({
        'model': name, 'MAE': mae, 'RMSE': rmse,
        'MedianAE': medae, 'R²': r2, 'RMSE/MAE': rmse / mae,
    })

results_df = pd.DataFrame(results)
print(results_df.to_string(index=False))

# 4) 寄与上位 5 県の特定
y_pred = models['線形回帰 (MSE 最適化)'].predict(X)
residuals = np.abs(y - y_pred)
top5_idx = np.argsort(residuals)[-5:][::-1]
print('\n[MAE 寄与トップ 5 都道府県]')
for i in top5_idx:
    print(f'  {prefs[i]}: |残差| = {residuals[i]:,.0f} 人 (実測={y[i]:,.0f}, 予測={y_pred[i]:,.0f})')

# 5) 5-fold CV
print('\n[5-fold CV with MAE]')
maes_cv = []
for tr, te in KFold(n_splits=5, shuffle=True, random_state=0).split(X):
    m = LinearRegression().fit(X[tr], y[tr])
    maes_cv.append(mean_absolute_error(y[te], m.predict(X[te])))
print(f'CV-MAE = {np.mean(maes_cv):,.0f} ± {np.std(maes_cv):,.0f} 人')

# 6) 可視化
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
axes[0].scatter(X.ravel(), y, alpha=0.6, label='実測')
xs = np.linspace(X.min(), X.max(), 100).reshape(-1, 1)
for name, m in models.items():
    axes[0].plot(xs, m.predict(xs), label=name)
axes[0].set_xlabel('総人口 A1101 (人)'); axes[0].set_ylabel('出生数 A4101 (人)')
axes[0].legend(); axes[0].set_title('SSDSE-B-2026 出生数モデル比較')

axes[1].bar(range(len(results_df)), results_df['MAE'])
axes[1].set_xticks(range(len(results_df)))
axes[1].set_xticklabels(results_df['model'], rotation=30, ha='right')
axes[1].set_ylabel('MAE (人)'); axes[1].set_title('MAE で見るモデル比較')
plt.tight_layout()
plt.savefig('outputs/mae_full_comparison.png', dpi=120, bbox_inches='tight')
📤 実行例(実測) 読み込み: 47 都道府県 model MAE RMSE MedianAE R² RMSE/MAE 線形回帰 (MSE 最適化) 1145.679973 1621.611122 854.545247 0.990871 1.415414 Huber 回帰 (ロバスト) 1147.669235 1621.936615 855.114010 0.990867 1.413244 分位点回帰 τ=0.5 (MAE 最適化) 1143.511754 1643.819625 871.300329 0.990619 1.437519 分位点回帰 τ=0.9 (上位予測) 1831.885924 2530.751391 1435.319964 0.977765 1.381501 [MAE 寄与トップ 5 都道府県] 北海道: |残差| = 5,976 人 (実測=24,430, 予測=30,406) 沖縄県: |残差| = 4,265 人 (実測=12,549, 予測=8,284) 福岡県: |残差| = 3,469 人 (実測=33,942, 予測=30,473) 愛知県: |残差| = 3,437 人 (実測=48,402, 予測=44,965) 大阪府: |残差| = 2,477 人 (実測=55,292, 予測=52,815) [5-fold CV with MAE] CV-MAE = 1,204 ± 494 人

実行結果(2023 年度実測):単回帰の MAE ≒ 1,146 人、 Huber 回帰の MAE ≒ 1,148 人、 分位点回帰 τ=0.5 の MAE ≒ 1,144 人。 このデータでは総人口と出生数の直線関係が非常に強い(R² = 0.991)ため 3 モデルの差はわずかで、 MAE を直接最適化する分位点回帰がごく僅かに小さい。 分位点回帰 τ=0.9 は MAE ≒ 1,832 人と大きくなる(上位側の予測を狙う指標なので当然)。 「指標が違えば最適モデルも違う」ことを確認できる例。

📊 実務テンプレート:MAE 報告書フォーマット

SSDSE-B-2026 を題材に、 MAE を含む回帰評価の報告書テンプレートを示します。 統計検定・データサイエンスコンペ・自治体報告書のいずれにも応用可能です。

セクション 記述例
データSSDSE-B-2026 2023 年度 47 都道府県データ、 説明変数 A1101 (総人口)、 目的変数 A4101 (出生数)
モデル線形回帰 \( \hat y = a \cdot x + b \)、 OLS で学習
評価指標MAE = 1,146 人、 RMSE = 1,622 人、 R² = 0.991、 5-fold CV-MAE = 1,204 ± 494 人(実測)
解釈「平均的に ±1,146 人の予測精度。 RMSE/MAE = 1.42 で軽度の外れ値あり。 R² = 0.991 で説明力は十分。」
外れ値診断北海道 (−5,976 人)、 沖縄県 (+4,265 人) が大きく外れる。 出生率の地域差を反映。
改善案老年人口・大学数を追加 → 重回帰の in-sample MAE = 1,008 人。 ただし CV-MAE は 1,472 人と単回帰より悪化(n=47 での過学習)し、 変数追加が常に有効とは限らない
限界単年度データのため経年変化を捉えない。 都道府県という粗い空間単位での予測。

🎯 学習チェック:MAE 演習問題

  1. 計算問題:実測値 [100, 95, 110, 200]、 予測値 [105, 100, 105, 195] の MAE は? (答:5.0)
  2. 解釈問題:「MAE = 1,200 人、 RMSE = 3,500 人」というモデルの特徴を言葉で説明せよ。 (答:RMSE/MAE ≒ 2.9 と高いので外れ値が支配的。 平均的なズレは 1,200 人だが、 一部の県で大外しがある)
  3. SSDSE 応用:SSDSE-B-2026 の「総人口 → 大学数 E6102」を単回帰したとき、 想定される MAE のオーダーは? (答:大学数は 2023 年度の 47 県で 2〜144 校。 標準偏差 ≒ 23 校、 in-sample MAE は実測で約 5 校)
  4. 選択問題:以下のうち MAE が MSE より適している場面は? ① 外れ値が多い ② NN 損失関数 ③ 自治体報告書 ④ 平均値推定 (答:① と ③。 ② は微分不可、 ④ は MSE が中央値ではなく平均を返す)
  5. コーディング:sklearn で MAE をスコア関数として使う cross_val_score 呼び出しを書け。 (答:cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=5))

📈 MAE 詳細ケーススタディ:SSDSE-B-2026 出生数予測

本セクションでは、 SSDSE-B-2026 の出生数予測を題材に、 MAE の使い方を 段階的に体験できるケーススタディを示します。 統計初学者・データサイエンス入門者が「MAE を実務でどう活かすか」を理解できる構成です。

ステップ 1:ベースラインモデル(全平均予測)の MAE

最も単純なモデルとして「全 47 都道府県の出生数の平均値で予測する」ベースラインを考えます。 SSDSE-B-2026(2023 年度)の出生数の全国平均は約 15,500 人/県。 各県の実測値と平均値の差を 47 件平均すると、 MAE = 約 11,800 人(ばらつきが大きいため)になります。 これが 「何もしないモデル」の MAEであり、 これ以上小さい MAE を出せないモデルは作る意味がありません。

ステップ 2:単回帰モデル(人口 → 出生数)の MAE

「総人口 A1101 で出生数 A4101 を予測する」単回帰モデルを学習すると、 MAE は約 1,146 人まで下がります(実測)。 ベースライン 11,800 人から約 1/10 に削減。 これは「人口情報を 1 つ足すだけで予測精度が劇的に向上する」ことを示します。 解釈:「平均的にどの県の出生数も ±1,100 人強の精度で当たる」。

ステップ 3:重回帰(人口 + 老年人口 + 大学数 → 出生数)の MAE

説明変数を 3 つ(総人口 A1101・老年人口 A1303・大学数 E6102)に増やした重回帰では、 in-sample MAE が約 1,008 人までわずかに低下(実測)。 総人口だけでほぼ説明できるため、 改善幅は小さい。 「変数を足せば必ず大きく改善する」わけではないことを示す好例です。

ステップ 4:非線形モデル(Random Forest)の MAE

Random Forest(非線形)で同じ 3 変数を入力すると、 in-sample MAE は約 924 人までさらに低下(実測)。 ただしこれは学習データへの当てはまりに過ぎず、 次のステップで見るように汎化性能はむしろ悪化します。 解釈性も低下するため、 自治体報告書では線形モデルの方が好まれることも。

ステップ 5:交差検証で汎化性能を測る

in-sample MAE(学習データで評価)は楽観的なので、 5-fold CV で out-of-sample MAE を測ります。 実測では単回帰の CV-MAE = 1,204 人に対し、 重回帰は CV-MAE = 1,472 人(in-sample 1,008 より悪い)、 Random Forest は CV-MAE = 2,470 人(in-sample 924 より大幅に悪い)。 複雑なモデルほど CV と in-sample の差が大きく、 n=47 では過学習が顕著。 「自分のモデルは新しいデータで本当に同じ精度を出すか?」を確認するのが交差検証の役割です。

ステップ 6:MAE 寄与県の特定

単回帰の残差を県別に見ると、 北海道(−5,976 人)、 沖縄県(+4,265 人)、 福岡県(+3,469 人)が大きく外れる傾向(実測)。 沖縄・福岡は 出生率が相対的に高いため人口から予測されるより出生数が多く、 北海道は少子高齢化が進み予測より少ない。 これら「外れ県」のパターンを理解することで、 モデル改善の方向性(地方区分ダミー追加、 出生率の階層モデル化など)が見えてきます。

ステップ 7:報告書での MAE 提示

最終報告書では「MAE = 1,204 ± 494 人(5-fold CV)、 R² = 0.991、 RMSE = 1,622 人(in-sample)」とセットで報告。 「平均的に ±1,200 人の精度で各都道府県の出生数を予測。 RMSE/MAE = 1.42 で軽度の外れ値あり。 大半の県は ±1,000 人以内に収まるが、 北海道・沖縄で大きく外れる」と解釈を添える。

🎓 MAE 学術的視点:3 つの確率論的解釈

解釈 1:ラプラス分布の最尤推定

残差 \( \epsilon_i = y_i - \hat y_i \) がラプラス分布(両側指数分布)\( p(\epsilon) = \frac{1}{2b}\exp(-|\epsilon|/b) \) に従うと仮定すると、 対数尤度は \( \log L = -n\log(2b) - \frac{1}{b}\sum |\epsilon_i| \)。 これを最大化する \( \hat\theta \) は MAE 最小化と等価。 つまり MAE 最小化は ラプラス分布ノイズの最尤推定と同じ。 ラプラス分布は正規分布より裾が重く、 外れ値を許容する分布です。

解釈 2:分位点回帰の中央値ケース

分位点回帰では τ-分位点を予測。 τ=0.5 が中央値で、 損失関数が MAE と一致。 \( \rho_{0.5}(u) = 0.5|u| \)。 つまり MAE 回帰 = 中央値回帰。 一般の τ に対し \( \rho_\tau(u) = u(\tau - \mathbb{1}\{u<0\}) \) で「上位 10%」「下位 10%」のような分位点予測ができる。 リスク管理では τ=0.95 で「95% パーセンタイル予測」を用いる。

解釈 3:ロバスト推定の特殊ケース

M 推定(一般化最尤推定)の枠組みで、 MAE は 影響関数が有界な推定量のシンプルケース。 Huber 損失(\( |\epsilon| \le \delta \) で MSE、 \( |\epsilon| > \delta \) で MAE)は MAE と MSE のハイブリッドで、 ガウス分布のもとで漸近効率を保ちつつ外れ値耐性を持つ。 SSDSE のような実データでは Huber 損失が実務的に最良であることが多い。

🔧 MAE 関連ツール詳細

ライブラリ 関数 用途 補足
sklearnmean_absolute_error標準 MAE 計算sample_weight 指定可
sklearnmedian_absolute_error中央値版(よりロバスト)外れ値多い場合に推奨
sklearnQuantileRegressor中央値回帰(=MAE 最適化)τ=0.5 で MAE と等価
sklearnHuberRegressorMAE と MSE のハイブリッドepsilon でしきい値
PyTorchnn.L1LossNN 訓練の MAE 損失劣勾配で SGD 可能
PyTorchnn.SmoothL1LossHuber 損失小誤差は MSE、 大誤差は MAE
XGBoostobjective='reg:absoluteerror'MAE 目的関数勾配ブースティングで MAE 最適化
LightGBMobjective='mae'MAE 目的関数勾配ブースティング

🔬 MAE 12 ステップ完全ワークフロー

SSDSE-B-2026 で「総人口 → 出生数」の回帰問題を MAE で評価する完全ワークフロー。 各ステップにコード断片と解説を付けます。

Step 1:データ取得と確認

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A4101(出生数) 北海道 5,092,000 24,430 東京都 14,086,000 86,348 沖縄県 1,468,000 12,549 …(全 47 行)
1
2
3
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)  # 2023 年度・47 都道府県
print(df[['Prefecture', 'A1101', 'A4101']].head())
📤 実行例(実測) Prefecture A1101 A4101 0 北海道 5092000 24430 1 青森県 1184000 5696 2 岩手県 1163000 5432 3 宮城県 2264000 12328 4 秋田県 914000 3611

読み込みエラーは encoding を shift-jiscp932 で試す。 BOM が付いている場合は utf-8-sig

Step 2:欠損・型の確認

1
2
print(df[['A1101', 'A4101']].isnull().sum())
print(df[['A1101', 'A4101']].dtypes)
📤 実行例(実測) A1101 0 A4101 0 dtype: int64 A1101 int64 A4101 int64 dtype: object

SSDSE-B-2026 は欠損が少ないが、 型が object(文字列)になっている場合は pd.to_numeric で変換。

Step 3:基本統計量の計算

1
print(df[['A1101', 'A4101']].describe())
📤 実行例(実測) A1101 A4101 count 4.700000e+01 47.000000 mean 2.645809e+06 15473.808511 std 2.797551e+06 17155.475476 min 5.370000e+05 3263.000000 25% 1.034000e+06 5472.000000 50% 1.549000e+06 9524.000000 75% 2.636500e+06 14390.000000 max 1.408600e+07 86348.000000

5 数要約(min, 25%, 50%, 75%, max)と平均・標準偏差で分布の概形を把握。

Step 4:散布図で関係性を可視化

plt.scatter(df['A1101'], df['A4101'])
plt.xlabel('総人口'); plt.ylabel('出生数')
plt.savefig('outputs/scatter.png', dpi=120)

「線形回帰で当てはまりそうか」「外れ値は?」を目視確認。

Step 5:訓練・検証データの分割

1
2
3
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    df[['A1101']], df['A4101'], test_size=0.3, random_state=42)

47 件と少ないので、 5-fold CV のほうが推奨。 学習データに過学習しないように。

Step 6:ベースラインモデル(平均値予測)

1
2
3
y_baseline = np.full_like(y_test, y_train.mean())
mae_baseline = mean_absolute_error(y_test, y_baseline)
print(f'Baseline MAE: {mae_baseline:,.0f}')
📤 実行例(実測) Baseline MAE: 13,716

「自分のモデル」が「平均値モデル」より良いことを必ず確認。

Step 7:単回帰モデルの学習

1
2
3
4
5
model = LinearRegression().fit(X_train, y_train)
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f'Linear MAE: {mae:,.0f}')
print(f'Improvement: {(mae_baseline - mae) / mae_baseline * 100:.1f}%')
📤 実行例(実測) Linear MAE: 1,504 Improvement: 89.0%

ベースラインからの改善率を計算。 50% 以上なら良いモデル。

Step 8:複数指標の比較

1
2
3
4
print(f'MAE: {mean_absolute_error(y_test, y_pred):,.0f}')
print(f'RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):,.0f}')
print(f'R²: {r2_score(y_test, y_pred):.3f}')
print(f'MedianAE: {median_absolute_error(y_test, y_pred):,.0f}')
📤 実行例(実測) MAE: 1,504 RMSE: 2,072 R²: 0.991 MedianAE: 936

MAE 単独では不十分。 RMSE・R²・MedianAE で多面的に評価。

Step 9:残差分析

residuals = y_test - y_pred
plt.scatter(y_pred, residuals)
plt.axhline(0, color='red'); plt.xlabel('予測'); plt.ylabel('残差')
plt.savefig('outputs/residuals.png', dpi=120)

残差プロットで「予測の偏り」を可視化。 ランダムに散らばっていれば OK、 パターンがあるとモデル改善余地あり。

Step 10:交差検証で汎化性能

1
2
3
4
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, df[['A1101']], df['A4101'],
    cv=5, scoring='neg_mean_absolute_error')
print(f'CV-MAE: {-scores.mean():,.0f} ± {scores.std():,.0f}')
📤 実行例(実測) CV-MAE: 1,403 ± 493

5-fold CV で汎化性能を確認。 in-sample MAE より大幅に大きいなら過学習。

Step 11:複数モデル比較

1
2
3
4
5
from sklearn.ensemble import RandomForestRegressor
for name, m in [('Linear', LinearRegression()), ('RF', RandomForestRegressor())]:
    cv_mae = -cross_val_score(m, df[['A1101']], df['A4101'],
        cv=5, scoring='neg_mean_absolute_error').mean()
    print(f'{name}: CV-MAE = {cv_mae:,.0f}')
📤 実行例(実測) Linear: CV-MAE = 1,403 RF: CV-MAE = 2,404

線形・非線形モデルの MAE を比較し、 最適なモデルを選択。

Step 12:報告書の作成

1
2
3
4
5
6
7
8
report = f'''
データ: SSDSE-B-2026 47 都道府県
モデル: 線形回帰(説明変数=総人口、 目的変数=出生数)
CV-MAE: {-scores.mean():,.0f} ± {scores.std():,.0f}
解釈: 平均的に ±{int(-scores.mean()):,} 人の精度で予測
改善余地: 説明変数の追加は CV-MAE で必ず再検証(n=47 では過学習で悪化しうる)
'''
print(report)
📤 実行例(実測) データ: SSDSE-B-2026 47 都道府県 モデル: 線形回帰(説明変数=総人口、 目的変数=出生数) CV-MAE: 1,403 ± 493 人 解釈: 平均的に ±1,403 人の精度で予測 改善余地: 説明変数の追加は CV-MAE で必ず再検証(n=47 では過学習で悪化しうる)

報告書テンプレート:データ・モデル・指標・解釈・改善余地の 5 点セット。

🔬 数式を言葉で読み解く(MAE 実装 4 ステップ)

MAE (平均絶対誤差) は (1/n) Σ |y_i - ŷ_i|。 言葉で読み解けば「全予測誤差の絶対値を平均しただけ」。 シンプルだが、 RMSE と並ぶ回帰評価の双璧。 SSDSE-B-2026 で 4 ステップで体感する。

▶ ブロック 1: 手計算で MAE を求める

このコードでやること: SSDSE-B-2026 から人口を読み、 「全県の平均」をベースラインとして予測。 各県の誤差を絶対値で平均して MAE を出す。

📥 入力データ (抜粋):

SSDSE-B-2026 (2023 年度), Prefecture, A1101(総人口, 千人換算) 北海道, 5092 青森県, 1184 東京都, 14086 ...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
import numpy as np

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

y_true = (df['A1101'] / 1000).values  # 総人口 (千人)
y_pred = np.full_like(y_true, fill_value=int(y_true.mean()))  # ベースライン: 全県平均

mae = np.mean(np.abs(y_true - y_pred))
print(f'全県平均 (予測値): {y_pred[0]}')
print(f'MAE (手計算): {mae:.1f}')

📤 実行例:

全県平均 (予測値): 2645.0 MAE (手計算): 1960.3

💬 MAE 1960 (千人) = 平均的に予測が約 196 万人ずれる。 47 県中、 東京 1409 万・神奈川 923 万・大阪 876 万のような大都市が平均を大きく超えるため誤差が大きい。 これが「ベースライン MAE」。

▶ ブロック 2: sklearn の mean_absolute_error で同値確認

このコードでやること: 手計算と sklearn の API で結果が一致することを確認。 実務では sklearn.metrics.mean_absolute_error を使う。

1
2
3
4
5
6
from sklearn.metrics import mean_absolute_error

mae_sklearn = mean_absolute_error(y_true, y_pred)
print(f'手計算 MAE: {mae:.4f}')
print(f'sklearn MAE: {mae_sklearn:.4f}')
print(f'一致: {np.isclose(mae, mae_sklearn)}')

📤 実行例:

手計算 MAE: 1960.2979 sklearn MAE: 1960.2979 一致: True

💬 当然完全一致。 sklearn API は内部で同じ式を計算しているだけ。 量産環境では sklearn を使うとサンプル重み・多変量対応・並列化の恩恵が受けられる。

▶ ブロック 3: MAE vs RMSE で外れ値感度を比較

このコードでやること: 同じデータで MAE と RMSE を比較。 RMSE は二乗で平均するので外れ値 (東京・大阪) の影響を強く受ける。 MAE は線形なので外れ値の影響が穏やか。

1
2
3
4
5
6
7
8
from sklearn.metrics import mean_squared_error

mae_val = mean_absolute_error(y_true, y_pred)
rmse_val = np.sqrt(mean_squared_error(y_true, y_pred))
print(f'MAE  = {mae_val:.0f}')
print(f'RMSE = {rmse_val:.0f}')
print(f'RMSE / MAE = {rmse_val/mae_val:.2f}')
print(f'(理論最小 1.0、 RMSE が大きいほど外れ値影響あり)')

📤 実行例:

MAE = 1960 RMSE = 2768 RMSE / MAE = 1.41 (理論最小 1.0、 RMSE が大きいほど外れ値影響あり)

💬 RMSE/MAE = 1.41 で、 外れ値の影響が顕著。 47 県のような長い裾分布では MAE の方が「典型的な誤差」を反映する。 評価指標選びの基準: 外れ値が「本当の誤差」なら RMSE、 「測定ノイズ」なら MAE。

▶ ブロック 4: MAE を線形回帰の評価で使う

このコードでやること: 老年人口 A1303 から総人口 A1101 を予測する単回帰モデルを作り、 5-fold CV で MAE と RMSE を比較。 ベースライン MAE との改善幅を観察。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

X = (df[['A1303']] / 1000).values   # 老年人口(65歳以上、千人)
y = (df['A1101'] / 1000).values     # 総人口 (千人)

lr = LinearRegression()
mae_cv = -cross_val_score(lr, X, y, cv=5,
                          scoring='neg_mean_absolute_error').mean()
rmse_cv = -cross_val_score(lr, X, y, cv=5,
                           scoring='neg_root_mean_squared_error').mean()
print(f'単回帰 MAE (CV): {mae_cv:.0f} (ベースライン {mae_val:.0f} から改善)')
print(f'単回帰 RMSE (CV): {rmse_cv:.0f}')

📤 実行例:

単回帰 MAE (CV): 248 (ベースライン 1960 から改善) 単回帰 RMSE (CV): 416

💬 ベースライン MAE 1960 → 単回帰 248 (約 1/8)。 「総人口は老年人口 A1303 でほぼ予測できる」と定量的に言える (両者は強く相関する)。 RMSE決定係数 と併用して評価の頑健性を保つ。

📈 MAE を SSDSE-B-2026 で徹底検証する補論

本セクションは「MAE という指標が、 都道府県データという 外れ値の宝庫 でどう振る舞うのか」を、 散布図・ヒストグラム・箱ひげ図の 3 種類の図で 視覚的に 確認するための拡張パートです。 ここでの議論は、 本文で示した「MAE は外れ値の影響が MSE より小さい」「単位が直感的」という性質を、 実データで体感するための補強材料です。 教育用ハンズオン教材として、 図とコードと数値解釈をセットで提示します。

🎨 散布図で MAE の幾何学的意味を掴む

下の散布図は、 SSDSE-B-2026 の「総人口 A1101」と「一般診療所数 I5102」の対応関係を都道府県別にプロットしたものです。 両者の相関係数は r ≈ 0.972 と極めて強く、 この関係を単回帰でモデル化したとき、 各点と回帰直線の 垂直距離 がそのまま「絶対誤差 \(|y_i - \hat y_i|\)」に該当し、 これを 47 都道府県で平均したものが MAE です。 RMSE が「点と直線の距離の 二乗平均の平方根」であるのに対し、 MAE は「素直に絶対値の平均」なので、 散布図上の 距離をそのまま読める 直感性が魅力です。

散布図: 47 都道府県の総人口と一般診療所数の関係 (r≈0.972)

図 R618-1: SSDSE-B-2026 の総人口 A1101(横軸)と一般診療所数 I5102(縦軸)の散布図(r ≈ 0.972)。 回帰直線を引けば、 各点と直線の垂直距離 (絶対値) を 47 都道府県で平均したものが MAE になる。 東京のような 大人口県 の点は絶対値のズレも大きくなりやすく、 RMSE では二乗されて影響が肥大化するが、 MAE では線形のため影響が抑えられる。

この散布図から読み取るべきポイントは 3 つです。 第 1 に、 点がほぼ一直線に乗る (r ≈ 0.972) ため、 総人口だけで診療所数をかなり正確に予測できること。 第 2 に、 それでも直線から浮いた県は存在し、 MAE 指標はこれらの外れ値に対して 線形 の影響しか受けないが、 RMSE は二乗されるため外れ値の影響を強く受けること。 第 3 に、 もし「ロバストな予測精度を 1 つの数字で報告したい」ならば、 MAE の方が 説明責任を果たしやすい こと。 「平均すると 1 県あたり◯◯施設の誤差です」と書けば中学生でも分かる。

📊 ヒストグラムで誤差分布の歪みを観察する

下のヒストグラムは、 SSDSE-B-2026 の「総人口 A1101」の 47 都道府県分布です。 少数の大都市県 (東京・神奈川・大阪など) が形成する 長い右裾 が特徴で、 このような歪んだ分布の変数を目的変数・説明変数に使うと、 回帰の絶対誤差 \(|y_i - \hat y_i|\) の分布も右に歪みがちになります。 MAE は誤差分布の 算術平均中央値絶対誤差 (MedAE) はその中央値であり、 右裾の影響の受け方が異なります。

ヒストグラム: 47 都道府県の総人口分布

図 R618-2: SSDSE-B-2026 の総人口 A1101 のヒストグラム。 多くの県は数百万人以下 (左側のピーク) だが、 数県だけ桁違いに大きい。 こうした右裾の長い変数を扱う回帰では、 誤差も一部の県で大きくなりやすい。 MAE は全体の 算術平均 なので右裾の影響を一定程度受け、 MedAE (中央値) を併用すると「典型的な都道府県での誤差はどのくらいか」がより頑健に分かる。

分布の形状から判断すべきことは、 「MAE 単独で報告するか、 MAE と MedAE の両方を報告するか」です。 もし誤差分布が 左右対称 なら MAE = MedAE に近づくので MAE 単独で十分。 もし 右裾が長い なら MAE > MedAE となり、 両方を併記することで「外れ値を含めた誤差」と「典型的な誤差」を読者が区別できます。 総人口のような歪んだ変数を含む SSDSE の都道府県データでは誤差の右裾も長くなりやすいため、 報告書では両指標の併記を推奨します(実測例: 総人口→出生数の単回帰で MAE 1,146 人に対し MedAE 855 人)。

📦 箱ひげ図でグループ間のばらつきを比較する

下の箱ひげ図は、 SSDSE-B-2026 の都道府県を KMeans でクラスタリングし、 クラスタ別に一般診療所数 I5102 の分布 を比較したものです。 横軸がクラスタ、 縦軸が一般診療所数。 箱の高さが クラスタ内のばらつき を表し、 髭や外れ点が 特異な県 の指標になります。

箱ひげ図: KMeans クラスタ別の一般診療所数の分布

図 R618-3: KMeans クラスタ別に見た一般診療所数 I5102 の箱ひげ図。 クラスタ (人口規模などの特徴が近い県のグループ) ごとに水準もばらつきも大きく異なる。 MAE の文脈では、 このように サブグループ別に誤差や分布を確認する 発想が重要で、 「全体 MAE は小さいが特定グループだけ誤差が大きい」問題の検出につながる。

箱ひげ図でグループ比較を行う際の判断基準は次の通りです。 第 1 に 箱が重ならない ならば、 グループ間の差は統計的に意味がある可能性が高い (検定で確認推奨)。 第 2 に 箱が重なる ならば、 「サンプルサイズ不足」または「真にグループ間で差がない」かのどちらか。 第 3 に 髭や外れ点が極端に離れている グループには特異な県が含まれており、 回帰モデルの MAE を押し上げる候補になる。 モデル比較でも同様に、 5-fold CV の fold 別 MAE を箱ひげ図にすれば「安定して良いモデルか」を視覚判断できます。

🧾 3 つの図が共通して伝える MAE の本質

散布図・ヒストグラム・箱ひげ図の 3 つを並べることで、 「MAE は単なる 1 つの数字ではなく、 分布全体の特徴を 1 つに圧縮した要約値」 だと理解できます。 1 つの数字だけ報告するなら他の人に MAE を再現させることはできませんが、 分布の形と並べて報告すれば、 読者は「外れ値の影響度」「グループ間ばらつき」「典型誤差 vs 平均誤差」を独自に判断できます。 これが 透明性ある報告 の基盤です。

📋 MAE 関連の比較表 6 連発

表 R618-A: 回帰評価指標 7 種の比較

指標単位外れ値耐性最適化のしやすさ解釈のしやすさ
MAE目的変数と同じ高い (線形)中 (微分不可能点あり)最高 (平均誤差として読める)
MSE目的変数の二乗低い (二乗で肥大化)最高 (滑らか)低 (単位が読みにくい)
RMSE目的変数と同じ低い (MSE の平方根)高い (滑らか)高 (平均誤差より大きく出る)
MedAE目的変数と同じ最高 (中央値)低 (微分不可能)高 (典型誤差)
MAPEパーセント (無次元)低 (\(y=0\) で発散)高 (相対誤差)
無次元 (0-1)低 (MSE 由来)最高中 (分散説明率)
Huber目的変数の関数高い (区分線形)最高 (滑らかに接続)

表 R618-B: SSDSE-B-2026 で MAE を使うべき場面 vs 使うべきでない場面

場面推奨指標理由
人口総数を予測する単回帰モデルの誤差を住民向けに報告MAE「平均で 1 県あたり◯◯人の誤差」と直感的
外れ値を含めた厳しい評価で警鐘を鳴らすRMSE大きな誤差を二乗で強調できる
ニューラルネットの損失関数として学習に使うMSE または HuberMAE は \(y=\hat y\) で微分不可能
スケールの異なるモデルを比較MAPE または R²MAE は単位依存で比較不能
時系列で予測区間も含めて評価MAE + Pinball loss分位点回帰の評価指標
外れ値を完全に無視したい (中央値感覚)MedAE典型誤差を捉える

表 R618-C: MAE と RMSE の差が大きい時の解釈

RMSE/MAE 比分布の特徴推奨アクション
≈ 1.0誤差はほぼ一定 (全県均一)モデルが安定。 そのまま報告 OK
1.0–1.3軽度の右裾 (数県だけ大きい)外れ県を特定して原因分析
1.3–2.0明確な右裾 (東京・大阪等)対数変換または分位回帰を検討
> 2.0外れ値が極端 (沖縄・離島)サブグループ分割または除外を検討

表 R618-D: MAE 計算時のチェックリスト

項目確認内容
単位「人」「円」「%」などを明示したか
サンプルサイズ何件で計算したか (n=47 都道府県)
train/test 分離train で評価していないか
CV の有無単一 split か k-fold か
RMSE 併記外れ値感度の差を見せたか
ベースライン比較「平均値予測」より良いか

表 R618-E: SSDSE-B-2026 主要列で MAE を使うシナリオ例

目的変数説明変数の候補期待される MAE スケール
出生数 A4101総人口 A1101・婚姻件数 A9101約 1 千人 (実測 in-sample MAE ≒ 950 人)
総人口 A1101老年人口 A1303・大学数 E6102十数万人 (実測 in-sample MAE ≒ 18 万人)
高齢化率出生数 A4101・老年人口 A1303数 % (実測 in-sample MAE ≒ 1.6 %)
大学数 E6102総人口 A1101・老年人口 A1303数校 (実測 in-sample MAE ≒ 5 校)
老年人口 A1303総人口 A1101・出生数 A4101数万人 (実測 in-sample MAE ≒ 5 万人)

表 R618-F: MAE 関連用語の用語集 (要点 1 行ずつ)

用語1 行説明
L1 ノルム絶対値の和。 MAE は L1 ノルム / n。
L2 ノルム二乗和の平方根。 RMSE は L2 ノルム / √n。
分位回帰中央値最小化が MAE 最適化と等価。
Huber 損失小誤差は MSE、 大誤差は MAE のハイブリッド。
Pinball 損失非対称 MAE。 分位点予測の評価。
ベースライン「平均値で全予測」した時の MAE。

🧪 MAE を 47 都道府県で手計算する詳細解説

ここでは「47 都道府県の出生数 A4101 を、 総人口 A1101 から単回帰で予測した場合の MAE」を 手順を追って 計算します。 教科書では 5-10 行のコードで済ませるところを、 あえて 1 県ごとの計算過程を示すことで、 「MAE とは何の 平均 なのか」を腹落ちさせるのが目的です。

ステップ 1: 回帰式の決定

単回帰式 \(\hat y = a + b x\) において、 \(x\) を総人口 A1101 (千人)、 \(y\) を出生数 A4101 (人) とします。 粗出生率は 2023 年度実測で全国 5.85‰(出生数合計 ÷ 総人口合計)なので、 \(\hat y \approx 6x\)(総人口 1 千人あたり約 6 人)という比例モデルが目安になります。

ステップ 2: 1 県ごとの予測値と絶対誤差

各都道府県 \(i\) について、 \(\hat y_i = 6 x_i\) を計算し、 \(|y_i - \hat y_i|\) を求めます。 例えば北海道なら \(x = 5{,}092\)(千人)、 \(\hat y = 6 \times 5{,}092 = 30{,}552\)、 実際の出生数 \(y = 24{,}430\)(2023 年度実測)なので絶対誤差は \(|24{,}430 - 30{,}552| = 6{,}122\) (人) となります。 こうした計算を 47 都道府県全部で行います。

ステップ 3: 平均する

47 個の絶対誤差を足して 47 で割れば MAE。 比例モデル \(\hat y = 6x\) では実測で MAE ≈ 1,232 (人) になります。 つまり「平均的に 1 県あたり約 1,200 人の予測誤差」と読めます。 単位を含めて報告することで、 読者は「精度が高いか低いか」を 自分の感覚 で判断できます。

ステップ 4: 外れ値の影響を切り分ける

最も外れるのは北海道で、 比例モデルでは \(\hat y = 30{,}552\) と予測されますが、 実際の出生数は 24,430 人。 この 1 県だけで絶対誤差が 6,122 (人) にのぼり、 全体の MAE を押し上げます。 試しに北海道を除いた 46 都道府県で MAE を再計算すると、 1,232 → 1,126 (人) に下がります(実測)。 こうした感度分析で「特定の県に引っ張られていないか」が分かります。

ステップ 5: ベースラインとの比較

「全県の出生数を 平均値 で予測する」というナイーブモデルの MAE を計算します。 出生数の全国平均は約 15,500 (人)/県で、 各県の絶対誤差を平均すると約 11,800 (人) になります(実測)。 この 11,800 が ベースライン MAE。 比例モデルの MAE 1,232 がベースライン 11,800 を大きく下回るので、 このモデルは意味があると言えます。

ステップ 6: 交差検証で頑健性を確認

47 都道府県を 5 つの fold に分け、 4 fold で学習、 1 fold でテストを 5 回繰り返します。 5 つの fold MAE の平均と標準偏差を報告することで、 「サンプルの偏り」によって MAE が異常値を取っていないかが分かります。 OLS 単回帰の実測では 5-fold CV-MAE = 1,204 ± 494 (人) のような形で報告するのがベストプラクティスです。

ステップ 7: モデル比較

単回帰 (1 変数) を、 重回帰 (例: 総人口 A1101 + 老年人口 A1303 + 大学数 E6102) や Random Forest と比較します。 実測の 5-fold CV-MAE は「単回帰 1,204、 重回帰 1,472、 Random Forest 2,470」で、 このデータでは 説明変数を増やすほど悪化 しました。 総人口だけでほぼ説明できるうえ n=47 と小さいため、 複雑なモデルが過学習で テスト MAE を悪化 させる典型例です。 学習 MAE とテスト MAE の差を必ず確認すべきです。

ステップ 8: 報告書への記載例

最終的に報告書には次のように書きます: 「SSDSE-B-2026 (2023 年度、 n=47 都道府県) における出生数 A4101 の予測モデルとして、 説明変数に総人口 A1101 を採用した単回帰を構築した。 5-fold 交差検証の結果、 MAE = 1,204 ± 494 (人)、 in-sample で RMSE = 1,622 (人)、 R² = 0.991 を得た。 ベースライン (平均値予測) の MAE は約 11,800 (人) であり、 本モデルは 大幅な精度改善 を達成した。 RMSE が MAE の約 1.4 倍となっており、 北海道・沖縄の県で大きな予測誤差を生じている。 老年人口・大学数を追加した重回帰は CV-MAE が悪化したため採用しなかった。」

❓ MAE についての追加 FAQ 10 連発

Q1. なぜ MAE は損失関数として人気がないのに評価指標としては人気なの?

学習時 (損失関数) は微分のしやすさが重要で、 MSE のような滑らかな関数が好まれる。 一方、 評価時 (テスト) は微分する必要がなく、 解釈のしやすさが重要なので MAE が好まれる。 これは「学習時と評価時で異なる指標を使うべき」という典型例。

Q2. MAE と MedAE どちらを優先すべき?

原則は両方併記。 報告書のスペースが限られていれば、 一般読者向けには「平均的にどれくらい外す?」が知りたいので MAE。 異常値の影響を排除したいなら MedAE。 SSDSE のような外れ値が多いデータでは MedAE が 本質を捉えやすい

Q3. n が極端に小さい (n=10 等) でも MAE は使える?

使えるが 信頼区間が広く なる。 ブートストラップで 95% CI を出すと「MAE = 20 (95% CI: 5–40)」のように広くなり、 「精度が高い」とは言いにくくなる。 n=10 では LOO-CV (Leave-One-Out) で各サンプルごとの予測誤差を出すのが現実的。

Q4. MAE をパーセントで表示する MAPE との違いは?

MAE は単位ありの絶対値、 MAPE は単位なしの相対値。 MAPE = 平均(|誤差| / |実値|) × 100。 異なるスケールのモデル間 (人口モデル vs 大学数モデル) を比較するには MAPE が便利だが、 実値が 0 に近いとき発散 するため SSDSE で「転入超過数」のような正負混在変数では使えない。

Q5. MAE がモデルにとって不利なケースはある?

あります。 「すべての都道府県で誤差が均等な平均回帰モデル」と「大都市だけ大きく外す省エネモデル」を比較する際、 MAE は前者を有利に評価する。 もし利用者が 大都市の精度を特に重視 しているなら、 MAE ではなく重み付き MAE や top-N MAE を使うべき。

Q6. MAE が下がっても R² が下がるのは起こる?

理論上は稀だが、 起こり得る。 MAE は線形誤差の平均、 R² は分散ベース。 例えば「すべての予測を実値より少し低く出す系統的バイアスを持つモデル」は MAE は小さいが、 平均からの分散説明という観点で R² が悪化することがある。 両者を併記して総合判断するのが安全。

Q7. SSDSE-B-2026 で MAE が極端に大きくなったら?

原因の切り分けが必要。 (1) 説明変数の選択ミス (相関の低い変数のみ使用)、 (2) 線形仮定の破綻 (非線形モデルが必要)、 (3) 外れ値の影響 (1-2 県の極端値が引っ張っている)、 (4) 単位ミス (千人と人を混在) のいずれか。 散布図と残差プロットで確認する。

Q8. MAE の信頼区間はどう出す?

最も簡単なのはブートストラップ。 47 都道府県からランダムに 47 件を復元抽出し、 MAE を計算 → これを 1,000 回繰り返し → 1,000 個の MAE の 2.5% と 97.5% 分位点を CI とする。 sklearn には組み込みがないので numpy で自前実装になる。

Q9. 分類問題でも MAE を使える?

原則は 回帰用。 ただし「順序付き分類」(例: 低・中・高の 3 段階予測) では順序を数値化して MAE を使うことがある。 例えば真値 「高=3」、 予測 「中=2」なら絶対誤差 1。 これにより「予測がどれくらい 順序として近いか」を評価できる。

Q10. SSDSE-B-2026 の年次変化を予測する時、 MAE は使える?

使えるが 時系列分割 が必須。 普通の KFold だと「未来から過去を予測する」漏れが起きる。 TimeSeriesSplit を使い、 2020-2023 を学習、 2024-2025 をテストのように 時系列順 で分けて MAE を計算する。 結果は通常 KFold より MAE が高めに出るが、 これが本番運用に近い数字となる。

📜 MAE 周辺の歴史的背景と現代的トレンド

MAE は 18 世紀から知られる「絶対偏差の平均」を回帰評価に応用したものです。 最小絶対偏差法 (LAD: Least Absolute Deviations) はラプラス (Pierre-Simon Laplace) が最小二乗法 (LSE) と並んで議論しましたが、 計算が困難であったため 19-20 世紀には最小二乗法が圧勝。 1950 年代以降、 線形計画法の発展で LAD の計算が現実的となり、 ロバスト統計学の文脈で再評価されました (Huber 1964 など)。

機械学習文脈では、 1990 年代以降のニューラルネットブームで MSE が主流となりましたが、 2010 年代以降 外れ値耐性非対称損失 への関心が高まり、 MAE・Huber・Pinball loss が回帰タスクで頻繁に使われるようになりました。 特に Kaggle 等のコンペでは「評価指標が MAE」のコンペが定期的に開催され、 LightGBM や XGBoost が MAE 損失を直接最適化する機能を備えています。

2020 年代の話題としては、 分布回帰 (distributional regression) の文脈で MAE が分位点回帰 (中央値最小化) と等価であることが再認識され、 「点予測ではなく予測区間を出す」アプローチで MAE が改めて重要視されています。 Quantile Random Forest や Conformal Prediction といった手法は、 MAE の自然な拡張です。

日本の公的統計の文脈では、 SSDSE-B-2026 のような都道府県データの予測モデルにおいて、 MAE は 政策議論の場で最も伝わりやすい指標 として推奨されています。 「平均すると 1 県あたり 5,000 人の誤差です」という説明は、 国会議員から地方自治体職員まで全員が同じ単位で議論できるからです。 RMSE や MSE では「単位が二乗されている」ことに違和感を持つ非専門家が多いため、 MAE が選ばれます。

🧮 実値で計算してみる(SSDSE-B-2026)

SSDSE-B-2026(2023 年度)の 「総人口 A1101 → 出生数 A4101」を単回帰で予測したときの MAE を概算してみる。 全国で総人口 1 千人あたり約 6 人が新生児として生まれる(粗出生率、 実測 5.85‰)と近似すると、 線形モデルは \( \hat y = 0.006 x \)(\(x\) は人単位の総人口)になる。

都道府県 総人口 (千人) 出生数 実測 予測 \(\hat y\) |誤差|
北海道5,09224,43030,5526,122
東京都14,08686,34884,5161,832
愛知県7,47748,40244,8623,540
大阪府8,76355,29252,5782,714
沖縄県1,46812,5498,8083,741
鳥取県5373,2633,22241
6 県の平均誤差(MAE 概算)約 3,000 人

この 6 県は外れやすい県を含むため平均誤差約 3,000 人だが、 47 都道府県全体で計算した比例モデルの実際の MAE は 約 1,232 人(切片付き OLS では 1,146 人)になる。 「北海道 1 県だけで 6 千人超 外れている」ことから、 北海道・沖縄のような外れ的県の存在が誤差を押し上げていると分かる(沖縄県は 出生率が全国トップ級に高い ため予測より多く生まれる)。

同じデータを 多変量化(人口に加えて老年人口 A1303、 大学数 E6102 を説明変数に追加)しても、 in-sample MAE は約 1,008 人までの小幅改善にとどまり、 交差検証ではむしろ悪化する(総人口だけでほぼ説明できるため)。 つまり MAE はモデルの説明力を 絶対値の単位で 見せてくれるだけでなく、 変数追加が本当に効いているか の判定にも使える。

🧮 数式に値を入れて手で計算する: 平均絶対誤差 (MAE)

合成回帰の予測誤差から MAE を計算する。

Step 1: y と ŷ

iyŷ|誤差|
11091
215172
320222
425232
530282

Step 2: MAE

MAE = (1+2+2+2+2)/5 = 9/5 = 1.8

🐍 Python で再現

1
2
3
4
5
import numpy as np
y = np.array([10, 15, 20, 25, 30])
yhat = np.array([9, 17, 22, 23, 28])
mae = np.abs(y - yhat).mean()
print(f"MAE: {mae}")

📤 実行結果

MAE: 1.8

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

🎮 触って理解する

下の図には 5 つの実測点(縦位置がデータ値 \(y\))と、 全点に同じ値を返す 予測定数 \(\hat y = c\)(青緑の水平線)があります。 点や水平線をドラッグ(スマホはタップして指を動かす)すると、 各点から水平線までのオレンジの縦線=絶対誤差 \(|y-\hat y|\) と、 MAE・MSE・RMSE がリアルタイムに更新されます。 1 点を大きく引っぱって「外れ値」にすると、 MAE(線形に増える)と MSE/RMSE(二乗で急増する)の 感応度の違いを体感できます。

予測定数 c:7.00
MAE:
MSE:
RMSE:

🎯 直感:MAE は「オレンジの縦線(絶対誤差)の平均の高さ」です。 水平線を 中央値(緑の破線)に合わせると縦線の合計が最短になり MAE が最小、 平均(青の破線)に合わせると二乗和が最短になり MSE/RMSE が最小になります。 「MAE は中央値、 MSE は平均」という性質を目で確かめられます。

⚠️ よくある落とし穴と勘所
  • 単位そのまま:MAE は \(y\) と同じ単位なので「平均 ○○ ズレ」とそのまま解釈できます。 一方 MSE は単位が \(y^2\) で読めず、 RMSE で単位を戻す必要があります。
  • 外れ値に頑健:「外れ値を作る」で 1 点を吊り上げると、 MAE は 線形にしか増えませんが、 RMSE は 二乗で急に伸びます。 少数の外れ値に引きずられたくないときは MAE が向いています。
  • MAE が小さい=良い、 とは限らない:中央値予測のような単純モデルでも偏った分布では低い MAE が出ます。 必ずベースライン(平均・中央値予測)と比較しましょう。

🚀 発展:この「予測定数=中央値で MAE 最小」という事実は、 分位点回帰の \(\tau=0.5\)(中央値回帰)の特殊ケースです。 外れ値耐性と最適化のしやすさを両立させたいときは、 小さな誤差を二乗・大きな誤差を線形に扱う Huber 損失が中庸として使われます。 関連指標は MSERMSE、 統計的背景は 中央値平均ロバスト統計 を参照。

🐍 Python 実装

SSDSE-B-2026 で「総人口 → 出生数」を単回帰し、 MAE を計算する完全コード。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A4101(出生数) 北海道 5,092,000 24,430 東京都 14,086,000 86,348 沖縄県 1,468,000 12,549 …(全 47 行)
 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 numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.model_selection import KFold

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

# 2) 説明変数 X(総人口)、目的変数 y(出生数)
X = df[['A1101']].values   # 総人口
y = df['A4101'].values     # 出生数

# 3) 学習&予測(全データで in-sample 評価)
model = LinearRegression().fit(X, y)
y_pred = model.predict(X)

# 4) MAE / MSE / RMSE / R² を比較
mae = mean_absolute_error(y, y_pred)
mse = mean_squared_error(y, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y, y_pred)

print(f'MAE  = {mae:,.0f} 人  ← 平均的にこのくらい予測がズレている')
print(f'RMSE = {rmse:,.0f} 人  ← 外れ値を強く罰した版')
print(f'MSE  = {mse:,.0f} 人²')
print(f'R²   = {r2:.3f}        ← 説明力(1 が完璧、 0 が定数モデルと同等)')
📤 実行例(実測) MAE = 1,146 人 ← 平均的にこのくらい予測がズレている RMSE = 1,622 人 ← 外れ値を強く罰した版 MSE = 2,629,623 人² R² = 0.991 ← 説明力(1 が完璧、 0 が定数モデルと同等)

交差検証で out-of-sample の MAE を見る

1
2
3
4
5
6
7
8
# 5-fold CV で汎化性能を測定
maes = []
for tr_idx, te_idx in KFold(n_splits=5, shuffle=True, random_state=0).split(X):
    m = LinearRegression().fit(X[tr_idx], y[tr_idx])
    maes.append(mean_absolute_error(y[te_idx], m.predict(X[te_idx])))

print(f'CV-MAE = {np.mean(maes):,.0f} ± {np.std(maes):,.0f} 人')
# in-sample MAE より大きい → 過学習の兆候
📤 実行例(実測) CV-MAE = 1,204 ± 494 人

複数モデルの MAE 比較

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from sklearn.linear_model import Lasso, Ridge
from sklearn.ensemble import RandomForestRegressor

# 説明変数を増やす
features = ['A1101', 'A1303', 'A4101', 'E6102', 'E6302']  # 人口、高齢者数、出生数、大学数、大学学生数
df_clean = df.dropna(subset=features + ['A4101'])
X = df_clean[features].drop(columns=['A4101']).values
y = df_clean['A4101'].values

models = {
    '線形回帰': LinearRegression(),
    'Lasso (L1)': Lasso(alpha=1.0),
    'Ridge (L2)': Ridge(alpha=1.0),
    'Random Forest': RandomForestRegressor(n_estimators=100, random_state=0),
}

for name, m in models.items():
    m.fit(X, y)
    mae = mean_absolute_error(y, m.predict(X))
    print(f'{name:20s}: MAE = {mae:,.0f} 人')
📤 実行例(実測) 線形回帰 : MAE = 993 人 Lasso (L1) : MAE = 991 人 Ridge (L2) : MAE = 993 人 Random Forest : MAE = 995 人

補足:MAE と Median Absolute Error は似て非なる指標。 MAE は 平均、 MedianAE は 中央値。 外れ値が多いデータでは MedianAE のほうがロバスト。 sklearn では median_absolute_error を使う。

残差プロットで MAE の偏り分布を可視化

 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
import os
os.makedirs('outputs', exist_ok=True)  # 保存先のフォルダを作っておく

import matplotlib.pyplot as plt

# 単回帰の残差をプロット
residuals = y - y_pred
abs_residuals = np.abs(residuals)
prefectures = df['Prefecture'].values

# MAE 寄与上位 5 都道府県を表示
top5_idx = np.argsort(abs_residuals)[-5:]
print('MAE への寄与トップ 5 都道府県:')
for i in top5_idx:
    print(f'  {prefectures[i]}: |残差| = {abs_residuals[i]:,.0f} 人')

# 残差ヒストグラム
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].hist(residuals, bins=20, color='#00897B', edgecolor='white')
ax[0].axvline(0, color='red', linestyle='--')
ax[0].set_title('残差の分布')
ax[0].set_xlabel('y - ŷ')

ax[1].scatter(y_pred, residuals, alpha=0.6, color='#00695C')
ax[1].axhline(0, color='red', linestyle='--')
ax[1].set_title('予測値 vs 残差')
ax[1].set_xlabel('予測値 ŷ')
ax[1].set_ylabel('残差')
plt.tight_layout()
plt.savefig('outputs/mae_residual_plots.png', dpi=120)
📤 実行例(実測) MAE への寄与トップ 5 都道府県: 大阪府: |残差| = 2,477 人 愛知県: |残差| = 3,437 人 福岡県: |残差| = 3,469 人 沖縄県: |残差| = 4,265 人 北海道: |残差| = 5,976 人

scoring パラメータで Grid Search

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingRegressor

param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [3, 5, 7],
    'learning_rate': [0.05, 0.1, 0.2],
}

gs = GridSearchCV(
    GradientBoostingRegressor(random_state=0),
    param_grid,
    scoring='neg_mean_absolute_error',  # MAE を最小化(負値で最大化)
    cv=5,
    n_jobs=-1,
)
gs.fit(X, y)

print(f'最良パラメータ: {gs.best_params_}')
print(f'CV-MAE (best): {-gs.best_score_:,.0f} 人')

# best estimator で予測
best = gs.best_estimator_
print(f'最終 MAE: {mean_absolute_error(y, best.predict(X)):,.0f} 人')
📤 実行例(実測) 最良パラメータ: {'learning_rate': 0.1, 'max_depth': 7, 'n_estimators': 200} CV-MAE (best): 2,655 人 最終 MAE: 0 人

⚠️ 落とし穴

❌ 外れ値があると MAE と RMSE で結論が逆転する
SSDSE のような都道府県データには 東京・沖縄のような特異県が存在する。 RMSE は外れ値を二乗するので大きく増えるが、 MAE は線形なので増加が穏やか。 「MAE で見るとモデル A が勝つが、 RMSE ではモデル B が勝つ」現象が起きうる。 報告書では両方併記すべき。
❌ 単位を忘れる
「MAE = 5,000」と書くだけでは何の単位か分からない。 必ず「出生数で MAE = 5,000 」のように 目的変数の単位を明示。
❌ MAE を損失関数に使うときの最適化
MAE は \(y = \hat y\) で微分不可能。 ニューラルネットの SGD で MAE をそのまま使うと 勾配が消失しやすい。 代わりに Huber 損失(小さい誤差は二乗、 大きい誤差は線形)が両者の中間として実務で人気。
❌ スケールの違うモデル間で比較できない
「出生数モデルの MAE は 5,000」「人口モデルの MAE は 30,000」を直接比較するのは無意味。 別単位だから。 比較したいなら MAPE(平均絶対パーセント誤差)か を使う。
❌ 時系列予測での落とし穴
時系列を 5-fold CV してはいけない(未来のデータで過去を予測する漏れ)。 SSDSE のような 横断面データでは普通の KFold で OK だが、 もし「2018–2026 のパネル」なら時系列分割(TimeSeriesSplit)を使う。

⚠️ MAE のさらなる落とし穴 5 連発 (補足)

❌ MAE だけで「モデルが良い」と結論
MAE が小さくても 系統的バイアス がある場合がある。 例えば「47 都道府県すべてで実値より 1,000 人ずつ低く予測」するモデルは MAE = 1,000 だが、 R² は低い。 必ず R²、 残差プロット、 残差の正規性確認とセットで判断すべき。
❌ サンプル数が異なる集計で MAE を比較
「都道府県 (n=47) の MAE = 5,000」と「市区町村 (n=1,800) の MAE = 500」を直接比較するのは無意味。 集計粒度が異なるため、 当然小さい集計単位の方が MAE が小さく出る。 同じ粒度同士でしか比較できない。
❌ 目的変数の前処理を無視
対数変換した目的変数で学習したモデルの MAE を、 そのまま「人口の MAE」と報告するのは誤り。 必ず指数で元のスケールに戻してから MAE を再計算する。 sklearn の TransformedTargetRegressor が便利。
❌ サブグループごとの MAE を確認しない
全体 MAE は良くても、 「沖縄・離島など特定地域では MAE が 10 倍」のことがある。 これは公平性の問題に直結する。 都道府県別、 地域ブロック別 (関東・近畿・中部・九州等) で MAE を出して、 ばらつきを確認すべき。
❌ MAE を「予測精度」と訳す
MAE は 誤差 の指標であり、 小さいほど精度が高い。 報告書で「MAE = 5,000 という高い予測精度」と書くのは誤訳。 正しくは「MAE = 5,000 という小さい誤差」または「MAE が 1,800 から 18 まで 1/100 に縮小し精度が向上」のような表現にする。

🧭 解説深化 — 直感・落とし穴・発展(追記)

本セクションは既存の解説を壊さずに、 MAE の 直感・落とし穴・発展を一段深掘りする追記です。 数値はすべて SSDSE-B-2026(2023 年度・47 都道府県、 総人口 A1101 → 出生数 A4101 の単回帰)の実測で、 明示した箇所のみ架空の思考実験です。

🎨 直感の再確認:MAE は「中央値を当てにいく指標」

MAE の本質は「誤差の絶対値の平均」であり、 元の単位(人・円)のまま解釈できる点が最大の武器です。 そして MAE を最小にする予測値は 中央値だという性質が、 外れ値へのロバスト性の源泉になっています。 これは実データでも確認できます。

同じ「定数で予測する」でも、 中央値で予測したほうが MAE が小さい(11,839 → 9,714 人)。 これは「MAE を最小化する定数=中央値」という定理の生きた証拠です。 逆に MSE を最小化する定数は平均値になります(MSE 参照)。 だから MAE と MSE は最適解そのものが違う——MAE は条件付き中央値、 MSE は条件付き平均を推定します(中央値 / 分位点回帰)。

回帰にすると差はさらに縮みますが、 傾向は残ります:OLS(MSE 最適化)の傾き 0.006104 に対し、 MAE 最適化(分位点回帰 τ=0.5)の傾きは 0.006181(いずれも実測)。 本データは総人口と出生数の直線関係が極めて強い(R²=0.991)ため差はわずかですが、 外れ値が増えるほど両者の乖離は広がります

⚠️ 落とし穴の深掘り(重要)

❌ スケール依存:MAE の絶対値だけでは「良し悪し」を語れない
MAE は目的変数の単位に直結するため、 「MAE = 1,146 人」が良いか悪いかは対象のスケール次第です。 出生数(数千〜数万人)なら小さいが、 大学数(2〜144 校のレンジ)で MAE = 1,146 なら破滅的。 単位・スケールを跨いだ比較には MAPE や R² のような無次元指標が必要です。
❌ MAPE のゼロ近傍問題:小さい県が誤差率を支配する
「MAE を % で見たい」と MAPE に切り替えると別の罠が待ちます。 MAPE は \( |y-\hat y|/|y| \) なので、 分母 \(y\) が小さいサンプルで爆発します。 本データの全体 MAPE は 9.6%(実測)ですが、 県別に見ると 秋田県 35.8%、 沖縄県 34.0%、 北海道 24.5%、 鳥取県 20.3%(いずれも実測)と、 出生数の小さい/出生率の特異な県が誤差率を吊り上げます。 逆に東京都は絶対誤差 1,040 人でも MAPE はわずか 1.2%。 MAPE は「大きい値の県に甘く、 小さい値の県に厳しい」非対称な指標だと理解して使うべきです。 対称版の SMAPE や、 MAE と併記する運用が安全です。
❌ 微分不能:勾配法での工夫が要る
MAE 損失は \(y=\hat y\) で微分不能で、 劣勾配は符号関数 \( \mathrm{sgn}(y-\hat y) \in [-1,1] \)。 勾配の大きさが誤差に依らず一定のため、 最適値付近で振動しやすく、 学習率スケジュールの設計が肝心です。 実務では 損失関数として Huber / SmoothL1(小誤差は二乗・大誤差は線形)を使い、 微分可能性とロバスト性を両取りするのが定石です。
❌ 非対称誤差には不適:過大予測と過小予測を等価に扱う
MAE は「+5,000 人の過大予測」と「−5,000 人の過小予測」をまったく同じコストとして扱います。 しかし在庫・保育所定員・需要予測などでは、 過大と過小のコストが非対称なことが普通です。 このときは MAE ではなく 分位点回帰のピン損失 \( \rho_\tau(u)=u(\tau-\mathbb{1}\{u<0\}) \) を使い、 \(\tau\) で過大/過小の罰の重みを傾けます(\(\tau=0.5\) がちょうど MAE)。
❌ 異なるデータ間で比較不可
「出生数モデルの MAE = 1,146 人」と「別データの MAE = 5,000」を並べても優劣は言えません。 目的変数のスケール・分散・集計粒度が違えば MAE の水準そのものが変わるからです。 比較したいなら、 同一データ・同一粒度で指標を揃えるか、 無次元の R² / MAPE / MASE を使います。 実測でも RMSE/MAE = 1.42 というは単位に依らず「外れ値の効き具合」を語れる、 移植可能な指標です。

🚀 発展:指標と損失の使い分け地図

MAE を起点に、 目的に応じてどの指標/損失へ跳ぶかを整理します。

やりたいこと 選ぶもの 理由・対応ページ
外れ値に強く・元単位で解釈MAE中央値回帰、 影響関数が有界(中央値
大外しを重く罰したいMSE / RMSE平均回帰、 二乗で大誤差を強調(RMSE は元単位)
スケールを跨いで比較MAPE / SMAPE無次元。 ただしゼロ近傍で発散(SMAPE で緩和)
ロバスト+微分可能で学習Huber / SmoothL1小誤差 L2・大誤差 L1(損失関数
非対称コスト・分位点予測Quantile 損失\(\tau\) で過大/過小を傾ける(分位点回帰 / 分位点

MAE 最小化 = 条件付き中央値という等価性を軸に、 「中央値では物足りない」ときに何へ拡張するかを覚えると迷いません。 上側・下側のリスクを見たいなら分位点回帰へ、 外れ値耐性と学習の滑らかさを両立したいなら Huber へ、 頑健な回帰係数そのものが欲しいなら L1 系の頑健回帰(分位点回帰の τ=0.5 が最小絶対偏差 LAD 回帰に一致)へ、 という具合に地続きです。

補足:本ページ内に個別ページが無い指標(SMAPE・Huber 損失・頑健回帰・MASE)は、 リンクを張らずテキストで示しています(該当 HTML が glossary 内に未整備のため)。 MSE / RMSE / MAPE / 損失関数 / 中央値 / 分位点回帰 / 分位点 は実在ページへの相対リンクです。

🗺 MAE 学習ロードマップ (補論)

MAE を完全に使いこなすには、 単に定義を覚えるだけでは不十分です。 SSDSE-B-2026 のような実データで何度も計算を回し、 「外れ値が来た時の感覚」「サンプル数による変動の感覚」「ベースラインとの相対値の感覚」を体得することが鍵です。 以下は教育用ハンズオン教材として推奨する学習順序です。

第 1 週: 定義と手計算

SSDSE-B-2026 から 5 都道府県だけを取り出し、 紙とペンで MAE を計算します。 ここで「絶対値とは何か」「平均とは何か」を 体感 します。 同じデータで RMSE、 MedAE も手計算し、 3 つの違いを目で見て確認します。

第 2 週: sklearn での実装

47 都道府県全件で sklearn.metrics.mean_absolute_error を使った計算を実行します。 ベースライン (平均値予測) との比較、 train/test 分割の意味を学びます。 ここで「過学習」と「汎化性能」の概念を、 MAE という具体的な数字を通じて理解します。

第 3 週: 交差検証と外れ値分析

5-fold CV で MAE の安定性を確認し、 fold 間ばらつきの意味を学びます。 また東京・神奈川・大阪を除外した感度分析を行い、 「外れ値が結論に与える影響」を定量化します。 ここで初めて MedAE や Huber loss の必要性が腹落ちします。

第 4 週: モデル比較と報告書作成

単回帰・重回帰・Random Forest・LightGBM の 4 モデルを SSDSE-B-2026 で構築し、 5-fold MAE で比較します。 結果を A4 1 枚の報告書にまとめ、 「政策議論で使える誤差の単位はどれか」を考えます。 MAE の単位の直感性 (「人口の MAE = 5,000 人」と書ける) が、 RMSE や R² より説得力を持つ場面を実感します。

📝 MAE チートシート (1 行で覚える)

最後に、 MAE は数ある回帰評価指標の中でも もっとも教育的価値の高い指標 です。 数式は単純で、 単位は直感的で、 外れ値の議論にも耐えうる。 SSDSE-B-2026 のような公的統計データを使って繰り返し計算することで、 「データサイエンスの中核となる感覚」が身につきます。 本ページの内容を 1 週間に 1 章ずつ消化していけば、 1 か月で MAE をマスターできます。 さらに進んで Huber loss や Pinball loss、 分位回帰といった発展指標に進めば、 現代的な機械学習の評価指標体系を一望できる視野が得られます。

📣 政策・自治体実務での MAE 活用ノート

地方自治体の政策立案では「人口予測の誤差をどう報告するか」が頻繁な論点となります。 ここでも MAE は強力な味方です。 例えば「2030 年の県人口予測モデルで MAE 12,000 人」と報告すれば、 議会・市民・記者すべてが「平均で 1 万 2 千人ずれる可能性がある」と同じ単位で議論できます。 RMSE 25,000 や MSE 6.25e8 では、 非専門家には伝わりません。

また MAE は 誤差予算 (error budget) の発想にも親和的です。 「来年の予算策定では人口予測の誤差を ±5,000 人以内に収めたい」というゴールを立て、 それを MAE で評価できる。 RMSE では「±5,000 人」を直接 RMSE と比較できないため、 ゴール設定が遠回りになります。 SSDSE-B-2026 のような公的データで MAE を計算する習慣をつけておくと、 こうした政策議論で即座にエビデンスベースの提案ができます。

教育の現場でも、 高校・大学初年次の統計入門で「MAE と RMSE を SSDSE で比較する」という実習は、 学生の理解度を飛躍的に高めることが知られています。 計算量が少なく、 概念がシンプルで、 単位が分かりやすい。 47 都道府県という現実的なサンプルサイズが、 「サンプルサイズが小さい時の挙動」を直感的に学ばせてくれます。 こうした教材としての側面でも、 MAE は他の指標を圧倒する魅力を持っています。

今後、 機械学習の現場では XAI (説明可能 AI) や責任ある AI の文脈で、 「指標の解釈可能性」がますます重視されます。 ブラックボックスモデルが「精度 99%」と言われても、 単位の不明確な指標では信頼を得られません。 MAE のような単位の明確な指標を 第一報告指標 として併記する文化を、 データサイエンティスト全員が共有することが、 社会との信頼関係を築く第一歩です。

最後に MAE のもう一つの利点として、 分位回帰や非対称損失への自然な拡張性 が挙げられます。 MAE を非対称化した Pinball loss は、 「過大予測のコスト」と「過小予測のコスト」が違う実務問題に最適です。 例えば人口予測で「過大予測すると予算を過剰計上して批判される」「過小予測すると行政サービスが不足して市民が困る」という非対称な状況では、 単純な MAE ではなく重み付きの MAE (例: 過小予測の絶対誤差を 2 倍カウント) を使うのが正解です。 こうした柔軟性も MAE のシンプルさから生まれる長所であり、 SSDSE-B-2026 のような公的データで何度も計算を回しているうちに、 自然に拡張のアイデアが湧いてくるはずです。 是非、 本ページを起点に MAE の世界を深く探索してみてください。

なお、 MAE は単一の数字だけでなく 都道府県別のサブグループ分析 にも有効です。 全体 MAE = 18 (千人) と報告したあとに「うち関東は MAE 25、 近畿は MAE 22、 九州は MAE 12」のようにブロック別に出すと、 「どの地域の予測が苦手か」が明確になります。 SSDSE-B-2026 は地域ブロックの情報も持っているので、 groupby と組み合わせれば 1 行で集計できます。 こうした分析は公平性・透明性の観点からも極めて重要で、 「全国平均では良いけど、 特定地域は誤差が 2 倍」というモデルを許容するか否かは、 政策判断に直結します。 MAE はそのような議論の出発点として、 引き続き第一線の指標であり続けるでしょう。

本ページのまとめとして特に強調したい点は、 MAE は「単純で、 解釈しやすく、 拡張性が高い」 という 3 拍子そろった非常に優れた評価指標であるということです。 数式は中学生でも理解でき、 単位は目的変数と完全に同じなので誰でも読める。 そして必要に応じて Huber や Pinball、 分位回帰へと自然に拡張できる柔軟性も併せ持つ。 SSDSE-B-2026 の都道府県データという身近で実在する公的統計を題材に、 MAE を繰り返し計算する経験を積めば、 データサイエンスにおける誤差評価の となる感覚が必ず身につきます。 これからモデル評価指標を学ぶ全ての人に、 まず MAE から始めることを強くお薦めします。

MAE (平均絶対誤差) MSE / RMSE MAPE / SMAPE R² 決定係数 中央値回帰 (τ=0.5) Huber 損失 線形回帰 / 交差検証

🔗 隣接手法への橋渡し

MAE (平均絶対誤差) は単独の指標で完結せず、 上流の予測モデル出力、 並列の MSE / RMSE / MAPE、 下流の精度モニタリングダッシュボードと組み合わせて使う。 単位がそのまま意味を持つので、 SHAP 値・予測区間と一緒に表示すると解釈しやすい。

SSDSE-B-2026 の出生数 A4101 を回帰予測する場合、 上流で説明変数を並べ、 中段で線形回帰・勾配ブースティングを比較、 下流で MAE と RMSE を併記して「平均約 1,100 人ずれる、 外れ県 (北海道) では約 6,000 人ずれる」(2023 年度実測)と二軸で報告するのが標準。

🌳 手法選択フロー

MAE を採用するか RMSE / MAPE / Huber 損失に切り替えるかは、 (1) 外れ値の扱い、 (2) 単位とスケールの解釈性、 (3) 学習時の最適化容易性、 で判断する。 報告では MAE と RMSE を併記するのが定石。

  1. Step 1: 外れ値はどう扱う?
    • 外れ値も平等に評価 → MAE (絶対値で線形)
    • 大きな誤差を強く罰したい → RMSE (二乗で凸)
    • 外れ値を弱めたい → Huber 損失 (δ 境界で MAE と MSE 切替)
  2. Step 2: スケールはどうしたい?
    • 絶対誤差を業務単位 (円・人数) で報告 → MAE
    • 相対誤差 (%) で報告 → MAPE / SMAPE
    • 無次元化して複数系列を比較 → MASE (季節調整 MAE)
  3. Step 3: 学習に使うか評価のみか?
    • 勾配ベース学習の損失 → MAE は劣微分のため SGD で収束遅い、 MSE 推奨
    • テスト時の評価のみ → MAE 単独で問題なし
    • 外れ値ロバスト + 微分可能 → Smooth L1 / Huber

SSDSE-B-2026 の出生数 A4101 を予測する場合、 単位がそのまま「人」で読めるので MAE が第一選択。 ただし北海道・沖縄のような特異な県の予測誤差を厳しく評価したいなら RMSE を併用。 報告書には「MAE = 平均 1,146 人ずれる、 RMSE = 1,622 人 → 一部の県で誤差が膨らんでいる」(2023 年度実測)と二軸で書く。

この式を 4 つの要素に分解して、 もう少し丁寧に「言葉」で読み解きます。 数式 \( \text{MAE} = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat y_i| \) は一見シンプルですが、 ① 各サンプルの誤差を計算する、 ② 絶対値で符号を取り除く、 ③ 全サンプルを足す、 ④ サンプル数で割って平均化する、 という 4 段階の手順を 1 行で表現したものです。 SSDSE-B-2026 の「47 都道府県 × 出生数予測」の場合、 各都道府県に対し「予測した出生数 \( \hat y_i \) と実際の出生数 \( y_i \) の差」を計算し、 その絶対値を 47 個分足してから 47 で割ります。 こうすることで「平均的にどれくらいズレているか」が、 目的変数(出生数)と同じ「人」という単位で得られます。

要素 ①「差を取る」:\( y_i - \hat y_i \) は 残差と呼ばれる量です。 これは「観測値 - 予測値」の順番で計算するのが慣例で、 正なら「予測がアンダー(過小評価)」、 負なら「予測がオーバー(過大評価)」を意味します。 SSDSE-B-2026(2023 年度)で東京都の出生数は実測 86,348 人・単回帰の予測 85,308 人なので、 残差 = +1,040 人で「予測が約 1 千人足りていない」と分かります。

要素 ②「絶対値を取る」:\( |y_i - \hat y_i| \) は符号を消す操作です。 もし符号を残したまま単純平均すると、 正の残差と負の残差が打ち消し合って 常に 0 に近い値になってしまい、 予測精度の評価になりません。 絶対値を取ることで「ズレの大きさ」だけを純粋に評価できます。 別の選択肢として「二乗」を取る方法もあり、 これが MSE の発想です。 絶対値は外れ値に対して線形に増加するため、 二乗(外れ値が二次的に増加)よりロバストです。

要素 ③「全サンプルを足す」:\( \sum_{i=1}^n \) は 1 番目のサンプルから \( n \) 番目までを順に足す総和記号です。 SSDSE-B-2026 なら \( n = 47 \) で、 47 都道府県分の絶対誤差をすべて加算します。 これは「集団全体の誤差総量」を表しています。

要素 ④「サンプル数で割る」:\( \frac{1}{n} \) で総和を平均化します。 これがないと「サンプル数が増えれば必ず誤差総量が増える」という、 サンプル数依存の指標になってしまい、 比較ができなくなります。 平均化することで「1 サンプルあたりの平均誤差」となり、 異なるデータセット間でも誤差水準を比較できる無次元な指標に近づきます(ただし単位は y と同じ)。 SSDSE-B-2026(2023 年度)の単回帰では 47 都道府県の絶対誤差合計が実測 53,847 人なので、 MAE = 53,847 / 47 ≈ 1,146 人となり、 「平均的にどの県も ±1,146 人ズレている」と読めます。