# TD2 - Analyse de séries temporelles

## 1. Import et visualisation

```{r}
library(tseries)
par(mfrow = c(1, 1))


data(AirPassengers)
plot(AirPassengers)
```

## 2. Saisonnalité

```{r}
library(forecast)

monthplot(AirPassengers, main = "Graphique par mois (Monthplot)")

lag.plot(
  AirPassengers,
  lags = 12,
  do.lines = FALSE,
  main = "AirPassengers Lag-Plot"
)

boxplot(
  AirPassengers ~ cycle(AirPassengers),
  main = "Boxplot par mois",
  xlab = "Mois",
  ylab = "Nombre de passagers"
)
```

Il y a en effet une saisonnalité dans les données, avec des pics réguliers tous les 12 mois. Cela suggère que les passagers aériens ont tendance à augmenter à certaines périodes de l'année, probablement en raison de vacances ou d'autres facteurs saisonniers. Le boxplot confirme cette saisonnalité, montrant des variations significatives entre les mois, avec des pics plus élevés en été (juin, juillet, août) et des creux en hiver (décembre, janvier).

## 3. Moyenne mobile

```{r}
ma <- filter(AirPassengers, rep(1 / 12, 12))

plot(
  AirPassengers,
  main = "AirPassengers with Moving Average",
  ylab = "Number of Passengers"
)
lines(ma, col = "red", lwd = 2)
legend(
  "topleft",
  legend = c("AirPassengers", "Moving Average"),
  col = c("black", "red"),
  lwd = 2
)
```

## 4. Décomposition

```{r}
airpassengers_add <- decompose(AirPassengers, type = "additive")
plot(airpassengers_add)
residus_add <- airpassengers_add$random
residus_add_clean <- stats::na.omit(residus_add)
plot(residus_add_clean, main = "Résidus du modèle additif", ylab = "Résidus")
acf(residus_add_clean, main = "ACF des résidus du modèle additif")
```

```{r}
airpassengers_mult <- decompose(AirPassengers, type = "multiplicative")
plot(airpassengers_mult)
residus_mult <- airpassengers_mult$random
residus_mult_clean <- stats::na.omit(residus_mult)

plot(
  residus_mult_clean,
  main = "Résidus du modèle multiplicatif",
  ylab = "Résidus"
)

acf(
  residus_mult_clean,
  main = "ACF des résidus du modèle multiplicatif"
)
```

Observation : Le modèle multiplicatif est ici plus pertinent car les résidus (le "random") du modèle additif montrent encore une structure liée à l'amplitude de la série, alors qu'ils sont plus stables (homoscédastiques) dans le modèle multiplicatif. La fonction `decompose()` permet de séparer la série en trois composantes : tendance, saisonnalité et résidus. Cependant, elle suppose que la saisonnalité est fixe dans le temps, ce qui peut ne pas être le cas pour toutes les séries temporelles. De plus, elle est sensible aux valeurs aberrantes, ce qui peut affecter la qualité de la décomposition.

La saisonnalité de type multiplicatif colle mieux à AirPassengers car l'amplitude de la saisonnalité semble augmenter avec le temps, ce qui est caractéristique d'une relation multiplicative entre les composantes. En revanche, une décomposition additive supposerait que la saisonnalité a une amplitude constante, ce qui ne correspond pas à la nature des données d'AirPassengers.

## 5. STL

```{r}
dec_stl <- stl(log(AirPassengers), s.window = "periodic")
plot(dec_stl, main = "Décomposition STL de log(AirPassengers)")
```

Différences clés :

- `decompose()` est rigide (moyennes mobiles simples, saisonnalité fixe).
- `stl()` permet de gérer des valeurs aberrantes et d'ajuster la "vitesse" d'évolution de la saisonnalité via le paramètre s.window.

## 6. Différenciation

```{r}
trend_diff <- diff(log(AirPassengers))
saison_diff <- diff(log(AirPassengers), lag = 12)
final_diff <- diff(trend_diff, lag = 12)

plot(
  trend_diff,
  main = "Différence tendancielle (Trend)",
  ylab = "Différence tendancielle"
)
plot(
  saison_diff,
  main = "Différence saisonnière (Seasonal)",
  ylab = "Différence saisonnière"
)
plot(
  final_diff,
  main = "Différence finale (Trend + Seasonal)",
  ylab = "Différence finale"
)

acf(
  final_diff,
  main = "ACF de la série différenciée",
  lag.max = 20
)
```

- $(I - L)X_t = X_t - X_{t-1}$ : différence première (retirer la tendance).  
- $(I - L^{12})X_t = X_t - X_{t-12}$ : différence saisonnière sur 12 périodes (retirer la saisonnalité).

Donc la série finale est obtenue en appliquant ces deux différences :
- $(I - L)(I - L^{12})X_t = X_t - X_{t-1} - X_{t-12} + X_{t-13}$

```{r}
kpss_test_result <- kpss.test(final_diff)
print(kpss_test_result)

adf_test_result <- adf.test(final_diff)
print(adf_test_result)
```

Le test KPSS indique que la série différenciée est stationnaire (p-value > 0.05), tandis que le test ADF confirme également la stationnarité (p-value < 0.05). Ainsi, après les différenciations, la série semble être stationnaire.
