Python3でのProphetによる時系列予測のガイド
序章
以前のチュートリアルでは、時系列データを視覚化および操作する方法、およびARIMAメソッドを活用して時系列データから予測を生成する方法を示しました。 ARIMAモデルの正しいパラメーター化が、一定の時間を必要とする複雑な手動プロセスである可能性があることに注目しました。
R
などの他の統計プログラミング言語は、この問題を解決するための自動化された方法を提供しますが、それらはまだPythonに正式に移植されていません。 幸い、Facebookのコアデータサイエンスチームは最近、 Prophet と呼ばれる新しいメソッドを公開しました。これにより、データアナリストと開発者は、Python3で大規模な予測を実行できます。
前提条件
このガイドでは、ローカルデスクトップまたはリモートサーバーのいずれかで時系列分析を行う方法について説明します。 大規模なデータセットの操作はメモリを大量に消費する可能性があるため、いずれの場合も、このガイドの計算の一部を実行するには、コンピュータに少なくとも2GBのメモリが必要です。
このチュートリアルでは、 JupyterNotebookを使用してデータを操作します。 まだお持ちでない場合は、チュートリアルに従って、Python3用のJupyterNotebookをインストールおよびセットアップする必要があります。
ステップ1—データセットをプルしてパッケージをインストールする
Prophetを使用して時系列予測を行うための環境を設定するには、まずローカルプログラミング環境またはサーバーベースのプログラミング環境に移動します。
cd environments
. my_env/bin/activate
ここから、プロジェクトの新しいディレクトリを作成しましょう。 これをtimeseries
と呼び、ディレクトリに移動します。 プロジェクトを別の名前で呼ぶ場合は、ガイド全体で必ずtimeseries
の代わりに名前を使用してください。
mkdir timeseries cd timeseries
Box and Jenkins(1976) Airline Passengersデータセットを使用します。このデータセットには、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
ライブラリは、その予測を計算するために、数学者 StanislawUlamにちなんで名付けられたSTAN
プログラミング言語に依存しています。 したがって、fbprophet
をインストールする前に、STAN
へのpystan
Pythonラッパーがインストールされていることを確認する必要があります。
pip install pystan
これが完了したら、pipを使用してProphetをインストールできます。
pip install fbprophet
これですべてのセットアップが完了したので、インストールされたパッケージの操作を開始できます。
ステップ2—パッケージをインポートしてデータをロードする
データの操作を開始するには、JupyterNotebookを起動します。
jupyter notebook
新しいノートブックファイルを作成するには、右上のプルダウンメニューから New > Python3を選択します。
これにより、必要なライブラリをロードできるノートブックが開きます。
ベストプラクティスとして、ノートブックの上部に必要なライブラリをインポートすることから始めます(pandas
、matplotlib
、およびstatsmodels
を参照するために使用される標準の省略形に注意してください)。
%matplotlib inline import pandas as pd from fbprophet import Prophet import matplotlib.pyplot as plt plt.style.use('fivethirtyeight')
プロットにファイブサーティエイトmatplotlibスタイルも定義したことに注目してください。
このチュートリアルの各コードブロックの後に、ALT + ENTER
と入力してコードを実行し、ノートブック内の新しいコードブロックに移動する必要があります。
時系列データを読み取ることから始めましょう。 次のコマンドを使用して、CSVファイルをロードし、最初の5行を印刷できます。
df = pd.read_csv('AirPassengers.csv') df.head(5)
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
タイプであることがわかります。
Prophetは、入力列の名前がds
(時間列)およびy
(メトリック列)であるという厳密な条件も課しているため、DataFrameの列の名前を変更しましょう。
df = df.rename(columns={'Month': 'ds', 'AirPassengers': 'y'}) df.head(5)
使用するデータを視覚化することをお勧めします。そのため、時系列をプロットしてみましょう。
ax = df.set_index('ds').plot(figsize=(12, 8)) ax.set_ylabel('Monthly Number of Airline Passengers') ax.set_xlabel('Date') plt.show()
データが準備できたので、Prophetライブラリを使用して時系列の予測を作成する準備が整いました。
ステップ3—預言者による時系列予測
このセクションでは、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()
上記のコードチャンクでは、将来36個の日付スタンプを生成するようにProphetに指示しました。
Prophetを使用するときは、時系列の頻度を考慮することが重要です。 月次データを処理しているため、タイムスタンプの目的の頻度を明確に指定しました(この場合、MS
は月の始まりです)。 したがって、make_future_dataframe
は36か月のタイムスタンプを生成しました。 つまり、3年後の時系列の将来価値を予測することを目指しています。
次に、将来の日付のDataFrameが、適合モデルのpredict
メソッドへの入力として使用されます。
forecast = my_model.predict(future_dates) forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
Prophetは、多くの興味深い列を持つ大きなDataFrameを返しますが、出力を予測に最も関連する列にサブセット化します。
ds
:予測値の日付スタンプyhat
:メトリックの予測値(統計では、 yhat は、値y
の予測値を表すために従来から使用されている表記法です)yhat_lower
:予測の下限yhat_upper
:予測の上限
預言者は予測を生成するためにマルコフ連鎖モンテカルロ(MCMC)法に依存しているため、上記の出力からの値の変動が予想されます。 MCMCは確率過程であるため、値は毎回わずかに異なります。
Prophetは、予測の結果をすばやくプロットするための便利な機能も提供します。
my_model.plot(forecast, uncertainty=True)
預言者は、時系列の観測値(黒い点)、予測値(青い線)、および予測の不確実性間隔(青い影付きの領域)をプロットします。
Prophetのもう1つの特に強力な機能は、予測の構成要素を返す機能です。 これは、時系列の日次、週次、および年次のパターンが全体的な予測値にどのように寄与するかを明らかにするのに役立ちます。
my_model.plot_components(forecast)
上記のプロットは興味深い洞察を提供します。 最初のプロットは、航空会社の乗客の月間ボリュームが時間の経過とともに直線的に増加していることを示しています。 2番目のプロットは、週の乗客数が週末と土曜日にピークに達するという事実を強調しています。3番目のプロットは、7月と8月の休日に最も多くのトラフィックが発生することを示しています。
結論
このチュートリアルでは、Prophetライブラリを使用してPythonで時系列予測を実行する方法について説明しました。 すぐに使用できるパラメーターを使用してきましたが、Prophetを使用するとさらに多くの引数を指定できます。 特に、Prophetは、時系列に関する独自の知識をテーブルにもたらす機能を提供します。
ここにあなたが試すことができるいくつかの追加の事柄があります:
- 休日の月に関する事前知識を含めることにより、休日の影響を評価します(たとえば、12月が休日の月であることがわかっています)。 休日のモデリングに関する公式ドキュメントが役立ちます。
- 不確実性の間隔の範囲を変更するか、将来をさらに予測します。
さらに練習するために、別の時系列データセットをロードして、独自の予測を作成することもできます。 全体として、Prophetは、ユーザーの要件に合わせて予測モデルを調整する機会など、多くの魅力的な機能を提供します。