時系列解析は、時間的に順序を追って観測されるデータの解析手法です。このようなデータは、経済や気象など多くの分野でよく使われています。Pythonには、時系列解析に必要な多数のライブラリがありますが、その中でも特にStatsmodelsは、時系列解析に特化したライブラリとして有名です。
ここでは、Statsmodelsを使った時系列解析の方法を説明します。まずは、Statsmodelsをインストールします。
Statsmodelsのインストールと関連ライブラリのインポート
下記のコマンドでStatsmodelsをインストールします。
pip install statsmodels
次に、必要なライブラリをインポートします。
import pandas as pd import numpy as np import matplotlib.pyplot as plt import statsmodels.api as sm
時系列データの取得
今回は、例として、Googleの株価データを使って、時系列解析を行います。株価データは、Yahoo Financeから取得することができます。以下のように、pandasのread_csvメソッドを使ってデータを読み込みます。
url = 'https://query1.finance.yahoo.com/v7/finance/download/GOOG?period1=1583020800&period2=1614556800&interval=1d&events=history&includeAdjustedClose=true'
df = pd.read_csv(url)
df.head()
このコードで、2020年3月1日から2021年3月1日までのGoogleの株価データを読み込むことができます。
データの前処理
Statsmodelsを使った時系列解析の基本は、データを時系列データに変換することです。時系列データには、以下の2つの要素があります。 - 日付 - 数値データ
まずは、日付をdatetime型に変換します。
df['Date'] = pd.to_datetime(df['Date'])
次に、日付をインデックスに設定します。
df.set_index('Date', inplace=True)
これで、日付を持つ時系列データに変換することができました。
単純移動平均の分析
次に、時系列解析に必要なライブラリであるStatsmodelsを使って、データの分析を行います。
まずは、単純移動平均(SMA)を求めてみましょう。SMAは、一定期間の平均値を求める手法です。
sma = df['Close'].rolling(window=20).mean()
次に、プロットしてみましょう。
plt.plot(df['Close'])
plt.plot(sma)
plt.show()
このグラフで、青色の線がGoogleの株価データで、オレンジ色の線が20日間のSMAです。このグラフから、株価が一定期間を超えるとSMAが下がっていることがわかります。このような傾向は、株価のトレンドを把握する上で非常に重要です。
時系列データの傾向の予測
次に、ARIMAモデルを使って、Googleの株価の予測を行ってみましょう。ARIMAは、自己回帰モデルと移動平均モデルを組み合わせたモデルです。
まずは、ARIMAモデルに必要なパラメータを設定します。
p = d = q = range(0, 2) pdq = [(x, y, z) for x in p for y in d for z in q]
次に、最適なパラメータを探します。
for param in pdq: try: model = sm.tsa.ARIMA(df['Close'], order=param) results = model.fit() print('ARIMA{} - AIC:{}'.format(param, results.aic)) except: continue
これで、パラメータの探索が完了しました。次に、最適なパラメータを使って、ARIMAモデルを構築します。
model = sm.tsa.ARIMA(df['Close'], order=(1, 0, 1)) results = model.fit()
最後に、予測を行い、結果をプロットしてみましょう。
pred = results.predict(start='2021-02-01', end='2021-03-01', dynamic=True) plt.plot(df['Close']) plt.plot(pred) plt.show()
このグラフで、青色の線がGoogleの株価データで、オレンジ色の線がARIMAモデルによる予測値です。グラフから、予測値が実際の株価と比較してかなり近いことがわかります。
よく発生するエラーと対応法
Statsmodelsを使った時系列解析の手順において、以下のようなエラーが発生することがあります。
"ValueError: The computed initial AR coefficients are not stationary"
このエラーは、ARIMAモデルの初期パラメータが不適切である場合に発生します。この場合、ARIMAモデルのパラメータを調整することで解決することができます。
例えば、次のようにARIMAモデルのパラメータを変更してみることができます。
model = sm.tsa.ARIMA(df['Close'], order=(2, 1, 2))
"ValueError: A given frequency of %s cannot be converted to a frequency with a fixed frequency"
このエラーは、データセットのインデックスに適切な期間がない場合に発生します。この場合、データセットのインデックスを適切に設定する必要があります。
例えば、次のようにデータセットのインデックスを日付形式に変更することができます。
df.index = pd.to_datetime(df.index)
"AttributeError: 'module' object has no attribute 'ARIMA'"
このエラーは、Statsmodelsのバージョンが古い場合に発生することがあります。この場合、Statsmodelsを最新バージョンに更新することで解決することができます。
例えば、次のようにStatsmodelsを更新することができます。
!pip install --upgrade statsmodels
エラーが発生した場合、最初に確認するべきことは、データの形式が正しいかどうかです。また、モデルのパラメータを調整することで、エラーを解決することができる場合があります。
まとめ
以上が、Statsmodelsを使った時系列解析の方法です。データ解析において、時系列解析は非常に重要な分野であり、Statsmodelsを使えば簡単に解析を行うことができます。Pythonのデータ解析を学習するには下記のようなサイトが有効です。