Le étapes de la méthodologie de Box–Jenkins

Identification du modèle

La première étape de la méthodologie de Box–Jenkins consiste à identifier la structure du modèle ARIMA approprié pour la série étudiée. L’objectif principal est de déterminer les valeurs des paramètres \(p, d, q\) (et éventuellement \(P, D, Q\) pour un modèle saisonnier). On commence par analyser graphiquement la série afin de vérifier si elle est stationnaire, c’est-à-dire si sa moyenne et sa variance restent constantes dans le temps. Si la série présente une tendance ou une variance croissante, on applique une transformation (comme le logarithme) et/ou une différenciation pour la rendre stationnaire. Une fois la stationnarité atteinte, on examine les fonctions d’autocorrélation (ACF) et d’autocorrélation partielle (PACF) afin d’identifier la présence de composantes autorégressives (AR) ou moyennes mobiles (MA). Cette étape est exploratoire et repose fortement sur l’interprétation graphique et théorique.

Estimation des paramètres

Une fois la structure du modèle identifiée, la deuxième étape consiste à estimer les paramètres du modèle choisi. Cela signifie calculer les coefficients associés aux termes autorégressifs et/ou de moyenne mobile. Cette estimation se fait généralement par la méthode du maximum de vraisemblance ou par la méthode des moindres carrés. L’objectif est d’obtenir des estimations précises et statistiquement significatives des paramètres. À cette étape, on vérifie également des critères d’information comme l’AIC (Akaike Information Criterion) ou le BIC (Bayesian Information Criterion), qui permettent de comparer plusieurs modèles et de choisir celui qui offre le meilleur compromis entre qualité d’ajustement et complexité.

Diagnostic du modèle

Après l’estimation, il est essentiel de vérifier si le modèle est adéquat. Cette troisième étape consiste à analyser les résidus du modèle, c’est-à-dire les erreurs entre les valeurs observées et les valeurs ajustées. Un modèle ARIMA est considéré comme approprié si ses résidus se comportent comme un bruit blanc, c’est-à-dire une suite de variables aléatoires indépendantes, de moyenne nulle et de variance constante. On examine alors l’ACF des résidus et on applique des tests statistiques comme le test de Ljung–Box pour vérifier l’absence d’autocorrélation. Si les résidus présentent encore une structure ou une autocorrélation significative, cela signifie que le modèle est mal spécifié et qu’il faut revenir à l’étape d’identification pour ajuster la structure du modèle.

Prévision

La dernière étape de la méthodologie de Box–Jenkins consiste à utiliser le modèle validé pour effectuer des prévisions futures. Une fois que le modèle est jugé satisfaisant et que les résidus se comportent comme un bruit blanc, il peut être utilisé pour prédire les valeurs futures de la série. Les prévisions sont accompagnées d’intervalles de confiance, qui tiennent compte de l’incertitude croissante à mesure que l’horizon de prévision s’éloigne dans le temps.

Nous allons maintenant faire une prévision de passagers aériens entre 1961-1962 en utilisant la méthodologie de Box-Jenkins.

Aperçu de la base AirPassengers

La base AirPassengers est une série temporelle intégrée par défaut dans R.

Elle contient :

  • Le nombre mensuel de passagers aériens internationaux;

  • De janvier 1949 à décembre 1960;

  • Unité : milliers de passagers

Chargement des packages nécessaires

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(astsa)
## Warning: package 'astsa' was built under R version 4.5.3
library(forecast)
## 
## Attaching package: 'forecast'
## The following object is masked from 'package:astsa':
## 
##     gas

Chargement et visualisation des données

# Chargement de la base
data("AirPassengers")
start(AirPassengers)
## [1] 1949    1
end(AirPassengers)  # Les caractéristiques de la série
## [1] 1960   12
frequency(AirPassengers)
## [1] 12
# Voir les premières valeurs
head(AirPassengers, 12)
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 121 135 148 148 136 119 104 118
summary(AirPassengers, 12) # Résumé
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   104.0   180.0   265.5   280.3   360.5   622.0

Visualisation de la série

autoplot(AirPassengers, 
     main=" Nombre de passagers aeriens 1949-1960",
     ylab="Passagers (milliers)",
     xlab="Temps",
     col="red")

decomp <- decompose(AirPassengers)
plot(decomp, col="red") # Décomposition de la série

La décomposition d’une série temporelle permet d’identifier ses composantes principales : la tendance, la saisonnalité et le bruit afin de mieux comprendre la structure avant la modélisation.

L’analyse graphique montre que notre série presente une tendance croissante, une forte saisonnalité (période = 12) et une variance croissante. Ce qui nous permet de conclure que notre série n’est pas stationnaire.

Transformation pour stabiliser la variance

Comme la variance augmente avec le temps, on applique un logarithme.

log_AP <- log(AirPassengers)
plot(log_AP, main="Log of AirPassengers",
col="red")

D’apres le graphique ci-dessus, la variance semble plus stable

acf(AirPassengers, col="red")

pacf(AirPassengers, col="red")

Ce graphique (acf) montre que les autocorrélations sont élevées et diminuent très lentement, ce qui indique une forte dépendance entre les valeurs passées et présentes de la serie. Comme plusieurs barres dépassent les bandes de confiance (pointillés en bleu), la série n’est pas stationnaire et doit etre différenciée.

Différenciation

diff1 <- diff(log_AP, differences = 1)
plot(diff1, main="Premiere Difference", col="red")

Le graphique montre que la tendance a disparu après la première différence.

Différence saisonnière (période 12)

diff_season <- diff(diff1, lag=12)
plot(diff_season, main="Difference saisonniere", col="red")

Après l’analyse des graphiques (tendance et saisonnalité), la série semble stationnaire.

Vérification de stationnarité

acf(diff_season, col="red")

pacf(diff_season, col="red")

La différenciation a permis d’enlever l’autocorrélation de la série. Donc, la série est stationnaire.

Test ADF

Le test de Dickey–Fuller augmenté (ADF) est un test statistique utilisé pour vérifier si une série temporelle est stationnaire ou si elle possède une racine unitaire. Il s’agit d’une extension du test de Dickey–Fuller simple, qui ajoute des retards supplémentaires des différences de la variable afin de corriger l’autocorrélation des erreurs. Le test repose sur les hypothèses suivantes : l’hypothèse nulle \(H_0\) stipule que la série possède une racine unitaire, donc qu’elle est non stationnaire, tandis que l’hypothèse alternative \(H_1\) affirme que la série est stationnaire. Si la statistique du test est suffisamment négative et que la p-value est inférieure au seuil de signification (par exemple 5 %), on rejette \(H_0\) et on conclut que la série est stationnaire.

library(tseries)
adf.test(diff_season)
## Warning in adf.test(diff_season): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff_season
## Dickey-Fuller = -5.1993, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary

Conclusion: La série est stationnaire car la p-value = 0.01 est inférieure à 5%.

Estimation du modèle

model <- arima(log_AP, 
               order=c(0,1,1),
               seasonal=list(order=c(0,1,1), period=12))

summary(model)
## 
## Call:
## arima(x = log_AP, order = c(0, 1, 1), seasonal = list(order = c(0, 1, 1), period = 12))
## 
## Coefficients:
##           ma1     sma1
##       -0.4018  -0.5569
## s.e.   0.0896   0.0731
## 
## sigma^2 estimated as 0.001348:  log likelihood = 244.7,  aic = -483.4
## 
## Training set error measures:
##                        ME       RMSE        MAE        MPE      MAPE      MASE
## Training set 0.0005730622 0.03504883 0.02626034 0.01098898 0.4752815 0.2169522
##                    ACF1
## Training set 0.01443892

Diagnostic du modèle

On vérifie que les résidus sont du bruit blanc.

autoplot(residuals(model)) + ggtitle("Residus du modele ARIMA") + ylab("Residus") + xlab("Temps") + theme_minimal(base_size = 9) + geom_hline(yintercept = 0, linetype = "dashed", col = "red")

ACF des residus

ggAcf(residuals(model), lag.max = 20) + ggtitle("ACF des residus") + theme_minimal(base_size = 9)

checkresiduals(model)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,1,1)(0,1,1)[12]
## Q* = 26.446, df = 22, p-value = 0.233
## 
## Model df: 2.   Total lags used: 24

La p-value = 0.233 est supérieure à 5 %, les résidus du modèle sont du bruit blanc.

Prévision

forecast_model <- forecast(model, h=24)

plot(forecast_model, main = "Previsions sur 24 mois", ylab ="Passagers aeriens", xlab = "Annee", type = 'o', col = "red")

Comme on a utilisé log :

exp(forecast_model$mean)
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1961 450.4224 425.7172 479.0068 492.4045 509.0550 583.3449 670.0108 667.0776
## 1962 495.9301 468.7289 527.4025 542.1538 560.4865 642.2823 737.7043 734.4748
##           Sep      Oct      Nov      Dec
## 1961 558.1894 497.2078 429.8720 477.2426
## 1962 614.5852 547.4424 473.3034 525.4600