Prophetの使い方

Prophetによる時系列予測の使い方や結果の解釈の仕方、よくある質問をご紹介します。

Prophetは、Facebookにいたデータサイエンティスト(Sean J. Taylor氏)が作成した時系列予測のアルゴリズムで、オープンソースとして公開されています。Prophetは典型的な時系列予測のモデルと異なり、統計、時系列予測の専門知識がなくても使えるようにデザインされているのが特徴です。

Prophetを使うことで下記の質問に答えていくことができます。

  • この日は予測対象の値(例:ユーザー数)が何件と予測できる。
  • このデータを使うことで、日付の単位ごとの予測対象の値をどれだけのずれで予測できるのか。
  • どの変数が予測対象の値を予測する上で重要なのか。

必要なデータ

Prophetを作成するためには、日付(日付/時間)型の列と予測対象の値の列が必要です。

予測対象の値の列には、数値型(numeric)の列と、ロジカル型(logical)の列が選択できます。また、Prophetでは1行がどの単位なのかといったことはそこまで重要ではありません。例えば、日毎の売上を予測したい場合、1行が1注文の売上データでも、1行が1日単位に集計された売上データでもどちらも同じく1日単位の予測が行えます。

サンプルデータ

今回はサンプルデータとして、自転車のレンタルデータを使用していきます。このデータは1行が1日単位のデータで、列には日付、レンタル数、気温などの列があります。

Prophetのモデルを作成する

今回は日ごとの「レンタル数」を予測するProphetのモデルを作成します。

アナリティクスビューを選び、タイプに「Prophet」を選択します。

日付/時間に日付の列を割り当て、日付の単位を丸め処理の「日」を選択します。

予測対象の値に「レンタル数」を選び、集計関数に「合計値 (sum) 」を選択します。

予測期間はデフォルトでは10が設定されていますが、プロパティから変更できます。日付/時間で選んだ単位が「日」の場合、予測期間が10の場合は10日後までの予測となります。

今回は1年後(365日後)までの予測をしたいので、予測期間に「365」を指定して適用します。

Prophetのモデルが作成されました。

結果の解釈

予測結果

予測結果タブでは、Prophetで算出された予測値と実測値がラインチャートで可視化されます。

青の線は実測値を表しています。

オレンジの線は予測値を、淡いオレンジ色の幅は予測の不確定区間(uncertainty interval)を表します。

オレンジ色の線だけの区間は今後1年間(365日)の予測を表しています。

例えば、2013年の6月28日の予測値は8,560件ということがわかります。

変数重要度

変数重要度タブでは、どの変数が予測対象の値と相関が強いのか、予測する時に重要なのかを調べることができます。

外部予測変数や祝日情報を使用していない場合は、季節性の周期のみ表示されます。

この場合は、年周期の方が、週周期に比べて予測に大きな影響を与えていることがわかります。

トレンド

トレンドタブでは、トレンドラインとそのトレンドの変化点がチャートとして表示されます。

緑の線がトレンドラインになります。

赤いバーはチェンジポイントでのトレンドラインの傾きの変化量を表します。

年周期

年周期タブでは、年周期の季節性のチャートが表示されます。ちなみに、年周期は日付の期間が2年以上ある場合のみ適用されます。

毎年、5月から10月まではレンタル数が多い傾向があるようです。

11月から2月までは季節が冬のためか、レンタル数が少ない傾向がみて取れます。

週周期

週周期タブをクリックすると週周期の季節性のチャートが表示されます。週周期は、日付の単位が「日」よりも小さい必要があります。

毎週、日曜日と月曜日のレンタル数が少なくなる傾向が読み取れます。

木曜日と金曜日はレンタル数が多くなるようです。

影響度

影響度タブでは、予測値を構成する各要素(トレンド、季節性)が表示されます。外部予測変数を設定している場合は、外部予測変数での効果も表示されるようになっています。

Prophetの季節性のモードが加法的の場合は、トレンドに対して年周期や週周期の季節性などの変数の効果を足し上げて予測値が求められます。

そのため、影響度タブの見方としても、より効果がある変数は標準偏差の平均値である0からどれだけ値にばらつきがあるかで、効果があるのかないのかがわかります。

もし変数のばらつきが大きい場合は、その分予測値に対して加算されるため、より効果がある変数であると判断することができます。

サマリ

サマリタブでは、この予測モデルの評価を確認できます。

表示される指標は下記の4つになります。

  • RMSE (Root Mean Square Error) : 予測からのずれの二乗の平均のルート
  • MAE (Mean Absolute Error) : 予測からのずれの絶対値の平均
  • MAPE (Mean Absolute Percentage Error) : パーセントで表した予測からのずれの絶対値の平均
  • MASE (Mean Absolute Scaled Error) : MAEを、トレーニングデータでのナイーブ予測(一つ前の期と同じ値が現れるであろうという単純な予測)のMAEで割ったもの。テストモードの時のみ表示される。

この予測モデルのRMSEをみると、レンタル件数の予測値は、平均して976件ほどのずれがあるようです。MAPEは0.6のため、平均して60%ほどのずれがあることになります。

データ

データタブでは、モデルに使用したデータと予測値がテーブル形式で表示されます。

予測対象であるレンタル数と、このモデルで算出された予測値(Predicted Value)を確認できます。

祝日効果を追加する

Prophetで祝日効果を使用したい場合、デフォルトで使用できる「国民の祝日データ」を適用するか、自信が持つ「祝日情報の列を追加」する方法があります。

国民の祝日データはプロパティから設定できます。祝日データの国はアメリカの場合は「US」を、日本の場合は「JP」を入力します。

企業独自の祝日やイベントがあり、その日に予測対象の値が高くなる、または低くなるとわかっている場合は、その情報をProphetのモデルに組み込むことができます。

そのためには、データとして祝日情報(イベント情報)の列を持っておく必要があります。

祝日情報の列に「祝日」の列を選択して実行することで、祝日の情報をProphetのモデルに組み込むことができます。

外部予測変数を使用してモデルを作成する

Prophetの予測精度を上げるために、外部予測変数を使ってモデルを作成することができます。

例えば、レンタル数の予測精度を上げるために、気温、湿度、風速の列を使用したいとします。

外部予測変数に、気温、湿度、風速の平均値を列として追加して実行します。

外部予測変数を使用していないモデル(ベースモデル)より、実測値と予測値がフィットしていることが確認できます。

注意点としては、外部予測変数を追加してモデルを作成した場合、未来の外部予測変数のデータがない場合は、現在あるデータに対してのみ予測されます。詳しくは本ノートの末尾にあるFAQをご参照下さい。

変数重要度タブを見ると、レンタル数を予測する上で気温が最も重要度が高いことがわかります。

サマリタブを見ると、RMSEが「804」と先程作成した外部予測変数を使用していないモデル(ベースモデル)の「976」より、平均的なずれが「170ほど」減少していることがわかります。

参考資料

Prophetに関する参考資料は下記をご覧ください。

  • Prophetを使った時系列予測 - リンク
  • 時系列データの加工、可視化、分析手法の紹介 - リンク

Prophetに関するよくある質問

Exploratoryが時系列予測に使用しているProphetアルゴリズムについて、よく聞かれる質問とその答えをこちらにまとめました。

Q: Prophetは何を根拠に予測を行っているのですか?

Prophetは予測を行うために、以下の特徴を過去のデータから抽出します。

  • 直線(チェンジポイントで折れる折れ線)で表される、大局的な成長・衰退トレンド
  • 年単位で繰り返される季節性
  • 週単位で繰り返される周期性
  • (日より細かい単位のデータの場合)一日単位で繰り返される周期性
  • (祝日データを指定した場合)祝日であることが結果の値に及ぼす効果

過去のデータから抽出されたこれらの値を未来に延長し、それを足し上げたものがProphetによる予測値となります。

参考リンク:Prophetの公式ドキュメント

Q: 年周期の季節性とはなんですか?

Prophetはデータから読み取ったトレンドや季節性などを足し上げて予測値を求めるモデルとなっています。

年周期の季節性はその中でも、毎年繰り返される月ごとの効果を表しており、1月や2月だったらこれくらいの効果があると想定して算出されています。

影響度タブを見るとわかりやすいのですが、トレンドと季節性を足し上げた値が予測値になっており、年周期の季節性で見たチャート(1~12月)と同じようなトレンドが毎年繰り返されていることがわかります。

※ 年周期の季節性をProphetで使用するためには、2年以上のデータを使用する必要がございます。

Q: チェンジポイントとはなんですか?

Prophetが計算する、過去の時系列のトレンドは、直線をつなげた折れ線で表されますが、この折れ線の折れている点がチェンジポイントです。

Prophetは、入力時系列データの始めの80%の部分に、均等に25個の点を置き、これらの点においてどの程度トレンドの直線を折るのが過去のデータを表現するのに最適なのかを計算します。

多くの場合、これらの点の内の一部だけで直線を折るのが最適という結果になり、その場合、これらの点において過去にトレンドの変化があったと解釈することができます。

チェンジポイントと、各チェンジポイントでのトレンドの折れ線の傾きの変化量は、トレンドビューで、赤色のバーとして表されます。

参考リンク:Prophetの公式ドキュメントでの説明

Q: 入力する時系列データは、定常的(stationary)である必要はありますか?

ARMAやARIMAといった時系列予測アルゴリズムでは、入力データの定常性(stationarity)はモデルの持つ仮定に関わる重要な条件ですが、prophetでの予測においてはあまり関係がありません。

むしろ、Prophetはトレンドや季節性といった、データの非定常性を検出して予測に利用しています。定常的なデータには、トレンドも季節性もありませんので、定常的なデータをProphetに与えても、常に一定値を返す予測となるだけであり、これはprophetが力を発揮するようなデータではないとも言えます。

参考リンク

Q: 欠損のある時系列データで予測を行うことはできますか?

はい、できます。欠損のある時系列データを扱えることは、他の多くの時系列予測アルゴリズムとの比較において、Prophetの特徴的な強みの一つです。

Q: Prophetを実行するためにはどの程度のデータが必要ですか。

例えば、年周期の季節性を予測に利用するには最低でも2年間のデータが必要になります。そのため、予測用のデータは最低でも2年間分以上を用意いただくことを推奨いたします。

Q: 多くの人が集まるイベントが開催された日、などによって起きた外れ値的なデータをどう処理したらよいでしょうか?

外れ値としてデータから除いてしまってもよいのですが、Prophetならではの方法として、こういった特別な日による影響を「祝日効果」としてモデルに組み込むことができます。これにより、将来、同様のイベントが開催されるときに、その効果を考慮に入れた予測をすることができます。

詳しくはこちらのノートをご覧ください。

Q: 将来の予測値が計算されません。

外部予測変数を利用している

Prophetで外部予測変数を使用したモデルをつくった場合は、将来の予測をするには、その将来の期間の外部予測変数の値が必要となります。将来の期間の外部予測変数がデータ中にない場合は、モデルは作成されますが、予測はされません。(過去の実績のデータフレームと将来の期間の外部予測変数ののデータフレームが分かれている場合は、データフレー無をマージすることが必要です。)

将来の予測をしたい場合には、外部予測変数は、そもそも予測がしやすい値であるか、将来の予定が決まっているような値である必要があることになります。(予測に利用するのではなく過去のデータ間の関連性を見る目的であれば、もちろんそうでなくても問題はありません。)

外部予測変数も一緒に過去の値のみから予測して欲しいところなのですが、Prophetにそういった機能がないというのが現在の状況となります。そういった機能を加えようという動き(参考:この件のgithub issue)はあるようですがしばらく時間がかかりそうに見えます。

検証モードを利用している

プロパティから検証モードを有効(TRUE)にしている場合、将来の予測は実行されませんので、検証モードを無効(FALSE)に設定してPropehtを実行してください。

Q: Prophetの場合、予測用のデータの期間を短くすることで精度が上がることもありますか?

データによっては、予測用のデータの期間を短くすることで精度が上がることがあります。

例えば、ビジネスのトレンドや周期性が昔(例:5-10年前)と比べて大きく異なるようでしたら、直近のデータだけを利用した方が良いかと思います。一方で、大きな変化がなく、ある程度決まった周期性や外部予測変数を元に予測値が決まるような状況であれば、過去のデータを含めた方が精度が高くなりやすいと言えます。

Q: Prophet(時系列予測)の変数重要度はどのように計算されているのでしょうか?

Prophetでは、それぞれの変数(または季節性)の効果の標準偏差として計算され、「影響度」タブに表示されています。

この考え方は、モデルが変数(回帰変数)を重要であるとみなしている場合、最終的な予測出力に対するその変数の影響が大きくなり、標準偏差を計算することでその影響を評価できるというものです。

変数(回帰)の場合、効果の標準偏差は、Prophet モデルの変数の「ベータ」係数と同じになります。

例えば、下記のProphetのモデルでは、売上を予測するのに「オンライン広告費用」が重要であると判断されています。

Prophetの季節性のモードが加法的の場合は、トレンドに対して年周期や週周期の季節性、外部予測変数などの変数の効果を足し上げて予測値が求められます。

※ 季節性のモードが乗法的の場合は、それぞれの変数の効果を乗算して予測値が求められます。

影響度タブを見た時に、より効果がある変数は標準偏差の平均値である0からどれだけ値にばらつきがあるかで、効果があるのかないのかがわかります。

もし変数のばらつきが大きい場合は、その分予測値に対して加算されるため、より効果がある変数であると判断することができます。

上記を踏まえると、予測値に対して、ダイレクトメール費用はあまり影響を与えていないのに対し、オンライン広告費用は予測値に対して大きな影響を与えていると判断することができます。

参考: https://github.com/facebook/prophet/issues/928#issuecomment-485501984

Q: ExploratoryはProphetをどのように呼び出しているのですか?そのコードは公開されていますか?

Exploratoryがprophetを呼び出している部分のRのコードは、こちらのgithubレポジトリで公開されています。

Q: Prophetを使って時系列データから季節性を取り除きたい

Prophetを用いることで時系列データから季節性(年周期、など)を求めることができ、その結果を元に実測値から季節性の値を除くことで季節性を除去した値を求めることが可能です。

詳細については、こちらのノートをご覧ください。

Export Chart Image
Output Format
PNG SVG
Background
Set background transparent
Size
Width (Pixel)
Height (Pixel)
Pixel Ratio