MAPE と sMAPE

入門

4.2.4

MAPE と sMAPE

最終更新 2020-03-11 読了時間 2 分
まとめ
  • MAPE は実測値に対する割合誤差の平均を測る指標です。
  • 売上予測の例で MAPE と sMAPE を比較し、ゼロ付近での暴れを確認します。
  • 負値や極小値を含むデータでの対処法と注意点を整理します。
  • MAE・RMSE の概念を先に学ぶと理解がスムーズです

1. 定義 #

$$ \mathrm{MAPE} = \frac{100}{n} \sum_{i=1}^n \left| \frac{y_i - \hat{y}_i}{y_i} \right| $$
  • 実測値に対する相対誤差の平均。
  • 値が小さいほど予測が実測に近い。
  • 実測値 y_i が 0 に近いと発散しやすい。

2. Python での実装 #

1
2
3
4
5
6
7
8
import numpy as np
from sklearn.metrics import mean_absolute_percentage_error

y_true = np.array([120, 150, 80, 200])
y_pred = np.array([110, 160, 75, 210])

mape = mean_absolute_percentage_error(y_true, y_pred)
print(f"MAPE = {mape * 100:.2f}%")

scikit-learn の mean_absolute_percentage_error は既定で 0–1 の値を返すため、パーセント表示には 100 を掛けます。


3. sMAPE(Symmetric MAPE) #

MAPE は実測値が 0 に近いと値が暴走しやすいため、分母に予測値も加えた sMAPE(対称 MAPE) がよく使われます。

計算式 #

$$ \mathrm{sMAPE} = \frac{100}{n} \sum_{i=1}^n \frac{|y_i - \hat{y}_i|}{(|y_i| + |\hat{y}_i|)/2} $$
  • 分母に実測値と予測値の平均を取ることで、実測値が小さいときも安定しやすくなります。
  • 値の範囲は 0〜200% です(MAPE は 0〜∞)。
  • M4 コンペティションなど、需要予測コンテストの公式指標として広く採用されています。

Python 実装 #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np

def smape(y_true: np.ndarray, y_pred: np.ndarray) -> float:
    numerator = np.abs(y_true - y_pred)
    denominator = (np.abs(y_true) + np.abs(y_pred)) / 2
    return float(np.mean(numerator / np.maximum(denominator, 1e-8)))

y_true = np.array([120, 150, 80, 200])
y_pred = np.array([110, 160, 75, 210])
print(f"sMAPE = {smape(y_true, y_pred) * 100:.2f}%")

計算例:MAPE vs sMAPE #

同じデータで MAPE と sMAPE を比較し、ゼロ付近での挙動の違いを確認します。

実測値 $y$予測値 $\hat{y}$絶対誤差MAPE 寄与 $\frac{|y-\hat{y}|}{y}$sMAPE 寄与 $\frac{|y-\hat{y}|}{(y+\hat{y})/2}$
1009010$10/100 = 10.0%$$10/95 = 10.5%$
506010$10/50 = 20.0%$$10/55 = 18.2%$
2108$8/2 = \mathbf{400.0%}$$8/6 = \mathbf{133.3%}$
80782$2/80 = 2.5%$$2/79 = 2.5%$
$$ \mathrm{MAPE} = \frac{10.0 + 20.0 + 400.0 + 2.5}{4} = 108.1\% $$$$ \mathrm{sMAPE} = \frac{10.5 + 18.2 + 133.3 + 2.5}{4} = 41.1\% $$

3行目のように実測値が小さい($y=2$)場合、MAPE は 400% に跳ね上がりますが、sMAPE は 133% に抑えられます。MAPE では1つの外れ値が全体平均を支配してしまう一方、sMAPE はより安定した評価を提供します。

需要予測で sMAPE が好まれる理由 #

  1. ゼロ需要への耐性 — 小売や物流では需要ゼロの SKU が頻出します。MAPE はゼロ除算で破綻しますが、sMAPE は予測値が正であれば計算可能です。
  2. 過大予測と過小予測の対称性 — MAPE は「実測100→予測50」と「実測50→予測100」で異なる値を返しますが、sMAPE は対称的に評価します。
  3. コンペティション標準 — M3・M4 コンペティションで公式指標として採用され、需要予測分野のベンチマークとして定着しています。

3.1 MAPE・sMAPE・WAPE 比較表 #

需要予測の文脈で頻出する3つの割合誤差指標を整理します。

指標分母範囲ゼロ耐性主な用途
MAPE実測値 $y_i$0〜∞✗(ゼロで発散)一般的な割合誤差、ビジネス報告
sMAPE$(y_i + \hat{y}_i)/2$0〜200%△(両方ゼロで不定)対称的な割合誤差、予測コンペ
WAPE$\sum y_i$(総量)0〜∞✓(個別ゼロに強い)需要予測、在庫管理
  • ビジネス報告で「平均何%外した」を伝えたい → MAPE(ただしゼロ除け必須)
  • 予測コンペや対称性を重視したい → sMAPE
  • SKU 単位の需要予測でゼロ需要が多い → WAPE

4. 使用時の注意点 #

  • ゼロや負の値:MAPE はゼロに敏感で、負の値では意味が変わる。ゼロ除けや sMAPE の利用を検討。

  • 平均の偏り:大きな実測値よりも小さな実測値の誤差が重くなる。売上 1000 の誤差 10 より、売上 10 の誤差 5 の方が大きく影響する。

  • 外れ値:割合指標なので絶対値より外れ値の影響が小さいが、ゼロ除けを怠ると破綻する。

  • 報酬の解釈:ビジネスでは「平均で何%外したか」を伝えやすい一方、金額換算ができない点に注意。


5. 他指標との併用 #

  • MAE / RMSE:絶対値の誤差も併用して、実際のダメージ量を把握。
  • RMSLE:過小予測を重視したいときはログ誤差を取る。
  • 分位点損失:需要予測でリスクバッファを設けるなら、上下限の目標値も合わせて評価する。

ノイズと MAPE #

ノイズ量が増えると MAPE がどう変化するか確認できます。

まとめ #

  • MAPE は予測誤差を割合で表すため、ビジネス側に説明しやすいが 0 付近では不安定。

  • sMAPE を使うと極端な値でも安定しやすく、需要予測コンテストでも標準的に採用されている。

  • 絶対値指標と組み合わせて、ビジネス影響を多角的に評価するのが実務では重要。


  • RMSPE — 二乗ベースの割合誤差
  • WAPE — 加重平均による割合誤差
  • MAE・RMSE — 絶対誤差ベースの指標