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. .. ..
Google Colaboratory
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 |
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)
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.
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"])
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()
――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?
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