タイムシリーズ解析は、時間的な順序に基づいてデータを分析するための手法です。Pythonを使用すると、タイムシリーズデータを効率的に処理し、予測やトレンド分析、季節変動の抽出などを行うことができます。この完全かつ包括的なガイドでは、Pythonを使用したタイムシリーズ解析の基本から高度なテクニックまでを説明します。
1. タイムシリーズ解析の基本
タイムシリーズとは、時間の経過とともに観測されたデータの順序です。例えば、株価、気温、販売数などがタイムシリーズデータの例です。Pythonでは、Pandasライブラリを使用してタイムシリーズデータを簡単に処理することができます。

1.1 Pandasでのタイムシリーズデータの準備
Pythonでタイムシリーズ解析を行う際、まずはデータを読み込み、適切な形式に変換する必要があります。以下は、CSVファイルからデータを読み込む例です。
pythonimport pandas as pd
# データを読み込む
data = pd.read_csv('data.csv', parse_dates=['date'], index_col='date')
# 最初の5行を表示
print(data.head())
parse_dates
引数を使って、date
列を日付として解析し、index_col
でその列をインデックスとして設定します。これにより、data
は日付をインデックスとするタイムシリーズデータになります。
1.2 データの可視化
タイムシリーズデータの基本的な理解には、データを可視化することが重要です。MatplotlibやSeabornを使用して、時系列データをグラフとして描画することができます。
pythonimport matplotlib.pyplot as plt
# 時系列データのプロット
data.plot()
plt.title('Time Series Data')
plt.xlabel('Date')
plt.ylabel('Value')
plt.show()
これにより、時系列データのトレンドやパターンが視覚的に確認できます。
2. 時系列データの前処理
タイムシリーズデータには欠損値や外れ値が含まれていることがあります。これらを適切に処理することが、解析の精度を高めるためには重要です。
2.1 欠損値の処理
欠損値を処理する方法として、データの前後の値で埋める(補完する)方法や、欠損値を削除する方法があります。
python# 欠損値を前の値で埋める
data.fillna(method='ffill', inplace=True)
2.2 外れ値の検出と処理
外れ値を検出するためには、統計的手法や機械学習を使用することができます。例えば、Zスコアを使って外れ値を検出する方法があります。
pythonfrom scipy import stats
# Zスコアを計算
z_scores = stats.zscore(data)
# Zスコアが3以上の値を外れ値とみなす
outliers = data[abs(z_scores) > 3]
print(outliers)
3. 時系列データの解析
3.1 トレンドの抽出
時系列データには、トレンド(長期的な変化の傾向)、季節性(周期的な変動)、ランダム成分(ランダムなノイズ)が含まれていることが多いです。これらを分解するには、statsmodels
ライブラリを使用します。
pythonfrom statsmodels.tsa.seasonal import seasonal_decompose
# 時系列データを分解
result = seasonal_decompose(data, model='multiplicative', period=12)
# 分解結果のプロット
result.plot()
plt.show()
seasonal_decompose
関数は、時系列データをトレンド成分、季節成分、残差(ランダム成分)に分解します。このプロットを通じて、データの背後にあるパターンを視覚化することができます。
3.2 自己相関と偏自己相関
自己相関(ACF)と偏自己相関(PACF)は、時系列データの特徴を理解するための重要な指標です。これらは、過去のデータが現在のデータにどれだけ影響を与えているかを示します。statsmodels
を使って、ACFとPACFを計算できます。
pythonfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 自己相関プロット
plot_acf(data)
plt.show()
# 偏自己相関プロット
plot_pacf(data)
plt.show()
これらのプロットを使用して、時系列データにおける依存関係を視覚的に確認できます。
4. モデルの構築と予測
時系列データを予測するためには、ARIMA(自己回帰移動平均モデル)などの統計モデルを使用します。ARIMAモデルは、過去のデータから未来を予測するために広く使用されています。
4.1 ARIMAモデルの構築
ARIMAモデルを使用するには、まずデータが定常である必要があります。定常性を確認するために、ADF(Augmented Dickey-Fuller)テスト
を使用します。
pythonfrom statsmodels.tsa.stattools import adfuller
# ADFテスト
result = adfuller(data)
print('ADF Statistic:', result[0])
print('p-value:', result[1])
p値が0.05未満の場合、データは定常であるとみなされます。次に、ARIMAモデルを適用して予測を行います。
pythonfrom statsmodels.tsa.arima.model import ARIMA
# ARIMAモデルの適用
model = ARIMA(data, order=(5,1,0)) # (p,d,q)
model_fit = model.fit()
# 予測
forecast = model_fit.forecast(steps=10)
print(forecast)
ARIMAのorder
引数は、モデルのパラメータを指定します。p
は自己回帰項の数、d
は差分の次数、q
は移動平均項の数です。
5. モデル評価と予測精度の向上
モデルを構築した後、予測精度を評価するために、実際のデータと予測値を比較します。Mean Absolute Error(MAE)
やRoot Mean Squared Error(RMSE)
を使用して、モデルの精度を確認することができます。
pythonfrom sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np
# 実際のデータと予測値の比較
mae = mean_absolute_error(actual_data, forecast)
rmse = np.sqrt(mean_squared_error(actual_data, forecast))
print('MAE:', mae)
print('RMSE:', rmse)
6. 高度な手法
ARIMAモデルの他にも、LSTM(Long Short-Term Memory)などのディープラーニングを活用した予測手法や、ProphetといったFacebookのライブラリを利用した手法もあります。これらの手法を使うことで、さらに高度な予測が可能になります。
pythonfrom fbprophet import Prophet
# Prophetモデルの構築
df = data.reset_index()
df.columns = ['ds', 'y']
model = Prophet()
model.fit(df)
# 予測
future = model.make_future_dataframe(df, periods=10)
forecast = model.predict(future)
# 結果のプロット
model.plot(forecast)
plt.show()
結論
Pythonを使用したタイムシリーズ解析は、非常に多くのツールと手法を活用することができ、データから価値ある情報を抽出するために強力な手段を提供します。基本的な操作から高度な予測手法まで、さまざまなアプローチを学ぶことで、より正確な予測や分析が可能になります。