DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

Facebookの「Prophet」を使った時系列予測

前の記事から大分時間が空いてしまって、すみません。
私事ですが、転勤などあって、ドタバタしていました。

さて、今日の話題は時系列予測です。
時系列予測を行うには、以下のような方法が挙げられます。

  1. Excel2016の新機能、「予測シート」を使う
  2. Power BIの予測機能を使う
  3. RかPythonで頑張る

さて、1番と2番については、どちらも「指数平滑法」というアルゴリズムを使っています。
3は色々方法がありますが、有名なのはRのforecastパッケージと、pythonstatsmodels.tsaでしょう。
これらの方法には、色々メリットがありますが、今日紹介するのは時系列予測界隈のニューフェイスfacebook製作のProphetライブラリです。

Prophet、素人のための時系列予測ライブラリ

facebook.github.io

煽りっぽい書き方ですが、facebookのページには、時系列予測を扱えるユーザーを広げようと書いてあります。
Prophetのモットー、'Forecasting at scale'とは、ビッグデータを扱おうという意味ではなく、時系列予測を行える人間を増やそうという意味です。
実際、Prophetは使い方にクセがありますが、かなり使いやすいライブラリです。ユーザーが指定しなければならないパラメータを、極力減らしています。

まず、以下のようなデータフレームを用意します。 そう、Pandasのデータフレームを使うことが前提です。

y ds cap
112 1949-01-01 1000
118 1949-02-01 1000
132 1949-03-01 1000
129 1949-04-01 1000
121 1949-05-01 1000

さらに注意すべきは、

  • 予測したい数値はyというカラムに入れる
  • 日付データはdsというカラムに入れる

と、カラム名まで決めうちになっていることです。 こんな風に、データフレームを使うだけではなく、カラム名まで決めうちにするライブラリは珍しいですね。

また、Prophetは「上限値」を設定することが出来ます。capというカラムに指定してください。

from fbprophet import Prophet

m = Prophet(growth='logistic')
m.fit(df)

まず、モデルのインスタンスを作成し、fitメソッドでデータを食わせます。scikit-learnでよく見るスタイルですね。
また、上限値を設定する場合は必ずlogisticモデルを選択しなければいけません。
ちなみに、growthパラメータは'logistic'と'linear'の2択ですので、迷ったら両方試せば良いでしょう。

続いて、未来予測を行います。どれくらいの期間予測するのか設定しましょう。
statsmodelsではパラメータにより予測期間を設定しますが、Prophetでは未来のデータを収めるデータフレームを作ります。
これもかなり特異な部分ですが、ヘルパーメソッドが用意されているので、大して複雑ではありません。

future = m.make_future_dataframe(periods=36,freq='M')
future['cap'] = 1000
forecast = m.predict(future)

今回のデータは月次データなので、freq='M'を指定しました。periods=36となっているので、36ヶ月分のデータを予測することになります。
今回は上限値を設定したいので、futureデータフレームにもcapカラムを用意しています。
なお、capは定数でなくても構いません。 ある時期を境に、上限値が変わることが分かっているなら、そのように設定すれば、モデルはそれを元に予測を行います。賢い!
さて、こうして作られたforecast変数は、予測値の他、トレンドや季節性、信頼区間などのデータが入ったデータフレームです。
データフレームの中身を見てもいいですし、手っ取り早くplotメソッドで可視化も出来ます。

m.plot(forecast)

f:id:stagira:20180623222522p:plain

f:id:stagira:20180623222522p:plain
Prophetで予測を行った結果

結果は上のようになります。上の点線が、設定した上限値です。
あっけないほど簡単に時系列予測が出来てしまいました。
まあ、実際には上限値の設定により予測値が大きくブレることもあったり、注意が必要ですが、かなりお手軽に使えるライブラリです。
Python界隈では、Rのforecastパッケージのような、扱いやすい予測ライブラリがありませんでした。Prophetはかなりいい位置にあるのではないでしょうか。
本家ドキュメントでは、クリスマスのように数値が跳ね上がる瞬間を、上手に扱う方法も紹介されています。極めてビジネス寄りの思想で作られたライブラリですね。