From 746f4fbc7855887d5f046f9a45d4ed03b004060f Mon Sep 17 00:00:00 2001 From: Arthur DANJOU Date: Mon, 9 Feb 2026 11:36:24 +0100 Subject: [PATCH] Add TP1 of time series --- M2/Séries temporelles/TD1.Rmd | 237 +++++++++++++++++++++++++++++ M2/Séries temporelles/data/TD1.csv | 101 ++++++++++++ 2 files changed, 338 insertions(+) create mode 100644 M2/Séries temporelles/TD1.Rmd create mode 100644 M2/Séries temporelles/data/TD1.csv diff --git a/M2/Séries temporelles/TD1.Rmd b/M2/Séries temporelles/TD1.Rmd new file mode 100644 index 0000000..6d81cb1 --- /dev/null +++ b/M2/Séries temporelles/TD1.Rmd @@ -0,0 +1,237 @@ +# Import des données + +```{r} +library(tseries) + +data = read.csv2('./data/TD1.csv') +data_series = ts(data) +``` + +# Graphique + +```{r} +plot( + data_series, + main = "Exemple de série temporelle", + ylab = "Valeurs", + xlab = "Temps", + col = "blue", + type = "o" +) + +acf(data, main = "Fonction d'Autocorrélation (ACF)") +``` + +## 1. Analyse de la série temporelle (Time Plot) + +- Tendance : Il y a une tendance linéaire croissante extrêmement claire et forte sur toute la période (de `t=0` à `t=100`). La moyenne de la série augmente de façon constante, ce qui confirme une non-stationnarité pure. + +- Saisonnalité : Nous observons des oscillations très régulières en forme de "dents de scie". La répétition systématique de ces motifs indique une composante saisonnière forte. + +- Variabilité : L'amplitude des oscillations semble ici rester constante par rapport à la tendance (modèle additif). + +## 2. Analyse de la Fonction d'Autocorrélation (ACF) + +- Profil de Non-Stationnarité : Nous observons une décroissance très lente et linéaire des pics. Même au lag 20, la corrélation reste très élevée (environ `0.4`), bien au-dessus de la zone de significativité bleue. C'est la signature typique d'une série avec une tendance non traitée. + +- Saisonnalité de période 2 : les retards pairs (2,4,6...) sont systématiquement plus élevés que les retards impairs (1,3,5...). + + - Le pic au lag 2 est particulièrement fort, presque au même niveau que le lag 1. + - Cela confirme que la valeur à l'instant `t` est très fortement corrélée à la valeur à `t−2`. + +# Lag plot + +```{r} +lag.plot( + data_series, + lags = 4, + do.lines = FALSE, + main = "Lag-Plot" +) +``` + +## 1. Analyse par retard (Lag) + +- Lag 2 et Lag 4 (Forte corrélation positive) : Les nuages de points pour les retards pairs sont extrêmement resserrés autour de la première bissectrice (la ligne pointillée). Cela signifie que la valeur à l'instant `t` est presque parfaitement prédite par la valeur à `t−2` et `t−4`. Cela confirme la saisonnalité de péridoe `2`. + +- Lag 1 et Lag 3 (Dispersion organisée) : Pour les retards impairs, nous observons deux "nuages" ou une dispersion plus large. Cela traduit l'oscillation "haut-bas" : une valeur haute est suivie d'une valeur basse, créant cet écart par rapport à la ligne d'identité. + +## 2. Relation avec la tendance + +L'alignement global de tous les lags le long d'une diagonale ascendante confirme la tendance déterministe. Même avec le "bruit" saisonnier, la valeur globale `Y_t`​ augmente proportionnellement à `Y_{t−k}`​. C'est ce qui expliquait la p-value de `0.581` à l'ADF : la série ne revient jamais vers une moyenne centrale, elle "s'échappe" vers le haut. + +# Saisonnalité + +```{r} +kpss_test_result <- kpss.test(data_series) +print(kpss_test_result) + +adf_test_result <- adf.test(data_series) +print(adf_test_result) +``` + +## 1. Analyse du test ADF (Augmented Dickey-Fuller) + +- Hypothèse nulle (`H0​`) : La série est non stationnaire. + +- Résultat : La p-value est de `0.581`. + +- Interprétation : Étant donné que la p-value est très supérieure au seuil classique de `0.05`, nous conservons `H0`. La série est donc considérée comme non stationnaire par l'ADF. + +## 2. Analyse du test KPSS + +- Hypothèse nulle (`H0​`) : La série est stationnaire. + +- Résultat : La statistique de test est très élevée (`2.0282`) et la p-value est de `0.01`. + +- Interprétation : La p-value est inférieure à `0.05`, nous rejetons donc l'hypothèse de stationnarité. Le test KPSS confirme que la série n'est pas stationnaire. + +## Conclusion croisée + +| Test | Hypothèse Nulle (`H0​`) | Résultat | Conclusion statistique | +|------------------|------------------|------------------|------------------| +| ADF | Non stationnaire | Non rejetée (`p=0.58`) | La série n'est pas stationnaire | +| KPS | Stationnaire | Rejetée (`p=0.01`) | La série n'est pas stationnaire. | + +# Correction de la saisonnalité + +## Lag 1 + +```{r} +serie_diff = diff(data_series) +plot(serie_diff, type = "l") +acf(serie_diff, main = "ACF de la série différenciée lag 1") +``` + +### Pourquoi la différenciation d=1 a "échoué" ? + +Le graphique ACF de la série différenciée montre des pics à `-0.9` (lag 1) et `+0.85` (lag 2). Le Lag-Plot explique pourquoi : en faisant `Y_t​−Y_{t−1}`​, la pente est supprimée, mais l'oscillation `S=2` est transformée en une alternance de signes massive. + +**Verdict final** : Pour modéliser proprement cette série, nous ne pouvons pas nous contenter d'un modèle ARIMA classique. Nous devons utiliser la différence saisonnière : diff(data_series, lag = 2). + +## Lag 2 + +```{r} +serie_diff_2 <- diff(data_series, lag = 2) +plot(serie_diff_2, type = "l") +acf(serie_diff_2, main = "ACF de la série différenciée lag 2") +``` + +### 1. Disparition de la non-stationnarité + +- Observation : Contrairement aux ACF précédentes qui affichaient des pics massifs et persistants, celle-ci chute immédiatement vers zéro dès le premier retard. + +- Conclusion : La série résultante est désormais stationnaire. La moyenne et la variance sont stabilisées. + +### 2. Élimination de la structure saisonnière `S=2` + +- Observation : L'alternance parfaite "haut-bas" (pics à `+0.8`/`-0.9`) que nous voyions après la différenciation classique (`diff(x)`) a totalement disparu. + +- Interprétation : En appliquant `diff(x, lag = 2)`, nous avons retiré à chaque point sa valeur correspondante au cycle précédent. Cela a "neutralisé" l'oscillation déterministe de période 2. + +### 3. Identification des résidus (Bruit Blanc ?) + +- Pic au Lag 2 : Nous observons un pic négatif significatif au lag 2. Cela suggère qu'il reste une petite dépendance de type `MA(1)` saisonnier ou `MA(2)`. + +- Reste du graphique : Pour tous les autres retards, les pics sont situés à l'intérieur des bandes de confiance bleues. + +- Conclusion : La série est maintenant très proche d'un bruit blanc. Les résidus sont quasi-indépendants, ce qui est l'objectif ultime avant de valider un modèle de prévision. + +## Moyenne + +```{r} +t.max = length(data_series) +serie_moy = ts((data_series[1:(t.max - 1)] + data_series[2:t.max]) / 2) +plot(serie_moy, type = "l") +acf(serie_moy, main = "ACF de la série moyenne") +``` + +### 1. Analyse de la série temporelle (serie_moy) + +- Lissage de la saisonnalité : L'effet le plus frappant est la disparition presque totale des dents de scie (l'oscillation "haut-bas" de période 2). En moyennant deux points consécutifs, nous avons annulé les variations saisonnières de court terme pour ne laisser apparaître que la composante de tendance. + +- Allure de la tendance : La série montre une croissance qui n'est pas strictement linéaire mais légèrement curviligne (quadratique). On observe une accélération de la pente à mesure que le temps progresse. + +- Stationnarité : La série n'est toujours pas stationnaire. La moyenne augmente de façon continue avec le temps (environ de 100 à 1100). + +### 2. Analyse de l'ACF de la série moyenne + +- Disparition de l'alternance : On ne voit plus l'oscillation caractéristique (pics positifs/négatifs) tous les deux lags. Cela prouve mathématiquement que la saisonnalité de période 2 a été filtrée avec succès par la moyenne mobile. + +- Profil de "Trend" pur : L'ACF décroît de manière très lente, régulière et presque linéaire. C'est la signature typique d'une série dont la seule source de non-stationnarité restante est la tendance. + +- Persistance : Même au lag 15, l'autocorrélation reste très élevée (\>0.5). Cela confirme que la série a une "mémoire" longue induite par sa dérive déterministe. + +## Synthèse des corrections + +| Caractéristique | Série Brute | Différenciation Lag 1 (`diff(x)`) | Différenciation Lag 2 (`diff(x, 2)`) | Série Moyenne (`serie_moy`) | +|:--------------|:--------------|:--------------|:--------------|:--------------| +| **Allure Visuelle** | Tendance ascendante forte + oscillations en "dents de scie". | Moyenne stabilisée mais oscillations "haut-bas" amplifiées. | Série stationnaire, ressemble à un bruit blanc avec peu de structure. | Courbe lisse montrant la tendance (sans les oscillations). | +| **Stationnarité** | **Non** (moyenne mobile dans le temps). | **Partielle** (moyenne stable mais forte dépendance cyclique). | **Oui** (la plus proche de la stationnarité complète). | **Non** (la tendance est toujours présente). | +| **Profil ACF** | Décroissance linéaire très lente. | Alternance parfaite de pics positifs/négatifs ($S=2$). | Chute immédiate vers 0 après le lag 2. | Décroissance lisse et très lente. | +| **Saisonnalité** | Présente (période 2) mais masquée par la tendance. | **Exacerbée** : l'alternance devient la structure dominante. | **Éliminée** : le cycle de période 2 est neutralisé. | **Filtrée** : les variations de court terme sont lissées. | +| **Usage Typique** | Observation initiale des données. | Suppression d'une tendance linéaire simple. | Traitement d'une tendance + saisonnalité de période 2. | Isolation de la tendance pour une régression polynomiale. | + +# Régression polynomiale + +```{r} +n <- length(data_series) +time <- 1:n + +data_deseas <- (data_series[2:n] + data_series[1:(n - 1)]) / 2 +time_deseas <- time[2:n] + +model_poly <- lm(data_deseas ~ time_deseas + I(time_deseas^2)) + +summary(model_poly) + +plot( + time, + data_series, + type = "l", + col = "gray", + lty = 2, + main = "Ajustement Polynomial (deg 2) sur Série Dé-saisonnalisée", + xlab = "Temps", + ylab = "Valeurs" +) +lines(time_deseas, data_deseas, col = "blue", lwd = 1) +lines(time_deseas, fitted(model_poly), col = "red", lwd = 2) + +legend( + "topleft", + legend = c("Série Brute", "Série Dé-saisonnalisée", "Régression Poly (d=2)"), + col = c("gray", "blue", "red"), + lty = c(2, 1, 1), + lwd = c(1, 1, 2) +) +``` + +## Interprétation + +- Superposition visuelle : La courbe rouge (prédiction) doit épouser parfaitement la ligne bleue (série dé-saisonnalisée). Si la courbe rouge passe par le "centre" des oscillations de la série brute (grise), cela confirme que le degré 2 est suffisant pour capturer la dynamique de long terme. + +- Analyse des résidus : Après cet ajustement, les résidus de la régression ne doivent plus contenir de tendance. Cependant, ils contiendront encore la saisonnalité de période 2 si nous les calculons par rapport à la série brute. + +- Significativité : Dans le `summary(model_poly)`, nous vérifions que le coefficient lié à `I(time_deseas^2)` possède une p-value très faible (`<0.05`). + +# Résidus + +```{r} +residus <- residuals(model_poly) + +par(mfrow = c(2, 1)) +plot( + time_deseas, + residus, + type = "l", + col = "darkgreen", + main = "Série des résidus (après régression poly)", + xlab = "Temps", + ylab = "Résidus" +) +abline(h = 0, col = "red", lty = 2) + +acf(residus, main = "ACF des résidus") +``` + diff --git a/M2/Séries temporelles/data/TD1.csv b/M2/Séries temporelles/data/TD1.csv new file mode 100644 index 0000000..0917fd7 --- /dev/null +++ b/M2/Séries temporelles/data/TD1.csv @@ -0,0 +1,101 @@ +"x" +-29,2226905371166 +213,582166211104 +-34,8814306205024 +289,36404010689 +28,975388590768 +174,576580794099 +43,2714526214243 +259,316235256461 +54,8890675826746 +214,730580642182 +109,689058422542 +257,892161820572 +11,8379709729098 +136,865005641125 +108,746545907155 +255,353319549238 +62,0904868450527 +315,591810534265 +115,161059754904 +309,695066060875 +132,048868580411 +331,506815036553 +102,62824916826 +206,132415206831 +143,491287394736 +316,79356302355 +119,110224664734 +260,862380805036 +118,192497244569 +370,897078009985 +226,033977576452 +361,26061363285 +194,283580577968 +380,909747970855 +123,64702215857 +380,850271835016 +191,185502314483 +417,434330164441 +285,101268599194 +478,158787422877 +241,873820187321 +447,731915993175 +305,748168770237 +509,433159933683 +258,062215272524 +468,225242151894 +333,129098106841 +564,826646225771 +332,482689392489 +594,055386322711 +382,005294018353 +543,798680337462 +403,955984571221 +543,13184519596 +484,151185085052 +724,619994925293 +420,538926176675 +600,193268684174 +494,585981372121 +673,247269805959 +614,180888025239 +706,437999863342 +557,386968122539 +739,000107939033 +515,33633955588 +777,039614975717 +492,652068555448 +871,677743078144 +621,762666910595 +938,630583518108 +669,875476444983 +826,902678453909 +709,436317674453 +848,895118417787 +649,818329988045 +944,172311775873 +724,735406339078 +964,455267581581 +785,817066207583 +970,523952690596 +789,666563359075 +1029,64106924381 +913,80434982866 +997,421659978512 +922,197309381421 +1128,24751856068 +984,054991863818 +1135,19080381829 +988,600940495814 +1203,35493953861 +982,973998450418 +1290,79339029916 +1108,92013078475 +1306,61068247575 +1171,84167272704 +1341,52432127827 +1071,0703895771 +1327,73672928816 +1116,86936925508 +1376,32996817803