Python + Rを使用したSARIMAモデルの構築

はじめに



こんにちは、読者の皆様。

Pythonで時系列の分析に関する以前の投稿を書いた後、コメントに示されたコメントを修正することにしましたが、それらを修正するとき、たとえば、季節のARIMAモデルを構築するときなど、いくつかの問題に遭遇しました statsmodelsパッケージに同様の関数が見つかりませんでした。 結局、私はこのためにRの関数を使用することに決め、検索によりrpy2ライブラリに移動しました。これにより、前述の言語のライブラリの関数を使用できます。

多くの人が「なぜこれが必要なのか」と尋ねるかもしれません。なぜなら、 Rを取得して、その中ですべての作業を行う方が簡単だからです。 私はこの声明に完全に同意しますが、データに予備処理が必要な場合、 Pythonでデータを生成する方が簡単で、必要に応じて正確にR機能を分析に使用できるように思えます。

さらに、関数Rの出力結果をIPython Notebookに統合する方法を示します



Rpy2をインストールして構成する



開始するには、rpy2をインストールする必要があります。 次のコマンドを使用してこれを行うことができます。



pip install rpy2
      
      





このライブラリが機能するためには、インストールされたR言語が必要であることに注意してください。 オフからダウンロードできます サイト

次に行うことは、必要なシステム変数を追加することです。 Windowsの場合、次の変数を追加します。



インストールは、操作データが不要なMac OS Xでも実行されました。



はじめに



したがって、 IPython Notebookで作業している場合は、命令を追加する必要があります。



 %load_ext rmagic
      
      





この拡張機能を使用すると、 rpy2を介して特定の R関数を呼び出し、IPython Notebookコンソールに結果を直接表示できます。これは非常に便利です(これを行う方法を以下に示します)。 詳細はここに書かれています

次に、必要なライブラリをダウンロードします。



 from pandas import read_csv, DataFrame, Series import statsmodels.api as sm import rpy2.robjects as R from rpy2.robjects.packages import importr import pandas.rpy.common as com from pandas import date_range
      
      





ここで、前の記事と同様に、データをロードして、毎週の間隔に進みます。



 dataset = read_csv('DataSets/tovar_moving.csv',';', index_col=['date'], parse_dates=['date'], dayfirst=True) otg = dataset.qty w = otg.resample('w', how='sum') w.plot(figsize=(12,6))
      
      







したがって、グラフから、年間の季節性(52週間)と顕著な傾向を確認できます。 したがって、モデルを構築する前に、傾向と季節性を取り除く必要があります。



予備データ分析



したがって、まず最初に、元のシリーズをプロローグして値を調整します。



 w_log = log(w) w_log.plot(figsize=(12,6))
      
      







ご覧のとおり、グラフには季節性があるため、系列は定常的ではありません。 Dickey-Fullerテストを使用しこれを検証します。このテストでは、単位根の存在の仮説をチェックします。したがって、存在する場合、系列は静止しません。 前回、 statsmodelsライブラリを使用してこのテストを実行する方法を示しました。 次に、 Rの adf.test()関数を使用してこれを行う方法を示します

したがって、この関数はtseries Rライブラリにあります。 時系列分析用に設計されており、オプションです。 importr()関数を使用して、目的のライブラリをロードできます。



 stats = importr('stats') tseries = importr('tseries')
      
      





tseriesに加えて、 統計ライブラリもダウンロードしたことに気付くかもしれません。 型変換に必要です。

次に、データをPythonタイプから理解可能なRのタイプに変換する必要があります。これは、 convert_to_r_dataframe()関数を使用して、DataFrameが入力される入力に変換できます。出力はRのベクトルです。



 r_df = com.convert_to_r_dataframe(DataFrame(w_log))
      
      





したがって、ベクトルは次のステップであり、時系列の形式に変換する必要があります。 このため、Rには関数ts()があり、その呼び出しは次のようになります。



 y = stats.ts(r_df)
      
      





予備データの準備が完了し、必要な関数を呼び出すことができます。



 ad = tseries.adf_test(y, alternative="stationary", k=52)
      
      





パラメータとして、テストが計算される時系列とラグの数が渡されます。 経済モデルでは、この値を年と等しくすることが慣習的であり、 週ごとのデータがあり、1年で52週間なので、パラメーターにはそのような値があります。

広告変数にRオブジェクトが含まれるようになりました。 その構造はリストとして記述されていますが、その記述は見つけることができませんでした。 したがって、視覚的な分析を使用して、関数の結果をわかりやすい方法で表示するコードを作成しました。



 a = ad.names[:5] {ad.names[i]:ad[i][0] for i in xrange(len(a))}
      
      





{「代替」:「静止」、

'method': '拡張ディッキーフラーテスト'、

「p.value」:0.23867869477446427、

「パラメータ」:52.0、

「統計」:-2.8030060277420006}



テスト結果に基づいて、最初の系列は定常的ではありません。 なぜなら 単位根の存在の仮説は低い確率で受け入れられ、したがって、系列は定常的ではありません。 次に、定常性について、いくつかの最初の違いを確認します。

まず、Pythonを使用してそれらを取得し、次にADFテストを適用します。



 diff1lev = w.diff(periods=1).dropna() print 'p.value: %f' % sm.tsa.adfuller(diff1lev, maxlag=52)[1]
      
      





p値:0.000000



 diff1lev.plot(figsize=(12,6))
      
      







テスト結果によると、多くの最初の違いは定常的であることが判明しました。 そして、グラフはトレンドがないことを確認するのに役立ちます。 季節性を取り除くために残っています。

これを行うには、結果のシリーズから季節の違いをとる必要があります。 詳細はこちら 。 結果の行が静止している場合は、最初の違いを編んで確認する必要があります。



 diff1lev_season = diff1lev.diff(52).dropna()
      
      





RのADFテストを使用して、定常性を確認しましょう。



 r_df = com.convert_to_r_dataframe(DataFrame(diff1lev_season)) y = stats.ts(r_df) ad = tseries.adf_test(y, alternative="stationary", k=52) a = ad.names[:5] {ad.names[i]:ad[i][0] for i in xrange(len(a))}
      
      





{「代替」:「静止」、

'method': '拡張ディッキーフラーテスト'、

「p.value」:0.551977997289418、

「パラメータ」:52.0、

「統計」:-2.0581183466564776}



そのため、シリーズは静止していません。最初の違いを確認してください。



 diff1lev_season1lev = diff1lev_season.diff().dropna() print 'p.value: %f' % sm.tsa.adfuller(diff1lev_season1lev, maxlag=52)[1]
      
      





p.value:0.000395



結果の行は静止しています。 これで、モデルの構築に進むことができます



モデルの構築。



これで予備分析が完了し、 季節モデルARIMA (SARIMA)の構築に進むことができます。

このモデルの一般的なビュー

このモデルでは、パラメーターは以下を示します。





pdqの決定方法は、前回示しました。 次に、 PDQの季節成分の順序の決定について説明します

パラメーターDを定義することから始めます 季節差の統合の順序、つまり 私たちの場合、それは1に等しいです。 PQを決定するには ACRPACFの相関図を作成する必要があります。



 fig = plt.figure(figsize=(12,8)) ax1 = fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(diff1lev_season1lev.values.squeeze(), lags=150, ax=ax1) ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(diff1lev_season1lev, lags=150, ax=ax2)
      
      







PACF garfikから、AR次数はp = 4であり、 ACFによれば次数MA q = 13であることがわかります。 13ラグは、0以外の最後のラグです。

それでは、季節の要素に移りましょう。 それらを評価するには、季節性のサイズの倍数であるラグを調べる必要があります。つまり、この例では、季節性が52である場合、ラグ52、104、156、...

この場合、パラメーターPQは0に等しくなります(これは、上記の遅れでACFとPACFを見るとわかります)。

私たちの研究の結果、モデルを得ま​​した

この記事の冒頭で示したように、このモデルをPythonで作成する方法を見つけられなかったため、Rのarima()関数を使用することにしました。このため、ARIMAモデルの順序と、必要に応じて季節成分の順序が渡されます。 しかし、呼び出す前に、いくつかのデータを準備する必要があります。

まず、ソースセットをR形式に変換し、時系列形式に変換します。



 r_df = com.convert_to_r_dataframe(DataFrame(w)) y = stats.ts(r_df)
      
      





モデルの順序はベクトルRとして渡されるため、作成しましょう。



 order = R.IntVector((4,1,13))
      
      





また、季節コンポーネントのパラメーターとして、その順序と期間のサイズを含むリストが渡されます。



 season = R.ListVector({'order': R.IntVector((0,1,0)), 'period' : 52})
      
      





これで、モデルを作成する準備ができました。



 model = stats.arima(y, order = order, seasonal=season)
      
      





これでモデルの準備が整い、それに基づいて予測の構築に進むことができます。



モデルの妥当性を確認します。



そのため、モデルの妥当性を確認するには、モデルの残りが「ホワイトノイズ」に対応しているかどうかを確認する必要があります。 肺-ボックスQテストを実行してこれを検証し、残留物の相関を検証します。 これを行うには、Rにtsdiag()関数があり、テストのモデルとラグの数がパラメーターとして渡されます。

この関数は次のように呼び出すことができます。



 %Rpush model %R tsdiag(model, 100)
      
      







1行目の%Rpush命令は、Rで使用するオブジェクトをロードします2行目の%Rステートメントは、R言語形式のコードを呼び出します。

上記のグラフから、残差が独立していることがわかります(これはACFから見ることができます)。 さらに、Q統計のグラフから、すべての点でp値が有意水準よりも大きいことがわかります。これから、残基が「ホワイトノイズ」である可能性が最も高いと結論付けることができます。



予測



実行するには、 予測ライブラリをロードする必要があります



 forecast = importr('forecast')
      
      





予測結果を導き出すには2つの方法があります。



方法1.これは、前のセクションで示したIPythonとRの統合機能を使用することです。



 %R plot(forecast(model))
      
      









方法2。2番目の方法は、予測ライブラリを使用して予測を作成し、その結果を一時的なパンダシリーズに変換して画面に表示することです。 実行されるコードは次のとおりです。



 f = forecast.forecast(model) #  pred = [i[1] for i in f[3].iteritems()] #  dt = date_range(w.index[-1], periods=len(pred)+1,freq='W')[1:] #    pr = Series(pred, index = dt) #   TimeSeries
      
      





結果を表示する



 w.plot(figsize=(12,6)) pr.plot(color = 'red')
      
      









おわりに



結論として、季節性をより正確に分析するには、7〜10シーズンのデータが必要です。 さらに、記事を準備する過程で支援してくれたwerwooolfに感謝します。

この記事では、季節ごとのARIMAモデルの作成方法を示し、データ分析に多数のRおよびPython言語を使用する方法も示しました。 ガールフレンドの言語の専門家は、記述された束を効果的に適用する方法を見つけると思います。



All Articles