時系列分析の手順とプログラムの詳細(Python)

時系列分析の手順とプログラムの詳細(Python)



序文

例「応用時系列分析 (第 6 版)」Wang Yan の時系列 2 つの例題 4.4 と 4.7 を通して、以下はすべて Python プログラミングであり、他の言語の時系列コードは私とプライベートにチャットできます。
注: コードが画像を取り消していない場合、コードは後続のコードを実行しません。画像がない場合は、plt.show() を追加できます。


都市の将来の死亡率

最初にサードパーティのライブラリをインポートします

clear;clc
from __future__ import print_function
import pandas as pd
import numpy as np
from scipy import  stats
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
from statsmodels.stats.diagnostic import acorr_ljungbox

データのインポート

data=pd.Series([3.665,4.247,4.674,3.669,4.752,4.785,5.929,4.468,5.102,4.831,6.899,5.337,5.086,
      5.603,4.153,4.945,5.726,4.965,1.82,3.723,5.663,4.739,4.845,4.535,4.774,5.962,
      6.614,5.255,5.355,6.144,5.59,4.388,3.447,4.615,6.032,5.74,4.391,3.128,3.436,
      4.964,6.332,7.665,5.277,4.904,4.83,])

1. シーケンスのタイミング図を描く

data=pd.Series(data)
data.index = pd.Index(sm.tsa.datetools.dates_from_range('1978','2022'))
data.plot(figsize=(12,8))

ここに画像の説明を挿入

2. シーケンスの定常性と純粋なランダム性の判断

(i) 定常性試験

# ADF单位根平稳型检验
ADF = sm.tsa.stattools.adfuller(data)
print(ADF[0:2]) #输出统计量和对应的p值
if ADF[4]['1%'] > ADF[0]:
      print('ADF单位根平稳型检验通过,显著的拒绝原假设,数据是平稳的')
else:
      print('ADF单位根平稳型检验不通过,接受原假设,数据是不平稳的')

ここに画像の説明を挿入
有意水準 1%、%5、10% 帰無仮説の統計値と ADF テスト結果の異なる棄却度の比較、ADF テスト結果が 1%、5%、10% 未満である場合は、同時に仮説が棄却されたことを意味しますそうですね、このデータのうち、adf の結果は -5.18696 で、3 レベルの統計値を下回っています。これは、0.01 ~ 3.59250 の有意水準に対応する統計的臨界値未満です。対応する P 値は 0 に非常に近いです。このデータでは、P 値は 9e-6 で、0 に近い値です。
定常性テストに合格しない場合は、差分を実行する必要があります。差分コードは次のとおりです。

#一阶差分
fig = plt.figure(figsize=(12,8))
ax1= fig.add_subplot(111)
diff1 = data.diff(1)
diff1.plot(ax=ax1)

#二阶差分
fig = plt.figure(figsize=(12,8))
ax2= fig.add_subplot(111)
diff2 = data.diff(2)
diff2.plot(ax=ax2)

(ii) 純粋なランダム性テスト

# 白噪声检验
bzs = acorr_ljungbox(data.dropna(), lags = [i for i in range(1,12)],boxpierce=True)
print(bzs)

ここに画像の説明を挿入
ここで 2 行目は p 値であり、各自己回帰係数に対応する p 値に対応し、すべてが 0.05 より大きい場合、このシーケンスはホワイト ノイズ シーケンスであり、値を持ちません。

3. シーケンスの自己相関係数と偏自己相関係数の性質を調べる

# 检查平稳时间序列的自相关图和偏自相关图
dta= data.diff(1)#我们已经知道要使用一阶差分的时间序列,之前判断差分的程序可以注释掉
fig = plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(data,title="ACF",ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(data,title="PACF",ax=ax2,method='ywm')
plt.show()

ここに画像の説明を挿入

シーケンス自己相関グラフによれば、自己相関グラフの 1 次の切り捨て、または部分自己相関の 2 次の切り捨てと見なすことができることを理解するのは難しくありません。
また、自己相関グラフが一次の切り捨てられ、部分自己相関が尾を引くと考えることもできます。

4. シーケンスの展開を複数のモデルでフィッティングして、シーケンスのフィッティング モデルの最適化問題を調査します。

自己相関と偏自己相関に従って、対応するモデルを選択します。ここでは MA(1)、AR(2)、ARMA(1,1) を選択します。

#参数检验
model1 = sm.tsa.arima.ARIMA(data, order=(0,0,1))
result1 = model1.fit()
model2 = sm.tsa.arima.ARIMA(data, order=(2,0,0))
result2 = model2.fit()
model3 = sm.tsa.arima.ARIMA(data, order=(1,0,1))
result3 = model3.fit()

print(result1.summary())
print(result2.summary())
print(result3.summary())
print('arma(1,1)参数检验存在问题,参数显著为零,淘汰arma(1,1)')
print('MA(1),AR(2)参数显著非零,残差检验均为白噪声序列,MA(1)模型在AIC和BIC更优,所以选择MA(1)为最优模型')
#AIC BIC HQIC
print('模型      ','AIC               ','BIC              ','HQIC          ')
print('MA(1)    ',arma_mod20.aic,arma_mod20.bic,arma_mod20.hqic)
print('AR(2)    ',arma_mod30.aic,arma_mod30.bic,arma_mod30.hqic)
print('ARMA(1,1)',arma_mod40.aic,arma_mod40.bic,arma_mod40.hqic)

出力結果(各モデルのaic、bic比較):
ここに画像の説明を挿入
各モデルのパラメータ検査(修飾されていないarma(1,1)のみがここに配置されます)
画像の説明を追加してください

ARMA(1,1) パラメーター テストに問題があります。パラメーターは大幅にゼロであり、ARMA(1,1) モデル
MA(1)、AR(2) パラメーターは大幅にゼロではありません。残差テストはホワイト ノイズ シーケンス、MA(1) モデルは AIC と BIC で優れているため、最適なモデルとして MA(1) を選択します (aic と bic が大きいほど優れています)。

5. 最適なモデルを使用して、今後 5 年間の都市の人口死亡率を予測します。

pred = result1.predict('2022','2027',dynamic=True, typ='levels')
print (pred)

ここに画像の説明を挿入

上記のコードは、類似点があるとしても、純粋にレンガです。

おすすめ

転載: blog.csdn.net/weixin_52952969/article/details/125453970