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)
Google Colaboratory
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 |
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))
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.
À 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))
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.
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.
model.plot_fit(figsize=(15, 10))
Hmm. Identique au modèle ARIMA.
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