Modèle Exponentiel Lissé (ETS)
Le modèle Exponentiel Lissé (ETS) est une famille de modèles de séries temporelles qui utilise des moyennes mobiles exponentiellement pondérées pour lisser les données et effectuer des prévisions. Ce modèle est particulièrement utile pour les séries temporelles qui montrent des tendances ou des saisons. Il comprend des variations basées sur trois principaux composants :
-
Composant de niveau (Level) : Il capture la valeur de base ou le niveau de la série temporelle.
-
Composant de tendance (Trend) : Il modélise la direction ou la pente de la série temporelle (croissante ou décroissante).
-
Composant saisonnier (Seasonality) : Il modélise les effets saisonniers ou cycliques présents dans la série temporelle.
Types de modèles ETS
Le modèle ETS est basé sur les combinaisons de trois types de comportements :
-
Additif : Lorsque l’impact de la tendance ou de la saisonnalité est constant au fil du temps.
-
Modèle additif :
-
-
Multiplicatif : Lorsque l’impact de la tendance ou de la saisonnalité varie avec le niveau de la série.
-
Modèle multiplicatif :
-
Composants du modèle ETS
1. Niveau (Level)
Le niveau représente la valeur moyenne de la série à un instant donné. Il est mis à jour par un lissage exponentiel.
2. Tendance (Trend)
Le modèle de tendance peut être linéaire ou exponentiel et capture la croissance ou la décroissance de la série.
3. Saison (Seasonality)
Le composant saisonnier capture les effets de la saisonnalité dans les données, comme les pics et les creux réguliers dans le temps.
Formulation mathématique du modèle ETS
1. Modèle Additif
Pour une série temporelle
, le modèle additif est donné par :
2. Modèle Multiplicatif
Le modèle multiplicatif est donné par :
Les paramètres de lissage pour chaque composant sont donnés par des équations de mise à jour exponentielle, permettant d’ajuster les valeurs au fil du temps.
Méthode de lissage exponentiel
L’objectif du lissage exponentiel est d’attribuer un poids décroissant aux observations les plus anciennes. La mise à jour des niveaux, tendances et saisonnalités est effectuée à chaque nouveau point de données en utilisant un facteur de lissage (
,
,
).
-
Lissage du niveau :
-
Lissage de la tendance :
-
Lissage de la saisonnalité :
Où :
-
: facteur de lissage pour le niveau (entre 0 et 1)
-
: facteur de lissage pour la tendance (entre 0 et 1)
-
: facteur de lissage pour la saisonnalité (entre 0 et 1)
-
: nombre de périodes dans une saison
Fonctions :
-
ExponentialSmoothing()
La fonction ExponentialSmoothing() de statsmodels permet d'ajuster un modèle de lissage exponentiel à une série temporelle. Ce modèle est particulièrement utile pour les séries temporelles qui présentent des tendances, des saisonnalités, ou les deux. Le lissage exponentiel donne plus de poids aux observations récentes, ce qui permet de mieux prédire les valeurs futures.
Importation :
from statsmodels.tsa.holtwinters import ExponentialSmoothing
Attributs :
Nom Type Description trend str, optionnel Spécifie la composante de tendance à utiliser dans le modèle. Les options sont 'add' (tendance additive), 'mul' (tendance multiplicative), ou None (pas de tendance). seasonal str, optionnel Indique la composante saisonnière à utiliser. Les options sont 'add' (saisonnalité additive), 'mul' (saisonnalité multiplicative), ou None (pas de saisonnalité). seasonal_periods int, optionnel Le nombre de périodes dans une saison. Par exemple, 12 pour une saisonnalité mensuelle (annuelle) ou 4 pour une saisonnalité trimestrielle. exogenous array-like, optionnel Variables exogènes à inclure dans le modèle. Si présentes, elles seront utilisées comme facteurs influençant les prévisions. initialization_method str, optionnel La méthode d'initialisation des paramètres. Les options sont 'estimated' (paramètres estimés) ou 'legacy-heuristic' (méthode heuristique classique). Exemple de code :
from statsmodels.tsa.holtwinters import ExponentialSmoothing import pandas as pd import numpy as np import matplotlib.pyplot as plt # Création d'une série temporelle d'exemple avec une tendance et une saisonnalité np.random.seed(0) dates = pd.date_range('2020-01-01', periods=100, freq='D') data = 10 + np.sin(np.linspace(0, 20, 100)) + 0.5 * np.random.normal(size=100) # Série avec une tendance et une saisonnalité # Création d'une DataFrame series = pd.Series(data, index=dates) # Définir le modèle de lissage exponentiel avec tendance additive et saisonnalité additive sur une période de 12 model = ExponentialSmoothing(series, trend='add', seasonal='add', seasonal_periods=12) # Ajuster le modèle fitted_model = model.fit() # Affichage des résultats du modèle print(fitted_model.summary()) # Prédictions avec le modèle de lissage exponentiel forecast = fitted_model.forecast(steps=10) # Prédire les 10 prochaines valeurs # Affichage de la série temporelle et des prévisions plt.plot(series, label='Données historiques') plt.plot(pd.date_range('2020-04-10', periods=10, freq='D'), forecast, label='Prévisions', color='red') plt.legend() plt.show()
Explication du code :
Les bibliothèques nécessaires sont importées :
- ExponentialSmoothing de statsmodels.tsa.holtwinters permet de modéliser des séries temporelles en utilisant le lissage exponentiel, avec des options pour inclure une tendance et une saisonnalité.
- pandas pour la gestion des données sous forme de DataFrame.
- numpy pour les calculs mathématiques et la génération de données aléatoires.
- matplotlib.pyplot pour créer des visualisations graphiques.
Création d'une série temporelle d'exemple avec une tendance et une saisonnalité
Une graine aléatoire est fixée pour garantir la reproductibilité des résultats. Une série de 100 dates est générée à partir du 1er janvier 2020 avec une fréquence journalière. Les données sont créées en ajoutant une composante sinusoidale (pour la saisonnalité) et un bruit aléatoire à une valeur constante (pour la tendance).
Création d'une DataFrame
Les données générées sont converties en un objet pandas.Series, avec les dates comme index pour former une série temporelle.
Définir le modèle de lissage exponentiel
Un modèle de lissage exponentiel est défini en choisissant les options suivantes :
- trend='add' : une tendance additive est utilisée, ce qui signifie que la tendance est ajoutée à la série.
- seasonal='add' : une composante saisonnière additive est utilisée.
- seasonal_periods=12 : la saisonnalité est considérée sur une période de 12 unités (par exemple, 12 mois ou 12 jours).
Ajuster le modèle
Le modèle de lissage exponentiel est ensuite ajusté à la série temporelle à l'aide de la méthode fit().
Affichage des résultats du modèle
Une fois le modèle ajusté, un résumé des résultats est affiché avec la méthode summary(), contenant des informations détaillées sur les paramètres du modèle, leur significativité, ainsi que les performances du modèle.
Prédictions avec le modèle de lissage exponentiel
Le modèle ajusté est utilisé pour prédire les 10 prochaines valeurs de la série temporelle à l'aide de la méthode forecast().
Affichage de la série temporelle et des prévisions
Un graphique est tracé pour afficher à la fois les données historiques et les prévisions obtenues avec le modèle de lissage exponentiel. La série historique est représentée en bleu, tandis que les prévisions sont tracées en rouge.