[PYTHON] Défi des prévisions de ventes futures: ⑤ Analyse des séries chronologiques par Prophet

introduction

Jusqu'à la dernière fois, nous avons prévu les ventes futures à l'aide du modèle ARIMA d'analyse des séries chronologiques. Je prévois de faire divers efforts, mais les paramètres qui peuvent être ajustés sont limités et la précision ne s'améliore pas.

Par conséquent, j'aimerais apprendre de la tendance actuelle du Deep Learning au lieu du modèle ARIMA. Cependant, il est difficile de repartir de zéro soudainement, donc cette fois j'aimerais utiliser Prophet, une bibliothèque d'analyse de séries chronologiques publiée par Facebook, qui est souvent utilisée pour "parler d'analyse de séries chronologiques".

Je programmais en regardant les sites suivants, mais cela n'a pas fonctionné comme je m'y attendais à certains endroits. La version de la bibliothèque a-t-elle été modifiée?

Ou plutôt, Prophet est sorti en 2017. J'ai vécu sans le savoir. .. ..

Environnement analytique

Google Colaboratory

Données cibles

Comme pour [Dernière fois], 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

1. Création originale des données

Le processus d'extraction de données de BigQuery vers Pandas est le même qu'auparavant. Cependant, puisque je prédis le futur, je fais les 2 dernières années (df) et le futur 1 mois (df_future).

Vous devez également convertir l'élément de date en type datetime64 après cela. De plus, la date doit être remplacée par ds et la valeur prévue (ici le montant des ventes) doit être remplacée par le nom de variable y.

import pandas as pd

query = """
SELECT * 
FROM `myproject.mydataset.mytable`
WHERE CAST(Date COMME HORAIRE) between CAST("{from_day}" AS TIMESTAMP) AND CAST("{to_day}" AS TIMESTAMP) ORDER BY p_date'
"""

df = pd.io.gbq.read_gbq(query.format(from_day="2017-01-01",to_day="2018-12-31"), project_id="myproject", dialect="standard")
df_future = pd.io.gbq.read_gbq(query.format(from_day="2019-01-01",to_day="2019-01-31"), project_id="myproject", dialect="standard")

from datetime import datetime

#Convertir les éléments de date en type datetime64
def strptime_with_offset(string, format='%Y-%m-%d'):
  base_dt = datetime.strptime(string, format)
  return base_dt

df['Date'] = df['Date'].apply(strptime_with_offset)

df.rename(columns={'Montant des ventes': 'y','Date': 'ds'}, inplace=True)

2. Apprentissage de modèles

Appelez Prophet et ajoutez diverses choses au modèle.

from fbprophet import Prophet

#Le modèle est non linéaire
model = Prophet(growth='logistic', daily_seasonality=False)

#Vous pouvez spécifier un pays pour ajouter des jours fériés
model.add_country_holidays(country_name="JP")

#Ajoutez de la saisonnalité avec des éléments mensuels
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)

#Variables à ajouter à la prévision
features_list =["Température moyenne","Température la plus élevée","Température la plus basse"]

for f in features_list:
  model.add_regressor(f)

#En cas de non-linéarité, CAP est essentiel, alors entrez la valeur limite supérieure.
df['cap']=15000000 

model.fit(df)

Cela entraînera le modèle. Vous pouvez facilement ajouter des éléments, etc., il semble donc bon d'apprendre tout en ajoutant et en soustrayant divers éléments.

Appliquez ensuite le modèle résultant aux données futures.

#Jusqu'où prévoyez-vous? Spécifiez 30 jours ici
future = model.make_future_dataframe(periods=30, freq='D')
future["cap"]=15000000

#Df car nous avons besoin de variables à ajouter aux prévisions telles que la température_Prédire après la fusion avec le futur
future=pd.merge(future, df_future, on="ds")
df_forecast = model.predict(future)

Le résultat de la prédiction est maintenant stocké dans df_forecast. En regardant le contenu, il semble qu'il soit entré avec une valeur de yhat. De plus, il est prédit par la largeur de yhat_lower et yhat_upper. En outre, diverses tendances et les effets de la saisonnalité et de la température sont analysés.

3. Visualisez les résultats de prédiction

Représentons graphiquement les résultats de l'analyse d'une manière facile à comprendre. Vous pouvez comparer les prévisions de ventes et les résultats réels du mois dernier.

from matplotlib import pyplot as plt
% matplotlib inline

df_output=pd.merge(df_forecast, df_future, on="ds")

#Pour une raison quelconque, dans la version actuelle, une erreur s'est produite sans les éléments suivants
pd.plotting.register_matplotlib_converters()

df_output.plot(figsize=(18, 12), x="ds", y=["yhat","y"])

image.png

La prévision (yhat) est légèrement plus élevée, mais il semble que la prévision future montre une assez bonne tendance à la hausse et à la baisse.

Vous pouvez également extraire et voir la tendance et la périodicité.

model.plot_components(df_forecast)
plt.show()

image.png

――Les vacances sont une journée pour adultes, n'est-ce pas? C'est perçant. ―― En hebdomadaire, les week-ends les samedis et dimanches sont encore chers. ―― Le mois est spongieux. Cela signifie-t-il que la fin du mois et le début du mois sont élevés?

en conclusion

Ce n'était pas simple, comme les noms des éléments étant ds et y, et les programmes des pionniers à certains endroits provoquant des erreurs, mais une fois terminé, c'était très simple à déplacer.

La formule n'est pas incluse dans le programme, mais lorsque l'on compare y et yhat, l'erreur mensuelle est d'environ 10%, donc je pense qu'elle peut être utilisée suffisamment.

Cette fois, le montant des ventes de l'ensemble du magasin a été utilisé, mais à l'avenir, j'aimerais trouver quelque chose avec plus de précision, comme le nombre de visiteurs et le montant des ventes d'une catégorie spécifique.

Recommended Posts

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 à l'aide de PyFlux
Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models
Analyse des séries chronologiques
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
Prédiction de séries chronologiques facile avec Prophet
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Analyse des séries chronologiques 2 Stabilité, modèle ARMA / ARIMA
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
Prédire l'avenir des tendances démographiques dans la ville de Numazu par analyse de régression chronologique à l'aide de Prophet