本ページのトピックを 1 タップで移動できます。 「MAE(平均絶対誤差)」を学ぶうえで押さえたい論点はすべてここに集約しました。
予測値と実測値の 絶対差を平均した回帰誤差指標。 目的変数と同じ単位で「平均的にどれくらいズレているか」を示す。
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 で「人口 → 出生数」を線形回帰した場合、 MAE は典型的に「数千人」のオーダーになる。 これは「平均的に出生数を ±数千人くらいの精度で当てている」と直感的に解釈できる。 単位が目的変数と同じなので、 ステークホルダーへの報告がしやすい。 たとえば「うちの自治体の出生予測 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 はそれぞれ 中央値回帰 と 平均値回帰 に対応する。
SSDSE-B-2026 の 「総人口 A1101 → 出生数 A4101」を単回帰で予測したときの MAE を概算してみる。 全国平均で 1 万人あたり約 6 人が新生児として生まれる(粗出生率 6‰)と仮定すると、 線形モデルは \( \hat y = 0.006 x \) になる。
| 都道府県 | 総人口 (千人) | 出生数 実測 | 予測 \(\hat y\) | |誤差| |
|---|---|---|---|---|
| 北海道 | 5,092 | 24,430 | 30,552 | 6,122 |
| 東京都 | 14,038 | 96,000 | 84,228 | 11,772 |
| 愛知県 | 7,495 | 52,800 | 44,970 | 7,830 |
| 大阪府 | 8,838 | 59,600 | 53,028 | 6,572 |
| 沖縄県 | 1,468 | 14,000 | 8,808 | 5,192 |
| 鳥取県 | 541 | 3,500 | 3,246 | 254 |
| 6 県の平均誤差(MAE 概算) | 約 6,290 人 |
単純な比例モデルでも、 47 都道府県を回帰した実際の MAE は 約 5,000〜8,000 人になる(沖縄県は 出生率が全国一高い ため大きく外れる)。 これを「東京都 1 県あたり 1 万人超 外れている」と解釈すれば、 沖縄・東京のような外れ的県の存在が誤差を押し上げていると分かる。
同じデータを 多変量化(人口に加えて 15〜64 歳人口、 大学数、 都市部比率などを説明変数に追加)すれば、 MAE は 1,500 人前後まで下がる。 つまり MAE はモデルの説明力を 絶対値の単位で 見せてくれる。
SSDSE-B-2026 で「総人口 → 出生数」を単回帰し、 MAE を計算する完全コード。
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 を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# 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 が定数モデルと同等)')
交差検証で out-of-sample の MAE を見る
# 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 より大きい → 過学習の兆候
複数モデルの MAE 比較
from sklearn.linear_model import Lasso, Ridge
from sklearn.ensemble import RandomForestRegressor
# 説明変数を増やす
features = ['A1101', 'A1303', 'A4101', 'E4501', 'E4601'] # 人口、高齢者数、出生数、大学数、大学生数
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 と Median Absolute Error は似て非なる指標。 MAE は 平均、 MedianAE は 中央値。 外れ値が多いデータでは MedianAE のほうがロバスト。 sklearn では median_absolute_error を使う。
残差プロットで MAE の偏り分布を可視化
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)
scoring パラメータで Grid Search
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} 人')
SSDSE-B-2026 を模した架空サンプル(実測値 100, 95, 110, 200)に対し、 さまざまな予測値で MAE / MSE / RMSE がどう変わるかを見る。
| 予測パターン | 予測値 | MAE | MSE | RMSE | RMSE/MAE |
|---|---|---|---|---|---|
| 完璧予測 | 100, 95, 110, 200 | 0 | 0 | 0 | — |
| 全平均で予測 | 126, 126, 126, 126 | 36.0 | 2,061.5 | 45.4 | 1.26 |
| 中央値で予測 | 102.5, 102.5, 102.5, 102.5 | 28.75 | 2,517 | 50.2 | 1.74 |
| 小誤差均一 | 105, 100, 105, 195 | 5.0 | 25 | 5.0 | 1.00 |
| 1 つだけ大外れ | 100, 95, 110, 100 | 25.0 | 2,500 | 50.0 | 2.00 |
読み方:「小誤差均一」では RMSE/MAE = 1.00、 「1 つだけ大外れ」では 2.00。 比が大きいほど 外れ値の存在を示唆。 SSDSE-B-2026 の単回帰で RMSE/MAE が 1.4 以上なら、 残差プロットで外れ県の存在を確認する習慣をつけよう。
サンプル \(\{x_1, x_2, \dots, x_n\}\) があるとき、 「定数 \(c\) でこのサンプルを代表する」最適化問題を考える。 損失関数を MAE にすると:
$$ L(c) = \frac{1}{n}\sum_{i=1}^n |x_i - c| $$
この \(L(c)\) を最小化する \(c\) はサンプルの 中央値。 一方、 損失関数を MSE にすると:
$$ L(c) = \frac{1}{n}\sum_{i=1}^n (x_i - c)^2 $$
この \(L(c)\) を最小化する \(c\) はサンプルの 平均。 これが「MAE は中央値、 MSE は平均」と呼ばれる所以。 SSDSE で東京・沖縄のような外れ値を含むデータに対し、 MAE は中央値的な穏当な予測を返す。
絶対値関数は原点で微分不可。 そこで 劣勾配を使う:
$$ \partial |x| = \begin{cases} \{1\} & x > 0 \\ [-1, 1] & x = 0 \\ \{-1\} & x < 0 \end{cases} $$
この劣勾配を使えば SGD で MAE を最適化できる。 ただし \(x = 0\) 付近では勾配の符号が振動するので学習率を小さく設定するか、 Huber 損失で滑らかにするのが実務的。
同じデータに対し常に \(\text{MAE} \le \text{RMSE}\) が成立する(Cauchy-Schwarz の不等式から)。 等号は 全誤差の絶対値が等しいときのみ。 したがって両者の比 \(\text{RMSE}/\text{MAE}\) を見れば、 誤差分布の 不均一性が分かる:
SSDSE-B-2026 の単回帰では、 RMSE/MAE ≈ 1.4-1.6 になりがち(東京・沖縄が外れ値)。 これだけでも 「予測誤差は均一ではない、 一部の特異県が支配している」と即座に分かる。
「絶対誤差を平均する」という発想は古く、 18 世紀のラプラス(Pierre-Simon Laplace、 1749-1827)が天体観測の誤差解析で L1 ノルム最小化を提唱した。 ラプラスはまた 誤差の確率分布として両側指数分布(ラプラス分布)を導入し、 その最尤推定が MAE 最小化と一致することを示した。 一方、 同時代のガウス(Carl Friedrich Gauss、 1777-1855)は L2 ノルム(最小二乗法)を選び、 正規分布の最尤推定としての美しさと 解析解の存在から、 19〜20 世紀は L2 が主流に。
20 世紀後半、 ジョン・テューキー(John Tukey)や Peter Huber らによる ロバスト統計の発展で MAE が再評価される。 Huber は 1964 年に「Huber 損失」(誤差が小さいときは MSE、 大きいときは MAE)を提唱し、 ラプラスとガウスの間の橋渡しを設計した。
21 世紀以降、 ディープラーニングの実用化と 分位点回帰(quantile regression)の流行で、 MAE は再び表舞台に。 Amazon の需要予測、 Uber の到着時刻予測、 各種 Kaggle コンペでは MAE / Quantile loss が標準の評価指標になっている。 SSDSE のような 外れ値を含む公的統計データでは、 MAE のロバスト性が活きる場面が多い。
日本の文脈では、 統計検定 2 級・準 1 級で MAE / MSE / R² が回帰評価の必修項目に。 2026 年度の SSDSE データ解析コンペでも、 提出モデルの評価指標として MAE が採用されることが多い。
「MAE」が実務でどう使われるか、 SSDSE-B-2026 を題材にした具体的なシナリオで見てみる。
SSDSE-B-2026 の人口・経済指標から「保育所需要」「医療施設需要」を予測。 MAE が「平均的に施設数 ±15 件外れる」と分かれば、 自治体担当者は 誤差マージンを含めた計画 を立てられる。 列 H1800(保育所数)と人口・15-64 歳人口を組み合わせた重回帰で、 MAE が 8-12 件まで下がる経験的な相場。
学生コンペで「線形回帰 vs Random Forest vs XGBoost」を比較するとき、 CV-MAE をベンチマーク指標にする。 同じスケールで比較できるため、 アルゴリズム選択の判断材料に最適。 SSDSE-B-2026 の出生数予測では、 線形回帰 MAE = 6,000 → XGBoost MAE = 2,500 のように 非線形性を捉えることで誤差が半分以下になる典型例。
自治体への提案資料では「MAE = 1,200 人」と単位付きで書くと、 非専門家にも「どれくらい当たるか」が伝わる。 R² だけでは「説明できた割合」しか分からず、 実務的な意思決定にはつながりにくい。 提案書では 「MAE = X 人、 これは平均世帯数の Y% に相当」のように 相対化するとさらに伝わりやすい。
SSDSE-B を複数年(2020、 2022、 2024、 2026)に拡張すれば、 「過去 3 年の平均で 4 年目を予測」したときの MAE を 異常値検出の閾値にできる。 「ある県の今年の出生数が予測 MAE の 3 倍以上ズレている」=「政策効果・統計の誤りの可能性」というアラートに使える。
学生がはじめての回帰モデルを作るとき、 「全平均で予測した場合の MAE(ベースライン)」と「自分のモデルの MAE」を比較するだけで 「モデルを作る意味」 が定量化できる。 ベースライン MAE = 20,000 人、 単回帰 MAE = 8,000 人、 重回帰 MAE = 2,500 人と段階的に下がる過程を体験できる。
「MAE」と混同しやすい用語との比較表。 違いを明確にすることで使い分けの判断が早くなる。
| 観点 | MAE | 似た用語 | 違い |
|---|---|---|---|
| 単位 | y と同じ(人、 円など) | MSE は y² | MAE は人間が読める単位 |
| 外れ値感度 | 低い(線形) | MSE/RMSE は高い(二乗) | 外れ値が多いデータでは MAE が安定 |
| 微分可能性 | \(y = \hat y\) で不可 | MSE は全域で可能 | NN 損失には MSE/Huber が便利 |
| 対応する推定量 | 条件付き中央値 | MSE は条件付き期待値 | 統計的解釈が異なる |
| SSDSE 例 | 出生数 MAE = 5,000 人 | 出生数 MSE = 40,000,000 | MAE のほうがレポートに書きやすい |
| 式 | $$\frac{1}{n}\sum|y - \hat y|$$ | $$\frac{1}{n}\sum(y - \hat y)^2$$ | 絶対値 vs 二乗 |
cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=5) を使う。 戻り値は負の MAE なので符号反転する。y_log = np.log1p(y) で変換した場合、 MAE は 「対数スケールでの誤差」。 元のスケールに戻すなら予測も np.expm1 で逆変換してから MAE を計算。MAE(Mean Absolute Error、 平均絶対誤差)は、 回帰モデルの 「平均的なズレ」を目的変数と同じ単位で表す指標。 \( \text{MAE} = \frac{1}{n}\sum |y_i - \hat y_i| \) という単純明快な定義により、 人間が直感的に読めるのが最大の利点。
SSDSE-B-2026 のような 外れ値を含む公的統計データでは、 MSE/RMSE よりも MAE のほうがロバスト。 ただし NN 学習の損失関数としては微分不可性が障害になり、 Huber 損失で妥協するのが実務的。 R²・RMSE・MAE は必ず併記すること。
本ページの 3 つのテイクアウェイ:① MAE は 「平均的にどれくらい外れているか」を直感的に示す。 ② 外れ値に強い反面、 微分不可で NN 学習の損失関数には不向き。 ③ MAE は単独で見るのではなく、 必ず ベースラインモデル・RMSE・R² と一緒に比較して文脈を補う。