[PYTHON] Comparaison de la prédiction des données de séries chronologiques entre le modèle SARIMA et le modèle Prophet

Bonjour. Recherche future Je suis Sugato du Brésil.

Je ne sais pas quel nombre brasser aujourd'hui, mais j'aimerais écrire sur la prévision des données chronologiques.

1.Tout d'abord

Il y a une image selon laquelle la prédiction des données de séries chronologiques n'est fondamentalement pas aussi utilisable, mais j'aimerais voir combien c'est et si elle peut être utilisée dans la pratique.

Les détails que j'ai essayés sont les suivants

** Obtenez des abonnés quotidiens sur Twitter ** ~~ Cet astringent ~~ Faites de votre mieux avec l'API

** Essayez de prédire le nombre d'abonnés sur votre Twitter ** (1) Prédite par le modèle SARIMA ・ [Combinaison du modèle de réseau neuronal avec le modèle ARIMA de séries chronologiques saisonnières] https://www.sciencedirect.com/science/article/pii/S004016250000113X ・ [Analyse des données de séries temporelles avec SARIMA (prédiction du nombre PV)] https://www.kumilog.net/entry/sarima-pv @xkumiyu

(2) Prédite par le modèle du Prophète ・ [Officiel du Prophète] https://facebook.github.io/prophet/docs/quick_start.html ・ [Bibliothèque d'analyse de séries temporelles Traduction du document officiel Prophet 1 (présentation et fonctionnalités)] https://qiita.com/japanesebonobo/items/96868e58d4da42d36807 @japanesebonobo

Contenu de cette époque

Prédire le nombre de followers, qui diminue de jour en jour sans tweeter, rend mon cœur encore plus profond. Pour conclure d'abord, le nombre d'adeptes diminuera, et il n'y a aucune perspective d'augmentation.

2. Environnement

3. Préparation

Les données quotidiennes du nombre d'abonnés ressemblent à ceci. Je ne supporte pas de le voir. (Https://twitter.com/Ndtn_/) http://web.sfc.wide.ad.jp/~nadechin/follower.csv

date        follower
2018/9/6	39.569
2018/9/7	39.57
2018/9/8	39.573
   .           .
   .           .
   .           .
2019/12/10	37.861

4. Traitement des données de séries chronologiques

Séparez les données d'entraînement et les données de test. Peu importe que ce soit des pandas ou des engourdis, mais pour le moment ・ 2018/09/06 ~ 2019/12/10 Données originales ・ 2018/09/06 ~ 2019/11/30 données d'apprentissage ・ Données de test du 01/12/2019 au 10/12/2019

Confirmer la stabilité des données par le test ADF. ・ [Statsmodels.tsa.stattools.adfuller] http://www.statsmodels.org/dev/generated/statsmodels.tsa.stattools.adfuller.html ・ [Hypothèse nulle, niveau de signification] http://www.gen-info.osaka-u.ac.jp/MEPHAS/express/express11.html

res = sm.tsa.stattools.adfuller(df.follower)


Le résultat de sortie est le suivant

p-value = 0.9774


⇨p-value  >  0.05

Par conséquent, on ne peut pas dire qu'il a de la stabilité. Afin d'avoir la constance, la différence est prise et la saisonnalité est supprimée.

predict.py


data = [Scatter(x=df.index, y=df.follower.diff())]

Puis enlèvement saisonnier.

predict.py


data = [Scatter(x=df.index, y=df.follower-res.seasonal)]

Cela effectuera à nouveau le test ADF.

p-value = 1.109e-25


⇨p-value  <  0.05

En conséquence, nous avons pu traiter les données chronologiques avec régularité.

5. Prévision des données de séries chronologiques

Dans le cas du modèle SARIMA, créer un modèle de chaque donnée

predict.py


# coding:utf-8
from statsmodels.tsa.statespace.sarimax import SARIMAX

model = SARIMAX(
    train,
    order=(p, d, q),
    seasonal_order=(sa, sd, sq, s),
    enforce_stationarity=False,
    enforce_invertibility=False)
result = model.fit()

Faites-le avec. order = (p, d, q) est un paramètre du modèle ARIMA season_order = (sp, sd, sq, s) est un paramètre saisonnier

Voir ↓ ・ [Statsmodels.tsa.statespace.sarimax.SARIMAX] https://www.statsmodels.org/dev/generated/statsmodels.tsa.statespace.sarimax.SARIMAX.html ・ [Analyse des données de séries temporelles avec SARIMA (prédiction du nombre PV)] https://www.kumilog.net/entry/sarima-pv @xkumiyu

Ensuite, créez un modèle Prophet.

Prophet construira un modèle simplement en saisissant les données d'entraînement. Il se rend compte "Je ne sais pas ce que je fais, mais j'ai fait quelque chose qui semble prévisible." À partir d'aujourd'hui, je peux devenir data scientist avec un copier-coller de 2 secondes.

predict.py


# coding:utf-8
import pandad as pd
import numpy as np
from fbprophet import Prophet

data = pd.read_csv('follower.csv')
data.follower= data.follower.apply(lambda x: int(x.replace(',', '')))
#Le nom de la colonne est'ds','y'Doit être défini sur
data = data.rename(columns={'date': 'ds', 'follower': 'y'})
model = Prophet()
model.fit(data)

6. Prédiction des données de séries chronologiques

・ Modèle SARIMA

Prédiction des données de test appliquées au modèle SARIMA

2019-12-01  38002.878685
2019-12-02  38001.204647
2019-12-03  37998.080676
2019-12-04  37988.324131
2019-12-05  37981.134367
2019-12-06  37974.569498
2019-12-07  37966.333432
2019-12-08  37958.270232
2019-12-09  37956.258566
2019-12-10  37952.875398

・ Modèle de prophète

Prédiction des données de test appliquées au modèle Prophet

2019-12-01  37958.337506
2019-12-02  37959.963661
2019-12-03  37957.304699
2019-12-04  37943.272430
2019-12-05  37934.533210
2019-12-06  37920.537811
2019-12-07  37908.529618
2019-12-08  37905.819057
2019-12-09  37907.445213
2019-12-10  37904.786251

Je suis seul alors je vais essayer de comploter

[Vue d'ensemble] Figure_11.png

[Partie prédiction] Figure_12.png

[Vue partielle agrandie attendue] Figure_13.png

7. Ce que j'ai trouvé

Examinons les données de prévision pour le lendemain du dernier jour des données d'entraînement.

date, follower

#Données réelles
2019-12-01, 38003.000000

# SARIMA
2019-12-01, 38002.878685

# Prophet
2019-12-01, 37958.337506

Comme vous pouvez le voir dans la [Vue agrandie de la partie prédite], les prédictions pour le jour suivant des données d'entraînement sont presque les mêmes dans les données SARIMA. La prédiction de la prochaine fois des données d'apprentissage semble convenir.

Le Prophète était honnêtement subtil.

7. Faisons une prédiction intensive d'une journée

Je pensais que cela fonctionnerait de façon inattendue si j'apprenais jusqu'au 09/12/2019 et que je mettais la valeur prévue du 10/12/2019, alors je vais l'essayer.

Résultats ci-dessous Figure_15.png

date, follower

#Données réelles
2019-12-10, 37861.000000

# SARIMA
2019-12-10  37868.158032

Ça fait du bien. Après tout, s'il s'agit d'une prédiction pour un seul jour, il semble qu'une précision relativement bonne d'un niveau pratique en ressortira.

Comme je le dis à plusieurs reprises, Prophet était honnêtement subtil.

Résumé

Prophet est pratique, mais il manque de praticité. Avec le modèle SARIMA, j'ai senti que la prédiction des données chronologiques ne pouvait pas être utilisée en un jour. Je voulais comparer un peu plus de modèles à la fois. À la prochaine.

De plus, le nombre d'abonnés diminuera.

Recommended Posts

Comparaison de la prédiction des données de séries chronologiques entre le modèle SARIMA et le modèle Prophet
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
À propos des données de séries chronologiques et du surentraînement
Différenciation des données de séries chronologiques (discrètes)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Analyse des séries chronologiques 4 Construction du modèle SARIMA
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données
Puissance des méthodes de prédiction dans l'analyse de données chronologiques Semi-optimisation (SARIMA) [Memo]
Acquisition de données chronologiques (quotidiennes) des cours des actions
[Python] Mémo de conversion entre les données temporelles et les données numériques
Voir les détails des données de séries chronologiques dans Remotte
Détection d'anomalies des données de séries chronologiques par LSTM (Keras)
[Dernière méthode] Visualisation des données de séries chronologiques et extraction de modèles fréquents à l'aide du profil Pan-Matrix
"Analyse des séries chronologiques de mesure des données économiques et financières" Résolution du problème de fin de chapitre avec Python
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
Une histoire de regroupement de données de séries chronologiques d'échange
[Python] Tracer des données de séries chronologiques
Comparaison d'Apex et de Lamvery
Lors du traçage des données de séries chronologiques et de l'obtention d'une erreur de débordement matplotlib
Résumé des différences entre Python et PHP (tableau de comparaison des principaux éléments)
Calcul de la fidélité des clients dans les séries chronologiques
MVT-Relation entre le modèle et le module de Django
Prédiction de séries chronologiques facile avec Prophet
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Différence entre la série python2 et la série python3 dict.keys ()
Comparaison de vitesse entre CPython et PyPy
[Pour les débutants] Script dans les 10 lignes (5. Rééchantillonnage des données de séries chronologiques à l'aide de pandas)
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
[Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh