# Analyse et prévision de séries temporelles

#### 2025-2026

# 1 Exemples du cours

1. Packages nécessaires.

    library(ggplot2)
    library(ggfortify)
    library(forecast)
    library(tidyverse)

2. Chargement des données. Puis transformation en objet `ts`. Il faut donner la périodicité de la série (argument frequency=) et son début (argument start = c(an, numpériode), par exemple le numéro du 1er jour de données, ou du premier mois…).

Températures à Montsouris

    temperature = read.csv("TemperatureFrance.csv", sep=";",header=TRUE)
    Montsouris = temperature$PARIS.MONTSOURIS
    # transformation en objet time series, indiquer la date de début et la période
    serieMontsouris = ts(Montsouris/10,start=c(1960,1),frequency=365)
    # extraction d'une série plus petite
    serieMontsouris2000 = window(serieMontsouris,start=c(2000,1))
    plot(serieMontsouris2000,xlab='Année',ylab='degrés C',main="Température journalière moyenne" )

Production de blé tendre

    ble = read.csv("productionBle.csv")
    serieBle = ts(ble[,2],frequency=12,start=c(2001,2))
    plot(serieBle,xlab='Année',ylab='1000 tonnes',main='Production blé tendre')

Concentration de nitrates

    guingamp = read.csv("nitratesGuingamp.csv",sep=",",header=TRUE) %>%
                          select(annee,concentration_moy) %>% arrange(annee)
    guingamp.ts = ts(guingamp$concentration_moy,start=c(1995,1),frequency=1)
    plot(guingamp.ts)

3. Décomposition. On pourra commencer par calculer des moyennes mobiles. La fonction filter, avec l’argument method=“convolution” permet de lisser (ou filtrer) une série de deux manières différentes
   - si l’argument sides=1 la fonction renvoie la série \(y\) définie par \[ y[i] = f[1]*x[i] + f[2]*x[i-1]\ldots + f[p]*x[i-p)]\] \(x\) est la série d’entrée, \(f\) est le vecteur des coefficients du filtre.
   - si l’argument sides=2 la fonction renvoie la série \(y\) définie par \[ y[i] = f[1]*x[i+o] + \ldots + f[p]*x[i+o-(p-1)]\] \(o\) est l’écart de part et d’autre de \(i\) (\(p=2o+1\) si \(p\) est impair).

    k = 365
    filtre = rep(1,k)/k
    serie.filtre = stats::filter(serieMontsouris,filtre,method = 'convolution',sides=2)
    plot(serieMontsouris)
    lines(serie.filtre,col='darkgreen',lwd=3)
    plot(serie.filtre)

On peut utiliser la fonction `decompose` afin de décomposer en trois termes.

    serie.dec = decompose(serieMontsouris)
    plot(serie.dec)

4. Méthodes de lissage. La fonction `HoltWinters` avec ses différents réglages permet de faire les lissages. On peut fixer les paramètres ou le laisser les ajuster par moindres carrés. Ci-dessous, on a laissé le paramètre \(\alpha\) s’ajuster et on a imposé de ne pas considérer \(\beta\) et \(\gamma\) ce qui donne un lissage exponentiel simple.

    serieHW = HoltWinters(guingamp.ts,beta=FALSE,gamma=FALSE)
    plot(serieHW,predict(serieHW, 7, prediction.interval = TRUE),
    main='Nitrate, exponential smoothing')
    mtext(bquote(hat(alpha) == .(round(serieHW$alpha,2))),l=0.5)

Sur la production de blé tendre, on peut effectuer le lissage avec des paramètres fixés.

    alpha = 0.1
    beta = 0
    gamma = 0.1
    serieBleHW = HoltWinters(serieBle,alpha=alpha,beta=beta,gamma=gamma)
    plot(serieBleHW,predict(serieBleHW, 12, prediction.interval = TRUE),main='Prédiction blé tendre Holt-Winters')
    mtext(substitute(list(alpha,beta,gamma) == group("(",list(x,y,z),")"),
                               list(x=round(serieBleHW$alpha,2), y=round(serieBleHW$beta,2),z=round(serieBleHW$gamma,2)))
                               ,l=0.5)

5. Modèles SARIMA et analyse graphique.

On peut observer les graphiques d’autocorrélation et d’autocorrélation partielle ainsi :

    plot(acf(serieMontsouris,lag.max = 730))
    plot(pacf(serieMontsouris,lag.max = 730))

On peut travailler sur des séries différenciées :

    serie.diff1 = diff(serieMontsouris,lag=1)
    plot(acf(serie.diff1,lag.max = 730))
    serie.diff12 = diff(serieMontsouris,lag=12)
    plot(acf(serie.diff12,lag.max = 730))

La fonction arima ajuste un modèle SARIMA à la série. L’argument order=c(p,d,q) donne l’ordre \(d\) de la différentiation , l’ordre \(p\) de la partie AR et l’ordre \(q\) de la partie MA . L’argument seasonal=list(order=c(p,d,q)) donne les mêmes quantités pour la partie saisonnière. On peut faire une prédiction avec la fonction `forecast`, l’argument `h` donne l’horizon de prédiction.

    plot(acf(serieBle))
    plot(pacf(serieBle))
    serie.arima = arima(serieBle, order = c(0,0,1), seasonal = list(order=c(0,1,1)))
    print(serie.arima)
    forecastarima = forecast(serie.arima,h=2*12)
    autoplot(forecastarima)
    #On peut chercher le meilleur modèle ainsi :
    bestmod = auto.arima(serieBle)
    print(bestmod)
    forecastbestarima = forecast(bestmod, h=2*12)
    autoplot(forecastbestarima)

# 2 Données de concentration en CO\(_2\) dans l’atmosphère

La courbe de Keeling est un graphique de l’évolution de la concentration de dioxyde de carbone (CO\(_2\)) dans l’atmosphère terrestre depuis 1958. Elle est basée sur les mesures en continu faites à l’observatoire du Mauna Loa à Hawaï, à l’origine sous la supervision de Charles Keeling.

Ces mesures montrent l’augmentation rapide des niveaux de CO2 atmosphérique et leur variabilité au cours de l’année.

La fluctuation annuelle de dioxyde de carbone est due aux variations saisonnières causées par les plantes. Comme beaucoup de forêts se trouvent dans l’hémisphère nord, il y a plus de consommation de gaz carbonique de l’atmosphère durant l’été septentrional que pendant l’été austral. Ce cycle annuel est indiqué dans l’encart en haut à gauche de l’image et montre la concentration moyenne de gaz au cours des différents mois par rapport à la moyenne annuelle. Ce cycle se répète quelle que soit l’année observée.

Ces données ont été l’une des premières preuves de l’impact de la consommation des énergies fossiles par les sociétés humaines sur l’atmosphère, les concentrations de CO\(_2\) atteignant des valeurs probablement jamais égalées au cours des trois derniers millions d’années.

https://fr.wikipedia.org/wiki/Courbe_de_Keeling

Les concentrations de CO\(_2\) peuvent être téléchargées sur le site https://gml.noaa.gov/ccgg/trends/data.html

Les concentrations mensuelles moyennes de CO\(_2\) se trouvent dans le fichier texte Maunaloa.csv

1. Charger les données.

La représenter et commenter.
Pour traiter la série sur une période différente on utilisera la fonction window(x,start = c(an1,per1),end=c(an2,per2)) et l’argument extend=TRUE si on veut prolonger la série.

2. Calculer les lissages par moyennes mobiles d’ordre 3, 6 et 12, sur le passé et symétriques. Analyser les différences observées.

3. Décomposer la série en tendance, composante saisonnière et composante irrégulière. Analyser les différentes composantes.

4. Proposer un modèle paramétrique pour la tendance.

5. Utiliser le lissage de Holt-Winters pour faire une prévision sur un an. Commenter les paramètres de lissage et les estimations des coefficients. Faire varier les coefficients de lissage et comparer (on pourra travailler sur une série raccourcie).

6. Calculer les autocorrélations et autocorrélations partielles () de la série initiale, de la série différenciée d’ordre 1 (\(y(t) = x(t) -x(t-1)\)), d’ordre 12 (\(z(t) = x(t) -x(t-12)\)), d’ordre 1 puis 12 (\(w(t) = y(t) -y(t-12)\)) (calculées avec la fonction diff). Observer les différences.

7. Faire varier les différents ordres de modèles SARIMA et comparer les AIC. Faire une prévision avec `forecast` sur les 24 mois suivants avec le modèle sélectionné.

# 3 Déforestation

L’objectif est de prédire l’évolution des surfaces de soja au Brésil jusqu’en 2025 et d’évaluer l’impact de cette évolution sur la surface de forêt. Les données disponibles sont les séries chronologiques de surfaces de soja (1961-2018) et de forêt (1990-2020) au Brésil (source : FAOstat). Les données sont dans les fichiers .csv dont les noms commencent pas FAOSTAT.

1. Faire un graphique des deux séries chronologiques, ainsi qu’un graphique reliant les surfaces de forêt aux surfaces de soja.
2. Décomposer les séries pour les analyser.
3. Ajuster un lissage de Holt-Winters.
4. Sélectionner un modèle arima aux surfaces de soja.
5. Utiliser les deux modèles pour prédire la surface de soja jusqu’en 2025.
6. Ajuster un modèle de régression reliant les surfaces de forêt aux surfaces de soja.
7. Utiliser les modèles ajustés pour prédire des valeurs plausibles de surfaces de forêt à l’horizon 2025.