時系列解析では、データの特性を評価するために以下の3つの主要な統計検定が用いられます:
- 無相関性検定(ホワイトノイズ検定)
- 定常性検定
- 自己相関関数(ACF)と偏自己相関関数(PACF)の解析
データ生成と可視化
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
# 乱数シード設定
np.random.seed(2023)
n_obs = 120
# トレンド成分を持つ系列
trend_coeff = 0.15
base_value = 12
trend_series = trend_coeff * np.arange(n_obs) + base_value
data_trend = trend_series + np.random.randn(n_obs)
# ランダム系列
random_series = np.random.randn(n_obs) + 18
# データフレーム作成
time_index = pd.date_range('2023-01-01', periods=n_obs, freq='D')
ts_df = pd.DataFrame({
'date': time_index,
'trend_data': data_trend,
'random_data': random_series
}).set_index('date')
# 可視化
fig, ax = plt.subplots(figsize=(12, 7))
ts_df.plot(ax=ax)
ax.set_title('生成された時系列データ')
ax.grid(True)
plt.tight_layout()
plt.show()
無相関性検定(Ljung-Box検定)
時系列が無相関(ホワイトノイズ)であるかどうかを判定します:
from statsmodels.stats.diagnostic import acorr_ljungbox
lag_values = [5, 10, 20, 40]
# トレンドデータ検定
lb_result_trend = acorr_ljungbox(ts_df['trend_data'], lags=lag_values, return_df=True)
# ランダムデータ検定
lb_result_random = acorr_ljungbox(ts_df['random_data'], lags=lag_values, return_df=True)
print(f"トレンドデータ検定結果:\n{lb_result_trend}")
print(f"ランダムデータ検定結果:\n{lb_result_random}")
定常性検定
ADF検定
from statsmodels.tsa.stattools import adfuller
# ADF検定実施
adf_test_trend = adfuller(ts_df['trend_data'])
adf_test_random = adfuller(ts_df['random_data'])
# 差分系列の検定
diff_trend = ts_df['trend_data'].diff().dropna()
adf_test_diff = adfuller(diff_trend)
KPSS検定
from statsmodels.tsa.stattools import kpss
kpss_test_trend = kpss(ts_df['trend_data'])
kpss_test_random = kpss(ts_df['random_data'])
kpss_test_diff = kpss(diff_trend)
ARIMAモデルパラメータ推定
from pmdarima.arima import ndiffs
d_param_trend = ndiffs(ts_df['trend_data'], test='kpss')
d_param_random = ndiffs(ts_df['random_data'], test='kpss')
d_param_diff = ndiffs(diff_trend, test='kpss')
print(f"トレンド系列の推奨d値: {d_param_trend}")
print(f"ランダム系列の推奨d値: {d_param_random}")
print(f"差分系列の推奨d値: {d_param_diff}")