tldr;
Данные вашего временного ряда напоминают (смещенный в среднем) белый шум; данные не подтверждают каких-либо признаков основного процесса авторегрессии (AR) или скользящего среднего (MA). Таким образом, модель ARIMA (0,0,0) (с ненулевым средним значением) соответствует вашим данным.
Визуализация данных
До установки (S) ARIMA В моделях всегда полезно взглянуть на необработанные данные.
import matplotlib.pyplot as plt
import matplotlib.dates as dates
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.plot(data.Date, data.Births)
ax.xaxis.set_major_locator(dates.DayLocator(interval = 10))
ax.xaxis.set_major_formatter(dates.DateFormatter('%d/%m'))
ax.set_xlabel('DD/MM in 1959')
ax.set_ylabel("Births")
plt.show()
Уже здесь мы видим, что данные более или менее напоминают белый шум.
Функции автокорреляции и частичной автокорреляции
Мы можем изучить это далее, построив график ACF и PACF
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
plt.figure()
plt.subplot(211)
plot_acf(data["Births"], ax = plt.gca())
plt.subplot(212)
plot_pacf(data["Births"], ax = plt.gca())
plt.show()
Не существует значительной (частичной) автокорреляции при лагах <10; несколько значительных всплесков при более высоких задержках в PACF могут быть такими, как ожидалось (так как мы строим 95% CI), или могут быть вызваны каким-то другим «ненормальным» временным рядом. ИМО, учитывая скудность данных, просто недостаточно информации, чтобы сказать гораздо больше. </p>
Авто ARIMA
Давайте снова запустим auto_arima
:
from pmdarima import auto_arima
auto_arima(
data["Births"],
start_p = 1, max_p = 6,
start_q = 1, max_q = 6,
seasonal = False, trace = True).summary()
#Performing stepwise search to minimize aic
#/Users/maurits/miniconda3/lib/python3.5/site-packages/statsmodels/base/model.py:568: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
# "Check mle_retvals", ConvergenceWarning)
#Fit ARIMA: (1, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=422.260, BIC=430.637, Time=0.255 seconds
#Fit ARIMA: (0, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=419.527, BIC=423.716, Time=0.010 seconds
#Fit ARIMA: (1, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=421.148, BIC=427.431, Time=0.040 seconds
#Fit ARIMA: (0, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=421.238, BIC=427.521, Time=0.058 seconds
#Fit ARIMA: (0, 0, 0)x(0, 0, 0, 0) (constant=False); AIC=616.939, BIC=619.034, Time=0.010 seconds
#Total fit time: 0.383 seconds
#<class 'statsmodels.iolib.summary.Summary'>
#"""
# SARIMAX Results
#==============================================================================
#Dep. Variable: y No. Observations: 60
#Model: SARIMAX Log Likelihood -207.764
#Date: Wed, 19 Feb 2020 AIC 419.527
#Time: 20:20:11 BIC 423.716
#Sample: 0 HQIC 421.166
# - 60
#Covariance Type: opg
#==============================================================================
# coef std err z P>|z| [0.025 0.975]
#------------------------------------------------------------------------------
#intercept 39.9333 0.997 40.068 0.000 37.980 41.887
#sigma2 59.5956 13.897 4.288 0.000 32.358 86.833
#===================================================================================
#Ljung-Box (Q): 51.46 Jarque-Bera (JB): 1.50
#Prob(Q): 0.11 Prob(JB): 0.47
#Heteroskedasticity (H): 0.80 Skew: -0.01
#Prob(H) (two-sided): 0.63 Kurtosis: 2.23
#===================================================================================
#
#Warnings:
#[1] Covariance matrix calculated using the outer product of gradients (complex-step).
#"""
Наилучшая модель - модель белого шума со смещенным средним (сдвиг в среднем определяется параметром intercept
).
Пример данных
import pandas as pd
data = pd.DataFrame({
"Date": ["1959-01-01", "1959-01-02", "1959-01-03",
"1959-01-04", "1959-01-05", "1959-01-06", "1959-01-07", "1959-01-08",
"1959-01-09", "1959-01-10", "1959-01-11", "1959-01-12", "1959-01-13",
"1959-01-14", "1959-01-15", "1959-01-16", "1959-01-17", "1959-01-18",
"1959-01-19", "1959-01-20", "1959-01-21", "1959-01-22", "1959-01-23",
"1959-01-24", "1959-01-25", "1959-01-26", "1959-01-27", "1959-01-28",
"1959-01-29", "1959-01-30", "1959-01-31", "1959-02-01", "1959-02-02",
"1959-02-03", "1959-02-04", "1959-02-05", "1959-02-06", "1959-02-07",
"1959-02-08", "1959-02-09", "1959-02-10", "1959-02-11", "1959-02-12",
"1959-02-13", "1959-02-14", "1959-02-15", "1959-02-16", "1959-02-17",
"1959-02-18", "1959-02-19", "1959-02-20", "1959-02-21", "1959-02-22",
"1959-02-23", "1959-02-24", "1959-02-25", "1959-02-26", "1959-02-27",
"1959-02-28", "1959-03-01"],
"Births": [35, 32, 30, 31, 44, 29, 45, 43, 38, 27, 38, 33, 55, 47, 45,
37, 50, 43, 41, 52, 34, 53, 39, 32, 37, 43, 39, 35, 44, 38, 24,
23, 31, 44, 38, 50, 38, 51, 31, 31, 51, 36, 45, 51, 34, 52, 47,
45, 46, 39, 48, 37, 35, 52, 42, 45, 39, 37, 30, 35]
})
data["Date"] = pd.to_datetime(data["Date"])