STEP 33:売上予測の実践

📈 STEP 33: 売上予測の実践

時系列データから将来の売上を予測しよう

📋 このステップで学ぶこと

  • 時系列データの3つの構成要素(トレンド・季節性・ノイズ)
  • 移動平均法による売上予測
  • 加重移動平均の考え方と計算
  • 予測精度の評価指標(MAE、RMSE、MAPE)
  • PythonとExcelでの実装方法

学習時間の目安: 2.5時間

🔍 1. 時系列データとは

売上予測が必要な理由

📌 売上予測の重要性

「来月の売上はいくらか?」はあらゆる経営判断の基盤

1. 在庫管理
・予測より売れた → 欠品で機会損失
・予測より売れない → 過剰在庫でコスト増
・適切な予測で利益を最大化

2. 人員計画
・繁忙期 → アルバイトを増員
・閑散期 → 研修や休暇を計画
・シフトの最適化

3. 予算策定
・マーケティング予算の決定
・設備投資の計画
・資金繰りの調整

4. 経営判断
・新規出店の可否
・事業拡大・縮小の判断
・投資家への説明資料

時系列データの基本概念

💡 時系列データとは
定義:
時間の経過とともに記録されたデータ
→ 過去のパターンから未来を予測する

具体例:
月次売上: 2024年1月100万円、2月110万円、3月105万円…
日次訪問者数: 1日目1,000人、2日目1,200人、3日目950人…
四半期利益: Q1 500万円、Q2 600万円、Q3 450万円…

共通点:
すべて「時間順に並んでいる」データ

時系列データの3つの構成要素

📌 3要素の分解
時系列データは、3つの要素の組み合わせで成り立っています。

1. トレンド(Trend)- 長期的な傾向
・上昇トレンド: スマートフォン市場の成長
・下降トレンド: 固定電話の減少
・横ばい: 成熟した日用品市場

2. 季節性(Seasonality)- 周期的な変動
・夏にアイスクリーム売上増
・12月にギフト需要増
・月末に給料日特需
→ 毎年(毎月)同じパターンが繰り返される

3. 残差/ノイズ(Residual)- ランダムな変動
・天候による一時的な変動
・突発的なイベント
・予測不能な要因

売上データの分解イメージ:
実際の売上 = トレンド + 季節性 + ノイズ
💡 具体例: アイスクリーム店の7月売上
実際の売上: 150万円

分解すると:
・トレンド成分: 100万円(基本的な売上水準)
・季節性成分: +40万円(夏なので増加)
・ノイズ成分: +10万円(たまたま暑い日が多かった)

この構造が分かれば、来年の7月を予測できる!
予測 = トレンド100万 + 季節性40万 = 140万円
(ノイズは予測不能なので含めない)

📊 2. 移動平均法の基本

移動平均法とは

📌 最もシンプルで実用的な予測手法
基本的な考え方:
「直近n期間の平均」を計算し、それを次の期間の予測値とする

なぜ「移動」なのか?
時間が進むにつれて、計算に使う期間も「移動」していくから

例: 3ヶ月移動平均
・4月の予測 = (1月 + 2月 + 3月) / 3
・5月の予測 = (2月 + 3月 + 4月) / 3 ← 1期間ずれる
・6月の予測 = (3月 + 4月 + 5月) / 3 ← さらに1期間ずれる

移動平均の効果:
・ノイズを除去(平滑化)
・トレンドを把握しやすくなる
・計算が簡単でExcelでも実装可能

具体例で理解する移動平均

💡 3ヶ月移動平均の計算例
月次売上データ:
1月: 100万円、2月: 110万円、3月: 105万円
4月: 115万円、5月: 120万円、6月: 125万円

3ヶ月移動平均の計算:

・3月時点: (100 + 110 + 105) / 3 = 105.0万円
・4月時点: (110 + 105 + 115) / 3 = 110.0万円
・5月時点: (105 + 115 + 120) / 3 = 113.3万円
・6月時点: (115 + 120 + 125) / 3 = 120.0万円

7月の予測:
7月予測 = (4月 + 5月 + 6月) / 3
= (115 + 120 + 125) / 3
= 360 / 3
= 120万円

「直近3ヶ月の平均が、次の月の予測値になる」

移動平均の期間による違い

📌 期間の選び方
短期(3ヶ月):
・メリット: 変化に敏感、トレンド転換を早く捉える
・デメリット: ノイズの影響を受けやすい
・適用: 変動の大きい商品、新商品

中期(6ヶ月):
・メリット: バランスが良い、実務で最も使いやすい
・デメリット: 特になし(汎用的)
・適用: 一般的なビジネス、迷ったらこれ

長期(12ヶ月):
・メリット: 安定、季節性を除去できる
・デメリット: 変化への反応が遅い
・適用: 季節変動の大きい商品、長期トレンド分析

Excelでの実装

# ============================================ # Excelでの移動平均計算 # ============================================ # 参考: 以下の設定をExcelで行う 【データ配置】 A列: 月(1月、2月、3月…) B列: 売上(100、110、105…) C列: 3ヶ月移動平均 【C4セルに入力する数式(3ヶ月移動平均)】 =AVERAGE(B2:B4) 【C4セルを下にコピーすると自動で計算範囲が移動】 C5: =AVERAGE(B3:B5) C6: =AVERAGE(B4:B6) … 【エラー回避(最初の数行はエラーになるため)】 =IFERROR(AVERAGE(B2:B4), “”) 【6ヶ月移動平均の場合】 =IFERROR(AVERAGE(B2:B7), “”) 【12ヶ月移動平均の場合】 =IFERROR(AVERAGE(B2:B13), “”)

⚖️ 3. 加重移動平均(WMA)

単純移動平均の問題点

💡 SMAの限界
問題:
単純移動平均(SMA)は、すべてのデータを同じ重みで扱う

例: 3ヶ月移動平均で7月を予測する場合
・4月の売上: 重み 1/3(33%)
・5月の売上: 重み 1/3(33%)
・6月の売上: 重み 1/3(33%)← 一番最近なのに同じ重み

これの何が問題か?
・最近の変化を十分に反映できない
・トレンド転換に気づくのが遅れる
・直感に反する(普通は最新データを重視したい)

加重移動平均の計算方法

📌 最新データに重みをかける
重みの付け方(3期間の例):
・3期前(古い): 重み 1
・2期前(中間): 重み 2
・1期前(最新): 重み 3
・合計重み: 1 + 2 + 3 = 6

計算式:
WMA = (古いデータ×1 + 中間×2 + 最新×3) / 6

具体例: 4月100万、5月110万、6月120万
WMA = (100×1 + 110×2 + 120×3) / 6
= (100 + 220 + 360) / 6
= 680 / 6
= 113.3万円

SMAとWMAの比較

💡 上昇トレンドでの違い
データ: 100 → 110 → 120(上昇トレンド)

単純移動平均(SMA):
(100 + 110 + 120) / 3 = 110.0万円

加重移動平均(WMA):
(100×1 + 110×2 + 120×3) / 6 = 113.3万円

差の意味:
・SMA: 3つの単純平均(中央値に近い)
・WMA: 最新データ(120)を重視した値
・WMAの方が上昇トレンドをより正確に反映

どちらを使うべきか?
・安定した市場 → SMA(シンプル)
・変化の激しい市場 → WMA(反応が速い)
・実務では両方計算して比較することも多い

🎯 4. 予測精度の評価

なぜ精度評価が必要か

📌 精度評価の目的
1. モデルの比較:
・3ヶ月移動平均 vs 6ヶ月移動平均
・どちらが精度が高いか?
・最適なモデルを選択

2. 信頼性の判断:
・予測結果をどの程度信頼できるか
・意思決定にどう活用するか
・リスクの見積もり

3. 経営への報告:
・「来月120万円の予測です」だけでは不十分
・「誤差±10%の予測です」と言えれば信頼性UP
・根拠のある意思決定

4. 改善ポイントの特定:
・どこで大きく外しているか
・季節性を考慮すべきか
・モデルの改善方向を決める

3つの主要な評価指標

💡 MAE・RMSE・MAPE
1. MAE(Mean Absolute Error)- 平均絶対誤差
・計算式: Σ|実績 – 予測| / n
・意味: 平均的に何万円ずれているか
・特徴: 解釈しやすい、単位が元と同じ
・例: MAE = 5万円 → 平均5万円の誤差

2. RMSE(Root Mean Squared Error)- 二乗平均平方根誤差
・計算式: √(Σ(実績 – 予測)² / n)
・意味: 大きな誤差をより重視した評価
・特徴: 外れ値にペナルティ
・例: RMSE = 8万円 → 大きな誤差がある可能性

3. MAPE(Mean Absolute Percentage Error)- 平均絶対パーセント誤差
・計算式: Σ|実績 – 予測| / 実績 / n × 100%
・意味: 平均的に何%ずれているか
・特徴: %表示で直感的、最もよく使う
・例: MAPE = 5% → 平均5%の誤差

MAPEの評価基準

📌 MAPEの目安
5%以下: 非常に良い ★★★★★
・在庫計画・予算策定に使える
・意思決定の根拠として十分

5〜10%: 良い ★★★★☆
・実務で十分活用できる
・多くのビジネスでこのレベル

10〜20%: 普通 ★★★☆☆
・参考値として活用
・改善の余地あり

20%以上: 要改善 ★★☆☆☆
・モデルを見直す必要あり
・予測を鵜呑みにしない

MAPE計算の具体例

💡 5期間のMAPE計算
データ:
実績: 100, 110, 105, 115, 120万円
予測: 105, 108, 108, 112, 118万円

各期のパーセント誤差:
1期目: |100 – 105| / 100 × 100% = 5.0%
2期目: |110 – 108| / 110 × 100% = 1.8%
3期目: |105 – 108| / 105 × 100% = 2.9%
4期目: |115 – 112| / 115 × 100% = 2.6%
5期目: |120 – 118| / 120 × 100% = 1.7%

MAPE:
(5.0 + 1.8 + 2.9 + 2.6 + 1.7) / 5 = 14.0 / 5 = 2.8%

評価: ★★★★★ 非常に良い(5%以下)
このモデルは在庫計画や予算策定に十分使えるレベル

🐍 5. Pythonでの実装

データ作成と移動平均計算

# ============================================ # 売上予測の実装 # ============================================ # 時系列データを分析し、将来の売上を予測する # 移動平均法は最もシンプルで実用的な予測手法 import pandas as pd # データフレーム操作用 import numpy as np # 数値計算用 import matplotlib.pyplot as plt # グラフ描画用 # ============================================ # サンプルデータ作成(月次売上) # ============================================ # np.random.seed(42): 乱数の再現性を確保 # → 同じコードを実行すれば同じ結果が得られる # → 42は慣習的によく使われる数値(意味はない) np.random.seed(42) # pd.date_range(): 日付の連続データを生成 # ‘2022-01-01’: 開始日 # ‘2024-12-01′: 終了日 # freq=’MS’: 月初(Month Start)の頻度 months = pd.date_range(‘2022-01-01’, ‘2024-12-01′, freq=’MS’) # ============================================ # 時系列データの3要素を作成 # ============================================ # 売上 = トレンド + 季節性 + ノイズ # 1. トレンド(長期的な傾向) # np.linspace(100, 150, 36): 100から150まで36個の等間隔数値 # → 3年間で100→150に成長する上昇トレンド trend = np.linspace(100, 150, len(months)) # 2. 季節性(周期的な変動) # np.sin(): サイン波で周期的なパターンを作成 # 2 * np.pi / 12: 12ヶ月で1周期(年次季節性) # 20 *: 振幅±20の変動 seasonality = 20 * np.sin(np.arange(len(months)) * 2 * np.pi / 12) # 3. ノイズ(ランダムな変動) # np.random.normal(0, 5, 36): 平均0、標準偏差5の正規分布乱数 noise = np.random.normal(0, 5, len(months)) # 3要素を合成して売上データを作成 sales = trend + seasonality + noise # データフレーム作成 df = pd.DataFrame({ ‘date’: months, ‘sales’: sales }) print(“【売上データ(直近12ヶ月)】”) print(df.tail(12).to_string(index=False)) print() # ============================================ # 移動平均の計算 # ============================================ # .rolling(window=n): 直近n期間のウィンドウを作成 # .mean(): そのウィンドウ内の平均を計算 # 3ヶ月移動平均: 短期的な傾向を捉える df[‘SMA_3’] = df[‘sales’].rolling(window=3).mean() # 6ヶ月移動平均: 中期的な傾向を捉える(実務で最も使う) df[‘SMA_6’] = df[‘sales’].rolling(window=6).mean() # 12ヶ月移動平均: 長期的な傾向(季節性を除去) df[‘SMA_12’] = df[‘sales’].rolling(window=12).mean() print(“【移動平均による平滑化(直近6ヶ月)】”) print(df[[‘date’, ‘sales’, ‘SMA_3’, ‘SMA_6’, ‘SMA_12’]].tail(6).round(1).to_string(index=False))

予測精度の評価

# ============================================ # データ分割と精度評価 # ============================================ # 訓練データ: モデル作成用(過去) # テストデータ: 精度検証用(直近) # → 過去データで作ったモデルが、 # 未知のデータでも通用するか確認 # 80%を訓練用、20%をテスト用に分割 train_size = int(len(df) * 0.8) # 36 × 0.8 = 28件 train = df[:train_size] test = df[train_size:].copy() print(f”訓練データ: {len(train)}件”) print(f”テストデータ: {len(test)}件”) print() # ============================================ # 6ヶ月移動平均で予測 # ============================================ window = 6 predictions = [] for i in range(len(test)): if i == 0: # 最初の予測: 訓練データの直近6ヶ月の平均 pred = train[‘sales’].tail(window).mean() else: # 2回目以降: 訓練データ + これまでの予測値を使用 recent = list(train[‘sales’].tail(window-i).values) + predictions[:i] pred = np.mean(recent[-window:]) predictions.append(pred) test[‘predicted’] = predictions # ============================================ # 評価指標の計算 # ============================================ actual = test[‘sales’].values predicted = test[‘predicted’].values # MAE: 平均絶対誤差 # np.abs(): 絶対値を計算 # np.mean(): 平均を計算 mae = np.mean(np.abs(actual – predicted)) # RMSE: 二乗平均平方根誤差 # (actual – predicted)**2: 誤差の二乗 # np.sqrt(): 平方根 rmse = np.sqrt(np.mean((actual – predicted)**2)) # MAPE: 平均絶対パーセント誤差 # 実績で割ることで%に変換 mape = np.mean(np.abs((actual – predicted) / actual)) * 100 print(“=” * 50) print(“【予測精度評価】”) print(“=” * 50) print(f”MAE: {mae:.2f}万円(平均的な誤差額)”) print(f”RMSE: {rmse:.2f}万円(大きな誤差を重視)”) print(f”MAPE: {mape:.2f}%(平均的な誤差率)”) print() # MAPEに基づく評価 if mape < 5: rating = "★★★★★ 非常に良い" elif mape < 10: rating = "★★★★☆ 良好" elif mape < 20: rating = "★★★☆☆ 普通" else: rating = "★★☆☆☆ 要改善" print(f"評価: {rating}") print() # ============================================ # 予測結果の確認 # ============================================ print("【予測 vs 実績】") for i, row in test.iterrows(): actual_val = row['sales'] pred_val = row['predicted'] error = abs(actual_val - pred_val) / actual_val * 100 print(f"{row['date'].strftime('%Y-%m')}: 実績 {actual_val:.1f} / 予測 {pred_val:.1f} / 誤差 {error:.1f}%")

次月の売上予測

# ============================================ # 次月の売上予測 # ============================================ # 方法1: 単純な6ヶ月移動平均 # 直近6ヶ月の平均を次月の予測とする next_month_sma = df[‘sales’].tail(6).mean() print(“【次月の売上予測】”) print(f”6ヶ月移動平均: {next_month_sma:.1f}万円”) print() # 方法2: 季節性を考慮した予測 # 前年同月の値に成長率を掛ける # → 季節パターンを反映できる # 前年比成長率を計算 # iloc[-1]: 最新月のデータ # iloc[-13]: 13ヶ月前(昨年同月)のデータ yoy_growth = (df[‘sales’].iloc[-1] / df[‘sales’].iloc[-13]) – 1 print(f”【季節性を考慮した予測】”) print(f”前年比成長率: {yoy_growth*100:.1f}%”) print() # 今後3ヶ月の予測(昨年同月 × (1 + 成長率)) print(“今後3ヶ月の予測:”) for i in range(1, 4): # 昨年同月の値 last_year_value = df[‘sales’].iloc[-12+i-1] # 成長率を適用 forecast = last_year_value * (1 + yoy_growth) print(f” {i}ヶ月後: {forecast:.1f}万円”) print() print(“【予測の使い分け】”) print(“・安定した市場 → 移動平均法”) print(“・季節性が強い → 前年同月比法”) print(“・成長市場 → トレンド + 季節性の組み合わせ”)

可視化

# ============================================ # 可視化 # ============================================ # グラフで傾向を視覚的に確認 # plt.subplots(): 複数のグラフを1つの図に配置 # 2, 2: 2行2列のグリッド(計4つのグラフ) # figsize: 図全体のサイズ(幅14インチ × 高さ10インチ) fig, axes = plt.subplots(2, 2, figsize=(14, 10)) # ============================================ # グラフ1: 売上と移動平均(左上) # ============================================ axes[0, 0].plot(df[‘date’], df[‘sales’], ‘b-‘, alpha=0.5, label=’実際の売上’) axes[0, 0].plot(df[‘date’], df[‘SMA_3’], ‘r-‘, label=’3ヶ月移動平均’) axes[0, 0].plot(df[‘date’], df[‘SMA_6’], ‘g-‘, label=’6ヶ月移動平均’) axes[0, 0].plot(df[‘date’], df[‘SMA_12’], ‘purple’, label=’12ヶ月移動平均’) axes[0, 0].set_title(‘売上推移と移動平均’, fontsize=13, fontweight=’bold’) axes[0, 0].set_xlabel(‘日付’) axes[0, 0].set_ylabel(‘売上(万円)’) axes[0, 0].legend() axes[0, 0].grid(True, alpha=0.3) # ============================================ # グラフ2: 予測 vs 実績(右上) # ============================================ axes[0, 1].plot(test[‘date’], test[‘sales’], ‘b-o’, label=’実績’) axes[0, 1].plot(test[‘date’], test[‘predicted’], ‘r–o’, label=’予測’) axes[0, 1].set_title(f’予測精度検証(MAPE: {mape:.1f}%)’, fontsize=13, fontweight=’bold’) axes[0, 1].set_xlabel(‘日付’) axes[0, 1].set_ylabel(‘売上(万円)’) axes[0, 1].legend() axes[0, 1].grid(True, alpha=0.3) # ============================================ # グラフ3: 予測誤差の分布(左下) # ============================================ errors = actual – predicted axes[1, 0].hist(errors, bins=10, edgecolor=’black’, alpha=0.7) axes[1, 0].axvline(x=0, color=’red’, linestyle=’–‘, linewidth=2) axes[1, 0].set_title(‘予測誤差の分布’, fontsize=13, fontweight=’bold’) axes[1, 0].set_xlabel(‘誤差(万円)’) axes[1, 0].set_ylabel(‘頻度’) axes[1, 0].grid(True, alpha=0.3) # ============================================ # グラフ4: 時系列分解(右下) # ============================================ axes[1, 1].plot(df[‘date’], trend[:len(df)], ‘g-‘, label=’トレンド成分’) axes[1, 1].plot(df[‘date’], seasonality[:len(df)], ‘orange’, label=’季節性成分’) axes[1, 1].set_title(‘時系列の分解’, fontsize=13, fontweight=’bold’) axes[1, 1].set_xlabel(‘日付’) axes[1, 1].set_ylabel(‘値’) axes[1, 1].legend() axes[1, 1].grid(True, alpha=0.3) plt.tight_layout() plt.show()

📝 STEP 33 のまとめ

✅ このステップで学んだこと
  • 時系列データ: トレンド + 季節性 + 残差の3要素で構成
  • 移動平均法: 直近n期間の平均で予測(シンプルで実用的)
  • 加重移動平均: 最近のデータを重視した予測
  • 精度評価: MAE、RMSE、MAPE(5%以下が目標)
  • 実務活用: 在庫管理、人員計画、予算策定に活用
💡 重要ポイント

売上予測は、過去のパターンが未来も続くという前提に基づきます!

予測精度向上のコツ:
季節性を必ず考慮する
外れ値を除外または調整
・複数の手法を組み合わせる
・定期的にモデルを更新

移動平均法の長所:
・シンプルで理解しやすい
・Excelで簡単に実装可能
・説明が容易(経営層への報告向き)

移動平均法の短所:
・急激な変化に対応できない
・長期予測には不向き
・トレンド転換を捉えにくい

次のSTEP 34では、より高度な時系列分析手法を学びます!

📝 練習問題

問題 1 基礎

過去6ヶ月の売上が以下の通りです。

1月: 100万円、2月: 110万円、3月: 105万円
4月: 115万円、5月: 120万円、6月: 125万円

3ヶ月移動平均法で、7月の売上を予測してください。

【解答】120万円

計算:

3ヶ月移動平均 = 直近3ヶ月の平均

7月の予測 = (4月 + 5月 + 6月) / 3
= (115 + 120 + 125) / 3
= 360 / 3
= 120万円

補足:

このデータは上昇トレンド(100→125万円)が見られます。
移動平均は「平滑化」するため、トレンドを少し遅れて反映します。

もし上昇トレンドを重視するなら:
・加重移動平均を使用
・成長率を考慮(125×1.05≒131万円など)
問題 2 基礎

加重移動平均(3期間、重み1:2:3)で予測してください。

データ: 4月 100万円、5月 110万円、6月 120万円

【解答】113.3万円

計算:

重み配分:
・4月(3期前): 重み 1
・5月(2期前): 重み 2
・6月(1期前): 重み 3
・合計重み: 1 + 2 + 3 = 6

WMA = (100×1 + 110×2 + 120×3) / 6
= (100 + 220 + 360) / 6
= 680 / 6
= 113.3万円

SMAとの比較:

SMA = (100 + 110 + 120) / 3 = 110万円
WMA = 113.3万円

WMAの方が最新データ(120万円)を重視するため、
上昇トレンドをより反映した予測になっています。
問題 3 応用

以下の予測結果からMAPEを計算し、精度を評価してください。

実績: 100, 110, 105, 115, 120万円
予測: 105, 108, 108, 112, 118万円

【解答】MAPE = 2.8%(非常に良い)

計算手順:

各期のパーセント誤差を計算:

1期目: |100 – 105| / 100 × 100% = 5.0%
2期目: |110 – 108| / 110 × 100% = 1.8%
3期目: |105 – 108| / 105 × 100% = 2.9%
4期目: |115 – 112| / 115 × 100% = 2.6%
5期目: |120 – 118| / 120 × 100% = 1.7%

MAPE = (5.0 + 1.8 + 2.9 + 2.6 + 1.7) / 5
= 14.0 / 5
= 2.8%

評価:

MAPEが5%以下なので「非常に良い ★★★★★」精度です。

この精度であれば:
・在庫計画に十分使えるレベル
・予算策定の根拠として適切
・経営判断に活用できる
問題 4 応用

アイスクリーム店の売上データが以下の通りです。

・夏(7月): 150万円
・冬(1月): 60万円
・年間平均: 90万円

このデータから、時系列の3要素(トレンド、季節性、ノイズ)の特徴を説明してください。

【解答】季節性が非常に強いデータ

分析:

1. トレンド:
年間平均90万円がベースライン
→ 長期的な成長/減少は不明(1年分のデータが必要)

2. 季節性(最も顕著):
・夏(7月): 150万円 → 平均+60万円(+67%)
・冬(1月): 60万円 → 平均-30万円(-33%)
・季節変動幅: 150 – 60 = 90万円
→ 平均売上と同じ幅で変動!非常に強い季節性

3. ノイズ:
・天候(猛暑/冷夏)による変動
・イベント(近くの祭りなど)
→ 具体的な数値は毎年のデータを比較して把握

予測への示唆:

このようなデータの予測では:

1. 単純移動平均は不適切
・6ヶ月平均を使うと季節性が消える
・夏に低い予測、冬に高い予測になってしまう

2. 前年同月比法が有効
・今年7月の予測 = 昨年7月 × (1 + 成長率)
・季節パターンを正確に反映

3. 12ヶ月移動平均でトレンド把握
・季節性を除去した「純粋なトレンド」を確認
・長期的な成長/減少を判断

❓ よくある質問

Q1: 移動平均の期間は何ヶ月が適切ですか?
データの特性によりますが、6ヶ月が最も汎用的です。

期間選択の指針:
変動が大きい(新商品、成長市場)→ 短め(3ヶ月)
安定している(成熟市場、日用品)→ 長め(12ヶ月)
季節性が強い(アパレル、旅行)→ 12ヶ月で季節性除去
迷ったら → まず6ヶ月で試す

実務では複数の期間を試し、MAPEが最小になる期間を選ぶのがベストです。
Q2: 季節性が強いデータはどう予測すればよいですか?
前年同月比または季節調整を使います。

方法1: 前年同月比
来年7月の予測 = 今年7月の売上 × (1 + 成長率)
例: 今年7月100万円、成長率10% → 来年7月110万円

方法2: 季節調整
1. 12ヶ月移動平均で季節性を除去
2. トレンドだけで予測
3. 予測値に季節指数を掛ける

季節性が強い場合は必ず考慮してください。無視すると大きな誤差になります。
Q3: 外れ値(異常値)はどう扱えばよいですか?
原因を確認してから、調整または除外を判断します。

外れ値の原因例:
・キャンペーンによる一時的な売上増
・災害や事故による売上減
・システムエラーによるデータ欠損

対処方法:
1. 原因が明確 → 調整値を使用(キャンペーン分を差し引くなど)
2. 一時的イベント → 前後の平均で補間
3. データエラー → 修正または除外

注意: 安易に除外せず、記録を残して判断基準を明確にしましょう。
Q4: 予測結果をどう報告すればよいですか?
予測値だけでなく、精度と前提条件も伝えましょう。

報告に含めるべき内容:
1. 予測値: 「来月の売上は約120万円と予測」
2. 精度: 「過去の精度はMAPE 8%(±10万円程度の誤差)」
3. 手法: 「6ヶ月移動平均法を使用」
4. 前提条件: 「特別なキャンペーンがない場合」
5. レンジ: 「110〜130万円の範囲に収まる可能性が高い」

避けるべきこと:
・点予測だけを伝える(「来月は120万円です」)
・精度を伝えない
・100%正確であるかのように伝える
📝

学習メモ

ビジネスデータ分析・意思決定 - Step 33

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE