Pythonでのデータ解析:Statsmodelsを使って時系列解析を行う方法

時系列解析は、時間的に順序を追って観測されるデータの解析手法です。このようなデータは、経済や気象など多くの分野でよく使われています。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のデータ解析を学習するには下記のようなサイトが有効です。

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com