前書き

以前のチュートリアルでは、https://www.digitalocean.com/community/tutorials/a-guide-to-time-series-visualization-with-python-3 [時系列データを視覚化および操作する方法]、およびhttps ://www.digitalocean.com/community/tutorials/a-guide-to-time-series-forecasting-with-arima-in-python-3 [時系列データから予測を生成するためにARIMAメソッドを活用する方法]。 ARIMAモデルの正しいパラメーター化は、一定の時間を要する複雑な手動プロセスになる可能性があることに注意しました。

+ R +`のような他の統計プログラミング言語は、この問題を解決するためにhttps://www.rdocumentation.org/packages/forecast/versions/7.3/topics/auto.arima [自動化された方法]を提供しますが、それらはまだ公式に公開されていませんPythonに移植されました。 幸いなことに、Facebookのコアデータサイエンスチームは最近、https://facebookincubator.github.io/prophet/ [+ Prophet +`]という新しいメソッドを公開しました。これにより、データアナリストと開発者がPython 3で大規模に予測を実行できます。

前提条件

このガイドでは、ローカルデスクトップまたはリモートサーバーで時系列分析を行う方法について説明します。 大きなデータセットの操作はメモリを集中的に使用する可能性があるため、どちらの場合でも、このガイドの計算の一部を実行するには、少なくとも* 2GBのメモリ*が必要になります。

このチュートリアルでは、* Jupyter Notebook *を使用してデータを操作します。 まだお持ちでない場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-jupyter-notebook-for-python-3 [インストールとセットアップのチュートリアルに従ってください。 Python 3用Jupyterノートブック]。

ステップ1-データセットのプルとパッケージのインストール

Prophetで時系列予測のための環境をセットアップするには、まずローカルプログラミング環境またはサーバーベースのプログラミング環境に移りましょう。

cd
. /bin/activate

ここから、プロジェクト用の新しいディレクトリを作成しましょう。 これを「」と呼び、ディレクトリに移動します。 プロジェクトに別の名前を付ける場合は、ガイド全体で「」の代わりに名前を使用してください:

mkdir
cd

BoxおよびJenkins(1976)https://raw.githubusercontent.com/tlfvincent/do-community-tutorials/master/monthly-airline-passengers.csv[Airline Passengers dataset]で作業します。これには時系列が含まれます1949年から1960年までの月間旅客数に関するデータ。 データを保存するには、 `+ curl `コマンドと ` -O +`フラグを使用して出力をファイルに書き込み、CSVをダウンロードします。

curl -O https://assets.digitalocean.com/articles/eng_python/prophet/AirPassengers.csv

このチュートリアルでは、「+ pandas 」、「 matplotlib 」、「 numpy 」、「 cython 」、および「 fbprophet 」ライブラリが必要です。 他のほとんどのPythonパッケージと同様に、 ` pandas `、 ` numpy `、 ` cython `および ` matplotlib +`ライブラリをpipでインストールできます。

pip install pandas matplotlib numpy cython

その予測を計算するために、 `+ fbprophet `ライブラリーは数学者https://en.wikipedia.org/wiki/Stanislaw_Ulam[Stanislaw Ulam]に敬意を表して命名された ` STAN `プログラミング言語に依存しています。 したがって、 ` fbprophet `をインストールする前に、 ` STAN `へのPythonラッパー ` pystan +`がインストールされていることを確認する必要があります。

pip install pystan

これが完了したら、pipを使用してProphetをインストールできます。

pip install fbprophet

これですべてのセットアップが完了したので、インストールされたパッケージの操作を開始できます。

ステップ2-パッケージのインポートとデータのロード

データの操作を開始するには、Jupyter Notebookを起動します。

jupyter notebook

新しいノートブックファイルを作成するには、右上のプルダウンメニューから[新規作成]> [Python 3]を選択します。

image:https://assets.digitalocean.com/articles/eng_python/JupyterNotebookPy3/jupyter-notebook-new.png [新しいPython 3ノートブックを作成]

これにより、必要なライブラリをロードできるノートブックが開きます。

ベストプラクティスとして、ノートブックの一番上に必要なライブラリをインポートすることから始めます( + pandas ++ matplotlib +、および `+ statsmodels +`を参照するために使用される標準の略記に注意してください)。

%matplotlib inline
import pandas as pd
from fbprophet import Prophet

import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

プロットに対してfivethirtyeight https://tonysyu.github.io/raw_content/matplotlib-style-gallery/gallery.html [+ matplotlib + style]も定義していることに注意してください。

このチュートリアルの各コードブロックの後に、「+ ALT + ENTER +」と入力してコードを実行し、ノートブック内の新しいコードブロックに移動する必要があります。

時系列データを読むことから始めましょう。 次のコマンドを使用して、CSVファイルをロードし、最初の5行を印刷できます。

df = pd.read_csv('AirPassengers.csv')

df.head(5)

画像:https://assets.digitalocean.com/articles/eng_python/prophet/fig-1.png [DataFrame]

DataFrameには、明らかに「+ Month + および + AirPassengers + `列。 Prophetライブラリは、入力として、時間情報を含む1つの列と、予測したいメトリックを含む別の列を持つDataFrameを予期します。 重要なのは、時間列は「+ datetime +」タイプであることが期待されるため、列のタイプを確認してみましょう。

df.dtypes
OutputMonth            object
AirPassengers     int64
dtype: object

`+ Month `カラムは ` datetime +`タイプではないため、変換する必要があります。

df['Month'] = pd.DatetimeIndex(df['Month'])
df.dtypes
OutputMonth            datetime64[ns]
AirPassengers             int64
dtype: object

`+ Month `カラムが正しい ` datetime +`タイプであることがわかりました。

また、預言者は、入力列の名前を「+ ds 」(時間列)および「 y +」(メトリック列)にするという厳密な条件を課しているため、DataFrameの列の名前を変更します。

df = df.rename(columns={'Month': 'ds',
                       'AirPassengers': 'y'})

df.head(5)

画像:https://assets.digitalocean.com/articles/eng_python/prophet/fig-2.png [DataFrame]

作業するデータを視覚化することをお勧めします。時系列をプロットしてみましょう。

ax = df.set_index('ds').plot(figsize=(12, 8))
ax.set_ylabel('Monthly Number of Airline Passengers')
ax.set_xlabel('Date')

plt.show()

image:https://assets.digitalocean.com/articles/eng_python/prophet/fig-3a.png [時系列プロット]

データが準備できたら、Prophetライブラリを使用して時系列の予測を作成する準備ができました。

ステップ3-預言者による時系列予測

このセクションでは、Prophetライブラリを使用して時系列の将来の値を予測する方法を説明します。 Prophetの作成者は、時系列予測の固有の複雑さの多くを抽象化し、アナリストと開発者が時系列データを操作するのをより直感的にしました。

最初に、新しいProphetオブジェクトをインスタンス化する必要があります。 Prophetを使用すると、多くの引数を指定できます。 例えば、 `+ interval_width +`パラメーターを設定することにより、不確実性区間の望ましい範囲を指定できます。

# set the uncertainty interval to 95% (the Prophet default is 80%)
my_model = Prophet(interval_width=0.95)

Prophetモデルが初期化されたので、DataFrameを入力としてその `+ fit +`メソッドを呼び出すことができます。 モデルのフィッティングには数秒しかかかりません。

my_model.fit(df)

次のような出力を受け取るはずです。

Output<fbprophet.forecaster.Prophet at 0x110204080>

時系列の予測を取得するには、予測が必要な日付を保持する「+ ds 」列を含む新しいDataFrameをProphetに提供する必要があります。 便利なことに、Prophetには ` make_future_dataframe +`ヘルパー関数が用意されているため、このDataFrameを手動で作成する必要はありません。

future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
future_dates.tail()

画像:https://assets.digitalocean.com/articles/eng_python/prophet/fig-4.png [DataFrame]

上記のコードチャンクでは、将来36の日付スタンプを生成するように預言者に指示しました。

Prophetを使用する場合、時系列の頻度を考慮することが重要です。 毎月のデータを使用しているため、タイムスタンプの希望する頻度を明確に指定しました(この場合、 `+ MS `は月の始まりです)。 したがって、 ` make_future_dataframe +`は36の月間タイムスタンプを生成しました。 つまり、3年先の時系列の将来価値を予測しようとしています。

将来の日付のDataFrameは、近似モデルの `+ predict +`メソッドへの入力として使用されます。

forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

image:https://assets.digitalocean.com/articles/eng_python/prophet/fig-5.png [予測モデル]

Prophetは、多くの興味深い列を持つ大きなDataFrameを返しますが、予測に最も関連する列に出力をサブセット化します。

  • + ds +:予測値の日付スタンプ

  • + yhat +:メトリックの予測値(Statisticsでは、http://www.chegg.com/homework-help/definitions/predicted-value-y-hat-31 [+ yhat +]は伝統的に表記です値「+ y +」の予測値を表すために使用)

  • + yhat_lower +:予測の下限

  • + yhat_upper +:予測の上限

Prophetは予測を生成するためにマルコフ連鎖モンテカルロ(MCMC)メソッドに依存しているため、上記の出力からの値の変動が予想されます。 MCMCは確率的プロセスであるため、値は毎回わずかに異なります。

Prophetは、予測の結果をすばやくプロットする便利な機能も提供します。

my_model.plot(forecast,
             uncertainty=True)

画像:https://assets.digitalocean.com/articles/eng_python/prophet/fig-6.png [予測プロット]

預言者は、時系列の観測値(黒い点)、予測値(青い線)、および予測の不確実性区間(青い網掛け領域)をプロットします。

Prophetのもう1つの特に強力な機能は、予測のコンポーネントを返す機能です。 これは、時系列の日次、週次、および年次のパターンが全体的な予測値にどのように寄与するかを明らかにするのに役立ちます。

my_model.plot_components(forecast)

image:https://assets.digitalocean.com/articles/eng_python/prophet/fig-7.png [予測プロットのコンポーネント]

上記のプロットは興味深い洞察を提供します。 最初のプロットは、航空会社の乗客の月間量が時間とともに直線的に増加していることを示しています。 2番目のプロットは、週の終わりと土曜日に乗客の週数がピークに達するという事実を強調し、3番目のプロットは、7月と8月の休日月に最も多くのトラフィックが発生することを示します。

結論

このチュートリアルでは、Prophetライブラリを使用してPythonで時系列予測を実行する方法を説明しました。 既定のパラメーターを使用していましたが、Prophetを使用すると、さらに多くの引数を指定できます。 特に、Prophetは、時系列に関する独自の知識をテーブルにもたらす機能を提供します。

試してみることができるいくつかの追加事項を次に示します。

  • 休日の月に関する事前の知識を含めることにより、休日の影響を評価します(たとえば、12月は休日の月であることがわかります)。 modeling holidaysの公式ドキュメントが役立ちます。

  • 不確実な間隔の範囲を変更するか、将来の予測を行います。

さらに練習するために、別の時系列データセットを読み込んで、独自の予測を作成することもできます。 全体として、Prophetは、ユーザーの要件に合わせて予測モデルを調整する機会など、多くの魅力的な機能を提供します。