Jusqu'à la dernière fois, nous avons utilisé le modèle ARIMA et le modèle ARIMAX d'analyse des séries chronologiques pour prévoir les ventes futures.
Cependant, la précision ne s'améliore pas. En supposant que la prise en compte de la saisonnalité ne suffit pas, je voudrais appliquer ensuite le modèle ARIMA = modèle SARIMA, y compris la saisonnalité.
Cependant, il semble que SARIMA ne puisse pas être utilisé avec le PyFlux utilisé jusqu'à la dernière fois, donc "[Prédire la transition du taux de visionnage de TV Asahi avec le modèle SARIMA](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) »sera utilisé comme référence pour utiliser les modèles de statistiques.
Google Colaboratory
Comme auparavant [précédent], les données utilisent les ventes quotidiennes et la température (moyenne, maximum, minimum) comme variables explicatives.
Date | Montant des ventes | Température moyenne | Température la plus élevée | Température la plus basse |
---|---|---|---|---|
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 |
La création des données d'origine est identique à Jusqu'à la dernière fois. Je vais en fait faire un modèle immédiatement, mais il peut être utilisé de la même manière que pyflux.
Nous effectuerons également le réglage des paramètres en utilisant le précédent. Comme SARIMA, les paramètres (sp, sd, sq) tenant compte de la saisonnalité sont en augmentation.
Vous devez également définir les paramètres suivants: --enforce_stationarity: s'il faut corriger la constance de l'AR --enforce_invertibility: s'il faut appliquer la répétabilité MA
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, 'Montant des ventes')
df_optimisations[df_optimisations.aic == min(df_optimisations.aic)]
Cela affichera le paramètre avec l'AIC le plus bas.
p | d | q | sp | sd | sq | aic |
---|---|---|---|---|---|---|
2.0 | 0.0 | 3.0 | 1.0 | 1.0 | 1.0 | 11056.356866 |
Spécifiez le paramètre dans le modèle et faites à nouveau pivoter le modèle pour vérifier l'évaluation du modèle.
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()
Vous devriez voir un résultat similaire au suivant:
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.
L'AIC ne semble pas avoir beaucoup changé. .. .. Regardons le graphique.
#Prévoir
ts_pred = sarima.predict()
#Illustration des données réelles et des résultats de prédiction
plt.figure(figsize=(15, 10))
plt.plot(df.kingaku, label='DATA')
plt.plot(ts_pred, label='SARIMA', color='red')
plt.legend(loc='best')
Le bleu est le nombre réel et le rouge est la valeur du modèle. Bien qu'il soit devenu possible de prédire la hausse et la baisse en temps normal, il n'est pas possible de prédire les parties extrêmes comme la fin de l'année. De plus, le début de l'année est devenu un chiffre étrange.
Est-ce le sentiment de faire 3 pas et de descendre 2,5 marches? Ensuite, nous réfléchissons à la manière de l'améliorer. .. ..
Recommended Posts