Bis zum letzten Mal haben wir das ARIMA-Modell und das ARIMAX-Modell der Zeitreihenanalyse verwendet, um zukünftige Umsätze vorherzusagen.
Die Genauigkeit verbessert sich jedoch nicht. Unter der Annahme, dass die Berücksichtigung der Saisonalität nicht ausreicht, möchte ich als nächstes das ARIMA-Modell = SARIMA-Modell einschließlich der Saisonalität anwenden.
Es scheint jedoch, dass SARIMA nicht mit dem PyFlux verwendet werden kann, der bis zum letzten Mal verwendet wurde. "[Vorhersage des Übergangs der Fernsehrate von TV Asahi mit dem SARIMA-Modell](https://qiita.com/mshinoda88/items/749131478bfefc9bf365#sarima%] E3% 83% A2% E3% 83% 87% E3% 83% AB% E5% AD% A3% E7% AF% 80% E8% 87% AA% E5% B7% B1% E5% 9B% 9E% E5% B8% B0% E5% 92% 8C% E5% 88% 86% E7% A7% BB% E5% 8B% 95% E5% B9% B3% E5% 9D% 87% E3% 83% A2% E3% 83% 87% E3% 83% AB) “wird als Referenz für die Verwendung von Statistikmodellen verwendet.
Google Colaboratory
Wie bei [Letztes Mal] verwenden die Daten den täglichen Umsatz und die Temperatur (Durchschnitt, Maximum, Minimum) als erklärende Variablen.
Datum | Verkaufszahlen | Durchschnittstemperatur | Höchste Temperatur | Niedrigste Temperatur |
---|---|---|---|---|
2018-01-01 | 7,400,000 | 4.9 | 7.3 | 2.2 |
2018-01-02 | 6,800,000 | 4.0 | 8.0 | 0.0 |
2018-01-03 | 5,000,000 | 3.6 | 4.5 | 2.7 |
2018-01-04 | 7,800,000 | 5.6 | 10.0 | 2.6 |
Das Erstellen der Originaldaten entspricht Bis zum letzten Mal. Ich werde tatsächlich sofort ein Modell erstellen, aber es kann auf die gleiche Weise wie Pyflux verwendet werden.
Wir werden auch die Parameteroptimierung mit dem vorherigen durchführen. Als SARIMA nehmen die Parameter (sp, sd, sq) unter Berücksichtigung der Saisonalität zu.
Sie müssen auch die folgenden Parameter einstellen: --enforce_stationarity: Gibt an, ob die Konstanz von AR korrigiert werden soll --enforce_invertibility: Gibt an, ob die MA-Wiederholbarkeit erzwungen werden soll
import pandas as pd
import statsmodels.api as sm
def optimisation_sarima(df, target):
df_optimisations = pd.DataFrame(columns=['p','d','q','sp','sd','sq','aic'])
max_p=4
max_d=4
max_q=4
max_sp=2
max_sd=2
max_sq=2
for p in range(0, max_p):
for d in range(0, max_d):
for q in range(0, max_q):
for sp in range(0, max_sp):
for sd in range(0, max_sd):
for sq in range(0, max_sq):
model = sm.tsa.SARIMAX(
df.kingaku, order=(p,d,q),
seasonal_order=(sp,sd,sq,4),
enforce_stationarity = False,
enforce_invertibility = False
)
x = model.fit()
print("AR:",p, " I:",d, " MA:",q, "SAR:",sp, "SI:",sd, "SMA:",sq," AIC:", x.aic)
tmp = pd.Series([p,d,q,sp,sd,sq,x.aic],index=df_optimisations.columns)
df_optimisations = df_optimisations.append( tmp, ignore_index=True )
return df_optimisations
df_optimisations = optimisation_sarima(df, 'Verkaufszahlen')
df_optimisations[df_optimisations.aic == min(df_optimisations.aic)]
Dadurch wird der Parameter mit dem niedrigsten AIC angezeigt.
p | d | q | sp | sd | sq | aic |
---|---|---|---|---|---|---|
2.0 | 0.0 | 3.0 | 1.0 | 1.0 | 1.0 | 11056.356866 |
Geben Sie diesen Parameter im Modell an und drehen Sie das Modell erneut, um die Bewertung des Modells zu überprüfen.
sarima = sm.tsa.SARIMAX(
df.kingaku, order=(3,0,3),
seasonal_order=(1,1,1,4),
enforce_stationarity = False,
enforce_invertibility = False
).fit()
sarima.summary()
Sie sollten ein ähnliches Ergebnis sehen:
Statespace Model Results
Dep. Variable: kingaku No. Observations: 363
Model: SARIMAX(3, 0, 3)x(1, 1, 1, 4) Log Likelihood -5416.395
Date: Tue, 03 Mar 2020 AIC 10850.790
Time: 11:18:46 BIC 10885.537
Sample: 01-03-2018 HQIC 10864.619
- 12-31-2018
Covariance Type: opg
coef std err z P>|z| [0.025 0.975]
ar.L1 0.7365 0.132 5.583 0.000 0.478 0.995
ar.L2 -0.3535 0.165 -2.145 0.032 -0.677 -0.031
ar.L3 -0.5178 0.132 -3.930 0.000 -0.776 -0.260
ma.L1 -0.4232 0.098 -4.315 0.000 -0.615 -0.231
ma.L2 -0.0282 0.096 -0.295 0.768 -0.216 0.159
ma.L3 0.6885 0.068 10.140 0.000 0.555 0.822
ar.S.L4 0.4449 0.091 4.903 0.000 0.267 0.623
ma.S.L4 -0.7696 0.057 -13.547 0.000 -0.881 -0.658
sigma2 1.489e+12 6.05e-14 2.46e+25 0.000 1.49e+12 1.49e+12
Ljung-Box (Q): 777.09 Jarque-Bera (JB): 44.86
Prob(Q): 0.00 Prob(JB): 0.00
Heteroskedasticity (H): 1.09 Skew: 0.60
Prob(H) (two-sided): 0.63 Kurtosis: 4.27
Warnings:
[1] Covariance matrix calculated using the outer product of gradients (complex-step).
[2] Covariance matrix is singular or near-singular, with condition number 3.14e+41. Standard errors may be unstable.
AIC scheint sich nicht so sehr verändert zu haben. .. .. Schauen wir uns die Grafik an.
#Prognose
ts_pred = sarima.predict()
#Darstellung der tatsächlichen Daten und Vorhersageergebnisse
plt.figure(figsize=(15, 10))
plt.plot(df.kingaku, label='DATA')
plt.plot(ts_pred, label='SARIMA', color='red')
plt.legend(loc='best')
Blau ist die reelle Zahl und Rot ist der Modellwert. Obwohl es möglich geworden ist, den Anstieg und Abfall in normalen Zeiten vorherzusagen, ist es nicht möglich, die extremen Teile wie das Jahresende vorherzusagen. Auch der Jahresbeginn ist zu einer merkwürdigen Zahl geworden.
Ist es ein Gefühl, 3 Schritte zu gehen und 2,5 Schritte hinunter zu gehen? Als nächstes überlegen wir, wie wir es verbessern können. .. ..
Recommended Posts