時間序列分析在數(shù)據(jù)科學(xué)領(lǐng)域中占據(jù)著重要地位,它不僅幫助我們理解數(shù)據(jù)的趨勢和模式,還能夠提供對未來趨勢的預(yù)測。在眾多時間序列分析工具中,Python中的Statsmodels庫以其強大的功能和靈活性備受青睞。本文將深入探討Statsmodels庫在時間序列分析中的應(yīng)用,聚焦于移動平均模型(MA)、自回歸模型(AR)以及ARIMA模型,帶你領(lǐng)略Statsmodels的精妙之處。
寫在開頭
時間序列分析是一種通過對時間相關(guān)數(shù)據(jù)的觀察、建模和預(yù)測來發(fā)現(xiàn)模式和規(guī)律的技術(shù)。在金融、氣象、銷售等眾多領(lǐng)域,時間序列分析都發(fā)揮著至關(guān)重要的作用。而在這個領(lǐng)域,Statsmodels庫以其豐富的功能和強大的性能表現(xiàn)得尤為突出。
1 移動平均模型(MA)
1.1 移動平均模型的基本原理
移動平均模型(Moving Average Model,簡稱MA模型)是一種時間序列分析中常用的模型,用于描述時間序列數(shù)據(jù)中的趨勢和季節(jié)性變化。MA模型的基本原理涉及到對數(shù)據(jù)的平均值進行移動計算,以揭示數(shù)據(jù)的平滑趨勢。
以下是MA模型的基本原理:
-
滑動平均的概念: MA模型基于滑動平均的思想,通過在時間序列上滑動一個固定大小的窗口,計算窗口內(nèi)數(shù)據(jù)的平均值。這個窗口的大小決定了平均值的穩(wěn)定性,較大的窗口可以平滑噪聲,但可能較慢地適應(yīng)趨勢的變化。
-
平均值的表示: 在MA模型中,時間點 t 處的觀測值被表示為過去幾期的白噪聲(隨機誤差項)的線性組合。具體來說,第 t 期的觀測值 Y(t) 可以被表示為:
Y ( t ) = μ + ? ( t ) + θ 1 ? ( t ? 1 ) + θ 2 ? ( t ? 2 ) + … + θ q ? ( t ? q ) Y(t) = \mu + \epsilon(t) + \theta_1 \epsilon(t-1) + \theta_2 \epsilon(t-2) + \ldots + \theta_q \epsilon(t-q) Y(t)=μ+?(t)+θ1??(t?1)+θ2??(t?2)+…+θq??(t?q)
其中, μ \mu μ 是均值, ? ( t ) \epsilon(t) ?(t) 是白噪聲, θ 1 , θ 2 , … , θ q \theta_1, \theta_2, \ldots, \theta_q θ1?,θ2?,…,θq? 是MA模型的參數(shù),而 q 是模型的階數(shù)。
-
模型的階數(shù): MA模型的階數(shù) q 表示窗口的大小,即過去 q 期的觀測值會對當(dāng)前期的觀測值產(chǎn)生影響。階數(shù)的選擇通常需要結(jié)合實際問題和模型擬合的效果進行調(diào)整。
-
模型的建模和預(yù)測: 利用過去的觀測值,通過估計模型的參數(shù),可以建立MA模型。然后,利用該模型對未來的觀測值進行預(yù)測。
1.2 利用Statsmodels進行MA模型的建模和預(yù)測
Statsmodels庫提供了豐富的時間序列分析工具,通過它,我們可以輕松地建立和訓(xùn)練移動平均模型,并進行未來數(shù)據(jù)的預(yù)測。
現(xiàn)在如果要分析過去幾個季度每月銷售額的變化,以便更好地理解銷售趨勢并進行未來銷售的預(yù)測,我們利用Python代碼進行構(gòu)建:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima.model import ARIMA
# 生成模擬數(shù)據(jù)
np.random.seed(12)
date_rng = pd.date_range(start='2022-01-01', end='2022-12-31', freq='M')
sales_data = np.random.randint(50, 150, size=(len(date_rng)))
sales_df = pd.DataFrame(data={'date': date_rng, 'sales': sales_data})
sales_df.set_index('date', inplace=True)
# 利用Statsmodels建立ARIMA模型
order = (0, 0, 1) # 設(shè)置MA階數(shù)為1
arima_model = ARIMA(sales_df['sales'], order=order)
arima_result = arima_model.fit()
# 模型評估
print(arima_result.summary())
# 預(yù)測未來3個月的銷售額
forecast_steps = 3
forecast = arima_result.get_forecast(steps=forecast_steps)
# 獲取預(yù)測結(jié)果
forecast_values = forecast.predicted_mean
# 輸出預(yù)測結(jié)果
print("未來3個月的銷售額預(yù)測:")
print(forecast_values)
# 可視化觀測值、預(yù)測值和置信區(qū)間
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(sales_df['sales'], label='Observations', marker='o')
plt.plot(forecast_values, label='Forecast', linestyle='--', marker='o', color='red')
plt.fill_between(forecast.conf_int().index, forecast.conf_int()['lower sales'], forecast.conf_int()['upper sales'], color='pink', alpha=0.3, label='Confidence Interval')
plt.title('Sales Forecast with MA(1) Model - Observations vs Forecast')
plt.legend()
# 殘差圖
residuals = sales_df['sales'] - arima_result.fittedvalues
plt.subplot(2, 1, 2)
plt.plot(residuals, label='Residuals', linestyle='--', marker='o')
plt.axhline(0, color='red', linestyle='--', linewidth=1, label='Zero Line')
plt.title('Residuals of MA(1) Model')
plt.legend()
plt.tight_layout()
plt.show()
運行上述代碼后,我們可以得到下面的結(jié)果:
從上述的模型評估結(jié)果,我們可以得到下面的信息:
-
Log Likelihood(對數(shù)似然): Log Likelihood 的值為 -54.927,該值越接近零越好,表示模型對觀測數(shù)據(jù)的擬合效果越好。
-
AIC(赤池信息準則)和BIC(貝葉斯信息準則): AIC 和 BIC 分別為 115.855 和 117.309。在比較不同模型時,我們通常選擇具有較小 AIC 和 BIC 值的模型,因為它們更好地平衡了模型的擬合效果和復(fù)雜性。
-
模型系數(shù)(coef): 我們關(guān)注 ma.L1 的系數(shù),其值為 0.8383。該系數(shù)表示過去一個期的白噪聲對當(dāng)前銷售額的影響。系數(shù)的顯著性通常通過 P-value 來判斷,這里 P-value 為 0.013,小于通常選擇的顯著性水平(如 0.05),說明該系數(shù)是顯著的。
-
殘差的方差(sigma2): sigma2 表示白噪聲的方差,該值為 500.9042。較小的方差表示模型對數(shù)據(jù)的擬合較好。
-
Ljung-Box 統(tǒng)計量和 Jarque-Bera 統(tǒng)計量: 這兩個統(tǒng)計量用于檢驗?zāi)P蜌埐钍欠翊嬖谧韵嚓P(guān)性和非正態(tài)性。在這里,Ljung-Box 的 Q 統(tǒng)計量為 0.32,P-value 為 0.57,Jarque-Bera 統(tǒng)計量為 1.31,P-value 為 0.52。P-value 較大,表示模型的殘差在統(tǒng)計上不顯著地違反模型假設(shè)。
-
Heteroskedasticity(異方差性): H 統(tǒng)計量為 0.84,P-value 為 0.87。較大的 P-value 表示模型的殘差在異方差性方面不顯著。
綜合評價:
該模型的Log Likelihood 較小,AIC 和 BIC 較大,可能存在過擬合的風(fēng)險。模型的 ma.L1 系數(shù)顯著,但在其他方面的統(tǒng)計量未完全符合理想情況。從上方的圖形中可以觀察出未來的趨勢和季節(jié)性情況。為了更進一步分析,建議嘗試其他ARIMA模型,調(diào)整階數(shù),以尋找更好的擬合效果。
建議和改進:
- 探索調(diào)整模型的階數(shù),包括 AR 和 MA 部分的階數(shù),以獲得更好的擬合效果。
- 可以嘗試其他時間序列模型,如 SARIMA(季節(jié)性ARIMA)等,以更好地考慮季節(jié)性因素。
- 考慮模型中可能存在的異方差性,可能需要進一步的處理。
2 自回歸模型(AR)
2.1 自回歸模型的概念
自回歸模型(Autoregressive Model,簡稱AR模型)是一種用于時間序列分析的模型,它基于時間序列過去的觀測值來預(yù)測未來的值。AR模型的核心思想是當(dāng)前時刻的觀測值與過去某些時刻的觀測值之間存在一定的線性關(guān)系。
AR模型的數(shù)學(xué)表示如下:
X t = ? 1 X t ? 1 + ? 2 X t ? 2 + … + ? p X t ? p + ε t X_t = \phi_1 X_{t-1} + \phi_2 X_{t-2} + \ldots + \phi_p X_{t-p} + \varepsilon_t Xt?=?1?Xt?1?+?2?Xt?2?+…+?p?Xt?p?+εt?
其中:
- X t X_t Xt? 是時間序列在時刻 t t t 的觀測值。
- ? 1 , ? 2 , … , ? p \phi_1, \phi_2, \ldots, \phi_p ?1?,?2?,…,?p? 是模型的參數(shù),代表了過去時刻觀測值的權(quán)重。
- X t ? 1 , X t ? 2 , … , X t ? p X_{t-1}, X_{t-2}, \ldots, X_{t-p} Xt?1?,Xt?2?,…,Xt?p? 是時間序列在過去時刻的觀測值。
- ε t \varepsilon_t εt? 是白噪聲,代表了模型中未被考慮的隨機誤差。
AR模型的階數(shù) p p p 表示考慮的過去觀測值的數(shù)量。例如,AR(1)模型只考慮上一個時刻的觀測值,而AR(2)模型考慮上兩個時刻的觀測值。
AR模型的特點包括:
-
自相關(guān)性: AR模型反映了時間序列在不同時刻之間的自相關(guān)關(guān)系,即過去的觀測值對當(dāng)前值有影響。
-
平穩(wěn)性: AR模型在許多應(yīng)用中假設(shè)時間序列是平穩(wěn)的,即統(tǒng)計特性在時間上不發(fā)生明顯變化。
-
參數(shù)估計: 通過最小化殘差平方和或最大似然估計等方法,可以估計AR模型的參數(shù)。
-
模型診斷: 可以通過觀察殘差圖、自相關(guān)圖等進行模型的診斷和評估。。
2.2 使用Statsmodels進行AR模型的擬合和預(yù)測
Statsmodels庫的ARIMA
類可以方便地用于自回歸模型的建模。
繼續(xù)利用上方的數(shù)據(jù)進行建模分析:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
# 生成模擬數(shù)據(jù)
np.random.seed(12)
date_rng = pd.date_range(start='2022-01-01', end='2022-12-31', freq='M')
sales_data = np.random.randint(50, 150, size=(len(date_rng)))
sales_df = pd.DataFrame(data={'date': date_rng, 'sales': sales_data})
sales_df.set_index('date', inplace=True)
# 利用Statsmodels建立AR模型
order = (2, 0, 0) # AR(2)模型
ar_model = sm.tsa.AutoReg(sales_df['sales'], lags=order[0])
ar_result = ar_model.fit()
# 輸出模型參數(shù)和統(tǒng)計信息
print(ar_result.summary())
# 預(yù)測未來的值
forecast_steps = 3
forecast = ar_result.predict(start=len(sales_df), end=len(sales_df)+forecast_steps-1, dynamic=False)
# 可視化
plt.plot(sales_df['sales'], label='Observations')
plt.plot(forecast, label='Forecast', linestyle='--', marker='o', color='red')
plt.title('AR Model - Observations vs Forecast')
plt.legend()
plt.show()
得到結(jié)果如下圖:
2
根據(jù)上方AutoReg模型的結(jié)果,我們可以得出以下結(jié)論:
-
Log Likelihood和AIC/BIC值: Log Likelihood(對數(shù)似然)和AIC/BIC(赤池信息準則/貝葉斯信息準則)是評估模型擬合好壞的指標。Log Likelihood越高,AIC和BIC越低越好。在這個例子中,Log Likelihood相對較低,而AIC和BIC相對較高,可能表明模型的擬合效果一般。
-
系數(shù)解釋: 模型的系數(shù)表示在每一個時間點上,當(dāng)前銷售額與前兩個時間點的銷售額之間的關(guān)系。在這里,sales.L1的系數(shù)為0.6029,sales.L2的系數(shù)為-0.5704。這些系數(shù)告訴我們,銷售額與前兩個時間點的銷售額之間存在正向和負向的關(guān)聯(lián)。
-
顯著性: 系數(shù)的P值表示其在模型中的顯著性。在這里,const和sales.L2的P值較小,表明它們可能是顯著的。
-
殘差: 模型的殘差是觀測值與模型預(yù)測值之間的差異。殘差的標準差(S.D. of innovations)為20.577,表示模型的預(yù)測值相對于實際觀測值的離散程度。
從實際應(yīng)用的角度來看,該模型對于擬合這一年的銷售數(shù)據(jù)的整體趨勢表現(xiàn)得相對較好。然而,對于更準確的預(yù)測,可能需要更多的數(shù)據(jù)或者更復(fù)雜的模型。模型的有效性也取決于具體應(yīng)用場景和對誤差的容忍度。
3 ARIMA模型
3.1 將AR和MA結(jié)合,介紹ARIMA模型
ARIMA(AutoRegressive Integrated Moving Average)模型是一種用于時間序列分析和預(yù)測的經(jīng)典統(tǒng)計方法。它結(jié)合了自回歸(AR)和移動平均(MA)兩種模型,同時具有差分(Integrated)的操作。ARIMA模型通常表示為ARIMA(p, d, q),其中:
- p(自回歸階數(shù)):表示模型中使用的自回歸項的數(shù)量。
- d(差分階數(shù)):表示使時間序列平穩(wěn)所需的差分次數(shù)。
- q(移動平均階數(shù)):表示模型中使用的移動平均項的數(shù)量。
ARIMA模型的核心思想是通過對時間序列進行差分,將非平穩(wěn)時間序列轉(zhuǎn)化為平穩(wěn)時間序列,然后利用自回歸和移動平均項來捕捉數(shù)據(jù)中的結(jié)構(gòu)和模式。
ARIMA模型的建模步驟通常包括:
-
平穩(wěn)性檢驗: 檢驗時間序列是否平穩(wěn),如果不平穩(wěn),需要進行差分直到平穩(wěn)。
-
選擇ARIMA參數(shù): 選擇合適的p、d、q值,可以通過觀察自相關(guān)圖(ACF)和偏相關(guān)圖(PACF)來進行初步選擇。
-
建立ARIMA模型: 使用選定的p、d、q值建立ARIMA模型。
-
模型擬合: 利用時間序列數(shù)據(jù)對ARIMA模型進行擬合。
-
模型診斷: 對模型進行診斷,檢查殘差的自相關(guān)性和偏相關(guān)性,確保模型符合假設(shè)。
-
模型預(yù)測: 利用已建立的ARIMA模型進行未來時點的預(yù)測。
3.2 利用Statsmodels進行ARIMA建模和預(yù)測
通過Statsmodels庫,我們可以輕松地應(yīng)用ARIMA模型:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
# 生成模擬數(shù)據(jù)
np.random.seed(123)
date_rng = pd.date_range(start='2020-01-01', end='2022-12-31', freq='M')
sales_data = np.random.randint(50, 150, size=(len(date_rng)))
sales_df = pd.DataFrame(data={'date': date_rng, 'sales': sales_data})
sales_df.set_index('date', inplace=True)
# 平穩(wěn)性檢驗
result = sm.tsa.adfuller(sales_df['sales'])
print("ADF Statistic:", result[0])
print("p-value:", result[1])
print("Critical Values:", result[4])
# ACF 和 PACF
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# 自相關(guān)圖
plot_acf(sales_df['sales'], lags=12, ax=ax1)
ax1.set_title('Autocorrelation Function')
# 偏相關(guān)圖
plot_pacf(sales_df['sales'], lags=12, ax=ax2)
ax2.set_title('Partial Autocorrelation Function')
plt.show()
# 選擇ARIMA參數(shù)
order = (1, 0, 1)
# 建立ARIMA模型
arima_model = sm.tsa.ARIMA(sales_df['sales'], order=order)
arima_result = arima_model.fit()
# 模型診斷
# 模型評估
print(arima_result.summary())
residuals = arima_result.resid
fig, ax = plt.subplots(figsize=(10, 6))
sm.graphics.tsa.plot_acf(residuals, lags=12, ax=ax)
plt.title("Autocorrelation of Residuals")
plt.show()
# 模型預(yù)測
forecast_steps = 12
forecast = arima_result.get_forecast(steps=forecast_steps)
forecast_values = forecast.predicted_mean
# 輸出預(yù)測結(jié)果
print("未來12個月的銷售額預(yù)測:")
print(forecast_values)
運行上述代碼后,得出下面的結(jié)果:
從上方的結(jié)果中,我們可以得出下面的結(jié)論:
-
AIC和BIC值:
- AIC值:344.388
- BIC值:350.722
通常情況下,我們會選擇AIC和BIC值較小的模型,因為它們表示了對數(shù)似然度和模型參數(shù)數(shù)量的權(quán)衡。在這個例子中,AIC和BIC的值都相對較小,表示該模型相對合適。
-
參數(shù)估計:
- const(截距項)的系數(shù)為113.8213,對應(yīng)的標準誤差為3.603。
- ar.L1(AR(1)項)的系數(shù)為0.2112,對應(yīng)的標準誤差為0.778。
- ma.L1(MA(1)項)的系數(shù)為-0.4549,對應(yīng)的標準誤差為0.698。
這些系數(shù)表示了模型中各項的影響。需要注意的是,系數(shù)的顯著性和方向?qū)τ诶斫饽P偷挠行灾陵P(guān)重要。在這個例子中,截距項的系數(shù)顯著不為零,但AR(1)和MA(1)項的系數(shù)未顯著。
-
殘差分析:
- Ljung-Box統(tǒng)計量(Q值)為0.00,對應(yīng)的p-value為0.95。這表示在模型的殘差序列中沒有顯著的自相關(guān)。
- Jarque-Bera統(tǒng)計量(JB值)為1.70,對應(yīng)的p-value為0.43。這表示在模型的殘差序列中未發(fā)現(xiàn)顯著的偏度和峰度。
殘差分析是評估模型擬合效果的關(guān)鍵部分,因為它可以告訴我們模型是否遺漏了某些重要的信息。
總體而言,該模型的AIC和BIC較小,殘差序列無明顯的自相關(guān),并且基本符合正態(tài)性的要求。然而,由于AR(1)和MA(1)項的系數(shù)未顯著,可能需要進一步調(diào)整模型的階數(shù)或考慮其他模型。模型的有效性可能會因為時間序列的特性而有所不同,因此在實際應(yīng)用中可能需要進一步優(yōu)化。文章來源:http://www.zghlxwxcb.cn/news/detail-840554.html
寫在最后
通過本文的介紹,我們深入了解了Statsmodels庫在時間序列分析中的三個關(guān)鍵模型:移動平均模型(MA)、自回歸模型(AR)和ARIMA模型。Statsmodels以其強大的功能和靈活性為數(shù)據(jù)科學(xué)家和分析師提供了強大的工具,使他們能夠更好地理解和預(yù)測時間序列數(shù)據(jù)。無論是預(yù)測未來銷售趨勢,還是分析股市波動,Statsmodels都是一個值得信賴的伙伴。希望通過這篇文章,讀者對Statsmodels庫在時間序列分析中的應(yīng)用有了更深入的認識,為應(yīng)對不同時間序列問題提供了強大的工具。文章來源地址http://www.zghlxwxcb.cn/news/detail-840554.html
到了這里,關(guān)于statsmodels專欄4——深度解析:Python中的Statsmodels庫時間序列分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!