当前位置:网站首页>【機器學習】基於多元時間序列對高考預測分析案例

【機器學習】基於多元時間序列對高考預測分析案例

2022-06-25 16:26:00 風度78

本文借助 ARIMA模型,通過對中國的往年高考錄取率進行建模和預測,並驗證和檢驗模型精度和可行性,來應用模型來估計未來的錄取率,進一步得出2030年中國高考錄取率的預測值。

本文系讀者投稿 

作者簡介:理智,河北科技大學的大三學生,主攻深度學習。和大多數程序員一樣,他是個樂觀主義者,大量的時間都在調試代碼,在調試中滿懷希望,克服遇到的無數挫折。

01 數據來源

本文采用的數據來自世界銀行官網(https://data.worldbank.org.cn/)的中國宏觀經濟數據集,現行版本的數據集共 45行12列,提供自1959年至2021年中國大陸12個指標每年的比特置和數值。數據集格式采用國際通用慣例,每年的記錄包含數值記錄和比率記錄,記錄包含了時間(世界時)、人口(萬人)、金額(億美元)、比例等指標,數據集的結構如錶1所示,圖1畫出了中國1949至2021年間的5個指標關系密切程度的熱力圖。

錶 1 世界銀行數據列錶 (️滑動查看更多)
出生年高考年新生兒人口(單比特:萬人)大學招生擴招政策,布爾變量,0錶示無,1錶示是出生年GDP(億美元)高考年GDP(億美元)高考年GDP占世界比例(%)參加高考人數(單比特:萬人)高考錄取人數(單比特:萬人)高考錄取率高等教育毛入學率參加高考人數同比增長
19591977163505501749.42.39570274.741.65NaN
1960197814020597.21495.41.7361040.26.592.870.07
196119799490500.61782.82.23468285.982.95-0.233
1962198024510472.11911.52.12333288.411.14-0.288
1963198129340507.11958.71.672592810.810.95-0.222
03d369e719a5979b47f9a882d57d5e83.png
圖1 相關性熱力圖

02 統計分析

在1959年~2020年的61年間,新生兒數量有較大波動,1987年後新生兒數量呈單調遞减趨勢,且2016年後下降最為明顯。

年GDP方面,呈上昇趨勢,1993年後變化較為明顯。

整體上新生兒數量與出生年GDP無較為明顯的關系,但存在部分區間負相關關系(1987年後)。

b684e6526e87340df6bd87a73ed32876.png
圖2 人口趨勢圖

高考錄取率與當年GDP如圖3。兩者均整體呈上昇趨勢,初步判斷兩者之間存在正相關關系。

29118118b0ee5797a5bf1e717d564d7a.png
圖3 高考年錄取率與GDP圖

高考參加人數及與之相關的情况:參加高考的人數逐年增加,但是參加高考的人數的年同比增長變化波動大,無明顯特征,如圖4。

96d373d99092e4f3bb3cf4ca9bc1099e.png
圖4 高考錄取人數詳情圖

觀察高等教育毛入學率及當年GDP全球占比可知如圖5。

61e0492dc7679b186a97a4b4f39e5fc4.png
圖5 中國教育毛入學率與GDP占比動態圖

毛入學率與全球GDP占比呈上昇趨勢,初步判斷兩者間存在正相關關系。

03 時間序列預測高考錄取率

在此處,我們應用ARIMA模型進行高考錄取率預測。這裏ARIMA模型可以點擊查看詳情終於把時間序列預測ARIMA模型講明白了

在應用ARIMA模型時需要先對觀測序列進行平穩性以及白噪聲檢驗,只有平穩非白噪聲序列才具有觀測價值,詳細流程有:

997a39d0e221b1ad14bfc75a61ee378b.png

 3.1  
 目標數據的原始數據序列時序圖及自相關圖

import matplotlib.pyplot as plt
# 確定目標數據
tag = data['高考錄取率']
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
fig = plt.figure(figsize=(12,4))
ax1 = fig.add_subplot(121)
tag.plot()
plt.title('Sequence diagram')
ax2 = fig.add_subplot(122)
plot_acf(tag,ax=ax2) # 自相關圖
plt.show()
d81c5f022cdb5a85f3231b89eb3a719c.png

觀察時序圖可知:

由於該序列有明顯的單調遞增趨勢,初步判斷其為非平穩序列,且自相關圖顯示自相關系數長期大於0,說明序列間有很强的長期相關性。

結合上述流程,需要先對該序列進行平穩性檢驗。

 3.2 ADF檢驗(單比特根檢驗)

# 平穩性檢測
from statsmodels.tsa.stattools import adfuller as ADF
ADF(tag)
(-0.5482617125015317,
 0.882249553115714,
 0,
 44,
 {'1%': -3.5885733964124715,
  '5%': -2.929885661157025,
  '10%': -2.6031845661157025},
 203.98252176030874)

觀察結果,P值為0.882249553115714,顯著大於0.05。

最終將該序列判斷為非平穩序列。

由於最終判斷該序列為非平穩序列,因此需要對其進行差分處理。

 3.3 差分處理

tag_diff = tag.diff().dropna()
tag_diff.plot()
plt.title('First order sequence diagram')
plt.show()
952fceae1507e527c4ecebb428d6ab9f.png

從上圖可以看出,一階差分後的數據增减趨勢較為平穩。但是依據最優化及准確性原則,需要再進行二階差分處理。

## 二階
tag_diff2 = tag_diff.diff().dropna()
tag_diff2.plot()
plt.title('Second order sequence diagram')
plt.show()
dadb6a83b4edbfdf0c5c9303923decdb.png

理論上說,多階的差分可以更好的剔除序列中的不確定因素,

但是差分的同時也會使得原序列損失一定的數據,所以差分的階數應該適當。

在本文中,二階差分過後,序列趨勢較為平穩,接下來對二階差分後的序列進行自相關及偏自相關圖的繪制分析。

# 偏自相關
fig = plt.figure(figsize=(12,4))
ax1 = fig.add_subplot(121)
plot_acf(tag_diff,ax=ax1)
ax2 = fig.add_subplot(122)
plot_pacf(tag_diff,ax=ax2)
plt.show()
5c6217ad7b95a54fda9019e100df2789.png
ADF(tag_diff2)
(-7.7836768644929695,
 8.2881029271227e-12,
 1,
 41,
 {'1%': -3.60098336718852,
  '5%': -2.9351348158036012,
  '10%': -2.6059629803688282},
 202.9415785772855)

觀察兩圖結果,

結果顯示,二階差分之後序列的自相關圖有較强的短期相關性,且 ADF 檢驗中 p值為 8.2881029271227e-12,顯著小於0.05,所以二階差分後的序列是平穩序列。

結合流程圖,平穩性檢驗後進行白噪聲檢驗。對於白噪聲相關內容可參見:時間序列預測中如何檢測隨機遊走和白噪聲

 3.4 白噪聲檢驗

檢驗結果如下

# 白噪聲檢驗
from statsmodels.stats.diagnostic import acorr_ljungbox
acorr_ljungbox(tag_diff2,lags=[6,12,24])
(array([14.16785, 16.24145, 22.69118]),
 array([0.02781, 0.18042, 0.53808]))
lbvalue: QLB檢驗統計量
pvalue: QLB檢驗統計量下對應的P值

此時查看P值,也就是第二行數據(各列分別為延遲6、12、24階時的檢驗結果):

lags=6 時,也就是延遲 6階時 P值為 0.02781636 < 0.05,此時可判斷該序列為非白噪聲序列,具有觀測價值。

 3.5 應用ARIMA模型

from statsmodels.tsa.arima_model import ARIMA
# 一般階數不超過length/10
pmax = int(len(tag_diff)/10)
qmax = int(len(tag_diff)/10)
bic_matrix = []

for p in range(pmax+1):
   tmp = []

for q in range(qmax+1):
   try:
       tmp.append(ARIMA(tag, (p,1,q)).fit().bic)
   except:
       tmp.append(None)
   bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix)
p,q = bic_matrix.stack().idxmin()  ## 得到最小p、q值
## 由於對原視數據進行了二階差分,所以此處的d值為 2
model = ARIMA(tag, (p,2,q)).fit() 
model.summary2()
9f401f9ccf6af3f1a903d34b318bd5bc.png

 預測2030年的高考錄取率

print('預測2030年的高考錄取率為 ' + 
      str(model.forecast(9)[0][-1]) + '%')
預測2030年的高考錄取率為 95.79511627906977%
print('預測2030年的高考錄取率為 ' + 
      str(model.forecast(9)[0][-1]) + '%')
預測2050年的高考錄取率為 98.79511627906977%

04 結論

ARIMA是一種非常流行的時間序列統計方法,它是差分整合移動平均自回歸模型,分別是自回歸(AR)項指的是差分序列的滯後,移動平均(MA)項是指誤差的滯後,而I是用於使時間序列平穩的差分數,描述了數據點的相關性,並考慮數值之間的差异。

本文借助ARIMA模型,通過對中國的往年高考錄取率進行建模和預測,並驗證和檢驗模型精度和可行性,來應用模型來估計未來的錄取率,進一步得出了2030年中國高考錄取率的預測值為 95.795%。(僅供學習參考)

采用差分整合移動平均自回歸模型挖掘影響高考錄取率的關鍵因素,然而差分整合移動平均自回歸模型需要各指標與高考的相關關系,故可采用相關系數R的性質,得出各指標的相關性,建立ARIMA模型需要先對觀測序列進行平穩性以及白噪聲檢驗,只有平穩非白噪聲序列才具有觀測價值,最終預測高考錄取率。

66955c153d642feafb73c349f3bbfd04.gif

baf29510a892fce12af96f86fe14dcb8.png

往期精彩回顧




適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼複現專輯機器學習交流qq群955171419,加入微信群請掃碼

9e61675b159e1ed3bf23c6c499ea0402.png

原网站

版权声明
本文为[風度78]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/176/202206251539432078.html