時系列データの解析の概要
時系列データとは、株価や気温、トラフィック量などの時間の経過に応じて値が変化するデータのことを呼ぶ。この時系列データに対して機械学習を適用することで、大量のデータを学習し、未知のデータに対する予測を行うことで、ビジネスの意思決定やリスク管理などに役立てることができる。
時系列データには、トレンド(傾向)、季節性、ランダム要素などが含まれる。トレンドとは長期的な傾向を表し、季節性とは周期的なパターンであり、ランダム要素とは予測できないノイズとなる。これらの要素を考慮するために、時系列データの予測では様々な手法が用いられている。
それらの中で代表的な手法としては、“RやPythonを用いた一般的な時系列解析のための実装例“でも述べているARIMA、”Prophetを用いた時系列分析について“で述べているProphet、”LSTMの概要とアルゴリズム及び実装例について“で述べているLSTM、状態空間モデルなどが用いられる。これらの手法は機械学習に基づいた予測手法で、過去の時系列データを学習して未来の予測を行うものとなる。
また、時系列データには時刻が含まれるため、過去のデータを学習し未来を予測するためには、データをトレンド成分、季節成分、残差成分に分解するなど、時系列データを適切に加工する必要があり、そこでも様々な工夫が必要となる。
Pythonでの時系列データ解析の実装
Pythonを用いた時系列解析には、様々なライブラリやツールが存在する。ここでは、代表的なライブラリの一つであるpandasを用いた時系列解析の具体的な実装について述べる。
まずはじめに、pandasのdatetimeデータ型を用いて時系列データを作成する。これは例えば、以下のように1時間ごとのデータを作成することで可能となる。
import pandas as pd
import numpy as np
# 時系列データの作成
date_rng = pd.date_range(start='1/1/2020', end='1/10/2020', freq='H')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng)))
次に、時系列データの可視化を行う。pandasには、plotメソッドを用いて簡単にグラフを描画することができる。以下は、上記で作成したデータの可視化例となる。
import matplotlib.pyplot as plt
# データの可視化
df.plot(x='date', y='data')
plt.show()
時系列解析では、トレンドや季節性などの要素を分解することが重要であり、pandasには、seasonal_decomposeメソッドを用いて時系列データを分解する機能がある。以下は、上記のデータをトレンド、季節性、残差に分解する例となる。
from statsmodels.tsa.seasonal import seasonal_decompose
# 時系列データの分解
result = seasonal_decompose(df['data'], model='additive', period=24)
# 分解結果の可視化
result.plot()
plt.show()
トレンドや季節性の分解結果をもとに、ARIMAモデルなどを用いた予測も行うことができる。ARIMAモデルを用いた予測の例を以下に示す。
from statsmodels.tsa.arima_model import ARIMA
# モデルの定義と学習
model = ARIMA(df['data'], order=(1, 1, 1))
model_fit = model.fit(disp=0)
# 予測結果の取得
forecast = model_fit.forecast(steps=24)
# 予測結果の可視化
plt.plot(df['data'])
plt.plot(forecast[0])
plt.show()
今回は、pandasを用いた時系列解析の実装例であったが、他にも、statsmodelsやscikit-learnなどのライブラリを用いた時系列解析の実装が可能となる。
Rを用いた時系列データ解析の実装
R言語は、時系列解析に非常に適したプログラミング言語の一つであり、R言語には、時系列解析に特化したパッケージである「forecast」がある。以下では、forecastパッケージを用いた時系列解析の具体的な実装例について述べる。
まずはじめに、時系列データを作成する。以下は、1時間ごとのデータを作成する例となる。
library(forecast)
# 時系列データの作成
date_rng <- seq(as.POSIXct("2020-01-01 00:00:00"),
as.POSIXct("2020-01-10 23:00:00"),
by="hour")
df <- data.frame(date=date_rng, data=rnorm(length(date_rng)))
次に、時系列データの可視化を行う。R言語には、ggplot2パッケージを用いて簡単にグラフを描画することができる。以下は、上記で作成したデータの可視化例となる。
library(ggplot2)
# データの可視化
ggplot(df, aes(x=date, y=data)) +
geom_line() +
xlab("Date") +
ylab("Data")
時系列解析では、トレンドや季節性などの要素を分解することが重要であり、forecastパッケージには、stl()関数を用いて時系列データを分解する機能がある。以下は、上記のデータをトレンド、季節性、残差に分解する例となる。
# 時系列データの分解
result <- stl(df$data, s.window="periodic")
# 分解結果の可視化
autoplot(result)
また、トレンドや季節性の分解結果をもとに、ARIMAモデルなどを用いた予測も行うこともできる。forecastパッケージには、auto.arima()関数を用いてARIMAモデルのパラメータを自動的に選択する機能がある。以下に、上記のデータをARIMAモデルで予測する例を示す。
# ARIMAモデルの予測
model <- auto.arima(df$data)
forecast <- forecast(model, h=24)
# 予測結果の可視化
autoplot(forecast)
R言語による時系列解析の具体的な実装では、このforecastパッケージ以外にも、statsパッケージやTSAパッケージなど、時系列解析に適した多数のパッケージが存在する。
参考情報と参考図書
時系列データ解析に関しては”時系列データ解析“に詳細を述べている。そちらも参照のこと。
参考図書としては”
“
“
“
コメント
[…] RやPythonを用いた一般的な時系列データ解析の実装例 […]
[…] RやPythonを用いた時系列データ解析の一般的な実装例 […]