Chargement de Libraries usuelles et installation.
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.4 v purrr 0.3.4
## v tibble 3.1.2 v dplyr 1.0.6
## v tidyr 1.1.3 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
#1 Analyse transverse et transformation des données
#1.1 Import des donnes et Data quality
Chargement des données des passagers de la SNCF de 1963 à 1980.
sncf=read.table("http://freakonometrics.free.fr/sncf.csv",header=TRUE,sep=";")
On regarde les données
View(sncf)
summary(sncf)
## ANNEE JANVIER FEVRIER MARS AVRIL
## Min. :1963 Min. :1670 Min. :1560 Min. :1770 Min. :1990
## 1st Qu.:1967 1st Qu.:1816 1st Qu.:1678 1st Qu.:1865 1st Qu.:2151
## Median :1972 Median :2044 Median :1942 Median :2136 Median :2470
## Mean :1972 Mean :2195 Mean :2101 Mean :2309 Mean :2555
## 3rd Qu.:1976 3rd Qu.:2620 3rd Qu.:2546 3rd Qu.:2746 3rd Qu.:2894
## Max. :1980 Max. :3313 Max. :2913 Max. :3306 Max. :3333
## MAI JUIN JUILLET AOUT SEPTEMBRE
## Min. :1910 Min. :2175 Min. :2581 Min. :2639 Min. :1932
## 1st Qu.:2111 1st Qu.:2486 1st Qu.:2939 1st Qu.:2762 1st Qu.:2143
## Median :2272 Median :2703 Median :3165 Median :2880 Median :2228
## Mean :2489 Mean :2888 Mean :3249 Mean :2928 Mean :2426
## 3rd Qu.:2931 3rd Qu.:3394 3rd Qu.:3636 3rd Qu.:3084 3rd Qu.:2820
## Max. :3391 Max. :3682 Max. :3937 Max. :3284 Max. :3206
## OCTOBRE NOVEMBRE DECEMBRE
## Min. :1850 Min. :1630 Min. :2270
## 1st Qu.:1937 1st Qu.:1774 1st Qu.:2445
## Median :2144 Median :1994 Median :2638
## Mean :2359 Mean :2205 Mean :2861
## 3rd Qu.:2790 3rd Qu.:2677 3rd Qu.:3297
## Max. :3269 Max. :3181 Max. :4008
Pas de données maquantes ni incoherente nous allons confirmer cela avec les graphes.
Transformation en serie temporelle
train=as.vector(t(as.matrix(sncf[,2:13])))
ts_train=ts(train,start = c(1963, 1), frequency = 12)
Voici des informations usuelle concernant la série.
ts_info(ts_train)
## The ts_train series is a ts object with 1 variable and 216 observations
## Frequency: 12
## Start time: 1963 1
## End time: 1980 12
1.2 Graphiques usuels
Le nombre de passager augmente durant les vacances scolaires.
Observons le Lag plot pour voir l’influence du passé sur la série.
On observe un Lag de 12 mois.
Regardons ce Lag au fil des 3 premieres années.
La série semble avoir à la fois une tendance et une composante saisonnière. Confirmons cela avec un autre graphique.
1.3 Determination du type de Serie
Etude du cycle de la série.
On voit bien que les périodes de vacances scolaires sont les mois ou la fréquentation est le plus élevés.
La série est elle Additive ou Multiplicative ?
Tout d’abord reprenons le graphe.
L’amplitude de la composante saisonnière augmente au fil des années, si la série était additive cette composante serait stationnaire (indépendamment de l’effet de la tendance) La série est donc Multiplicative.
Décomposons la série
Etudions la saisonalité de la série.
Nous pouvons tester la stationnarité de la serie avec un test de Augmented Dickey-Fuller .
adf.test(ts_train, alternative ="stationary", k=12)
##
## Augmented Dickey-Fuller Test
##
## data: ts_train
## Dickey-Fuller = -1.3766, Lag order = 12, p-value = 0.8375
## alternative hypothesis: stationary
Etant donnée la p-valeur nous pouvons conclure à la non stationnarité de la série.
Observons la saisonalité à l’aide de graphiques.
Ces graphiques mettent en évidence la saisonalité de la série.
Etude de la variance et de la moyenne.
Pour cela nous appliquons un test de Box-Pierce.
Box.test(ts_train,lag=20,type="Box-Pierce")
##
## Box-Pierce test
##
## data: ts_train
## X-squared = 1089.9, df = 20, p-value < 2.2e-16
La probabilité que la série soit un bruit blanc est évidement nulle Cela conforte notre analyse graphique que l’espérance et la variance sont non constante On peut également utiliser un graphique.
## integer(0)
Grace au graphique on voit que la variance et la moyenne augmentent également, elles ne sont donc pas stationnaires (comme vu précédemment). #Ainsi afin d’étudier notre série nous devons transformer la série afin de rendre la variance et la moyenne constante.
2 Modélisation
2.1 Analyse des Corrélations
On affiche le graphique ACF pour rechercher le coéfficient AR
acf(diff(diff(log(ts_train),lag=12,difference=1),lag=1,difference=1))
Ainsi en appliquant le critere vu en cours on choisit p=1.
On affiche le graphique PACF pour rechercher le coéfficient MA
pacf(diff(diff(log(ts_train),lag=12,difference=1),lag=1,difference=1))
Ainsi en appliquant le critere vu en cours on choisit q=1.
2.2 Choix du Modèle Manuellement
md1=arima(diff(diff(log(ts_train),lag=1,difference=1),lag=1,difference=1),order=c(1,0,1))
t_stat(md1)
## ar1 ma1 intercept
## t.stat -2.424902 -85.62507 0.064286
## p.val 0.015312 0.00000 0.948743
Les valeurs des test ne confirme qu’il faut changer l’ordre.
Choix avec d’autres coefficient. Apres avoir chercher de façon empirique, voici le meilleur modèle ARMA en manuel. Ce modèle à le meilleur compromis entre la simplicité et les résultats au test.
md2=arima(diff(diff(log(ts_train),lag=1,difference=1),lag=1,difference=1),order=c(3,0,1))
On peut regarder la matrice de correlations des estimateurs.
cor.arma(md2)
## ar1 ar2 ar3 ma1 intercept
## ar1 1.000000e+00 2.002232e-01 1.852890e-01 -3.269522e-07 1.516138e-02
## ar2 2.002232e-01 1.000000e+00 2.003658e-01 -2.725740e-07 7.311459e-03
## ar3 1.852890e-01 2.003658e-01 1.000000e+00 -2.114444e-07 1.902618e-03
## ma1 -3.269522e-07 -2.725740e-07 -2.114444e-07 1.000000e+00 -2.073271e-06
## intercept 1.516138e-02 7.311459e-03 1.902618e-03 -2.073271e-06 1.000000e+00
Tous les coéfficients sont bien inferieurs à 0.9
t_stat(md2)
## ar1 ar2 ar3 ma1 intercept
## t.stat -3.586708 -3.414976 -3.599056 -84.42742 0.056132
## p.val 0.000335 0.000638 0.000319 0.00000 0.955237
Les coéfficients ont une p.val faible.
summary(md2)
##
## Call:
## arima(x = diff(diff(log(ts_train), lag = 1, difference = 1), lag = 1, difference = 1),
## order = c(3, 0, 1))
##
## Coefficients:
## ar1 ar2 ar3 ma1 intercept
## -0.2391 -0.2281 -0.2396 -1.0000 0e+00
## s.e. 0.0667 0.0668 0.0666 0.0118 1e-04
##
## sigma^2 estimated as 0.02202: log likelihood = 101.26, aic = -190.52
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.003190166 0.1484081 0.1247135 8.572188 198.7046 0.3883776
## ACF1
## Training set 0.01059991
AIC =-190
checkresiduals(md2)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(3,0,1) with non-zero mean
## Q* = 378.64, df = 19, p-value < 2.2e-16
##
## Model df: 5. Total lags used: 24
Les résidus semblent se comporter comme un bruit blanc Le test de Ljung-Box test a une très faible une p-value.
2.3 Modele Auto Arima
On peut sélectionner un modèle automatique de 2 façons : Premièrement avec la fonction armaselect
armaselect(diff(diff(log(ts_train),lag=12,difference=1),lag=1,
difference=1))
## p q sbc
## [1,] 15 0 -1150.815
## [2,] 12 0 -1150.277
## [3,] 13 0 -1149.574
## [4,] 0 13 -1145.498
## [5,] 14 0 -1144.649
## [6,] 12 1 -1143.524
## [7,] 2 12 -1142.869
## [8,] 2 13 -1142.462
## [9,] 1 13 -1141.332
## [10,] 0 14 -1141.305
Ou avec la fonction auto.arima
mda=auto.arima(diff(diff(log(ts_train),lag=12,difference=1),lag=1,
difference=1))
summary(mda)
## Series: diff(diff(log(ts_train), lag = 12, difference = 1), lag = 1, difference = 1)
## ARIMA(1,0,3)(0,0,2)[12] with zero mean
##
## Coefficients:
## ar1 ma1 ma2 ma3 sma1 sma2
## -0.8144 0.1049 -0.6525 -0.2062 -0.5937 0.1419
## s.e. 0.1281 0.1404 0.1120 0.0754 0.0758 0.0744
##
## sigma^2 = 0.002374: log likelihood = 325.48
## AIC=-636.96 AICc=-636.38 BIC=-613.77
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.001728101 0.04800068 0.03713941 -3.935493 296.2438 0.4142767
## ACF1
## Training set -0.008682619
#AIC -637
On observe les résidus
checkresiduals(mda)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,0,3)(0,0,2)[12] with zero mean
## Q* = 22.242, df = 18, p-value = 0.2214
##
## Model df: 6. Total lags used: 24
Le modèle semble être cohérent. Les résidus semblent se comporter comme un bruit blanc gaussien. Cependant le test de Ljung-Box test à une p-value de 0.22 essayons d’améliorer ce résultat. Pour se faire essayons de modéliser la série à l’aide d’un modèle SARMA.
Nous recherchons par la suite un modèle SARIMA en mode automatique. #Pour cela on conserve la saisonnalité et on applique la fonction Auto.arima .
mdsa=auto.arima(diff(log(ts_train),lag=1, difference=1))
summary(mdsa)
## Series: diff(log(ts_train), lag = 1, difference = 1)
## ARIMA(1,0,3)(0,1,2)[12]
##
## Coefficients:
## ar1 ma1 ma2 ma3 sma1 sma2
## -0.8144 0.1049 -0.6525 -0.2062 -0.5937 0.1419
## s.e. 0.1281 0.1404 0.1120 0.0754 0.0758 0.0744
##
## sigma^2 = 0.002374: log likelihood = 325.48
## AIC=-636.96 AICc=-636.38 BIC=-613.77
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.001631537 0.04664192 0.03507763 -89.9094 210.333 0.6466543
## ACF1
## Training set -0.008773206
Nous obtenons un AIC de -637.
checkresiduals(mdsa)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,0,3)(0,1,2)[12]
## Q* = 23.439, df = 18, p-value = 0.1743
##
## Model df: 6. Total lags used: 24
Le modèle semble être cohérent. Les résidus semblent se comporter comme un bruit blanc gaussien Cependant le test de Ljung-Box test à une p-value de 0.17.
2.5 Conclusion Choix de modèles.
Le meilleur modèle est l’ARMA md2 (3,0,1). Il s’agit du meilleur modèle ceci en se basant sur 2 critères essentiels la parcimonie et les résultats au test.
3 Prédiction
fc2=forecast(md2, h = 12)
Prévison sur 1 an avec le meilleur modele ARMA.
Nous observons la prévision sur 1 an avec un seuil à 95% et 80%.
3.2 Prédiction avec le modèle SARMA
fcsa=forecast(mdsa, h = 12)
Prévison sur 1 an avec le modele SARMA.
Nous observons la prévision sur 1 an avec un seuil à 95% et 80%.
Nous obtenons un Modèle ARMA intéressant qui nous permet de faire de bonnes prédictions sur 1 an.