5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【R】時系列分析による未来予測モデルを比較してみた

5
Last updated at Posted at 2025-12-15

R言語 Advent Calendar 2025 16日目の記事です。
この記事は、R言語 Advent Calendar 2025 6日目の記事の続きです。

 前回の記事では統計検定の学習からSARIMAモデルまでたどり着きましたが、これは半世紀も前から使われているモデルです。それなら、今の時代のAI的なモデルにはかなわねんじゃね?という疑問を持つのは一般ピーポーである私めの当然の疑問となります。そこでLLMモデルに聞いてみたところ、下記のことがわかりました。

  • Rのforecastライブラリだけでも分析可能な時系列分析モデルが複数ある
  • 更にそれらのモデルの組み合わせによるハイブリッドモデルもある
  • META社が近年Prophetモデルなるものを作った

 じゃあ比較してみましょう。

先行研究など

 無知蒙昧な私が思いつくことですから、そういうことを先に考える方はいらっしゃっいます。
 先行研究をまとめると、

  1. Perone (2021) - COVID-19入院患者予測の比較研究

    • 最良の単一モデルはNNARとARIMA
    • ハイブリッドモデルは一般的に単一モデルよりも正確
    • 最良のハイブリッドモデルは常にNNARプロセスを含んでいた
  2. タイの家禽輸送時死亡率予測(2024)

    • TBATSとETSが最も高い予測精度を示した
  3. ガーナの降雨量予測(2025)

    • Prophetモデルが他のすべてのモデルを上回る性能を示した
  4. パキスタンのマラリア発生予測(2024)

    • Prophet-TBATSハイブリッドモデルが最良

 当たり前のことですが未来予測に「最良のモデル」は存在しないということですね。
 でも自分でやってみないとわからない、ということで、Rで実行してみました。

使用した時系列データとモデル

今回比較したモデル

  • SARIMA(ARIMA)
  • ETS
  • TBATS
  • NNAR
  • Prophet

LLMに5つの特徴をまとめてもらいました。あくまでご参考までに。

モデル 手法 歴史 特徴
SARIMA Seasonal Autoregressive Integrated Moving Average。ARIMAの季節版で、自己回帰(AR)、統合(I)、移動平均(MA)の成分に季節性を追加。トレンド、非定常性、季節性をモデル化し、過去値と誤差の依存を捉える。 Box-JenkinsによるARIMA(1970年代)の拡張として発展。季節性を扱うために1980年代以降に普及。 線形モデルで、非定常性と単一の季節性を効果的に扱う。短期・長期依存を捉え、通貨レートや売上予測に適するが、複雑な複数季節性には限界がある。
ETS Exponential Smoothing State Space Model。指数平滑の状態空間フレームワークで、エラー(Error)、トレンド(Trend)、季節性(Seasonality)を組み合わせ。過去観測の加重平均を使い、最近のデータに重みを置く。 Holt-Winters法(1950-60年代)の拡張。Hyndmanらにより2000年代に状態空間モデルとして体系化。 シンプルで計算効率が高く、さまざまなトレンド(加法的/乗法的)と季節性を自動選択可能。短期予測に強く、Excelなどのツールで実装しやすい。
TBATS Trigonometric seasonality, Box-Cox transformation, ARMA errors, Trend, Seasonal components。三角関数で季節性を表現し、Box-Cox変換で分散を安定化、ARMAで誤差をモデル化。 De Livera, Hyndman, Snyderにより2011年に提案。複雑な季節性を扱うためのBATSの拡張。 複数・非整数季節性(例: 日次+週次)を扱え、計算負担を軽減。電力消費や小売データのような複雑な時系列に強み。
NNAR Neural Network AutoRegression。時系列のラグ値を入力としたフィードフォワードニューラルネットワーク。非線形関係を学習し、予測を行う。 時系列へのニューラルネット応用は1990年代から。HyndmanとAthanasopoulosにより2018年にNNARとして紹介。 非線形パターンを捉え、ARIMAより精度が高い場合がある。隠れ層の調整が可能だが、データ量が多く必要で解釈しにくい。
Prophet 加法的モデルで、トレンド(非線形)、季節性(年次/週次/日次)、休日効果を分解。ベイズ推定でパラメータを調整。 Facebook(現Meta)により2017年に公開(Taylor & Letham, 2018)。ビジネス予測向けに開発。 トレンドと季節性を自動検出、欠損値や異常値に耐性。Python/Rで使いやすく、ビジネスサイクル(休日効果)に適するが、短期データでは不安定。

 そしてこれらを掛け合わせたハイブリッドモデルを12個ほど準備しました。先行研究で取り上げられているモデルを中心に、任意に掛け合わせています。なお、Prophetモデルのハイブリッドは手動を関数を作らなければならないので、TBATS-Prophetハイブリッドモデルのみとしました。
 今回使ったモデルは以下のとおりです(ハイブリッドモデルのモデル順は順不同)。

  • ARIMA(SARIMA)
  • ARIMA-ETS
  • ARIMA-ETS-NNAR
  • ARIMA-ETS-NNAR-TBATS
  • ARIMA-ETS-TBATS
  • ARIMA-NNAR
  • ARIMA-NNAR-TBATS
  • ARIMA-TBATS
  • ETS
  • ETS-NNAR
  • ETS-NNAR-TBATS
  • ETS-TBATS
  • NNAR
  • NNAR-TBATS
  • Prophet
  • TBATS
  • TBATS-Prophet

時系列分析に必要なライブラリ

library(forecast)
library(forecastHybrid)
library(tseries)
library(prophet)

prophetライブラリのインストールはcranよりも下記方法が推奨のようです。

# GitHubから最新版(推奨)
install.packages('remotes')
remotes::install_github('facebook/prophet@*release', subdir = 'R')

モデル実行方法

単一モデル実行方法(ETSモデルを例に)

# ETS
model_ets_mar <- ets(ts_data_mar)
fc_ets_fy <- forecast(model_ets_mar, h = 12)

auto.arima(), ets(), tbats(), nnerar()の各関数を使ってモデルを作り、forecast()で予測という、なんと簡単な手順!R礼賛!

ハイブリッドモデル(ARIMA-ETS-NNARモデルを例に)

hybrid_aen <- hybridModel(ts_data_mar, models = "aen", weights = "equal")
fc_hybrid_aen <- forecast(hybrid_aen, h = 12)

hybridModel(models = "aen")の記述だけでARIMA-ETS-NNARモデルができてしまうとは!R絶賛!

Prophetモデルとそのハイブリッドモデル

m_prophet <- prophet(data_filtered,
                     yearly.seasonality = TRUE,
                     weekly.seasonality = FALSE,
                     daily.seasonality = FALSE)
future_dates <- seq(from = data_end %m+% months(1), to = target_month,
                    by = "month")
future <- data.frame(ds = c(data_filtered$ds, future_dates))
fc_prophet <- predict(m_prophet, future)

 Prophetはforecastライブラリほど簡易ではありませんが、かといってそれほど複雑でもありません。予測する期間(上記コードの"future")を明確にする必要があるのというのが1点目。もう1点はより重要です。

Prophetパッケージ(R版)のprophet()関数では、入力データフレームに 'ds'(datastamp:日付列)と'y'(値列)という正確な列名 が必須です。これらの列名でない場合、関数はデータを認識できず、エラーが発生します。このため、必要に応じてrename()処理が必要になります。

df_prophet <- data |> 
  rename(ds = 1, y = 2)

 また、Prophetと何かを掛け合わせるハイブリッドモデルは、別関数を作る必要があります。これについてはLLMにRコードを作ってもらいました。

使用した時系列データ

  • 軽井沢町の月別平均気温(2012年1月~2025年12月の月次データ。12か月ごとの季節変動が明確)。軽井沢を使ったのは、やっぱり寒いのか見てみたかったからです(笑)
  • 勤務先の売り上げデータ(2012年12月~2025年11月の月次データを匿名化。日経平均に比べれば近年は比較的マイルドな動き。季節変動まあまああり)
  • 日経平均225(2010年1月~2025年12月の月初初値の月次データ。今年は急激に上昇し最高値更新。月次の周期性は小さい)

軽井沢町の月別平均気温_data_timeseries-1.png
売上_data_timeseries-1.png
日経平均225_data_timeseries-1.png

予測方法

  • 静的予測(2025年3月までのデータをもとに、2025年度の予測を行う)
  • ローリング予測(前月までのデータをもとにその後の予測を行う。例:2025年10月予測は2025年9月までのデータを活用して予測する)

予測精度を評価する方法

  • RMSE(二乗平均平方根誤差: 予測誤差の平方根平均)
  • MAE(平均絶対誤差: 予測誤差の絶対値平均)
  • MAPE(平均絶対パーセント誤差: 誤差のパーセント平均)

以上3つの順位を平均化して総合順位を算出。

結果

軽井沢の平均気温

軽井沢町の月別平均気温_forecast_all_models_static-1.png
軽井沢町の月別平均気温_rolling_all_models-1.png
軽井沢町の月別平均気温_rank_heatmap-1.png

 まず平均気温については、どれもほぼ同じ動きで、この中で優劣をつけることには意味がないように思えます。このように季節性のはっきりしたものは、ほぼどのモデルを利用してもよいのではないでしょうか。

筆者勤務先の売上

売上_forecast_all_models_static-1.png
 売上の方は平均気温とは少し様相を異にし、極端な予測を出すモデルがいくつか出てきます。静的予測で目立つのは12月以降に目立つ高い予測の2つの折れ線です。青線がProphet、紫線がTBATS-Prophetモデルです。
売上_rolling_all_models-1.png
 ローリング予測でも、Prophet、TBATS-Prophetモデルの予測上振れが目立ちます。なお、3月に最も予測値の低い赤線も気になりますが、これはSARIMAモデルです。
売上_rank_heatmap-1.png
 というわけで、期待のProphetモデルの予測精度が最も低いという結果でした。一方ETSやTBATSの単一モデルの健闘が光ります。

日経平均

日経平均225_forecast_all_models_static-1.png
日経平均225_rolling_all_models-1.png
 高市首相誕生などの影響で株価が一気に上がった11月の影響をもろに受け、12月の予測が極端に出るモデルが6つありました。
 高い方4つは予測が高い方からNNAR、NNAR-TBATS、ARIMA-NNAR、ETS-NNARと、NNARモデルとそのハイブリッドモデルが占めました。
 低い方の2つは予測が低い方からProphet、TBATS-Prophetでした。ここでもProphetモデルの値が極端に出ており、やはり特徴的な予測に見えます。
日経平均225_rank_heatmap-1.png
 日経平均についてまとめると、NNARモデルとProphetモデルの順位が極端に出ました。ここでもTBATS単一モデルが健闘しています。

まとめ

  • Prophetモデル、NNARモデルは極端な値をとることがある。
  • ETSモデルとTBATSモデル、とりわけTBATS単一モデルは今回の実験では精度が高かった。

結論

 時系列分析予測モデルの中でも「癖の強いモデルが何か」をある程度認識することができました。
 今回は5つの単一モデルとそれを組み合わせ掛け合わせた12のハイブリッドモデル、計17モデルを使用しました。GitHub上にRコード(timeseries_forecast_complete.R)を置いておきますので、これで実行しても構わないのですが、ただしやはり時間はかかります。今回使った売上モデルについては、実行終了までに1,744秒(約30分)かかりました。
 個人的には最も古典的なSARIMA、単一モデルでも精度の良かったTBATS、ETS、極端な結果の出やすいProphet、NNARという5つの単一モデルを実行するだけで十分ではないかとの感触を得ております。皆さんも手持ちのデータでいろいろ遊んでみると楽しめるのではないでしょうか。

ENJOY!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?