- 假设检验基础知识
- 原假设与备择假设
- P值、统计量、显著水平、置信区间
- 白噪声
- 白噪声的定义
- 自相关性检验:ACF检验和Ljung-Box 检验
- 偏自相关性检验:PACF检验
- 平稳性
- 平稳性的定义
- 单位根检验
- 季节性检验
- ACF检验
- 序列分解:趋势+季节性+残差
记忆口诀:p越小,落在置信区间外,越拒绝原假设。
时序部分需要铺垫的知识非常多,相信这次应该说清楚了假设检验相关的基础知识。
作业:自行构造数据集,来检查是否符合这个要求。
时间数据的检验流程,如下
一、假设检验
统计学中,假设检验:证明一件事,不直接去证明它‘是’,而先假设它‘不是’,然后用证据去推翻这个‘不是’的假设。
1.原假设和备择假设
根据序列预测对数据的要求,先进行检验,确定后续选择什么操作。
2 P值与统计量
p值:证明统计量是否有价值的关键指标
置信区间:
-落在置信区间内 = 我们观测到的现象很可能是在 原假设为真的情况下,纯属巧合发生的= 接受原假设
- 落在置信区间外 = 备择假设证据确凿,不是巧合
二、白噪声
1.定义
一个完全随机的序列(其特点是具有不可预测性)
白噪声满足以下条件:
(1)均值为0
(2)方差恒定
(3)自相关性为0(即过去的值对未来的值没有影响)
在结构化数据集中预测(样本独立无关),如果数据本身就没价值,比如特征和样本毫无关系,虽然生成一些随机数作为特征,再随机生成一些数作标签后,可以训练,但是模型注定也学不到什么东西。
时序预测中,要求会更加苛刻,自己制造一个随机的序列,然后让模型来学习,这注定也是不可能实现的。也就是说数据本身要具备可预测性
2.判断是否为白噪声的方法
(1)ACF 检验
ACF 假设的是在滞后 k 阶上,序列的自相关系数为 0
(2)PACF检验
PACF假设:k 阶偏自相关系数为 0,这句话的意思是控制了中间所有滞后项(y (t-1), y (t-2), ..., y (t-k+1))的影响后,y (t) 与 y (t-k) 之间无直接线性关联
- ACF (自相关):衡量 y(t) 和 y(t-k) 之间的总体相关性,包含了所有中间时刻(t-1, t-2, …)的间接影响。
- PACF (偏自相关):衡量 y(t) 和 y(t-k) 之间的直接相关性,剔除了所有中间时刻的干扰。
(3)Ljung-Box检验
评估整个数据(比如前10个或前20个滞后项)的整体表现
三、平稳性
1.定义
一组数据的均值,方差不会随时间改变而改变
2.判断是否具有平稳性的方法——ADF检验
ADF检验的两个假设和判断规则:
原假设 (H₀): 序列是非平稳的(存在单位根)。
备择假设 (H₁): 序列是平稳的。
判断规则: 我们主要看输出的 p-value。
- 如果 p-value < 0.05:我们有充分的理由拒绝原假设,采纳备择假设,即认为序列是平稳的。
- 如果 p-value ≥ 0.05:我们无法拒绝原假设,即认为序列是非平稳的。
三、季节性
1.定义
时间序列中,以固定的、已知的频率重复出现的模式或周期性波动
季节性是数据中最强大、最明显的预测信号之一。如果一个模型不能识别和利用季节性,它的预测结果将会出现系统性的、周期性的巨大误差。
四、代码实战
1.生成随机序列
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 中文显示设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题# --- 1. 生成随机序列数据 ---# 为了让每次运行的结果都一样,设置一个随机种子(可选)
np.random.seed(42)# 定义序列的长度
num_points = 200# 生成一个包含 200 个点的随机序列
# np.random.randn() 从标准正态分布(均值为0,方差为1)中抽取随机样本
random_sequence = np.random.randn(num_points)print("生成的前10个数据点:")
print(random_sequence[:10])# --- 2. 可视化序列 ---# 设置图形大小
plt.figure(figsize=(12, 6))# 绘制线图
plt.plot(random_sequence, label='Random Sequence (White Noise)')# 添加标题和标签
plt.title('Visualization of a Randomly Generated Sequence', fontsize=16)
plt.xlabel('Time Step (时间步)', fontsize=12)
plt.ylabel('Value (值)', fontsize=12)# 添加一条水平线,表示序列的均值(接近于0)
plt.axhline(y=0, color='r', linestyle='--', label='Mean (均值 ≈ 0)')# 显示网格和图例
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()# 显示图形
plt.show()
2.绘制ACF检验图
from statsmodels.graphics.tsaplots import plot_acf
print("--- 开始检验白噪声属性 ---")# 检验 1: 均值是否接近 0
mean = np.mean(random_sequence)
print(f"1. 序列的均值: {mean:.4f}")
if -0.1 < mean < 0.1:print(" (结论: 均值非常接近0,满足条件。)\n")
else:print(" (结论: 均值偏离0较远。)\n")# 检验 2: 方差是否恒定(且接近理论值1)
# 对于我们生成的数据,方差恒定是与生俱来的。我们主要检查其值。
variance = np.var(random_sequence)
print(f"2. 序列的方差: {variance:.4f}")
if 0.8 < variance < 1.2:print(" (结论: 方差接近于1,满足条件。np.random.randn理论方差为1)\n")
else:print(" (结论: 方差偏离1较远。)\n")# 检验 3: 自相关性是否为 0
# 这是最核心的检验。我们通过绘制ACF图来完成。
print("3. 检验自相关性 (使用ACF图):")
print(" - ACF图展示了序列与它过去值之间的相关性。")
print(" - 对于白噪声,只有lag=0时相关性为1,其他所有lag的相关性都应在蓝色置信区间内(统计上不显著)。")# 创建一个新的图形来绘制ACF图
fig, ax = plt.subplots(figsize=(12, 5))
plot_acf(random_sequence, lags=30, ax=ax) # 我们查看前30个滞后的相关性
ax.set_title('序列的自相关函数图 (ACF Plot)')
ax.set_xlabel('Lag (滞后阶数)')
ax.set_ylabel('Autocorrelation (自相关系数)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
3.绘制PACF检验图
from statsmodels.graphics.tsaplots import plot_pacf # 引入PACF图
# --- 绘制PACF图 ---
fig, ax = plt.subplots(figsize=(12, 5))
plot_pacf(random_sequence, lags=30, ax=ax)
ax.set_title('序列的偏自相关函数图 (PACF Plot)')
ax.set_xlabel('Lag (滞后阶数)')
ax.set_ylabel('Partial Autocorrelation')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
4.绘制Ljung-Box检验图
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
# 引入Ljung-Box检验的函数
from statsmodels.stats.diagnostic import acorr_ljungbox # --- 您的原始代码部分 ---
np.random.seed(42)
num_points = 200
random_sequence = np.random.randn(num_points)# --- 白噪声属性检验---
mean = np.mean(random_sequence)
variance = np.var(random_sequence)
print(f"1. 序列的均值: {mean:.4f}")
print(f"2. 序列的方差: {variance:.4f}\n")
print("3. 检验自相关性 (使用ACF图)...")
fig, ax = plt.subplots(figsize=(12, 5))
plot_acf(random_sequence, lags=30, ax=ax)
ax.set_title('序列的自相关函数图 (ACF Plot)')
plt.show()# --- 新增:使用 Ljung-Box 检验进行严格的白噪声检验 ---
print("\n" + "="*50)
print("4. 进行严格的白噪声检验 (Ljung-Box Test)")
print("="*50)
print(" - 原假设(H₀): 序列是白噪声。")
print(" - 判断标准: 如果 p-value > 0.05,则接受原假设,认为序列是白噪声。")# 执行Ljung-Box检验
# 我们通常会检查一系列的滞后项,比如前10、20、30个
# 函数返回一个包含统计量和p值的DataFrame
ljung_box_result = acorr_ljungbox(random_sequence, lags=[10, 20, 30], return_df=True)print("\nLjung-Box检验结果:")
print(ljung_box_result)# --- 结论解释 ---
print("\n--- 检验结论 ---")
# 我们可以检查最后一个(最严格的)p值
# .iloc[-1] 获取最后一行, .loc['lb_pvalue'] 获取p值
last_p_value = ljung_box_result.iloc[-1]['lb_pvalue']if last_p_value < 0.05:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 小于 0.05。")print("结论:我们拒绝原假设,该序列不是白噪声。")
else:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 大于 0.05。")print("结论:我们无法拒绝原假设,该序列是白噪声。")