如何使用Python检查时间序列数据是否是平稳的?

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检验来进行精确判断。通过检查时间序列数据平稳性,我们可以更好地理解数据并选择合适的模型来对其进行分析。

后端开发标签