🔖 キーワード索引
この用語と一緒に検索・参照されやすいタグ。 関連ページに飛ぶときの手がかりにも使えます。
#評価指標 #MAPE #回帰 #予測 #パーセント誤差
MAPE (Mean Absolute Percentage Error、 平均絶対パーセント誤差) は予測誤差を真値で割って %で表現する指標。 単位が % なので「人口予測 MAPE 3%、 売上予測 MAPE 8%」 のように 異なるスケールの対象を横並びで比較 できる。 ただし真値が 0 や負だと分母が壊れる弱点を持つ。
MAPE 平均絶対パーセント誤差 スケール不変 sMAPE WAPE MdAPE MASE 0 割問題 需要予測 KPI 時系列評価
「定義 → 0 割問題 → sMAPE/WAPE への発展」が MAPE 理解の柱。
💡 30秒で分かる結論
🍰 まずはやさしく
予測のズレをパーセントで表す道具です。
予測がどれくらい当たったかを知るために使います。
スマホの充電の残り時間の予測などで使えます。
ここではMAPEの結論を短くまとめます。
MAPE (Mean Absolute Percentage Error)は、 予測誤差を真値に対するパーセント で表す回帰評価指標。
定義 :平均 |真値 − 予測|/|真値| × 100単位 :%。 スケール非依存で直感的用途 :売上・需要予測(業務報告)欠点 :真値が 0 付近で爆発/真値 0 で未定義派生 :sMAPE(対称版)、 wMAPE(重み付き)
📍 文脈:「MAPE」はどんな場面で出てくる?
🍰 まずはやさしく
予測の正しさを測るための指標の一つです。
仕事で結果を報告するときに役立ちます。
部活の試合結果を予想して評価する時に似ています。
この用語がどんな場面で使われるかを紹介します。
本サイトの時系列予測・需要予測の章で頻出。 「経営層に説明しやすい」ので実務評価指標として根強く使われます。
🎨 直感で掴む
🍰 まずはやさしく
ズレを割合で考える体温計のようなものです。
大きさが違うものを同じ基準で比べるために使います。
お小遣いの予算と実際の支出のズレを比べる感じです。
MAPEが直感的にどういう意味かを見ていきましょう。
MAPE (Mean Absolute Percentage Error、 平均絶対パーセント誤差) は「予測が真値から平均何 % ずれたか」を 1 数字で示す指標。 単位が % なので「人口予測の MAPE は 3%、 売上予測の MAPE は 8%」と 規模やスケールが異なる対象を横並びで比較 できる。 RMSE は「人」「円」のように単位付きで残るため、 規模の違うシリーズ同士の精度比較が難しい — その弱点を埋めるのが MAPE。
「平均 X% ズレてる」 と一言で言える分かりやすさ。 経営報告・需要予測 KPI の定番(小売・物流・電力)。RMSE は単位が真値と同じ(円・人)、 MAPE は無単位(%)。 ビジネスの意思決定者は MAPE を好む(直感的・スケール不変)。 ただし真値が 0 や負だと使えない or 不安定(分母 0 で発散)。 適用範囲を確認すること。 0 近傍を含むなら sMAPE や MAE に切り替える。
比喩 : 体温計の誤差を「±0.3 度」と言うのが MAE(絶対誤差)、 「±0.8%」と言うのが MAPE。 36 度でも 38 度でも「8 %ズレ」なら相対的に同程度の精度と判断できる。 一方、 体重計の誤差を MAPE で測ると 60kg と 5kg では同じ ±0.1kg でも MAPE は 0.17% vs 2% と桁違いになり、 軽量物の精度が悪く見えるという「分母が小さい問題」 が露呈する。
💡 SSDSE-B-2026 で MAPE が「効く / 効かない」場面 :人口(A1101、 1〜1400 万人)の予測誤差を MAPE で報告すると「東京は ±2%、 沖縄は ±5%」のように 規模に依らない誤差率 が並ぶ。 一方、 県別「年少人口比率」(A1301、 0.10〜0.20)のように 真値が小さい指標 で MAPE を取ると、 分母が小さいために MAPE が極端に振れる。 「真値が 0 から離れていてオーダーが揃っている」変数で使うのが鉄則。
🎮 触って理解する
青い点が実測値 y 、 オレンジの点が予測値 ŷ です。 各点を上下にドラッグ すると、 点ごとの絶対パーセント誤差 $\left|y-\hat{y}\right|/\left|y\right|$ と、 その平均である MAPE がリアルタイムに再計算されます(スマホでは指でそのまま動かせます)。 実測値をぐっと下(0 の近く)へ動かすと MAPE が爆発 する様子、 予測を上(過大)に振ったときと下(過小)に振ったときの非対称 な効き方、 そして MAPE・sMAPE が % で表されスケールに依存しない一方で MAE・RMSE は実測と同じ単位で増減する対比を体感してください。
実測値 y(青・ドラッグ可)
予測値 ŷ(オレンジ・ドラッグ可)
↺ リセット
実測値を 0 に近づける(爆発)
過大 vs 過小(非対称)
点 y 実測 ŷ 予測 |誤差| APE |y-ŷ|/|y| 向き
※ この図の値は操作体験用のデモ値です(SSDSE-B-2026 の実測値ではありません)。計算式は本文の定義と一致します。
🎯 直感(相対誤差の平均)
MAPE は「1 点あたり平均で何 % ずれたか」を示します。 各点の縦の破線が誤差の大きさ、 それを実測値 y で割った % が APE、 その平均が MAPE です。 図の値を全体的に大きくしても小さくしても、 ずれの割合が同じなら MAPE は変わりません (スケール非依存)。 一方 MAE・RMSE は値の絶対的な大きさに比例して増減します。 だからこそ「人口予測 3%、 売上予測 8%」のように単位もスケールも違う対象を横並びに比較できるのが MAPE の強みです。
⚠️ よくある落とし穴(ゼロ割・非対称性・小値で不安定)
① ゼロ割・小値で不安定 :「実測値を 0 に近づける」ボタンを押すと、 分母 $\left|y\right|$ が小さくなり APE が急騰、 y=0 では MAPE が ∞(未定義) になります。 実測値が 0 やゼロ近傍を含むデータに MAPE を使ってはいけない理由がこれです。
② 過大・過小の非対称性 :「過大 vs 過小」ボタンで確認できます。 過小予測(ŷ<y)は予測が 0 まで下げても APE は最大 100% で頭打ちになりますが、 過大予測(ŷ>y)は上限がなく APE が 100% を軽く超えます。 つまり MAPE は過小予測に甘く、 過大予測に厳しい 非対称な指標で、 これを最小化する学習は系統的に予測を低めに寄せる副作用を生みます。
🚀 発展(sMAPE・MASE)
上の非対称性・ゼロ割を緩和する派生指標があります。 sMAPE (対称 MAPE)は分母を $\left(\left|y\right|+\left|\hat{y}\right|\right)/2$ に置き換え、 過大・過小の扱いを対称化して上限を 200% に抑えます(図の sMAPE カードで挙動を確認できます)。 MASE (Mean Absolute Scaled Error)は誤差をナイーブ予測(前期値など)の誤差で割って基準化し、 分母がゼロになりにくくスケール非依存性も保ちます。 sMAPE・MASE は本用語集に独立ページがまだ無いため、 ここでは概念のみ紹介します。 関連指標の詳細は MAE ・RMSE ・MSE ・評価指標 の各ページを参照してください。
🔬 数式を言葉で読み解く — 数式を「言葉」に翻訳
y_i 真値 ŷ_i 予測値 n サンプル数 % 出力単位 sMAPE 分母を (|y|+|ŷ|)/2 に変えた対称版
🔬 MAPE の数式を言葉で読み解く・完全版
MAPE の定義式 $\text{MAPE} = \frac{100}{n}\sum_{i=1}^{n}\left|\frac{y_i - \hat{y}_i}{y_i}\right|$ は 5 要素から成る。 各要素の意味を「言葉」に翻訳することで、 公式の暗記ではなく「なぜそういう形か」が理解できる。
① 分子 $|y_i - \hat{y}_i|$ — 「絶対誤差」
予測値 $\hat{y}_i$ と実測値 $y_i$ の差の絶対値。 絶対値を取るのは「上振れも下振れも同等にペナルティ」とする意図。 「-100 と +100 を相殺させない」ためにも絶対値が必須。
② 分母 $y_i$ — 「実測値での正規化」
絶対誤差を $y_i$ で割ることで「相対誤差 = 誤差 / 実測値」になる。 結果は単位を持たない無次元量 → 異なる単位 (円・件数・温度) の予測同士でも比較可能。 これが MAPE の最大の利点。
数式を言葉で読み解くと、 「実測値 1 万円の予測誤差 500 円」と「実測値 100 円の予測誤差 50 円」を同じ尺度 (5%) で比較できる。 売上予測、 来店者数予測など 規模差が大きい時系列 で特に有用。
③ 総和 $\sum_{i=1}^{n}$ — 「全データ点で集計」
テストデータの全 $n$ 件について相対誤差を合計。 これにより「個別の誤差の傾向 (overshoot vs undershoot) は隠れる」が「全体の予測精度」が要約される。
④ $\times 100$ — 「百分率化」
100 をかけることで「%」表示にする。 「予測誤差 5%」のように一般人にも直感的な数値に。 業務報告では必須の表現。
⑤ $/n$ — 「平均化」
合計を $n$ で割って平均にする。 これにより「1 件あたりの平均誤差率」となる。 データ数の異なるテストセット同士でも比較可能。
要素 役割 意味
$|y_i - \hat{y}_i|$ 絶対誤差 上下方向を区別しない
$/ y_i$ 正規化 単位なしの相対量
$\sum$ 集計 全データ点の合計
$\times 100$ 百分率化 人間可読の単位
$/ n$ 平均化 サンプルサイズ非依存
🧮 実値で計算してみる
需要予測 5 件の例:
真値 予測 |誤差/真値|
100 110 0.10
200 180 0.10
150 165 0.10
80 72 0.10
50 55 0.10
MAPE 10%
🧮 SSDSE-B-2026 で MAPE 完全計算実習
「都道府県人口を、 別の経済指標から線形回帰で予測」したモデルの MAPE を計算する。 加えて、 MAE、 MSE、 RMSE、 sMAPE、 MASE と比較し、 各指標の挙動の違いを定量化する。
このコードでやること : SSDSE-B-2026 で人口予測モデルを線形回帰で構築し、 複数の評価指標を計算・比較する。
📥 入力データ : SSDSE-B-2026 の県別人口 (A1101) と他の説明変数
📋 コピー 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 import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import (
mean_absolute_error , mean_squared_error ,
mean_absolute_percentage_error
)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
pref = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
y_true = pref [ 'A1101' ] . astype ( float ) . values
# 実在する 5 指標を説明変数に (出生数・死亡数・転入・婚姻・住宅着工)
num_cols = [ 'A4101' , 'A4200' , 'A5101' , 'A9101' , 'H1800' ]
X = pref [ num_cols ] . apply ( pd . to_numeric , errors = 'coerce' ) . fillna ( 0 ) . values
model = LinearRegression () . fit ( X , y_true )
y_pred = model . predict ( X )
# 主要評価指標
mae = mean_absolute_error ( y_true , y_pred )
mse = mean_squared_error ( y_true , y_pred )
rmse = np . sqrt ( mse )
mape = mean_absolute_percentage_error ( y_true , y_pred ) * 100
# 対称 MAPE
smape = np . mean ( 2 * np . abs ( y_pred - y_true ) / ( np . abs ( y_true ) + np . abs ( y_pred ))) * 100
# MAE 比のスコア (Mean Absolute Scaled Error の単純版)
mae_naive = np . mean ( np . abs ( np . diff ( y_true ))) # 1 期前 lag を予測とする naive base
mase = mae / mae_naive
print ( f 'MAE (Mean Absolute Error) = { mae : >15,.0f } ' )
print ( f 'MSE (Mean Squared Error) = { mse : >15,.0f } ' )
print ( f 'RMSE (Root MSE) = { rmse : >15,.0f } ' )
print ( f 'MAPE (Mean Absolute Percentage Error) = { mape : >15.2f } %' )
print ( f 'sMAPE (symmetric MAPE) = { smape : >15.2f } %' )
print ( f 'MASE (Mean Absolute Scaled Error) = { mase : >15.3f } ' )
📤 実行結果 :
MAE (Mean Absolute Error) = 67,378
MSE (Mean Squared Error) = 9,475,899,877
RMSE (Root MSE) = 97,344
MAPE (Mean Absolute Percentage Error) = 3.22 %
sMAPE (symmetric MAPE) = 3.21 %
MASE (Mean Absolute Scaled Error) = 0.038
💬 結果の読み方 : MAPE 3.22% → 平均的に「実測値の約 3% の誤差」で人口を再現できるモデル。 出生・死亡・転入・婚姻・住宅着工という人口動態と連動する変数を使ったため精度が高い。 県別の誤差率は最大が鹿児島県の 11.1%、 次いで滋賀県・山口県の約 7.6%。 人口最小の鳥取県は 4.5% だが、 2 番目に小さい島根県は 0.25% で、 誤差率の大小は人口規模だけでは決まらない。 sMAPE 3.21% は対称化してもほぼ同値。 MASE 0.038 は都道府県を並べた断面データでの参考値。
🧮 数式に値を入れて手で計算する: MAPE
合成需要予測で MAPE (%) を計算する。
Step 1: 実績と予測
i y ŷ |誤差|/y
1 100 90 0.10 2 150 165 0.10 3 200 180 0.10 4 250 275 0.10 5 300 270 0.10
Step 2: MAPE
MAPE = (1/n)·Σ|y-ŷ|/y × 100
= (0.10×5)/5 × 100
= 10.0 %
🐍 Python で再現
📋 コピー import numpy as np
y = np . array ([ 100 , 150 , 200 , 250 , 300 ])
yhat = np . array ([ 90 , 165 , 180 , 275 , 270 ])
mape = np . abs (( y - yhat ) / y ) . mean () * 100
print ( f "MAPE: { mape : .1f } %" )
📤 実行結果
MAPE: 10.0%
💬 手計算 (Step 2) 10.0% と Python 出力が完全一致。
🐍 Python 実装
公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで動作させます。 ファイルパス(data/raw/SSDSE-B-2026.csv)は自分の環境に合わせて変更してください。 まずはこのまま動かすことが理解の最短ルートです。
🎯 このコードでやること :MAPE(平均絶対パーセント誤差)— 予測の相対誤差指標。 需要予測 5 件の実測値・予測値を直接与え、 定義式そのままの最小 MAPE 関数を実装して計算します。
📥 入力データ(コード内のリスト)
y = [100, 200, 150, 80, 50] # 実測値
yhat = [110, 180, 165, 72, 55] # 予測値
📋 コピー import numpy as np
def mape ( y , yhat ):
y , yhat = np . asarray ( y ), np . asarray ( yhat )
return 100 * np . mean ( np . abs (( y - yhat ) / y ))
y = [ 100 , 200 , 150 , 80 , 50 ]
yhat = [ 110 , 180 , 165 , 72 , 55 ]
print ( f 'MAPE = { mape ( y , yhat ) : .2f } %' )
📤 実行結果(標準出力)
MAPE = 10.00%
💬 読み方 :5 件それぞれの相対誤差が 10% ずつ(例: |100−110|/100 = 0.10)なので平均も 10%。 実測値が 0 付近だとこの分母が壊れて爆発するため、 ゼロ値が混じる時は sMAPE を併用する。
▶ 実行 を押せばこのページの中でそのまま動きます(ライブラリもデータも同梱済みで、 準備は要りません)。 手元の Python に移して動かすときは pip install matplotlib numpy pandas scikit-learn が必要です。 読んでいるデータは data/raw/SSDSE-B-2026.csv。 日本語を含むので encoding='cp932' の指定を落とさないでください。
🐍 MAPE 自前実装 vs sklearn 実装の比較
sklearn の mean_absolute_percentage_error は便利だが、 中身を理解するには自前実装が有益。 加えて、 sklearn 版にはいくつか「隠れた挙動」がある。
このコードでやること : 数式通りの自前 MAPE と sklearn 版の MAPE を比較し、 ゼロ除算や微小値の扱いの違いを確認する。
📥 入力データ : SSDSE-B-2026 の人口データ + 仮想ゼロ値
📋 コピー 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 import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_percentage_error
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
pref = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
y_true = pref [ 'A1101' ] . astype ( float ) . values
y_pred = y_true * 1.05
# 自前実装 (数式通り)
def mape_naive ( y_true , y_pred ):
return np . mean ( np . abs (( y_true - y_pred ) / y_true )) * 100
# sklearn の動作確認
def mape_sklearn ( y_true , y_pred ):
return mean_absolute_percentage_error ( y_true , y_pred ) * 100
# epsilon 安全版 (ゼロ除算回避)
def mape_safe ( y_true , y_pred , eps = 1e-9 ):
return np . mean ( np . abs (( y_true - y_pred ) / np . maximum ( np . abs ( y_true ), eps ))) * 100
# Case 1: 正常データ
print ( 'Case 1 (正常):' )
print ( f ' naive = { mape_naive ( y_true , y_pred ) : .4f } ' )
print ( f ' sklearn = { mape_sklearn ( y_true , y_pred ) : .4f } ' )
print ( f ' safe = { mape_safe ( y_true , y_pred ) : .4f } ' )
# Case 2: ゼロ値を含むデータ
y_true_z = np . append ( y_true , [ 0 ])
y_pred_z = np . append ( y_pred , [ 1000 ])
print ( ' \n Case 2 (ゼロ含む):' )
try :
print ( f ' naive = { mape_naive ( y_true_z , y_pred_z ) : .4f } ' )
except Exception as e :
print ( f ' naive = ERROR: { e } ' )
print ( f ' sklearn = { mape_sklearn ( y_true_z , y_pred_z ) : .4f } ' )
print ( f ' safe = { mape_safe ( y_true_z , y_pred_z ) : .4f } ' )
📤 実行結果 :
Case 1 (正常):
naive = 5.0000
sklearn = 5.0000
safe = 5.0000
Case 2 (ゼロ含む):
naive = inf (ゼロ除算による発散)
sklearn = 9.38e+18 (sklearn は内部で eps≈2.22e-16 で割る → 巨大数値)
safe = 2.08e+12 (eps=1e-9 で 0 の APE を 1000/1e-9 として計算 → 巨大寄与)
💬 結果の読み方 : 数式通りの naive は inf、 sklearn は機械イプシロン (≈2.22e-16) で割るため約 9.4e18。 eps=1e-9 の安全版でも人口スケール (百万オーダー) に対して eps が小さすぎ、 約 2.1e12 と発散気味になる。 → eps はデータのスケールに合わせて選ぶ必要があり、 ゼロ値を含むデータでは事前処理 (行除外・sMAPE 切替) が必須。 sklearn 1.4 以降はゼロ値を含む場合に警告を出す。
⚠️ よくある落とし穴
❌ 1. 真値 0 付近で爆発(症状: MAPE が ∞ や数千 % に)
原因: 定義 |y−ŷ|/|y| の分母 y が 0 や微小値だと値が発散する。 例えば日次売上に定休日の 0 円の日を含めると、その日の APE は計算できず、100 円のような小さな日が 1 日あるだけで平均が数千 % に跳ねる。 回避: 0 を含む系列では sMAPE(対称版)や MASE(季節 naive 比)に切替え、 ゼロ行は事前に除外する。
❌ 2. 非対称性で過小予測を選んでしまう(症状: 学習が低い側に偏る)
原因: y > ŷ の最大は 100% だが y < ŷ は無限大、 つまり過小予測の方が罰金が小さい。 在庫予測で MAPE を最小化すると欠品リスクが上がる。 回避: 損失非対称な業務では Pinball loss / Quantile Regression / WAPE を使う。
❌ 3. 外れ値感度が高い(症状: 1 件の極端値で全体平均が跳ねる)
原因: 算術平均なので |y_i−ŷ_i|/|y_i| が 1 件だけ 500% でも全体に効く。 SSDSE-B-2026 で「東京」を含む県別予測で起きやすい。 回避: median APE (MdAPE) を併記、 あるいは外れ値を Winsorize(上下 1% を裾切り)してから集計する。
❌ 4. 負値・ゼロ越え系列に適用(症状: 利益・気温で意味不明な値)
原因: MAPE は |y| を仮定するので符号が変わる系列(営業損益、 気温偏差)では絶対値で割ることになり解釈不能。 回避: 絶対値スケールが固定された需要・人口・売上高のみで使い、 損益や気温には RMSE / MAE / RMSLE を使う。
❌ 5. スケール差のある系列を一括平均(症状: 大きい系列に支配される)
原因: 複数 SKU や複数都道府県を 1 つの MAPE にまとめると、 小さい系列の誤差が無視される一方、 ゼロ近傍の系列が一気に押し上げる。 回避: 系列ごとに MAPE を出してから加重平均 (WAPE) するか、 系列ランク別に層化評価する。
🛡 MAPE を採用するときの 3 条件 :(1) 真値 $y_i$ が 0 から離れている、 (2) 過小予測と過大予測のコストが 非対称でない 、 (3) 同じスケールの予測対象を 横並びで比較 したい。 この 3 条件のいずれかが崩れるなら、 sMAPE / MASE / WAPE / RMSE のどれかに切替える。
⚠️ MAPE の致命的な落とし穴 — $y=0$ ゼロ除算
MAPE の最大の弱点は分母 $y_i$ の存在。 $y_i = 0$ なら計算不能 ($\infty$)、 $y_i$ が小さければ誤差率が暴走する。
具体例: 売上が 0 円の日
店舗売上予測で「日曜定休 → 売上 0 円」「予測モデル → 売上 1000 円」のとき、 個別 APE = |0 - 1000| / 0 = ∞。 これが 1 日でも入ると MAPE 全体が無限大に。
対策一覧
$y=0$ の行を除外 : 最も単純。 ただし重要なケースが抜け落ちる可能性
分母に微小値を加算 : $|y_i - \hat{y}_i| / (|y_i| + \epsilon)$。 ε の選び方が恣意的
sMAPE に変更 : 分母を $(|y_i| + |\hat{y}_i|)/2$ に
MAE や RMSE に変更 : 相対化を諦める
MASE を使う : scale-free でゼロ問題なし
WAPE (Weighted APE): 全体の絶対誤差合計 / 全体の実測値合計
このコードでやること : SSDSE-B-2026 の人口データに人工的に「ゼロに近い値」を混ぜ、 MAPE と sMAPE、 WAPE の挙動を比較。
📥 入力データ : 47 県人口 + 仮想的に「人口 100 の島」を 1 件追加
📋 コピー 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 import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_percentage_error
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
pref = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
y_true = pref [ 'A1101' ] . astype ( float ) . values
y_pred = y_true * 1.05 # 一律 5% 過大予測
# Case A: 通常データ
mape_a = mean_absolute_percentage_error ( y_true , y_pred ) * 100
smape_a = np . mean ( 2 * np . abs ( y_pred - y_true ) / ( np . abs ( y_true ) + np . abs ( y_pred ))) * 100
wape_a = np . sum ( np . abs ( y_true - y_pred )) / np . sum ( np . abs ( y_true )) * 100
# Case B: ゼロに近い値を追加
y_true_b = np . append ( y_true , 100 )
y_pred_b = np . append ( y_pred , 1000 ) # 100 を 1000 と予測 → APE = 9.0
mape_b = mean_absolute_percentage_error ( y_true_b , y_pred_b ) * 100
smape_b = np . mean ( 2 * np . abs ( y_pred_b - y_true_b ) / ( np . abs ( y_true_b ) + np . abs ( y_pred_b ))) * 100
wape_b = np . sum ( np . abs ( y_true_b - y_pred_b )) / np . sum ( np . abs ( y_true_b )) * 100
print ( 'Case A (通常データ):' )
print ( f ' MAPE = { mape_a : .2f } %' )
print ( f ' sMAPE = { smape_a : .2f } %' )
print ( f ' WAPE = { wape_a : .2f } %' )
print ( 'Case B (人口 100 の異常値追加):' )
print ( f ' MAPE = { mape_b : .2f } %' )
print ( f ' sMAPE = { smape_b : .2f } %' )
print ( f ' WAPE = { wape_b : .2f } %' )
📤 実行結果 :
Case A (通常データ):
MAPE = 5.00 %
sMAPE = 4.88 %
WAPE = 5.00 %
Case B (人口 100 の異常値追加):
MAPE = 23.65 %
sMAPE = 8.19 %
WAPE = 5.00 %
💬 結果の読み方 : Case B で MAPE は約 4.7 倍に跳ね上がる (異常値 1 件で 5.00% → 23.65% と 18.65 ポイント悪化)。 sMAPE は影響を受けるが穏やか。 WAPE は変化なし → 「小さい値の影響を抑える」性質。 用途に応じて使い分けが必要。
⚖️ MAPE の非対称性 — 「過大予測 vs 過小予測」
MAPE は非対称な指標で、 「過大予測 (over-forecast) のペナルティには上限が無く、 過小予測 (under-forecast) は 100% で頭打ちになる」性質がある。 これが業務適用時の落とし穴の一つ。
数式で見る非対称性
実測値 100、 予測 50 → APE = |100-50|/100 = 50%
実測値 100、 予測 200 → APE = |100-200|/100 = 100%
予測 50 は実測の半分、 予測 200 は実測の 2 倍で、 比率としては同じだけずれているが、 過大予測の方が APE が大きい。 数式を言葉で読み解くと、 「分母が固定 ($y_i$) のため、 上方向は誤差が無限に大きくなれるが、 下方向は最大 100% で頭打ち」。
業務影響
需要予測モデルを MAPE で評価すると、 「保守的 (過小予測)」なモデルが選ばれやすい
在庫予測では過小予測が品切れリスクを生む → MAPE 最適化が業務リスクと逆行
対策: MAPE と「上方/下方の誤差比率」を併用
このコードでやること : SSDSE-B-2026 で「+30% 過大」「-30% 過小」の 2 つの予測モデルを作り、 MAPE と sMAPE を比較。
📥 入力データ : 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 import numpy as np
import pandas as pd
from sklearn.metrics import mean_absolute_percentage_error
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
pref = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
y_true = pref [ 'A1101' ] . astype ( float ) . values
y_over = y_true * 1.30 # 30% 過大予測
y_under = y_true * 0.70 # 30% 過小予測
mape_over = mean_absolute_percentage_error ( y_true , y_over ) * 100
mape_under = mean_absolute_percentage_error ( y_true , y_under ) * 100
smape_over = np . mean ( 2 * np . abs ( y_over - y_true ) / ( np . abs ( y_true ) + np . abs ( y_over ))) * 100
smape_under = np . mean ( 2 * np . abs ( y_under - y_true ) / ( np . abs ( y_true ) + np . abs ( y_under ))) * 100
print ( f '30% 過大予測:' )
print ( f ' MAPE = { mape_over : .2f } %' )
print ( f ' sMAPE = { smape_over : .2f } %' )
print ( f '30% 過小予測:' )
print ( f ' MAPE = { mape_under : .2f } %' )
print ( f ' sMAPE = { smape_under : .2f } %' )
print ( f ' \n → MAPE は両方とも { mape_over : .0f } % (対称的に見える)' )
print ( f '→ sMAPE は過大 { smape_over : .2f } % vs 過小 { smape_under : .2f } % (非対称)' )
📤 実行結果 :
30% 過大予測:
MAPE = 30.00 %
sMAPE = 26.09 %
30% 過小予測:
MAPE = 30.00 %
sMAPE = 35.29 %
→ MAPE は両方とも 30% (対称的に見える)
→ sMAPE は過大 26.09% vs 過小 35.29% (非対称)
💬 結果の読み方 : MAPE は ±30% で対称に見えるが、 実は内部で分母が $y_i$ なので「過大予測時の最大誤差は無限大、 過小予測時は 100% 上限」。 sMAPE では過小予測の方が大きく出る → 「予測モデルが体系的に保守的」かどうかを sMAPE で検出可能。
⚠️ MAPE 落とし穴 拡張版 (10 件)
$y = 0$ でのゼロ除算 : 計算不能 → 事前にゼロ除外、 epsilon 加算、 または sMAPE/WAPE/MASE への切替
$y$ が小さい時の暴走 : $y = 1$ に対し $\hat{y} = 5$ なら APE = 400%。 小さな実測値が支配的に
非対称性 : 過大予測 vs 過小予測で MAPE への影響が違う。 業務リスクと整合しているか確認
MAPE 最適化バイアス : MAPE を損失関数として学習すると、 体系的に過小予測になる傾向
外れ値の過大影響 : 1 件の極端な APE が全体 MAPE を引き上げる。 中央値版 (MdAPE) を併用
業界横断比較の罠 : 「MAPE 10%」の意味が業界によって全く違う。 業界水準を確認
サンプルサイズ依存 : $n$ が小さいと推定値が不安定。 信頼区間を Bootstrap で算出
%表示の誤解 : 「MAPE 50%」を「半分間違っている」と誤読されることあり。 詳細説明を付ける
負値・複素数 : $y < 0$ の場合、 単純な MAPE は意味不明に。 絶対値版や対数版を使用
クロスバリデーション時の集計 : fold ごとに MAPE を計算し平均するか、 全予測を合体させて MAPE を計算するかで値が異なる
📊 MAPE 可視化 — エラー分布グラフ
MAPE は単一の数値要約だが、 個別の APE 分布を可視化することで「どの観測点で誤差が大きいか」が分かる。
このコードでやること : SSDSE-B-2026 で線形回帰人口予測の個別 APE を計算し、 ヒストグラム + 都道府県別 APE バーチャートで可視化。
📥 入力データ : 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 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
pref = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
y_true = pref [ 'A1101' ] . astype ( float ) . values
names = pref [ 'Prefecture' ] . astype ( str ) . values
# 簡易予測モデル
num_cols = [ 'A4101' , 'A5101' , 'H1800' ] # 出生数・転入・住宅着工
X = pref [ num_cols ] . apply ( pd . to_numeric , errors = 'coerce' ) . fillna ( 0 ) . values
y_pred = LinearRegression () . fit ( X , y_true ) . predict ( X )
# 個別 APE
ape = np . abs (( y_true - y_pred ) / y_true ) * 100
mape = ape . mean ()
# 可視化
fig , ( ax1 , ax2 ) = plt . subplots ( 1 , 2 , figsize = ( 14 , 6 ))
ax1 . hist ( ape , bins = 20 , color = '#00838F' , edgecolor = 'black' , alpha = 0.7 )
ax1 . axvline ( mape , color = 'red' , linestyle = '--' , label = f 'MAPE= { mape : .2f } %' )
ax1 . set_xlabel ( 'APE (%)' )
ax1 . set_ylabel ( '県数' )
ax1 . set_title ( '個別 APE のヒストグラム' )
ax1 . legend ()
ax1 . grid ( True , alpha = 0.3 )
# 都道府県別 APE (上位 15)
order = np . argsort ( ape )[:: - 1 ][: 15 ]
ax2 . barh ( names [ order ][:: - 1 ], ape [ order ][:: - 1 ], color = '#FF6F00' )
ax2 . set_xlabel ( 'APE (%)' )
ax2 . set_title ( 'APE 上位 15 県' )
ax2 . grid ( True , alpha = 0.3 , axis = 'x' )
plt . tight_layout ()
plt . savefig ( 'mape_distribution.png' , dpi = 120 )
plt . show ()
print ( f 'MAPE = { mape : .2f } %' )
print ( f '中央APE = { np . median ( ape ) : .2f } %' )
print ( f '最大APE = { ape . max () : .2f } % ( { names [ ape . argmax ()] } )' )
print ( f '最小APE = { ape . min () : .2f } % ( { names [ ape . argmin ()] } )' )
📤 実行結果 :
MAPE = 9.65 %
中央APE = 8.14 %
最大APE = 46.36 % (沖縄県)
最小APE = 0.32 % (兵庫県)
💬 結果の読み方 : MAPE 9.65% は中央値 APE 8.14% より高い → 「少数の県で大きく外している」右裾の分布。 沖縄県で 46% と突出 (離島で人口構造が本土と異なり 3 変数回帰から外れやすい) → 少数の外れ県が MAPE を押し上げる性質を実証。 中央 APE (MdAPE 8.14%) も併記すると分布全体が見える。
🎯 まとめ — MAPE マスター 7 ヶ条
「相対誤差の平均」 が MAPE の本質。 単位なしで規模差ある対象を比較できる。
$y = 0$ で破綻 。 ゼロ値を含むデータでは sMAPE、 WAPE、 MASE を検討。
非対称性に注意 。 MAPE は過大予測を上限なしで罰し、 過小予測は 100% 止まり。 逆に sMAPE は同じ ±30% でも過小予測の方が大きく出る (35.29% 対 26.09%)。
小さな $y$ で暴走 。 中央値 APE (MdAPE) も併記すると分布の歪みが見える。
業界水準は対象による 。 電力 1-3%、 小売 10-20%、 株価 20%以上が標準。
学習指標と評価指標を分離 。 学習には MAE/MSE、 評価のみ MAPE が安全。
MAPE 単独では不十分 。 RMSE、 R²、 予測区間と併記して報告する。
📝 やってみよう — MAPE 5 ステップ実習
Step 1 : SSDSE-B-2026 を読み込み、 47 県人口を sklearn.linear_model.LinearRegression で他の指標から予測する。
Step 2 : sklearn.metrics.mean_absolute_percentage_error で MAPE を計算。
Step 3 : 自前で sMAPE、 WAPE、 MASE を実装し、 値を比較する。
Step 4 : 人為的に「ゼロに近い実測値」を挿入し、 各指標の挙動を観察。
Step 5 : matplotlib で個別 APE のヒストグラムを描画、 「分布の歪み」を確認。
5 ステップやり切ると、 「単一の % 数値が要約する情報の限界」が体感できる。 MAPE だけに頼らず、 複数指標と分布可視化で「予測モデルの全体像」を把握する習慣をつけよう。
✅ MAPE 実務チェックリスト
□ データに $y = 0$ が含まれていないか確認したか
□ データに $y < 0$ が含まれていないか確認したか
□ 極端に小さい $y$ がないか確認したか(暴走源)
□ MAPE と sMAPE の両方を計算したか
□ 中央値 APE (MdAPE) も併記したか
□ 個別 APE の分布をヒストグラムで確認したか
□ 上位 5-10 件の高 APE 観測点を特定し、 原因を調査したか
□ MAPE と RMSE/MAE を併記したか
□ クロスバリデーションでの MAPE 安定性を確認したか
□ 業務 KPI との対応関係を明示したか(MAPE 1% 改善 = 売上 X 円?)
□ ベンチマーク(naive、 業界水準)との比較を行ったか
□ 過小予測 vs 過大予測のバイアスを確認したか
📊 MAPE vs 他指標 — 同一データでの徹底比較
SSDSE-B-2026 で 3 つの予測モデル (Naive、 Mean、 LinearRegression) を作り、 10 種類の評価指標で比較する。
このコードでやること : 3 モデルを 10 指標で評価し、 ランキングを比較。 「どの指標を選ぶかでモデル選択が変わる」ことを実証する。
📥 入力データ : SSDSE-B-2026 の県別人口 + 説明変数
📋 コピー 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 import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import (
mean_absolute_error , mean_squared_error ,
mean_absolute_percentage_error , r2_score
)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
pref = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
y_true = pref [ 'A1101' ] . astype ( float ) . values
num_cols = [ 'A4101' , 'A5101' , 'H1800' ] # 出生数・転入・住宅着工
X = pref [ num_cols ] . apply ( pd . to_numeric , errors = 'coerce' ) . fillna ( 0 ) . values
predictions = {
'Mean (全平均)' : np . full_like ( y_true , y_true . mean ()),
'Median (中央値)' : np . full_like ( y_true , np . median ( y_true )),
'LR (3 var)' : LinearRegression () . fit ( X , y_true ) . predict ( X ),
}
def evaluate ( y_true , y_pred ):
mae = mean_absolute_error ( y_true , y_pred )
rmse = np . sqrt ( mean_squared_error ( y_true , y_pred ))
mape = mean_absolute_percentage_error ( y_true , y_pred ) * 100
smape = np . mean ( 2 * np . abs ( y_pred - y_true ) / ( np . abs ( y_true ) + np . abs ( y_pred ))) * 100
wape = np . sum ( np . abs ( y_true - y_pred )) / np . sum ( np . abs ( y_true )) * 100
median_ape = np . median ( np . abs (( y_true - y_pred ) / y_true )) * 100
r2 = r2_score ( y_true , y_pred )
bias = np . mean ( y_pred - y_true )
return { 'MAE' : mae , 'RMSE' : rmse , 'MAPE' : mape , 'sMAPE' : smape ,
'WAPE' : wape , 'MdAPE' : median_ape , 'R²' : r2 , 'Bias' : bias }
print ( f ' { "指標" : >8 } ' , end = '' )
for name in predictions :
print ( f ' { name : >16 } ' , end = ' ' )
print ()
print ( '-' * 70 )
results = { name : evaluate ( y_true , pred ) for name , pred in predictions . items ()}
for metric in [ 'MAE' , 'RMSE' , 'MAPE' , 'sMAPE' , 'WAPE' , 'MdAPE' , 'R²' , 'Bias' ]:
print ( f ' { metric : >8 } ' , end = '' )
for name in predictions :
val = results [ name ][ metric ]
if abs ( val ) > 1e6 :
print ( f ' { val : >16,.0f } ' , end = ' ' )
else :
print ( f ' { val : >16,.3f } ' , end = ' ' )
print ()
📤 実行結果 :
指標 Mean (全平均) Median (中央値) LR (3 var)
----------------------------------------------------------------------
MAE 1,960,694 1,622,681 184,802.267
RMSE 2,767,630 2,977,040 260,694.888
MAPE 111.102 54.339 9.652
sMAPE 70.777 55.759 9.306
WAPE 74.106 61.330 6.985
MdAPE 80.232 45.168 8.136
R² 0.000 -0.157 0.991
Bias 0.000 -1,096,809 0.000
💬 結果の読み方 : すべての指標で LR が最良 → 「ロバストな結論」。 一方 Mean と Median を比べると、 MAE・MAPE・MdAPE では Median が良いのに、 RMSE では Mean が良い (大規模県=東京の二乗誤差は Mean 予測の方が小さいため)。 「指標選択がモデルの優劣を逆転させる」ことを実証。
📚 関連グループ教材
MAPE は評価指標 の教材で、回帰の誤差を測る指標の 1 つとして MAE・RMSE と並べて学ぶ。単位に依存しない代わりに、真値が 0 に近いと発散し、過大予測と過小予測を非対称に罰する、という性質の違いがこのページの中心になる。主な使い道は時系列分析 の予測の評価で、前年値をそのまま使う素朴な予測(naive)と比べる MASE、分母を合計にする WAPE と合わせて読むとよい(🧮 と 🐍 の SSDSE-B-2026 の人口予測の実測)。予測モデルの比較を 1 回の分割に頼らずに行う方法は交差検証 の教材で扱う。
📚 関連指標・用語ミニ辞典
用語 説明
APE Absolute Percentage Error。 個別予測の相対誤差絶対値。
MAPE Mean APE。 個別 APE の平均。
MdAPE Median APE。 中央値版、 外れ値に頑健。
sMAPE Symmetric MAPE。 対称化版。 0-200% 範囲。
WAPE Weighted APE。 合計で割る形式。 小さい y の影響を抑制。
MASE Mean Absolute Scaled Error。 naive 予測との比較。
MAAPE Mean Arctangent APE。 arctan で MAPE を制限。
RMSPE Root Mean Squared Percentage Error。 MAPE の二乗版。
MPE Mean Percentage Error。 符号付き相対誤差の平均。 バイアス検出用。
MSPE Mean Squared Percentage Error。 二乗相対誤差。
Naive forecast 「最も単純な予測」(前回値、 平均値、 季節 lag)。 ベースライン。
Forecast Bias 予測の体系的なズレ。 $\bar{\hat{y}} - \bar{y}$。
Bullwhip Effect サプライチェーンで需要予測の誤差が増幅する現象。 MAPE 監視必須。
Concept Drift データ分布の時間変化。 MAPE 監視で検出可能。
🔍 MAPE 非対称性の数学的解明
MAPE の数式を言葉で読み解くと、 「絶対誤差 / 実測値」という構造に 本質的な非対称性 が潜んでいる。 この性質を数学的に整理する。
過大予測の APE 上限
$\hat{y} = k \cdot y$ で $k > 1$ (過大予測) なら APE = $|y - ky|/y = (k-1)$。 $k = 10$ なら APE = 900%、 $k \to \infty$ で APE $\to \infty$。 つまり 過大予測の APE には上限がない 。
過小予測の APE 上限
$\hat{y} = k \cdot y$ で $0 < k < 1$ (過小予測) なら APE = $|y - ky|/y = (1-k)$。 $k = 0$ (完全ゼロ予測) でも APE = 1 = 100%。 つまり 過小予測の APE は 100% 上限 。
この非対称性の業務影響
MAPE 最適化を学習目的にすると、 「APE 上限のある過小予測の方が安全」と認識し、 体系的に過小予測になる。 在庫予測なら「常に少なめに見積もる」→ 品切れ多発。 これが MAPE 学習の罠。
回避策
sMAPE : 対称化を試みる。 ただし完全対称ではない。
対数誤差 : $|\log(y) - \log(\hat{y})|$ は対称。 ただし $y, \hat{y} > 0$ 必要。
非対称損失 : Pinball loss、 Tilted absolute loss で過小予測を強く罰する
業務 KPI を直接最適化 : MAPE 最適化を諦め、 売上・利益などビジネス目的関数を使う
対数 MAPE — 対称化の試み
$$\text{LogMAPE} = \frac{1}{n}\sum |\log(y_i) - \log(\hat{y}_i)|$$
対数空間では「2 倍誤差」「0.5 倍誤差」が同じ大きさになる → 完全対称。 ただし $y, \hat{y}$ がともに正である必要あり。 SSDSE-B-2026 のような対数正規分布のデータには特に有効。
📊 MAPE vs MAE vs RMSE — 指標選択の判断基準
3 指標の比較表
MAPE 単独で評価すると、 0 近傍データや非対称性問題で誤った判断をしがち。 同じ予測でも MAE / RMSE と併用すると別の側面が見える。
指標 単位 スケール非依存 外れ値感度 0 近傍問題
MAE 元単位 (円, 人, 度...) なし 低 なし
RMSE 元単位 なし 高 (2 乗で罰) なし
MAPE % あり 中 深刻 (分母 0 で発散)
sMAPE % あり 中 緩和 (分母に予測値も加算)
WAPE % あり 中 緩和 (重み付き)
📐 sMAPE (対称 MAPE) の定義
MAPE の「過大予測 / 過小予測の非対称ペナルティ」を緩和するため、 分母を $|y_i| + |\hat{y}_i|$ に変えた指標。
$$\text{sMAPE} = \frac{100\%}{n} \sum_{i=1}^{n} \frac{|y_i - \hat{y}_i|}{(|y_i| + |\hat{y}_i|)/2}$$
🔬 数式を言葉で読み解く
$y_i$ — 実測値 (例: SSDSE-B-2026 のある都道府県の人口)
$\hat{y}_i$ — 予測モデルが出した予測値
$|y_i - \hat{y}_i|$ — 絶対誤差 (MAE と同じ分子)
$(|y_i| + |\hat{y}_i|)/2$ — 実測と予測の平均的なスケール (両方を平等に扱う)
結論 — 過大予測も過小予測も同程度のペナルティ。 上限が 200% で発散しないため安定。
🐍 SSDSE-B-2026 で MAPE / sMAPE / WAPE / MAE / RMSE を一括計算
🎯 このコードでやること :SSDSE-B-2026 の都道府県人口 (A1101) を実測値、 全国平均で全県を予測したナイーブモデルを比較対象とし、 5 種の指標を同時計算する。
📥 入力データ (SSDSE-B-2026 から) :
SSDSE-B-2026 Code Prefecture A1101(千人) 全県平均予測(千人)
2023 R01000 北海道 5092 2646
2023 R13000 東京都 14086 2646
2023 R47000 沖縄県 1468 2646
... (全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_error , mean_squared_error
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
y_true = df [ df [ 'SSDSE-B-2026' ] == 2023 ][ 'A1101' ] . values / 1000 # 47 都道府県の実人口(千人)
y_pred = np . full_like ( y_true , y_true . mean (), dtype = float ) # ナイーブ予測
mae = mean_absolute_error ( y_true , y_pred )
rmse = np . sqrt ( mean_squared_error ( y_true , y_pred ))
mape = np . mean ( np . abs (( y_true - y_pred ) / y_true )) * 100
smape = np . mean ( 2 * np . abs ( y_true - y_pred ) / ( np . abs ( y_true ) + np . abs ( y_pred ))) * 100
wape = np . sum ( np . abs ( y_true - y_pred )) / np . sum ( np . abs ( y_true )) * 100
print ( f "MAE = { mae : .1f } 千人" )
print ( f "RMSE = { rmse : .1f } 千人" )
print ( f "MAPE = { mape : .2f } %" )
print ( f "sMAPE = { smape : .2f } %" )
print ( f "WAPE = { wape : .2f } %" )
📤 実行すると次の出力が得られる :
MAE = 1960.7 千人
RMSE = 2767.6 千人
MAPE = 111.10 %
sMAPE = 70.78 %
WAPE = 74.11 %
💬 結果の読み方 : MAPE = 111.10% は「平均誤差が実測値を上回る」と読めるが、 これは「人口の小さい鳥取県・島根県で誤差比率が爆発」しているため (鳥取県は APE 約 393%)。 sMAPE (70.78%) は両側ペナルティで安定し、 WAPE (74.11%) は大規模県の影響を重視。 RMSE (2767.6 千人) は東京 (14086 vs 2646 で誤差 11440 千人) が 2 乗されて支配的。 「ナイーブ予測の弱点 = 県規模のばらつきを無視」が複数指標で見える。
⚠️ MAPE 特有の落とし穴と対処
ゼロ近傍データ — $y_i = 0$ で MAPE は無限大に発散。 → ゼロ含むデータでは sMAPE/MASE 使用
非対称性 — 過大予測 (300% 上限なし) と過小予測 (100% 上限) でペナルティが異なる。 → sMAPE で対称化
小規模値の支配 — 鳥取県 (537 千人) の誤差比率は東京 (14086 千人) より遥かに大きく出やすい。 → WAPE で重み付き化
多重予測の集計 — MAPE の単純平均は外れ値に弱い。 → 中央値 (MdAPE) や WAPE が安定
業務 KPI との整合性 — MAPE 10% が「許容範囲」かは、系列がどれだけ変化するかと業務の損失で決まる(🧮 の人口のように前年値だけで 1% を切る系列もあれば、新製品のように過去データが無く大きくぶれる系列もある)。自社の naive 予測の MAPE を基準線にして比べる
💡 実務の鉄則 : ① MAPE 単独で報告しない (必ず MAE/RMSE/sMAPE/WAPE のうち 2-3 種を併記) ② ゼロ含むデータでは MAPE を使わない (MASE 推奨) ③ APE のヒストグラムを可視化して分布形状を確認 ④ 業務 KPI との対応関係 (例: MAPE 5% 改善が利益 X 億円相当) を明示。
🖼 補講: MAPE の幾何と非対称性
MAPE (Mean Absolute Percentage Error) は誤差を「割合」で表す指標。 直観的だが、 ゼロ近傍での発散・過大予測と過小予測の非対称・小規模データへの過剰な反応、 という 3 つの落とし穴を持つ。 ここでは SSDSE-B-2026 の都道府県人口を題材に、 ビジュアルと数式で MAPE の正体を解剖する。
🖼 図 A: MAPE と sMAPE の非対称比較
→ MAPE (赤) は過大予測でペナルティが上限なし、 過小予測では最大 100% と非対称。 sMAPE (青) は両側で同じ最大値 200% に収まる対称指標。
🖼 図 B: ゼロ近傍での発散
→ 実値 $y$ が 0 に近づくと MAPE は無限大に発散する。 売上ゼロ日や新製品の初期需要のように、 ゼロや小さい値を含むデータでは MASE/MAE に切り替えるのが鉄則。
🖼 図 C: 県別 APE 分布 (SSDSE-B-2026)
→ 47 都道府県の APE ヒストグラム模式図。 中央値 (MdAPE) は外れ値に頑健で、 平均 (MAPE) は右側の極端値に引きずられる。 報告時は中央値・四分位範囲も併記したい。
🔬 数式を言葉で読み解く
MAPE の定義式 $\text{MAPE} = \dfrac{100}{n}\sum_{i=1}^{n}\left|\dfrac{y_i - \hat{y}_i}{y_i}\right|$ は、 「各点で誤差 $y_i - \hat{y}_i$ を実値 $y_i$ で割った絶対値 (= 相対誤差) を平均する」と読む。 分子は単位ありの誤差、 分母は単位ありの実値 → 相対誤差は無次元になる。 これに 100 をかけて「%」表示にする。 数学的には、 $y_i$ が 0 に近づくと発散することが定義から直接見える。 また、 過大予測 ($\hat{y}_i = 2y_i$ で 100%) と過小予測 ($\hat{y}_i = 0$ で 100%) では同じパーセンテージでも絶対誤差が異なり、 非対称性が生まれる。
🐍 補講コード: 5 種の誤差指標を一括比較
このコードでやること : SSDSE-B-2026 の都道府県人口を「予測」と仮定し、 過小予測モデルと過大予測モデルで MAPE/sMAPE/MAE/RMSE/MASE を計算して非対称性を確認する。
📥 入力 (SSDSE-B-2026 抜粋):
SSDSE-B-2026 Code Prefecture A1101(人)
2023 R01000 北海道 5,092,000
2023 R13000 東京都 14,086,000
...
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 import pandas as pd
import numpy as np
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
y = df [ df [ 'SSDSE-B-2026' ] == 2023 ][ 'A1101' ] . astype ( float ) . values # 真値: 47 都道府県の総人口
# モデル A: 全県を 90% に過小予測
y_hat_under = y * 0.9
# モデル B: 全県を 110% に過大予測
y_hat_over = y * 1.1
def metrics ( y , y_hat ):
err = y - y_hat
mape = 100 * np . mean ( np . abs ( err / y ))
smape = 100 * np . mean ( 2 * np . abs ( err ) / ( np . abs ( y ) + np . abs ( y_hat )))
mae = np . mean ( np . abs ( err ))
rmse = np . sqrt ( np . mean ( err ** 2 ))
naive = np . mean ( np . abs ( np . diff ( y )))
mase = mae / naive
return mape , smape , mae , rmse , mase
print ( "モデル MAPE sMAPE MAE RMSE MASE" )
print ( f "過小予測 (×0.9) { metrics ( y , y_hat_under )[ 0 ] : .2f } % { metrics ( y , y_hat_under )[ 1 ] : .2f } % { metrics ( y , y_hat_under )[ 2 ] : ,.0f } { metrics ( y , y_hat_under )[ 3 ] : ,.0f } { metrics ( y , y_hat_under )[ 4 ] : .3f } " )
print ( f "過大予測 (×1.1) { metrics ( y , y_hat_over )[ 0 ] : .2f } % { metrics ( y , y_hat_over )[ 1 ] : .2f } % { metrics ( y , y_hat_over )[ 2 ] : ,.0f } { metrics ( y , y_hat_over )[ 3 ] : ,.0f } { metrics ( y , y_hat_over )[ 4 ] : .3f } " )
📤 実行例:
モデル MAPE sMAPE MAE RMSE MASE
過小予測 (×0.9) 10.00% 10.53% 264,581 382,885 0.148
過大予測 (×1.1) 10.00% 9.52% 264,581 382,885 0.148
💬 MAPE は両モデルとも 10.00% と「同じ精度」と判定するが、 sMAPE は過大予測で 9.52%・過小予測で 10.53% と非対称に出る。 MAE・RMSE・MASE は絶対量なので両者同値。 「予測が低めに振れる癖」がある場合に MAPE だけ見ると見逃すリスクがある、 という実例。
📋 補講: MAPE 系指標まとめ
指標 定義のポイント ゼロ耐性 対称性 主用途
MAPE |err|/|y| の平均 なし 非対称 小売・電力 (y>0)
sMAPE 2|err|/(|y|+|ŷ|) の平均 部分的 対称 M4 コンペ等
MASE MAE / 単純予測 MAE あり 対称 ゼロ含む時系列
WAPE Σ|err| / Σ|y| あり 対称 需要予測の集計
MdAPE |err|/|y| の中央値 なし 非対称 外れ値ある時
関連: MAE , RMSE , 評価指標 , 回帰タスク 。
📝 MAPE が向く場面・向かない場面 — 業種別ガイドライン
MAPE は直感的だが万能ではない。 業種ごとの実情に合わせて使い分けないと、 意思決定を誤る。 以下は実務でよく見る使い分けの目安。
業種・タスク 推奨指標 理由
電力需要予測 MAPE (主) + RMSE 需要が常に正、 大小幅広いデータをパーセンテージで横並び比較しやすい
小売 SKU 需要予測 WAPE / MASE ゼロ販売 SKU が多く、 MAPE では発散する
財務 KPI MAPE + 絶対誤差金額 経営層は%と金額の両方を求める
気温予測 MAE / RMSE 気温は負値も取りうる (氷点下)。 MAPE は不適
為替予測 MAPE + 方向一致率 レートは常に正、 方向 (上昇/下落) の的中も重要
新製品売上予測 MASE / Naive ratio 過去データなし、 単純予測と比較するのが妥当
📝 MAPE を業務 KPI に翻訳する 4 ステップ
「MAPE 8%」だけ報告しても経営層には響かない。 業務 KPI (利益、 在庫回転率、 機会損失) に翻訳する手順を 4 ステップで示す。
誤差の金額換算 — MAPE 8% × 月商 10 億円 = 月 8 千万円の誤差レンジ。 この金額を経営層は理解する。
過大予測・過小予測の非対称コスト — 過大予測は在庫滞留 (倉庫コスト)、 過小予測は欠品 (販売機会損失)。 通常コストは非対称なので、 sMAPE や非対称 Quantile loss も併記。
許容範囲の合意 — 「MAPE 10% 以内なら自動補充、 10-20% は人手レビュー、 20%超は予測廃棄」のように業務フローと結び付ける。
長期トレンドの可視化 — 週次 MAPE を Power BI で時系列プロット。 改善傾向か悪化傾向かが一目で分かる。
📝 MAPE 計算時の前処理チェックリスト
ゼロ値の除外 — $y_i = 0$ の点は MAPE 分母で発散する。 事前に除外するか MASE に切り替える。
欠損値の処理 — NaN 含む行は np.isnan で除外。 SSDSE のような公的データでも稀に欠損がある。
外れ値の確認 — APE のヒストグラムをプロットして、 上位 1% が全体の MAPE に与える影響を確認。 必要なら Winsorize や MdAPE を採用。
スケール統一 — 単位 (円/千円/百万円) を統一しないと、 異なるモデル間の MAPE 比較が無意味になる。
季節調整 — 季節性のある時系列では「12 ヶ月平均 MAPE」のように期間集計を意識する。
テスト期間の長さ — テスト期間が 1 週間しかないとサンプルバイアスが大きい。 最低でも 13 週 (四半期) 取る。
📝 理解度チェック (練習問題)
MAPE と関連指標の理解を深めるための練習問題を 6 問用意した。 自分で考えてから解答例を確認してほしい。
Q1. 実値 100、 予測 110 のとき MAPE は何%か。 実値 110、 予測 100 のときは?
解答例 : 前者は |100-110|/100 = 10%。 後者は |110-100|/110 ≈ 9.09%。 同じ絶対誤差 10 でも MAPE は非対称になる、 これが「非対称性」の核心。
Q2. 実値 0、 予測 10 のとき MAPE はどうなるか。 これを回避するために何指標を使うか。
解答例 : MAPE は |0-10|/0 = ∞ で発散する。 ゼロを含むデータでは MASE (単純予測 MAE で正規化) や WAPE (合計で正規化) を使う。
Q3. MAPE と MAE の違いを 1 文で述べよ。
解答例 : MAPE は相対誤差 (%) の平均、 MAE は絶対誤差 (元の単位) の平均。 MAPE は単位非依存で異規模データを横並び比較できるが、 ゼロや小さい値で不安定。
Q4. 過大予測 (×1.2) と過小予測 (×0.8) で MAPE は等しい (両者 20%)。 sMAPE はどうなるか。
解答例 : sMAPE は対称化されているので過大・過小で異なる値 (それぞれ 約 18.2% と 22.2%) を返す。 sMAPE は予測の偏りを検出できる指標。
Q5. 47 県のうち東京だけ予測誤差が極端に大きい場合、 MAPE と MdAPE (中央値) はどう振る舞うか。
解答例 : MAPE は東京の極端値に引きずられて大きくなる。 MdAPE は中央値なので外れ値の影響を受けず、 ロバスト。 報告時は両方を併記するのが定石。
Q6. 自分で SSDSE-B-2026 の都道府県人口に対して「全国平均で予測」「中央値で予測」「最小値で予測」の 3 モデルの MAPE を計算し、 どれが最も小さいかを確認せよ。
解答例 : 中央値モデルが MAPE 観点で最も低い場合が多い (中央値は L1 損失の最適解)。 ただし全国平均モデルは MAE で最適。 損失関数によって最適予測子が変わる、 という統計の基本がここで実感できる。
📝 MAPE 報告テンプレート — 経営会議で使う書式
予測モデルの結果を経営会議で報告するときの典型的なテンプレートを示す。 MAPE 単独ではなく、 複数指標と業務インパクトをセットで提示するのが定石。
(1) 概要 — 「当四半期の需要予測モデル v2.3 の精度評価結果をご報告します」
(2) 精度指標 (3 種併記) — 「MAPE 8.4%、 MAE 12.5 千個、 MASE 0.78」
(3) ベースラインとの差分 — 「v2.2 から MAPE 1.2 pt 改善、 MAE 1.8 千個削減」
(4) 業務インパクト — 「在庫滞留コスト月 200 万円削減見込み、 欠品率 2.1% → 1.5% 改善」
(5) 残課題 — 「新製品 SKU で MAPE 25% と高い、 次四半期で MASE ベースに切替検討」
(6) ネクストアクション — 「v2.4 を 2 ヶ月後にリリース、 並行 A/B テスト 4 週」
この書式は MAPE の限界を率直に示しつつ、 ビジネスインパクトを定量化して経営判断を促す。 「MAPE 8.4%」だけだと「で?」となるが、 「在庫コスト月 200 万円削減」と訳せば意思決定の支点になる、 というのが実務の鉄則である。
📝 MAPE をめぐるよくある質問
Q: MAPE は何 % 以下なら良いか? — A: 業種次第。 電力 < 5%、 小売 10-20%、 新製品 30%+ も可。 自社のベースラインと過去の改善幅で判定する。
Q: MAPE と sMAPE はどちらが良い? — A: 「対称的に評価したい」「過大予測と過小予測を区別したい」なら sMAPE。 「直感的に説明したい」なら MAPE。 多くの実務では両方併記。
Q: MAPE はクロスエントロピーと比較できる? — A: できない。 MAPE は回帰タスク向け、 クロスエントロピーは分類タスク向けで指標の意味が異なる。
Q: MAPE の信頼区間は計算できる? — A: ブートストラップで近似できる。 APE を $B$ 回リサンプリングして MAPE 分布を作り、 2.5% / 97.5% 点を取る。
Q: 機械学習モデルの最適化で MAPE を直接最小化できる? — A: できるが推奨しない。 微分可能だがゼロ近傍で発散するため学習が不安定。 通常は MSE/MAE で学習し、 MAPE で評価する 2 段階方式を取る。
📝 MAPE の歴史と現代の位置付け
MAPE は 1970-80 年代に企業の需要予測現場で生まれ、 1982 年の Makridakis らによる M-competition (時系列予測コンペティション) で公式指標として採用されて広まった。 当時は計算機資源が貴重で、 「直感的で説明が簡単な指標」が重宝された。 その後 1993 年に sMAPE が、 2006 年に MASE が提案され、 学術界では MAPE 単独使用が次第に避けられるようになった。 しかし業務現場では今もなお最もよく使われる指標であり、 経営層への報告書では MAPE がデファクト標準と言える。
2018 年の M4 コンペでは MAPE が公式指標から外れ、 sMAPE と MASE が採用されたことが象徴的。 学術界では「MAPE の時代は終わった」という論調すらある。 一方で 2020 年代の AutoML プラットフォーム (DataRobot、 H2O、 Vertex AI 等) では依然として MAPE が標準オプションに含まれており、 「学術と実務の乖離」が現在進行形で続いている領域でもある。 教科書的に学ぶときは MASE/sMAPE の優位性を理解し、 実務では MAPE と他指標を併記する、 という二重構えが推奨される。
📝 SSDSE-B-2026 を使った MAPE 演習 — 段階別 5 課題
学習効果を高めるため、 SSDSE-B-2026 を題材にした 5 段階の演習課題を提示する。 段階を追って解くことで、 MAPE の感覚が体得できる。
課題 1 (基礎) — 47 県の総人口に対して「全国平均値で予測」した MAPE を計算する。 期待される結果は約 70-80%。 平均は MAPE 観点では最良ではないことを確認する。
課題 2 (中級) — 「中央値で予測」「最頻値で予測」「最小値で予測」の 3 モデルの MAPE を比較する。 どれが最良かを定量化する。
課題 3 (応用) — 出生数・転入者数・住宅着工戸数から人口を予測する線形回帰モデルの MAPE を計算し、 単純モデルとの改善幅を百分率で示す。
課題 4 (発展) — 同じデータで MAE/RMSE/sMAPE/MASE/WAPE を計算し、 5 指標の値とランキングを表にまとめる。 指標によってモデル順位が変わる場合を観察する。
課題 5 (実務) — 仮想的な「予測誤差 1% = 経営インパクト 5000 万円」というシナリオを設定し、 各モデルのコストを試算してレポート化する。
これらの課題はジャストインタイム学習教材として、 統計検定 2 級・データサイエンティスト検定アシスタント・E 資格などの試験対策にも対応する。 数式で覚えるより、 SSDSE で手を動かす方が圧倒的に定着する。
📝 MAPE と関連指標の数学的相互関係
MAPE、 sMAPE、 MASE、 WAPE は数学的に密接に関連している。 (1) MAPE と sMAPE は両方とも相対誤差ベースで単位非依存。 (2) WAPE は重み付き MAPE の一種と見なせ、 $\sum |y_i| / \sum |y_i|$ で正規化することで実値の規模に応じた重み付けが効く。 (3) MASE は単純予測 (前期と同じ予測) の MAE で正規化するため、 「単純予測を上回る程度」が直接読める。 これらの相互関係を理解すると、 状況に応じて適切な指標を選べる感覚が身につく。
具体的には、 (a) 単位非依存性・直感性が欲しい → MAPE/sMAPE、 (b) ゼロを含むデータがある → MASE/WAPE、 (c) 外れ値の影響を抑えたい → MdAPE (中央値)、 (d) 業務インパクト換算したい → MAE/RMSE + 単価、 という使い分けマップが描ける。 1 つの指標だけで判断せず、 必ず複数指標を併記して判断するのが現代の予測実務の鉄則であり、 機械学習工学 (MLOps) の品質管理プロセスにも組み込まれている標準的なプラクティスである。
最終的には、 「どの指標を選ぶか」より「なぜその指標を選ぶか」という意思決定プロセスが重要になる。 経営層への報告では指標選択の理由 (業務影響・データ特性・過去比較) を必ずセットで説明し、 別の指標を併記することで「指標選択の偏りが結論に影響していないこと」を担保する。 これが MLOps の品質ゲートとしての評価指標の使い方であり、 単なる「精度の高低」だけでなく「予測モデルが意思決定に与える影響の確からしさ」を保証する仕組みである。 SSDSE で学んだ MAPE の知識を、 自社の需要予測・売上予測・在庫予測に応用するときも、 この多面的な評価姿勢を必ず引き継いでほしい。 1 つの指標に振り回されず、 業務インパクトを軸に複数指標を統合判断する力こそが、 データサイエンティストの本質的な価値の源泉である。 さらに、 業界横断のベストプラクティスとして、 統計検定・データサイエンティスト検定 (DS 検定) の上級でも MAPE と sMAPE の使い分けが問われており、 単なる暗記知識ではなく原理理解が求められている。 SSDSE-B-2026 で繰り返し練習し、 自分の身体感覚に近いレベルまで落とし込むことが、 試験合格と実務適用の両方を最短距離で達成する道である。
🗺 概念マップ
MAPE を中心に、 MAE / RMSE / SMAPE / WAPE / MdAPE などの回帰評価指標を、 スケール依存性と対称性の 2 軸で整理した概念マップ。
MAPE
0割問題に注意
電力需要予測
気温予測 (1 日先)
株価予測 (短期)
小売店売上 (日次)
商品需要 (週次)
MAPE は売上予測・需要予測で標準指標。 SSDSE-B-2026 の県別人口予測なら絶対値が十分大きいため 0 割問題は発生しにくい。
🔗 隣接手法への橋渡し
MAPE (平均絶対パーセント誤差) は単独で使うのではなく、 上流の実測値 (0 を含まないこと) 整理、 並列の MAE / SMAPE / WAPE、 下流の予測精度モニタリング (KPI ダッシュボード) と組み合わせる。 売上・需要予測の業界標準指標として扱う。
SSDSE-B-2026 の県別人口予測なら、 上流で 47 県の年次データを整理し (0 含まず)、 中段で線形回帰・ARIMA・LightGBM を比較、 下流で MAPE = mean(|yi - ŷi| / |yi|) × 100 を県別 + 全体で報告、 5% 以下なら実用域と判断する。
🌳 手法選択フロー
MAPE を使うか他指標を使うかは、 (1) 実測値に 0 が含まれるか、 (2) 過小予測と過大予測を対称に扱うか、 (3) スケール非依存比較が要るか、 で判定する。 0 を含むなら MAPE は発散するので SMAPE / WAPE へ。 直前章「🔗 隣接手法への橋渡し」で示した「予測 → 精度評価 → モニタリング」パイプラインの 精度評価 段を担うのが本フロー。
[START] 回帰モデルの精度をどう測るか?
↓
Q1: 実測値 y に 0 や非常に小さい値があるか?
├ Yes (在庫切れ日・閉店日・少需要 SKU) → MAPE は分母 0 で発散 → Q2 へ
└ No (常に正の値) → Q3 へ
↓
Q2: 0 を含むが %誤差で報告したい?
├ Yes → SMAPE (対称版: |y - ŷ| / ((|y| + |ŷ|)/2))
├ Yes + 大口顧客の影響を可視化したい → WAPE (Σ|y - ŷ| / Σ|y|)
└ No → MAE (絶対量) / RMSE (二乗ベース)
↓
Q3: スケール非依存で複数 SKU を比較したい?
├ Yes (商品 A: 売上 1 万円, 商品 B: 100 万円) → MAPE で %統一
└ No (同一スケール) → MAE / RMSE で十分
↓
Q4: 過小予測と過大予測の扱いは?
├ 対称 (どちらも同じくらい嫌) → SMAPE / MAE
├ 非対称 OK (在庫過剰の方が痛い) → MAPE のままで OK
└ 非対称 + 明示的に重み付けしたい → Pinball Loss (分位回帰)
↓
Q5: 外れ値・季節性をどう扱う?
├ 外れ値ロバスト → 中央値ベース (MdAPE)
├ 季節性を考慮 → MASE (季節基準で正規化)
└ 標準運用 → MAPE + RMSE 併記
[次段: モニタリング]
→ 週次/月次で MAPE 推移を KPI ダッシュボードに出す
→ 5% 以下: 実用域、 5-15%: 改善余地、 15% 以上: 再モデリング要
実務では MAPE と SMAPE / WAPE を必ず併記し、 さらに分位誤差 (P50/P90) を見るのが定石で、 需要が極端に少ない品目では MAPE が見かけ上肥大化する罠を避けるため WAPE をメインにする現場も多い。 SSDSE-B-2026 で県別人口を予測する場合、 全県が正の値なので MAPE が使えるが、 東京 (1409 万人) と鳥取 (54 万人) の予測誤差を均等扱いするか否かで MAPE / WAPE のどちらが「実態に近い」かが変わる。
場面 主指標 併記指標 避けるべき
需要予測 (0 を含む) WAPE SMAPE MAPE (発散)
県別人口予測 MAPE MAE RMSE 単独 (東京が支配)
在庫過剰回避が重要 Pinball (非対称) MAPE 対称な MAE
複数モデルを論文で比較 MASE (季節基準) SMAPE MAPE 単独 (スケール依存)
🧭 解説深化:MAPEが「最小化する予測」は平均でも中央値でもない
このページでは既に「ゼロ除算」「非対称性(過大予測に甘い)」「小値での爆発」を詳しく扱っている。 ここでは重複を避け、 それらの根っこにある一つの事実 ——「MAPEを最小にする予測点は、平均でも中央値でもない特殊な位置にある」——を、 SSDSE-B-2026 の実測値だけ で可視化する。 この一点を掴むと、上の3つの落とし穴が「同じ現象の別の顔」だと分かる。
🎯 直感:1/y で重み付けした「加重中央値」
RMSE を最小にする定数予測は平均 、 MAE を最小にする定数予測は中央値 ——これは有名。 では MAPE は? 誤差 $|y_i-\hat y_i|$ を $y_i$ で割るということは、 実測値が小さい点ほど「1件あたりの重み」が大きい ということ。 数学的には、MAPE を最小にする定数予測は「重み $1/y_i$ を付けた加重中央値」になる。 実測値が小さい観測ほど発言力が強いので、 最適予測は自然と小さい側へ引っ張られる 。 これが「MAPEは過小予測を好む」の本当の理由である。
実データで確認(秋田県・総人口 A1101・2012〜2023 / 12年 / すべて実測)。 人口は毎年減り続けている:
秋田県 総人口(人):
2012:1,063,000 2013:1,050,000 2014:1,037,000 2015:1,023,119
2016:1,011,000 2017: 999,000 2018: 985,000 2019: 972,000
2020: 959,502 2021: 945,000 2022: 930,000 2023: 914,000
この12年を「1つの定数」で言い当てるとき、指標ごとに最適な定数はズレる:
指標 最適な定数予測 正体
RMSE 最小 990,718 = 平均
MAE 最小 985,000〜999,000 = 中央値レンジ(中央値 992,000)
MAPE 最小 985,000 = 1/y 加重中央値(下端=最小側 )
MAPE 最小の定数 985,000 は、 平均(990,718)よりも中央値レンジの下端よりも低い 。 直近ほど人口が小さく(=$1/y_i$ が大きく)、 その年の発言力が強いため、 最適予測が下側へ引っ張られたのである。 スライダーで自分の手で確かめられる:
定数予測 c = 985,000 人
MAPE最適(985,000)へ
中央値(992,000)へ
平均(990,718)へ
各ボタンで「その指標を最小化する定数」へジャンプ。 3つが別の場所にあることを確かめよう。
⚠️ 落とし穴(重要):横断集約すると「小さい県」が支配する
上の話は時系列だけの問題ではない。 複数系列(例:47都道府県)を1つの MAPE にまとめる ときにも同じ $1/y$ 重みが牙をむく。 実測で確認しよう。
架空の仮定: どの県も総人口予測が一律で +50,000 人ズレた とする(絶対誤差は全県同じ)。 実測人口(SSDSE-B-2026・2023年・47都道府県 A1101)で各県の APE を出すと:
全県平均 MAPE = 3.514 % (絶対誤差はどの県も同じ +50,000 人なのに)
最悪 3県: 鳥取県 9.311%(人口 537,000) / 島根県 7.692% / 高知県 7.508%
最良 3県: 東京都 0.355%(人口14,086,000) / 神奈川県 0.542% / 大阪府 0.571%
最悪 ÷ 最良 = 26.2 倍
誤差の中身は完全に同一(全県 +50,000 人) なのに、 MAPE で見ると鳥取県は東京都の 26倍ダメな予測 に見える。 つまり全国 MAPE の平均値は「予測の良し悪し」ではなく「人口の小さい県の集まり具合 」に強く支配される。 県別に人口規模が桁違いのデータを1つの MAPE で束ねると、 モデル改善のインセンティブが小さい県へ過剰に偏る 。 これは時系列で見た「最適予測が下へ引っ張られる」現象の、 空間版(横断版)である。
🚀 発展:分母を替える三兄弟、そして log の視点
分母を「全体の合計」にする → WAPE :$\sum|y_i-\hat y_i| / \sum|y_i|$。 小さい県が支配する問題を、 規模で重み付けし直して解消する。 「予測の総量誤差」を見たいときの第一候補。
分母を「(実測+予測)/2」にする → sMAPE :ゼロ割と非対称性を緩和するが、 上限200%で頭打ちになる別のクセを持つ。
分母を「単純予測の誤差」にする → MASE :スケール非依存かつ「ナイーブ予測に勝てているか」を1でまたぐ形で示す。 系列横断の集約に最も安全。
log 変換の視点 :相対誤差を重く見る MAPE は、 実質「対数スケールでの誤差」に近い。 実際、$y$ を $\log y$ に変換して RMSE を測ると、 MAPE と同じく「小さい値でのズレを大きく罰する」挙動が得られ、 かつゼロ割を回避できる($y>0$ 前提)。 MAPE で困ったら「log を取って普通の指標」も選択肢。
一言でまとめると: MAPE は「割合で見たい」という真っ当な動機の指標だが、 分母 $y_i$ が小さいほど声が大きくなるという構造上、 最適予測は下へ・集約は小規模系列へ 偏る。 この偏りを制御したいなら、 分母の取り方(WAPE / sMAPE / MASE / log)を意識的に選ぶ。
🔗 関連ページ
MAE(平均絶対誤差) — 最適定数が「中央値」。 スケール依存だが分母の罠がない素直な指標。 本節の対照群。
RMSE(二乗平均平方根誤差) — 最適定数が「平均」。 外れ値に敏感。 MAPE との「最適点のズレ」を体感する起点。
WAPE / sMAPE / MASE — 分母を替えて MAPE の偏りを補正する派生指標(本ページ「🌐 関連手法・派生」内で詳説)。 独立ページは未整備のためリンクなし。