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

🔖 キーワード索引

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

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

💡 30秒で分かる結論

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

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

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

位置づけ: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 で「人口 → 出生数」を線形回帰した場合、 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 はそれぞれ 中央値回帰平均値回帰 に対応する。

🔬 数式を言葉で読み解く

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

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

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

都道府県 総人口 (千人) 出生数 実測 予測 \(\hat y\) |誤差|
北海道5,09224,43030,5526,122
東京都14,03896,00084,22811,772
愛知県7,49552,80044,9707,830
大阪府8,83859,60053,0286,572
沖縄県1,46814,0008,8085,192
鳥取県5413,5003,246254
6 県の平均誤差(MAE 概算)約 6,290 人

単純な比例モデルでも、 47 都道府県を回帰した実際の MAE は 約 5,000〜8,000 人になる(沖縄県は 出生率が全国一高い ため大きく外れる)。 これを「東京都 1 県あたり 1 万人超 外れている」と解釈すれば、 沖縄・東京のような外れ的県の存在が誤差を押し上げていると分かる。

同じデータを 多変量化(人口に加えて 15〜64 歳人口、 大学数、 都市部比率などを説明変数に追加)すれば、 MAE は 1,500 人前後まで下がる。 つまり MAE はモデルの説明力を 絶対値の単位で 見せてくれる。

🐍 Python 実装

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} 人')

⚠️ 落とし穴

❌ 外れ値があると 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 / MSE / RMSE の振る舞い

SSDSE-B-2026 を模した架空サンプル(実測値 100, 95, 110, 200)に対し、 さまざまな予測値で MAE / MSE / RMSE がどう変わるかを見る。

予測パターン 予測値 MAE MSE RMSE RMSE/MAE
完璧予測100, 95, 110, 200000
全平均で予測126, 126, 126, 12636.02,061.545.41.26
中央値で予測102.5, 102.5, 102.5, 102.528.752,51750.21.74
小誤差均一105, 100, 105, 1955.0255.01.00
1 つだけ大外れ100, 95, 110, 10025.02,50050.02.00

読み方:「小誤差均一」では RMSE/MAE = 1.00、 「1 つだけ大外れ」では 2.00。 比が大きいほど 外れ値の存在を示唆。 SSDSE-B-2026 の単回帰で RMSE/MAE が 1.4 以上なら、 残差プロットで外れ県の存在を確認する習慣をつけよう。

🔍 深掘り:MAE の数理

なぜ MAE 最小化は中央値推定になるのか

サンプル \(\{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 は中央値的な穏当な予測を返す。

劣勾配(subgradient)と最適化

絶対値関数は原点で微分不可。 そこで 劣勾配を使う:

$$ \partial |x| = \begin{cases} \{1\} & x > 0 \\ [-1, 1] & x = 0 \\ \{-1\} & x < 0 \end{cases} $$

この劣勾配を使えば SGD で MAE を最適化できる。 ただし \(x = 0\) 付近では勾配の符号が振動するので学習率を小さく設定するか、 Huber 損失で滑らかにするのが実務的。

MAE と MSE の不等式

同じデータに対し常に \(\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 を題材にした具体的なシナリオで見てみる。

シナリオ 1:都道府県別需要予測

SSDSE-B-2026 の人口・経済指標から「保育所需要」「医療施設需要」を予測。 MAE が「平均的に施設数 ±15 件外れる」と分かれば、 自治体担当者は 誤差マージンを含めた計画 を立てられる。 列 H1800(保育所数)と人口・15-64 歳人口を組み合わせた重回帰で、 MAE が 8-12 件まで下がる経験的な相場。

シナリオ 2:モデル選択コンペ

学生コンペで「線形回帰 vs Random Forest vs XGBoost」を比較するとき、 CV-MAE をベンチマーク指標にする。 同じスケールで比較できるため、 アルゴリズム選択の判断材料に最適。 SSDSE-B-2026 の出生数予測では、 線形回帰 MAE = 6,000 → XGBoost MAE = 2,500 のように 非線形性を捉えることで誤差が半分以下になる典型例。

シナリオ 3:ステークホルダー報告

自治体への提案資料では「MAE = 1,200 人」と単位付きで書くと、 非専門家にも「どれくらい当たるか」が伝わる。 R² だけでは「説明できた割合」しか分からず、 実務的な意思決定にはつながりにくい。 提案書では 「MAE = X 人、 これは平均世帯数の Y% に相当」のように 相対化するとさらに伝わりやすい。

シナリオ 4:時系列パネルデータの異常検知

SSDSE-B を複数年(2020、 2022、 2024、 2026)に拡張すれば、 「過去 3 年の平均で 4 年目を予測」したときの MAE を 異常値検出の閾値にできる。 「ある県の今年の出生数が予測 MAE の 3 倍以上ズレている」=「政策効果・統計の誤りの可能性」というアラートに使える。

シナリオ 5:教育的なベースライン比較

学生がはじめての回帰モデルを作るとき、 「全平均で予測した場合の 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,000MAE のほうがレポートに書きやすい
$$\frac{1}{n}\sum|y - \hat y|$$$$\frac{1}{n}\sum(y - \hat y)^2$$絶対値 vs 二乗

❓ よくある質問(FAQ)

Q. MAE と RMSE どちらを使うべき?
A. 両方報告するのがベスト。 RMSE は外れ値の影響を強く反映、 MAE は平均的ズレを示す。 両者の差が大きい場合は外れ値の存在を疑う。
Q. MAE で交差検証する方法は?
A. sklearn の cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=5) を使う。 戻り値は負の MAE なので符号反転する。
Q. 対数変換した目的変数の MAE はどう解釈?
A. y_log = np.log1p(y) で変換した場合、 MAE は 「対数スケールでの誤差」。 元のスケールに戻すなら予測も np.expm1 で逆変換してから MAE を計算。
Q. MAE を使うと中央値回帰になる理由は?
A. MAE = Σ|y - ŷ| を最小化する \(\hat y\) は条件付き中央値。 これは確率密度関数の対称性と微分条件から証明できる(Quantile 回帰の τ = 0.5 ケース)。
Q. SSDSE-B-2026 の何を MAE で評価するのが教育的?
A. 「人口 → 出生数」のような 強相関の単回帰から始めて、 「人口 + 高齢化率 + 大学数 → 出生数」のような重回帰で MAE が劇的に下がる過程を体験するのがおすすめ。

✅ 実施前チェックリスト

📝 本ページまとめ — 「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² と一緒に比較して文脈を補う。