Python

Prophetとは|Facebook(Meta)が開発した時系列予測ライブラリの仕組みと使い方

Prophetは、Facebook(現Meta)のCore Data Scienceチームが2017年に公開した、時系列予測のためのオープンソースライブラリです。統計の専門知識がなくても、売上や来客数などの将来値を数行のコードで予測できる手軽さから、定番ツールとして広く使われています。なお本記事で扱う「Prophet」は、英単語の prophet(預言者)ではなく、この時系列予測ライブラリを指します。本記事では、仕組み・使い方・主要パラメータ・他手法との比較までを、実行確認済みのコードとあわせて整理します。

まとめ

Prophetは、時系列データを「トレンド+季節性+休日効果+ノイズ」に分解する加法モデルで将来を予測するPython/Rライブラリです。入力は日付列 ds と値列 y の2列だけ、fit() して predict() するだけという scikit-learn 風のシンプルな手順が特徴で、欠損値や外れ値にも比較的強く、結果を成分ごとに分解して解釈できます。一方で、分・時間単位の高頻度予測や、明確な因果関係の説明には向きません。導入は pip install prophet の一行。以下では、モデルの考え方から実装、精度を上げるパラメータ、ARIMAや深層学習との使い分けまでを順に見ていきます。

Prophetの概要と特徴

Prophetは、PythonとRの両方で提供され、PyPIやCRANから導入できるオープンソースのライブラリです。Azure Machine LearningのAutoMLやDataRobotなどの自動機械学習サービスにも予測アルゴリズムとして組み込まれており(AWSでもSageMaker Autopilotで利用できます)、ビジネスの需要予測を中心に普及しています。元はFacebook内部の予測ニーズから生まれ、データサイエンティストだけでなくエンジニアやアナリストでも扱えるよう、設定を最小限に抑えた設計になっています。

現在は大規模な新機能の追加よりも、安定運用とメンテナンスを重視したフェーズにあります(2017年の公開以降、定番ライブラリとして継続的に利用されています)。バージョンや対応状況は更新されることがあるため、最新情報は公式ドキュメントやPyPIで確認するのが確実です。

Prophetが向いているデータ・向かないデータ

Prophetが力を発揮するのは、週次・年次といった明確な季節性があり、数シーズン分の履歴があるデータです。小売の売上、Webサイトの流入、来店者数のように「周期性+トレンド+イベントの影響」を持つ日次・週次データが典型例です。逆に、秒・分単位の高頻度データ、季節性がほとんどないデータ、履歴が極端に短いデータでは精度が出にくく、別手法を検討した方がよい場面もあります。

Prophetのモデル構造(加法モデル)

Prophetは、時系列を複数の成分の足し合わせで表現する一般化加法モデル(GAM)を採用しています。基本式は次の形です。

y(t) = g(t) + s(t) + h(t) + ε_t

各項の意味は、g(t) がトレンド(長期的な増減)、s(t) が季節性(週次・年次などの周期的変動)、h(t) が休日・イベント効果、ε_t が正規分布に従う誤差(ノイズ)です。成分を分けて扱うため、予測後に「どの要因がどれだけ効いたか」を分解して確認でき、解釈しやすいのが大きな利点です。

季節性 s(t) はフーリエ級数で近似され、いくつの波で表現するか(fourier_order)によって季節パターンの滑らかさが変わります。休日効果 h(t) は、指定した日付とその前後だけに効く特別な項として扱われ、年末年始やセールのような一時的な山・谷を表現します。これらを個別に推定して足し合わせるのが、Prophetの予測の基本的な考え方です。

トレンド g(t) は、一定ペースで増減する線形成長と、上限(キャパシティ)に向けて鈍化するロジスティック成長の2種類から選べます。新規市場の急成長後に飽和するようなデータでは、上限を指定したロジスティック成長が有効です。また、トレンドが切り替わる「変化点」を自動検出するため、急激な傾向変化にも追従します。

Prophetの使い方|インストールから予測まで

導入はpipで一行です(旧パッケージ名 fbprophet は非推奨で、現在は prophet を使います)。Rの場合は install.packages('prophet') です。

pip install prophet

データは、日付列 ds と予測対象の値列 y を持つ pandas のDataFrameとして用意します。dsYYYY-MM-DD 形式の日付(またはdatetime)、y は数値で、1つのモデルにつき1系列を渡すのが基本です。途中に欠損日があっても事前の穴埋めは不要で、Prophetが内部で扱います。あとはモデルを作って fit() し、将来の日付を作って predict() するだけです。

import pandas as pd
from prophet import Prophet
 
# ds(日付)と y(値)の2列を用意する
df = pd.read_csv("data.csv")  # 列: ds, y
 
model = Prophet()
model.fit(df)
 
# 90日先までの枠を作って予測
future = model.make_future_dataframe(periods=90)
forecast = model.predict(future)
 
# yhat(予測値)と 80% 予測区間
print(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail())

予測結果は、点推定の yhat に加え、既定で80%の予測区間(yhat_loweryhat_upper)が得られます。区間の幅は interval_width で変更できます。可視化は matplotlib ベースのメソッドが用意されており、予測全体とトレンド・季節性の分解を簡単に確認できます。

model.plot(forecast)             # 実測+予測+予測区間
model.plot_components(forecast)  # トレンド・週次/年次季節性に分解

予測結果の見方

plot_components() が出力する分解図を読むと、トレンド・週次・年次の各成分が将来値にどう寄与しているかが一目で分かります。たとえばトレンド成分が右肩上がりなら基調は成長、週次成分で週末に山があれば「週末に需要が増える」傾向、年次成分の谷は閑散期を示します。判断の際は点推定の yhat だけでなく、予測区間(yhat_loweryhat_upper)の幅も合わせて確認し、予測の不確実性を踏まえて意思決定するのが実務的です。

トレンドの「変化点」も実務では要チェックです。Prophetはトレンドが切り替わった時点を自動で検出しますが、検出された変化点が実際の出来事(サイトのリニューアル、価格改定、需要が急変した外的ショックなど)と対応しているかを確認すると、予測の妥当性を判断しやすくなります。変化点に過剰に反応して予測がぶれる場合は changepoint_prior_scale を下げて滑らかにし、逆に直近のトレンド転換に追従できていない場合は値を上げて調整します。

予測区間が極端に広いときの対処も整理しておきます。まずは学習データの期間や件数が十分かを確認し、季節性が複数ある場合は add_seasonality で明示的にモデル化します。外れ値が区間を押し広げているようなら、明らかな異常値を欠損(NaN)に置き換えてから学習し直すと安定することがあります。それでも幅が縮まらない場合は、データ自体のばらつきが本質的に大きいと考え、点推定だけに頼らず区間を前提にした意思決定へ切り替えるのが現実的です。

精度を上げる主要パラメータ

既定設定でも実用的な予測が出ますが、データに合わせて以下を調整すると精度が上がります。

変化点の感度(changepoint_prior_scale):トレンド変化への追従度合いを調整します。値を大きくすると変化に敏感に、小さくすると滑らかになります(既定0.05)。

model = Prophet(changepoint_prior_scale=0.1)
model.fit(df)

カスタム季節性(add_seasonality):月次・四半期など、既定にない周期を追加できます。fourier_order で周期の表現力を調整します。

model = Prophet()
model.add_seasonality(name="monthly", period=30.5, fourier_order=5)
model.fit(df)

外部変数(add_regressor):キャンペーン有無や気温など、予測に効く外的要因を回帰項として組み込めます。学習用・予測用のどちらのDataFrameにも、その列を含める必要があります。

model = Prophet()
model.add_regressor("promo")   # 例: キャンペーン実施フラグ
model.fit(df)                  # df に promo 列を含める
 
future = model.make_future_dataframe(periods=90)
future["promo"] = ...          # 将来分の promo も埋める
forecast = model.predict(future)

このほか、holidays 引数に祝日・イベント表を渡せば、特定日の影響をまとめてモデル化できます。精度の検証には、時系列用のクロスバリデーションが用意されています。

from prophet.diagnostics import cross_validation, performance_metrics
 
cv = cross_validation(model, initial="365 days", period="90 days", horizon="30 days")
metrics = performance_metrics(cv)  # mae, rmse, mape などを算出
print(metrics.head())

他の時系列予測手法との比較

Prophetは「手軽さ」と「解釈性」で優位ですが、万能ではありません。代表的な手法との違いを整理します。長文の説明は本文で補い、表は要点のみ短くまとめています。

項目 Prophet ARIMA / SARIMA 深層学習(LSTM等)
前提知識 少ない 多い 多い
季節性 自動・複数可 手動設定 学習で獲得
外部変数 容易 限定的 容易
欠損・外れ値 強い 弱い 前処理依存
解釈性 高い 低い
必要データ量 多い
実装難度 低い 高い

定常性の仮定やパラメータ設計が前提となるARIMA/SARIMAに比べ、Prophetは非定常データや複数季節性を自動で扱えます。一方、複雑な非線形パターンや大規模データで最高精度を狙う場合は、LSTMなどの深層学習が有利になることもあります。まず素早く解釈しやすいベースラインを作るならProphet、と位置づけると選びやすくなります。

Prophetの活用シーンと注意点

実務では、小売・ECの需要予測や在庫最適化、Webサイトの流入予測、金融でのトレンド把握、エネルギーや気象の需要予測などで活用されています。外部変数や休日効果を組み込めるため、キャンペーンや季節イベントの影響を加味した予測も可能です。

たとえばECサイトでは、過去2〜3年の日次売上を学習させ、セールやキャンペーン期間を外部変数・休日効果として与えることで、在庫やプロモーションの計画に使える需要予測が得られます。Webメディアでは日次PVを予測してサーバーリソースや編集計画に活かす、製造業では受注数の季節変動を捉えて生産計画へ反映する、といった使い方が一般的です。いずれも「まず手早く解釈しやすい予測を立てたい」という場面と相性が良いのがProphetの強みです。

注意点として、Prophetはあくまで統計的なパターン外挿であり、変数間の因果関係を説明するものではありません。また、分・時間単位の高頻度予測や、履歴の極端に短いデータには不向きです。トレンドの変化点を自動検出する反面、過去にない急変は予測しきれないため、重要な意思決定では予測区間(不確実性)まで含めて判断することが大切です。前述のとおり、ライブラリは現在メンテナンスを重視したフェーズにあるため、依存関係や対応バージョンは導入時に公式情報で確認してください。

よくある質問(FAQ)

Q. Prophetの読み方は?「fbprophet」とは違う?

A. 読み方は「プロフェット」です。かつてのPythonパッケージ名は fbprophet でしたが、現在は prophet に統一されています。導入時は pip install prophet を使ってください。

Q. 無料で使える?商用利用は可能?

A. オープンソースとして公開されており、無料で利用できます。具体的なライセンス条件は公式リポジトリで確認してください。

Q. PythonだけでなくRでも使える?

A. はい。PythonとRの両方で提供されており、CRANからも導入できます。基本的な考え方や手順は両者でほぼ共通です。

Q. ARIMAとどちらを使うべき?

A. 手軽さ・解釈性・複数季節性への対応を重視するならProphet、定常データで古典的な統計モデルを厳密に組みたいならARIMA/SARIMAが向きます。まずProphetでベースラインを作り、必要に応じて比較するのが実務的です。

Q. どれくらいのデータ量が必要?

A. 季節性を捉えるには、最低でも数シーズン分(年次季節性なら2年程度以上)の履歴があると安定します。データが少ないと季節成分の推定が不安定になります。

Q. 複数の商品・店舗をまとめて予測できる?

A. Prophetは1系列ずつ予測するのが基本です。多数の系列を扱う場合は系列ごとにモデルを学習させる構成にし、必要に応じてSparkやAutoMLと組み合わせて並列化します。

Q. 予測区間が広すぎるときの対処は?

A. 学習データを増やす、変化点の感度(changepoint_prior_scale)を下げる、季節性や外部変数を適切に設定する、などで改善することがあります。それでも広い場合は、データ自体のばらつきが大きい可能性があります。

関連記事

資料請求

RELATED POSTS 関連記事