- 假設檢驗基礎知識
- 原假設與備擇假設
- 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("結論:我們無法拒絕原假設,該序列是白噪聲。")