[PYTHON] Défi des prévisions de ventes futures: ② Analyse des séries chronologiques à l'aide de PyFlux

introduction

La dernière fois, Contestation des prévisions de ventes futures: ① Qu'est-ce que l'analyse de séries chronologiques? a introduit l'analyse des séries chronologiques comme moyen de réaliser des prévisions de ventes futures. Plutôt qu'une introduction, j'ai senti que j'essayais de le résumer avec ma propre interprétation (je ne comprends pas du tout les mathématiques), et pour ceux qui ont une solide compréhension des formules mathématiques, il y a peut-être eu un point où «je ne comprends pas». Hmm. Si vous avez des questions, je vous serais reconnaissant de bien vouloir les signaler.

En passant, cette fois, j'aimerais créer un modèle pour l'analyse des séries chronologiques.

Le modèle est une bibliothèque de vérification du modèle ARIMA et du modèle ARIMAX utilisant PyFlux, qui a été introduite dans Bibliothèque de prédiction de données de séries temporelles - PyFlux--. Aller. (En fait, je voulais faire SARIMA compte tenu de la saisonnalité, mais je ne savais pas comment le faire avec PyFlux, alors j'ai abandonné cette fois)

Environnement d'analyse

Google Colaboratory

Données cibles

Les données sont très simples, utilisant les ventes quotidiennes et la température (moyenne / maximale / la plus basse) 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

1. Création originale des données

Comme d'habitude, téléchargez les données cibles dans BigQuery dans l'environnement Python de Colaboratory. Comme dans l'exemple, les noms d'éléments ne peuvent pas être donnés en japonais, mais pour des raisons de clarté, ils sont utilisés ici.

import pandas as pd

query = """
SELECT * 
FROM `myproject.mydataset.mytable`
WHERE CAST(Date COMME HORAIRE) between CAST("2018-01-01" AS TIMESTAMP) AND CAST("2018-12-31" AS TIMESTAMP) ORDER BY p_date'
"""

df = pd.io.gbq.read_gbq(query, project_id="myproject", dialect="standard")

#Valeurs manquantes à zéro
df.fillna(0, inplace=True)

#Définissez la date sur le type Datetime et définissez-la sur df Index
df = df[1:].set_index('Date')
df.index=pd.to_datetime(df.index, utc=True).tz_convert('Asia/Tokyo')
df.index = df.index.tz_localize(None)
df= df.sort_index()

Il est nécessaire de convertir la date en type Datetime et de l'indexer pour un traitement ultérieur.

Pour une raison quelconque, j'ai utilisé le read_gbq de Pandas, qui était le plus lent lorsque je l'ai vérifié avec J'ai essayé d'utiliser l'API BigQuery Storage. Je vais. Lorsque les données d'origine ne sont pas si lourdes, il est facile d'écrire simplement. .. .. (excuse)

Jetons un coup d'œil aux données de vente pour le moment.

%matplotlib inline
import matplotlib.pyplot as plt

plt.figure()
df["Montant des ventes"].plot(figsize=(12, 8))

ダウンロード.png

Comme il est quotidien, il monte et descend considérablement. Le début du mois de mars et la fin de l'année sont en forte hausse.

2. Construisez le modèle ARIMA

À partir de là, nous effectuerons une analyse de séries chronologiques à l'aide de PyFlux. Cependant, PyFlux n'est pas installé en standard dans Colaboratory, donc installons-le d'abord.

pip install pyflux

La programmation du modèle elle-même est super simple. Les cinq arguments suivants sont transmis à ARIMA.

--ar: Ordre de retour automatique --ma: ordre de la moyenne mobile --integ: plancher de différence --target: variable d'objectif --family: distribution de probabilité

Ensuite, MLE (estimation la plus probable) prédit le modèle.

import pyflux as pf

model = pf.ARIMA(data=df, ar=5, ma=5, integ=1, target='Montant des ventes', family=pf.Normal())
x = model.fit('MLE')

Cependant, je n'ai aucune idée de ce que devraient être les valeurs de ar, ma et integ, donc je dois d'abord la déplacer.

x.summary()

Voici le résumé qui en sort. Si vous utilisez AIC (Akaike Information Amount Standard) ou BIC (Bayes Information Amount Standard) pour évaluer le modèle lui-même, il semble qu'un modèle avec une valeur faible soit bon. L'évaluation de la variable est la valeur P (P>|z|) Dois-je l'utiliser? Constante (valeur fixe) et AR(3)・ Ma(5)Ne semble pas significatif car la valeur P est élevée.

Si l'un des AR / MA n'est pas significatif, cela signifie-t-il que chaque commande doit être réduite de un? Cependant, si l'on dit que la valeur fixe n'est pas significative, est-il difficile d'utiliser ces données pour le modèle ARIMA en premier lieu?

Normal ARIMA(5,1,5)                                                                                       
======================================================= ==================================================
Dependent Variable: Differenced kingaku                 Method: MLE                                       
Start Date: 2018-01-09 03:00:00                         Log Likelihood: -5401.3927                        
End Date: 2019-01-01 03:00:00                           AIC: 10826.7854                                   
Number of observations: 357                             BIC: 10873.3182                                   
==========================================================================================================
Latent Variable                          Estimate   Std Error  z        P>|z|    95% C.I.                 
======================================== ========== ========== ======== ======== =========================
Constant                                 18212.1745 51000.329  0.3571   0.721    (-81748.4703 | 118172.819
AR(1)                                    0.2046     0.0583     3.507    0.0005   (0.0902 | 0.3189)        
AR(2)                                    -0.9284    0.0476     -19.4981 0.0      (-1.0217 | -0.8351)      
AR(3)                                    -0.0762    0.0807     -0.9438  0.3453   (-0.2343 | 0.082)        
AR(4)                                    -0.4864    0.0465     -10.4663 0.0      (-0.5774 | -0.3953)      
AR(5)                                    -0.5857    0.0555     -10.5508 0.0      (-0.6945 | -0.4769)      
MA(1)                                    -0.8716    0.0787     -11.0703 0.0      (-1.0259 | -0.7173)      
MA(2)                                    0.9898     0.0905     10.9326  0.0      (0.8123 | 1.1672)        
MA(3)                                    -0.5321    0.1217     -4.3708  0.0      (-0.7707 | -0.2935)      
MA(4)                                    0.4706     0.0945     4.9784   0.0      (0.2853 | 0.6558)        
MA(5)                                    0.007      0.0725     0.0973   0.9225   (-0.135 | 0.1491)        
Normal Scale                             900768.835                                                       
==========================================================================================================

Statistiquement, cela n'a pas l'air très bien, mais qu'en est-il du graphique?

model.plot_fit(figsize=(15, 10))

ダウンロード (1).png

Le bleu est le nombre réel et le noir est la valeur du modèle. Le moment de la montée et de la descente est similaire, mais il existe de nombreux moments où l'amplitude de la largeur de fluctuation du nombre réel ne peut pas être prédite.

3. Construction du modèle ARIMAX

Ensuite, construisons un modèle ARIMAX qui peut utiliser des variables ARIMA +. Le programme est également super simple ici. Il semble écrire "variable objective ~ 1 + variable explicative" dans l'argument de formule. (C'est un peu peu intuitif)

import pyflux as pf

model = pf.ARIMA(data=df, formula='Montant des ventes~1+Température moyenne+Température la plus élevée+Température la plus basse', ar=5, ma=5, integ=1, target='Montant des ventes', family=pf.Normal())
x = model.fit('MLE')

Puis évaluez le modèle de la même manière qu'ARIMA.

x.summary()

C'est presque la même chose pour AIC et BIC. La variable de température ajoutée en tant que variable explicative a une valeur P de 1,0, ce qui est totalement inutile. .. ..

Normal ARIMAX(5,1,5)                                                                                      
======================================================= ==================================================
Dependent Variable: Differenced kingaku                 Method: MLE                                       
Start Date: 2018-01-09 03:00:00                         Log Likelihood: -5401.6313                        
End Date: 2019-01-01 03:00:00                           AIC: 10829.2627                                   
Number of observations: 357                             BIC: 10879.6732                                   
==========================================================================================================
Latent Variable                          Estimate   Std Error  z        P>|z|    95% C.I.                 
======================================== ========== ========== ======== ======== =========================
AR(1)                                    0.2036     0.0581     3.5023   0.0005   (0.0897 | 0.3175)        
AR(2)                                    -0.9277    0.0475     -19.5352 0.0      (-1.0208 | -0.8346)      
AR(3)                                    -0.0777    0.0804     -0.9658  0.3342   (-0.2353 | 0.08)         
AR(4)                                    -0.4857    0.0463     -10.4841 0.0      (-0.5765 | -0.3949)      
AR(5)                                    -0.5869    0.0552     -10.6292 0.0      (-0.6952 | -0.4787)      
MA(1)                                    -0.8687    0.0775     -11.2101 0.0      (-1.0205 | -0.7168)      
MA(2)                                    0.989      0.0902     10.9702  0.0      (0.8123 | 1.1657)        
MA(3)                                    -0.5284    0.1211     -4.3651  0.0      (-0.7657 | -0.2912)      
MA(4)                                    0.47       0.0942     4.9874   0.0      (0.2853 | 0.6547)        
MA(5)                                    0.0097     0.0715     0.1353   0.8924   (-0.1305 | 0.1499)       
Beta 1                                   0.0        59845.8347 0.0      1.0      (-117297.836 | 117297.836
Beta kion_min                            -0.0       755.0035   -0.0     1.0      (-1479.8069 | 1479.8068) 
Normal Scale                             901399.389                                                       
==========================================================================================================

Enfin, tracez-le. ダウンロード (3).png

model.plot_fit(figsize=(15, 10))

Hmm. Identique au modèle ARIMA.

en conclusion

Le programme d'analyse de séries chronologiques lui-même avec PyFlux était très facile à créer. Cependant, ARIMA et ARIMAX ont tous deux une bonne direction pour monter et descendre, mais la largeur est petite et la précision du modèle ne s'améliore pas. Il est difficile de spécifier le nombre optimal pour chaque paramètre.

Le reste peut être saisonnier. (Je ne pouvais pas l'utiliser avec PyFlux, SARIMA?) De plus, cette fois, la variable explicative utilisant la température n'a pas du tout aidé, il semble donc y avoir place à l'amélioration ici aussi.

Recommended Posts

Défi des prévisions de ventes futures: ② Analyse des séries chronologiques à l'aide de PyFlux
Défi des prévisions de ventes futures: ⑤ Analyse des séries chronologiques par Prophet
Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models
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 RNN_LSTM1
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 des séries chronologiques partie 4 VAR
Analyse de séries chronologiques Partie 1 Autocorrélation
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Illustrez instantanément la période prédominante dans les données de séries chronologiques à l'aide de l'analyse spectrale
Analyse des séries chronologiques 2 Stabilité, modèle ARMA / ARIMA
Comment comparer des données de séries chronologiques - Dérivée DTW, DTW-
J'ai essayé l'analyse de séries chronologiques! (Modèle AR)
Analyse des séries chronologiques Partie 2 AR / MA / ARMA
Analyse des séries chronologiques 4 Construction du modèle SARIMA
matplotlib Ecrire du texte dans un graphique de séries chronologiques
Comment gérer les données de séries chronologiques (mise en œuvre)
Analyse des séries chronologiques n ° 6 Faux retour et partie républicaine
Introduction à l'analyse des séries temporelles ~ Modèle d'ajustement saisonnier ~ Implémenté en R et Python