Home / 関数リファレンス

MAP関数で予測誤差を自力実装する ― MAE・RMSE・MAPEを2引数構文で徹底解剖

OVERVIEW はじめに ―― 「どの誤差指標を使うべきか」に答えるために

売上予測や需要予測の精度を評価するとき、MAE・RMSE・MAPEという3つの指標名をよく目にします。しかし「なんとなくRMSEを使っている」「MAPEとMAEの違いがよくわからない」という状態では、指標の選択を誤り、モデルの改善方向を見誤るリスクがあります。

このページでは、MAP 関数の2引数構文を使い、売上予測データに対してMAE・MSE・RMSE・MAPEを数式から自力実装します。実装を通じて各指標の計算構造を正確に把握し、さらに外れ値(大きく外れた予測)に対して各指標がどう反応するかまで確認します。指標の「選び方」に自信を持つことが、このページの最終目標です。

2引数MAPの構文 ―― 「対応する2列を同時に処理する」

STEP 1 1引数との違い

前回(MAP関数で正規分布を描く)では、1つの配列の各要素に処理を適用する構文を使いました。

1引数 =MAP( 配列, LAMBDA( x, 処理 ) )

MAP は引数として複数の配列を受け取ることができます。2つの配列を渡すと、同じ行位置の要素ペアを LAMBDA の2変数に同時に流し込みます。

2引数 =MAP( 配列1, 配列2, LAMBDA( a, b, 処理 ) )

予測値と実績値という「対応する2列」を同時に扱う誤差計算は、この2引数構文が最もシンプルに表現できます。2つの配列のサイズは完全に一致している必要があります。

サンプルデータ ―― 月次売上予測と実績

STEP 2 シートのレイアウト

12ヶ月分の売上予測値(万円)と実績値(万円)が以下のように入力されているとします。A列が月、B列が予測値、C列が実績値です。

A B C
1 予測値(万円) 実績値(万円)
2 1月 320 310
3 2月 290 305
4 3月 410 398
5 4月 380 420
6 5月 350 344
7 6月 430 415
8 7月 500 488
9 8月 520 530
10 9月 460 455
11 10月 390 401
12 11月 470 462
13 12月 610 598

B列が「モデルや担当者が事前に立てた予測」、C列が「月末に確定した実績」です。誤差指標はすべて 予測値 − 実績値(または実績値 − 予測値)の差分をベースに計算されます。符号の方向は指標によって集計時(絶対値や二乗)に処理されるため、以降の実装では 予測値を a、実績値を b として統一します。

実装 ―― 4指標を順に組み立てる

STEP 3 MAE ― 平均絶対誤差

MAE(Mean Absolute Error)は、各月の誤差の絶対値を平均したものです。誤差の大小を符号なしで素直に平均する、最もシンプルな指標です。

定義 MAE = (1/n) × Σ |予測値 − 実績値|
E2(誤差配列) =MAP(B2:B13, C2:C13, LAMBDA(a, b, ABS(a-b)))
MAE =AVERAGE(E2#)

E2セルに入力した MAP 数式が、12行分の絶対誤差をE2:E13にスピル出力します。それを AVERAGE で集計するだけでMAEが求まります。E2## はスピル参照演算子で、E2を起点にスピルした配列全体を参照します。

1行で完結させたい場合は次のようにネストします。

1行版 =AVERAGE(MAP(B2:B13, C2:C13, LAMBDA(a, b, ABS(a-b))))

MAEの単位は元データと同じ「万円」です。「平均して○万円外れていた」という直感的な解釈ができるのが最大の長所です。

STEP 4 MSEとRMSE ― 二乗誤差と平方根

MSE(Mean Squared Error)は誤差を二乗してから平均します。二乗により大きな誤差が強調されるため、外れ値に敏感な指標です。RMSE(Root Mean Squared Error)はMSEの平方根をとり、単位を元データと揃えたものです。

定義 MSE = (1/n) × Σ (予測値 − 実績値)² / RMSE = √MSE
F2(誤差配列) =MAP(B2:B13, C2:C13, LAMBDA(a, b, (a-b)^2))
MSE =AVERAGE(F2#)
RMSE =SQRT(AVERAGE(F2#))

MSEは「万円²」という二乗単位になるため、直感的な解釈がしにくくなります。実務でよく使われるのはRMSEです。MAEと同じ「万円」単位に戻るため比較しやすく、かつ二乗の特性で大きな誤差をより強く反映します。

RMSEがMAEより大きければ大きいほど、誤差が一部の月に集中していることを意味します。両者の乖離を見ることで、誤差の分布の偏り(外れ値の存在)を間接的に診断できます。

STEP 5 MAPE ― 平均絶対パーセント誤差

MAPE(Mean Absolute Percentage Error)は、誤差を実績値に対する割合(%)で表します。単位の異なる複数の予測モデルや商品カテゴリを横断比較したいときに有効です。

定義 MAPE = (1/n) × Σ |予測値 − 実績値| / 実績値 × 100
G2(誤差配列) =MAP(B2:B13, C2:C13, LAMBDA(a, b, ABS((a-b)/b)))
MAPE(%) =AVERAGE(G2#)*100

MAPE の LAMBDA 内では除数が b(実績値)である点に注意が必要です。実績値がゼロまたは極端に小さい月があると、割り算の結果が発散してMAPEが意味をなさなくなります。売上データのように実績値が必ず正の値をとる場面では安定して使えます。

MAPEは「平均して実績の○%外れていた」という解釈ができます。業界や経営層への報告では、万円単位よりもパーセントのほうが伝わりやすいケースが多いでしょう。

STEP 6 4指標を1箇所に集約する

各指標の誤差配列(E列・F列・G列)と集計値を以下のようにシートに整理します。

A B C D E F G
1 予測値 実績値 (空白) 絶対誤差 二乗誤差 絶対%誤差
2 1月 320 310 10 100 0.0323
3 2月 290 305 15 225 0.0492
4
15 MAE 13.00
16 MSE 244.00
17 RMSE 15.62
18 MAPE 3.16%

RMSEがMAEより約2.6万円大きくなっています。これは一部の月に比較的大きな誤差が存在することを示唆しています。MAPEは約3.2%であり、「月次売上の予測精度としてはおおむね良好」という判断の目安になります。

外れ値感度の比較 ―― 指標の「性格の違い」を確認する

STEP 7 1件の大外れを加えて各指標の反応を見る

各指標が外れ値にどれだけ敏感かを確認するため、4月の実績値をあえて420から650に書き換えてみます(予測値380のまま)。誤差が40万円から270万円へと急拡大する1件の大外れです。

指標 外れ値なし 外れ値あり(4月+230万) 変化率
1 MAE 13.00 万円 32.17 万円 +147%
2 RMSE 15.62 万円 78.65 万円 +404%
3 MAPE 3.16% 5.83% +84%

同じ1件の大外れに対して、各指標の反応は大きく異なります。

  • MAEは絶対値を単純平均するため、外れ値の影響は「その月の誤差 ÷ n」に比例します。増加率は+147%と最も穏やかです。
  • RMSEは誤差を二乗してから平均するため、大きな誤差が指数的に強調されます。+404%とMAEの約2.7倍の感度で外れ値に反応しています。
  • MAPEは実績値が分母に来るため、実績値が急増した月(650万円)では分母も大きくなり、今回は+84%と3指標の中で最も増加率が小さくなっています。実績値の絶対水準によって感度が変わる点が、MAPEの最大の特性です。実績値が小さい商品カテゴリでは逆に非常に敏感に反応するため、使用するデータの性質を把握したうえで採用する必要があります。

この性質から、指標の使い分けの基準が見えてきます。「大外れをとにかく検知したい」ならRMSE、「典型的な誤差水準を安定して把握したい」ならMAE、「規模の異なるカテゴリを横断比較したい」ならMAPEという選択が合理的です。

まとめ ―― MAP関数と誤差指標の3箇条

  1. 2引数MAPは「対応する2列の処理」に最適: 予測値と実績値のような「同じ行に対応する2列」を同時処理する用途で、2引数構文は威力を発揮します。誤差配列を明示的にスピルしておくことで、各月のどこに大きな誤差があるかも一目で把握できます。
  2. 誤差配列を中間出力として残す設計が堅牢: MAP の結果を中間列(E・F・G列)に出力し、そこから AVERAGESQRT で集計する構成は、デバッグや月別の誤差確認がしやすく実務的です。1行ネストで完結させることもできますが、検証フェーズでは中間出力を残す方が安全です。
  3. 指標は「目的」で選ぶ: MAE・RMSE・MAPEはそれぞれ外れ値感度と単位の扱いが異なります。「なんとなくRMSE」ではなく、外れ値への感度・単位の直感性・比較対象の性質を踏まえて選択し、必要に応じて INDEX 関数などで必要な重要特徴量だけをトリミング・抽出することが、予測モデルの正しい評価につながります。