1. 前言
时间序列数据是许多应用中常见的数据类型,本文将介绍如何使用Python检查时间序列数据是否是平稳的。
2. 什么是平稳数据?
在时间序列数据中,平稳是指其统计特性在时间中是恒定的。其主要特征是平均值,方差和自协方差与时间无关。它的好处是可以使用常规的统计工具,如假设检验和置信区间,来对其进行分析。
3. 如何检查时间序列数据的平稳性?
3.1 观察数据图
首先,我们可以通过可视化时间序列数据来判断其是否平稳。如果时间序列数据具有以下特征,则可能不平稳:
趋势:指随着时间的增长,数据呈现出明显的上升或下降趋势。
季节性:指在特定时间内,数据呈现出规律性的波动。
周期性:指数据随时间的推移而呈现出一定的波动。
下面是一段随机产生的时间序列数据,我们使用matplotlib绘制其图像,以观察其是否平稳:
import numpy as np
import matplotlib.pyplot as plt
# 随机产生一个时间序列数据
np.random.seed(10)
data = np.random.normal(0, 1, 1000).cumsum()
# 绘制时间序列数据图像
plt.plot(data)
plt.show()
得到的图像如下:
从图中可以看出,数据似乎有向上的趋势,因此可能不平稳。
3.2 统计检验
除了观察数据图,我们还可以使用一些统计检验方法来检验时间序列数据是否平稳。下面介绍两种常用的假设检验:
3.2.1 Augmented Dickey-Fuller(ADF)检验
ADF检验是一种常用的平稳性检验方法,其假设检验如下:
假设原假设为数据不平稳,则:
备择假设为数据平稳。
检验统计量小于置信区间的概率越小,越可以拒绝原假设。
我们可以使用statsmodels库中的adf_test函数来进行ADF检验:
from statsmodels.tsa.stattools import adfuller
def adf_test(series, signif=0.05):
"""
Augmented Dickey-Fuller Unit Root Test
"""
# ADF Test 1 - 1
n_obs = len(series)
adf_test = adfuller(series, autolag='AIC') # Original Series
adf = pd.Series(adf_test[0:4], index=['Test Statistic', 'p-value', '# Lags Used', 'Number of Observations Used'])
for key, value in adf_test[4].items():
adf[f'Critical Value ({key})'] = value
print(adf)
# Plotting
plt.rcParams.update({'figure.figsize': (9, 9), 'font.size': 16})
style.use('ggplot')
plt.plot(series, label='Original Series')
plt.legend(loc='upper left')
plt.title('Original Series')
plt.show()
# ADF Test 1 - 2
if adf_test[1] < signif:
print(f"ADF test: series is stationary with p-value = {adf_test[1]}")
return True
else:
print(f"ADF test: series is non-stationary with p-value = {adf_test[1]}")
return False
我们首先生成一个平稳的时间序列数据,然后使用上述函数进行ADF检验:
import pandas as pd
# 随机产生一个平稳的时间序列数据
pd.Series(np.random.normal(0, 1, 1000)).cumsum().plot()
# 进行ADF检验
adf_test(pd.Series(np.random.normal(0, 1, 1000)))
从输出结果可以看出,p值为0.05,小于置信区间,因此我们可以拒绝原假设,认为数据平稳。
3.2.2 Kwiatkowski-Phillips-Schmidt-Shin(KPSS)检验
KPSS检验也是一种常用的平稳性检验方法,其假设检验如下:
假设原假设为数据平稳,则:
备择假设为数据不平稳。
检验统计量大于置信区间的概率越小,越可以拒绝原假设。
我们可以使用statsmodels库中的kpss函数来进行KPSS检验:
from statsmodels.tsa.stattools import kpss
def kpss_test(series, signif=0.05):
"""
Kwiatkowski-Phillips-Schmidt-Shin KPSS test
"""
# KPSS Test
kpsstest = kpss(series, regression='c')
kpss_output = pd.Series(kpsstest[0:3], index=['Test Statistic', 'p-value', 'Lags Used'])
for key, value in kpsstest[3].items():
kpss_output[f'Critical Value ({key})'] = value
print(kpss_output)
# Plotting
plt.rcParams.update({'figure.figsize': (9, 9), 'font.size': 16})
style.use('ggplot')
plt.plot(series, label='Original Series')
plt.legend(loc='upper left')
plt.title('Original Series')
plt.show()
# KPSS Test
if kpsstest[1] < signif:
print(f"KPSS test: the series is not stationary with p-value {kpsstest[1]}.")
return False
else:
print(f"KPSS test: the series is stationary with p-value {kpsstest[1]}.")
return True
我们还是使用前面的平稳时间序列数据进行KPSS检验:
# 进行KPSS检验
kpss_test(pd.Series(np.random.normal(0, 1, 1000)))
从输出结果可以看出,p值为0.1,大于置信区间,因此我们不能拒绝原假设,认为数据平稳。
4. 总结
本文介绍了如何使用Python检查时间序列数据是否平稳。我们可以通过观察数据图来初步判断数据是否平稳,并使用ADF检验和KPSS检验来进行精确判断。通过检查时间序列数据平稳性,我们可以更好地理解数据并选择合适的模型来对其进行分析。