[PYTHON] Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models

introduction

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.

Environnement d'analyse

Google Colaboratory

Données cibles

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

Modèle ARIMA (SARIMA) tenant compte de la saisonnalité

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')

image.png

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.

en conclusion

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

Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models
Défi des prévisions de ventes futures: ⑤ Analyse des séries chronologiques par Prophet
Défi pour les prévisions de ventes futures: tun Réglage des paramètres PyFlux
Analyse de séries chronologiques Partie 3 Prévisions
Défi pour les prévisions de ventes futures: ① Qu'est-ce que l'analyse des séries chronologiques?
Python: analyse des séries chronologiques
Analyse des séries chronologiques 1 Principes de base
Une méthode d'étude pour les débutants pour apprendre l'analyse des séries chronologiques
Analyse de séries temporelles par modèle général d'espace d'états gaussien à l'aide de Python [Exemple d'implémentation considérant extrinsèque et saisonnalité]