From 8b220669162bb94afdeea4d1b9dcd21aa71049b2 Mon Sep 17 00:00:00 2001 From: Thomas PEROT Date: Wed, 14 Jun 2023 09:41:10 +0200 Subject: [PATCH] =?UTF-8?q?Nouvelle=20version=20de=20l'exercice=20=C3=A9va?= =?UTF-8?q?luation=20par=20les=20pairs,=20sujet=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module3/exo3/exercice_fr.Rmd | 144 +++++++++++++++++++++-------------- 1 file changed, 86 insertions(+), 58 deletions(-) diff --git a/module3/exo3/exercice_fr.Rmd b/module3/exo3/exercice_fr.Rmd index 1f59b55..a2c7b7c 100644 --- a/module3/exo3/exercice_fr.Rmd +++ b/module3/exo3/exercice_fr.Rmd @@ -17,7 +17,7 @@ knitr::opts_chunk$set(echo = TRUE) ## Introduction -Dans ce document nous allons présenter et analyser des données d'évolution de la concentration en CO2 atmosphérique provenant du site de l'observatoire de Mauna Loa situé sur l'île d'Hawaï. +Dans ce document nous allons présenter et analyser des données d'évolution de la concentration en CO2 atmosphérique provenant du site de l'observatoire de Mauna Loa situé sur l'île d'Hawaï. Ces données sont décrites dans le document suivant : *C. D. Keeling, S. C. Piper, R. B. Bacastow, M. Wahlen, T. P. Whorf, M. Heimann, and H. A. Meijer, Exchanges of atmospheric CO2 and 13CO2 with the terrestrial biosphere and oceans from 1978 to 2000. I. Global aspects, SIO Reference Series, No. 01-06, Scripps Institution of Oceanography, San Diego, 88 pages, 2001.* @@ -25,8 +25,10 @@ Dans ce document nous allons présenter et analyser des données d'évolution de Les données sont disponibles sur le site suivant : [Scripps CO2 Program](https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html). -Les premières 57 lignes du fichier donnent des informatins sur les données. -Les lignes 2 à 19 indiquent l'encroit des mesures, la source des données et d'autres informations sur les données. +Nous avons téléchargé les données le 12 juin 2023. + +Les premières 57 lignes du fichier donnent des informations sur les données. +Les lignes 2 à 19 indiquent l'endroit d'où proviennent les mesures, la source des données et d'autres informations sur les données. Les lignes 23 à 37 indiquent comment citer les données. Les lignes 41 à 56 décrivent le tableau de données. @@ -46,7 +48,7 @@ head(data) Dans un premier temps nous allons donc récuperer l'entête des colonnes, puis charger les données sans l'entête et renommer les colonnes conformément à l'entête. Enfin, la description du fichier nous indique que les valeurs -99.99 correspondent à des données manquantes. -Nous allons les remplacer par des NA. +Nous allons les remplacer par des NA et nous afficherons l'ensemble des valeurs manquantes. ```{r} header = read.csv("monthly_in_situ_co2_mlo.csv",skip=57,nrows=1) @@ -59,16 +61,16 @@ data[na_records,] ``` -**Premier problème rencontré** : les colonnes 3 et 4 sont des dates mais le format de la date n'est pas indiqué. -Après recherche voici la description des quatre première colonne : +### Conversion des colonnes en date + +**Problème rencontré** : les colonnes 3 et 4 sont des dates mais le format de la date n'est pas indiqué. +Après avoir recherché les différentes possibilités voici la description des quatre premières colonnes : - colonne 1 : année ; - colonne 2 : mois ; -- colonne 3 : date en nombre de jours depuis une origine (comme dans Excel). Date d'origine 1899-12-30 ; +- colonne 3 : date en nombre de jours depuis une origine, la date d'origine étant 1899-12-30 (comme dans Excel ce qui était indiqué par le mot Excel ligne 60 du fichier) ; - colonne 4 : date en année décimal. -### Conversion des colonnes en date - Nous allons convertir la colonne 3 en date en indiquant la date 1899-12-30 comme origine. ```{r} @@ -87,8 +89,9 @@ Nous n'avons pas réussi à faire de même avec la colonne 4. ### Réprésentation de l'évolution de la concentration de CO2 atmosphérique en fonction du temps -D'après la description des données contenu dans le fichier csv la colonne 5 CO2 correspond à la concentration en CO2 : "Column 5 below gives monthly Mauna Loa CO2 concentrations in micro-mol CO2 per mole (ppm)". -Ce ne sont pas des données brutes mais des données recalculées à une échelle mensuelle. +D'après la description des données contenue dans le fichier csv la colonne 5 "CO2" correspond à la concentration en CO2 : "Column 5 below gives monthly Mauna Loa CO2 concentrations in micro-mol CO2 per mole (ppm)". +D'après le document cité en introduction, ce ne sont pas des données brutes mais des données recalculées à une échelle mensuelle. +Nous pouvons représenter ces données sur un graphe semblable à celui du site [Scripps CO2 Program](https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html). ```{r} plot(data$Date,data$CO2,type="l",main="",xlab="Date (month)", @@ -106,20 +109,20 @@ Nous voyons clairement deux structures dans les données, une forte tendance à ### Transformation des données en série temporelle Pour caractériser ces deux composantes, nous allons considérer les données comme une série temporelle. -Nous allons transformer les données en un objet ts. +Nous allons transformer les données en un objet ts (time series). Pour cela nous devons utiliser une série de données sans valeurs manquantes. -Plutôt que la colonne 5 nous allons donc utiliser la colonne 9 "CO2.1" qui correspond aux mêmes données que la colonne 5 mais où les données manquantes ont été remplacées en utilisant une "smoothed version of the data generated from a stiff cubic spline function plus 4-harmonic functions with linear gain". +Plutôt que la colonne 5 nous allons donc utiliser la colonne 9 "CO2.1" décrite dans le fichier csv et qui correspond aux mêmes données que la colonne 5 mais où les données manquantes ont été remplacées en utilisant une "smoothed version of the data generated from a stiff cubic spline function plus 4-harmonic functions with linear gain". Cette procédure est décrite en détail dans le rapport cité en introduction de ce document. Nous pouvons le vérifier en superposant les données remplies et les données avec données manquantes : ```{r} plot(data$Date,data$CO2.1,type="l",main="",xlab="Date (month)", - ylab="CO2 concentration (ppm)",col=2) + ylab="CO2 concentration (ppm)",col="red",lwd=2) mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0) mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0) mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) -points(data$Date,data$CO2,type="l",col=1) -legend("topleft",c("CO2 data with NA","CO2 data filled"),lty=1,col=c(1,2),bty="n") +points(data$Date,data$CO2,type="l",col=1,lwd=2) +legend("topleft",c("CO2 data with NA","CO2 data filled"),lty=1,col=c(1,"red"),lwd=2,bty="n") ``` Nous constatons qu'il y a très peu de données manquantes et qu'elles se situent toutes entre 1958 et 1964 (nous les avions déjà identifiées plus haut). @@ -171,15 +174,28 @@ summary(decom.stl) plot(decom.stl) ``` -### Caractérisation de la saisonalité - -Nous pouvons récupérer les différentes composantes de la série temporelle et représenter la saisonnalité seule. +Nous pouvons récupérer les différentes composantes de la série temporelle et représenter les données avec la tendance. ```{r} data.trunc$seasonSTL<-as.numeric(decom.stl[1]$time.series[,1]) data.trunc$trendSTL<-as.numeric(decom.stl[1]$time.series[,2]) data.trunc$residSTL<-as.numeric(decom.stl[1]$time.series[,3]) +plot(data.trunc$Date,data.trunc$CO2.1,type="l",main="",xlab="Date (month)", + ylab="CO2 concentration (ppm)") +mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0) +mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0) +mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) +points(data.trunc$Date,data.trunc$trendSTL,col="blue",type="l") +legend("topleft",c("CO2 concentration", + "Trend from stl function"),lty=1,col=c(1,"blue"),bty="n") +``` + +### Caractérisation de la saisonalité + +Nous pouvons également représenter la saisonnalité seule. + +```{r} plot(data.trunc$Date,data.trunc$seasonSTL,type="l",xlab="Date (month)", ylab="CO2 concentration (ppm)",ylim=c(-4,4)) mtext("Variation saisonnière de la concentration en CO2 (ppm)",line=1) @@ -196,13 +212,18 @@ Pour mieux voir cet effet saisonnier nous pouvons le représenter en superposant ```{r} #install.packages("forecast") library(forecast) -ggseasonplot(decom.stl[1]$time.series[,1]) +ggseasonplot(decom.stl[1]$time.series[,1],main="Composante saisonnière") ``` Nous voyons qu'au sein d'une année le pic de concentration de CO2 a lieu vers le mois de mai et les valeurs les plus basses sont vers le mois de septembre octobre. Les données reflètent les variations de la concentration de CO2 atmosphérique dans l'hemisphère nord. Dans l'hemisphère nord, à partir du printemps, les plantes captent le CO2 atmosphérique expliquant une partie de ce cycle saisonnier (voir le document cité en introduction pour plus de détails). ### Caractérisation de la tendance -Nous pouvons superposer la tendance aux données brutes ce qui correspond au même type de données que la colonne 6 seasonally : "Column 6 gives the same data after a seasonal adjustment to remove the quasi-regular seasonal cycle" +La tendance obtenue avec la fonction stl() nous permet de donner quelques chiffres sur l'évolution de la concentration en CO2 atmosphérique. +Entre 1958 et 2023 la concentration de CO2 atmosphérique est passé de `r round(data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL,2)` ppm +à `r round(data.trunc[data.trunc$Date==as.Date("2023-05-15"),]$trendSTL,2)` ppm, soit une augmentation de `r +round(100*(data.trunc[data.trunc$Date==as.Date("2023-05-15"),]$trendSTL-data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL)/data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL,1)`% en 65 ans. Cette augmentation est principalement lié à l'utilisation de carburant fossile par l'homme (voir le document cité en introduction pour plus de détails). + +La tendance obtenue avec la fonction stl() correspond au même type de données que la colonne 6 "seasonally" : "Column 6 gives the same data after a seasonal adjustment to remove the quasi-regular seasonal cycle". Nous pouvons le vérifier en superposant les deux variables sur un même graphe. ```{r} plot(data.trunc$Date,data.trunc$CO2.1,type="l",main="",xlab="Date (month)", @@ -213,11 +234,11 @@ mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) points(data.trunc$Date,data.trunc$seasonally,col="red",type="l") points(data.trunc$Date,data.trunc$trendSTL,col="blue",type="l") legend("topleft",c("CO2 concentration","Column seasonally from file", - "Trend from stl function"),lty=1,col=c(1,"red","blue"),bty="n") + "Trend from stl() function"),lty=1,col=c(1,"red","blue"),bty="n") ``` -En zoomant nous voyons que la tendance que nous obtenons correspond à un lissage plus fort que la colonne 6. +Cependant, en zoomant nous voyons que la tendance que nous obtenons avec la fonction stl() correspond à un lissage plus fort que la colonne 6 "seasonally". Les méthodes utilisées ne sont pas les mêmes. ```{r} @@ -235,26 +256,21 @@ legend("topleft",c("CO2 concentration","Column seasonally from file", ``` -Nous voyons qu'entre 1958 et 2023 la concentration de CO2 atmosphérique est passé de `r round(data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL,2)` ppm -à `r round(data.trunc[data.trunc$Date==as.Date("2023-05-15"),]$trendSTL,2)` ppm, soit une augmentation de `r -round(100*(data.trunc[data.trunc$Date==as.Date("2023-05-15"),]$trendSTL-data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL)/data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL,1)`% en 65 ans. - ## Prédiction de la concentration de CO2 jusqu'en 2025 ### Modélisatin de la tendance avec un modèle simple -Lorsque l'on zoom sur les données comme sur le graphe précédent, un modèle linéaire semble convenir pour représenter la tendance d'augmentation du CO2 dans le temps. Cependant en observant l'ensemble des données il apparaît clairement que la concentration de CO2 augmente de plus en plus vite. -Un premier modèle simple pourrait être d'ajuster un modèle linéaire ayant une composante linéaire et une composante quadratique. -Pour simplifier nous allons ajuster ce modèle sur la tendance extraite précédemment avec la fonction stl(). +Lorsque l'on zoome sur les données comme sur le graphe précédent, un modèle linéaire semble convenir pour représenter la tendance d'augmentation du CO2 dans le temps. Cependant en observant l'ensemble des données il apparaît clairement que la concentration de CO2 augmente de plus en plus vite. +Un premier modèle simple pourrait être d'ajuster un modèle linéaire ayant une composante linéaire et une composante quadratique (un polynôme de degré 2). +Pour simplifier nous allons ajuster ce modèle sur la tendance extraite précédemment avec la fonction stl(), variable nommée trendSTL dans le data frame. Pour ajuster le modèle nous allons convertir le champ date en numérique et utiliser cette variable comme variable explicative du modèle. Nous nommons cette variable "time". ```{r} data.trunc$time<-as.numeric(data.trunc$Date) -head(data.trunc) ``` -Nous ajustons le modèle et récupérons les valeurs ajustées et les résidus. +Nous ajustons le modèle et récupérons les valeurs ajustées et les résidus que nous représentons. ```{r} modeleSimple0<-lm(data=data.trunc, trendSTL ~ time + I((time)^2)) @@ -266,10 +282,10 @@ par(mfrow=c(1,2)) plot(data.trunc$Date,data.trunc$trendSTL,type="l",main="",xlab="Date (month)", ylab="CO2 concentration (ppm)") mtext("Modèle simple", side=3,line=2,cex=0.75,adj=0) -mtext("Valeur ajustée", side=3,line=1,cex=0.75,adj=0) +mtext("Valeurs ajustées", side=3,line=1,cex=0.75,adj=0) points(data.trunc$Date,data.trunc$modeleSimple0Fit,col="blue",type="l") legend("topleft",c("tendance","tendance ~ time + time^2"),lty=1, - col=c("black","blue"),bty="n",cex=0.75) + col=c("black","blue"),bty="n",cex=0.5) plot(data.trunc$Date,data.trunc$modeleSimple0Res,type="l",main="", xlab="Date (month)",ylab="CO2 concentration (ppm)") mtext("Modèle simple", side=3,line=2,cex=0.75,adj=0) @@ -277,7 +293,7 @@ mtext("Résidus", side=3,line=1,cex=0.75,adj=0) abline(h=0) ``` -ce modèle est simpliste car, par exemple, nous n'avons pas tenu compte des observations répétées par années, c'est à dire de la présence de pseudoréplications, ni de l'autocorrélation temporelle. +Ce modèle est simpliste car, par exemple, nous n'avons pas tenu compte des observations répétées par année, c'est à dire de la présence de pseudoréplications, ni de l'autocorrélation temporelle. Néanmoins, même s'il n'est pas parfait, ce modèle très simple semble bien convenir aux données. ### Prédiction jusqu'en 2025 à l'aide du modèle simple @@ -304,20 +320,22 @@ Le graphe suivant représente la tendance "observée" sur la période connue, le ```{r} plot(data.trunc$Date,data.trunc$trendSTL,type="l",main="",xlab="Date (month)", - ylab="CO2 concentration (ppm)",col="red",xlim=as.Date(c("2000-01-01","2026-01-01")), + ylab="CO2 concentration (ppm)",col="black",xlim=as.Date(c("2000-01-01","2026-01-01")), ylim=c(360,440)) -points(myNewData$time,myNewData$fit,col=1,type="l") -points(myNewData$time,myNewData$lwr,col=1,type="l",lty=2) -points(myNewData$time,myNewData$upr,col=1,type="l",lty=2) -points(myNewDataExtrapolation$time,myNewDataExtrapolation$fit,col="blue",type="l") -points(myNewDataExtrapolation$time,myNewDataExtrapolation$lwr,col="blue",type="l",lty=2) -points(myNewDataExtrapolation$time,myNewDataExtrapolation$upr,col="blue",type="l",lty=2) +points(myNewData$time,myNewData$fit,col="blue",type="l") +points(myNewData$time,myNewData$lwr,col="blue",type="l",lty=2) +points(myNewData$time,myNewData$upr,col="blue",type="l",lty=2) +points(myNewDataExtrapolation$time,myNewDataExtrapolation$fit,col="red",type="l") +points(myNewDataExtrapolation$time,myNewDataExtrapolation$lwr,col="red",type="l",lty=2) +points(myNewDataExtrapolation$time,myNewDataExtrapolation$upr,col="red",type="l",lty=2) legend("topleft",c("tendance observée","valeurs ajustées (modèle simple)", - "valeurs prédites (modèle simple)","intervalle de confiance des prédictions"),col=c("red","black","blue","black"),lty=c(1,1,1,2),bty="n",cex=0.75) + "valeurs prédites (modèle simple)", + "intervalle de confiance des prédictions"), + col=c("black","blue","red","black"),lty=c(1,1,1,2),bty="n",cex=0.75) ``` -Nous pouvons estimer à l'aide du modèle simple la concentration moyenne attendue en CO2 pour l'année 2025. +Nous pouvons estimer à l'aide du modèle simple la concentration moyenne attendue en CO2 pour l'année 2025. Pour cela nous récupérons dans le data frame des extrapolations les données de l'année 2025 et nous calculons quelques statistiques pour l'année 2025. ```{r} myNewData2025<-myNewDataExtrapolation[myNewDataExtrapolation$time >= @@ -331,11 +349,11 @@ round(mean(myNewData2025$fit)-mean(myNewData2025$upr),2) **D'après le modèle simple, en première approximation la valeur de concentration moyenne en CO2 en 2025 serait de `r round(mean(myNewData2025$fit),2)` ppm plus ou moins `r round(mean(myNewData2025$fit)-mean(myNewData2025$lwr),2)` ppm.** -### Modélisation à l'aide d'un modèle stochastique +### Modélisation à l'aide d'un modèle SARIMA -Pour aller un peu plus loin nous allons tenter d'utiliser un modèle stochastique de type SARIMA pour faire les prédictions. -En effet, nous avons vu précédemment que les données présentaient à la fois une tendance et une saisonnalité. -Nous pouvons également vérifier que les résidus présentent une autocorrélation et une autocorrélation partielle à l'aide des fonctions acf et pcaf. +Pour aller un peu plus loin nous allons tenter d'utiliser un modèle stochastique de type SARIMA ("Seasonal Autoregressive Integrated Moving Average") pour faire les prédictions. +En effet, nous avons vu précédemment que la série temporelle présentait à la fois une tendance et une saisonnalité. +Nous pouvons également vérifier que les résidus obtenus avec la fonction stl() présentent une autocorrélation et une autocorrélation partielle à l'aide des fonctions acf et pcaf. ```{r} par(mfrow=c(1,2)) @@ -344,17 +362,17 @@ pacf(data.trunc$residSTL) ``` -Pour simplifier le processus de construction du modèle nous allons utiliser la fonction auto.arima() du package forecast qui permet de choisir le type de modèle approprié et d'estimer les différents paramètres du modèle stochastique. +Pour simplifier le processus de construction du modèle nous allons utiliser la fonction auto.arima() du package forecast qui permet de choisir le type de modèle approprié et d'estimer les différents paramètres du modèle stochastique. Même si cela rallonge le temps de calcul, nous fixons les paramètres stepwise et approximation à FALSE pour obtenir le meilleur modèle possible. ```{r} #install.packages("forecast") library(forecast) -modelSarima<-auto.arima(data.ts,stepwise=FALSE) +modelSarima<-auto.arima(data.ts,approximation=FALSE,stepwise=FALSE) summary(modelSarima) ``` -Nous pouvons vérifier qu'il n'y a plus d'autocorrélation dans les résidus du modèle. +Nous pouvons vérifier qu'il n'y a plus d'autocorrélation dans les résidus du modèle SARIMA. ```{r} par(mfrow=c(1,2)) @@ -362,22 +380,24 @@ acf(resid(modelSarima)) pacf(resid(modelSarima)) ``` -Pour prédire la concentration de CO2 jusqu'en 2025 nous allons utiliser et modèle précédent et la fonction forecast() du package forecast. -Pour aller jusqu'à décembre 2025 nous allons prédire sur 31 valeurs supplémentaires (de juin 2023 à décembre 2025). +Pour prédire la concentration de CO2 jusqu'en 2025 nous allons utiliser le modèle SARIMA et la fonction forecast() du package forecast. +Pour aller jusqu'à décembre 2025 nous allons faire des prédictions sur 31 valeurs supplémentaires (de juin 2023 à décembre 2025). ```{r} predictionsSARIMA<-data.frame(forecast(modelSarima,h=31)) tail(predictionsSARIMA) ``` -Nous pouvons représenter les prédictions à l'aide de la fonction plot.forecast() du package forecast qui représente les prédictions avec les intervalles de confiance à 80 et 95%. La fonction représente également les données qui ont servi à construire le modèle. Pour plus de lisibilité nous choisissons de ne représentées que les 50 dernières valeurs passées avec le paramètre include=50. +Nous pouvons représenter les prédictions à l'aide de la fonction plot.forecast() du package forecast qui représente les prédictions avec les intervalles de confiance à 80 et 95%. La fonction représente également les données qui ont servi à construire le modèle. Pour plus de lisibilité nous choisissons de ne représenter que les 50 dernières valeurs passées avec le paramètre include=50. ```{r} -plot(forecast(modelSarima,h=31),include=50) +plot(forecast(modelSarima,h=31),include=50,ylab="CO2 concentration (ppm)") ``` De la même façon que pour le modèle simple nous pouvons estimer la concentration de CO2 en 2025. Nous récupérons les dates dans le data frame des prédictions du modèle SARIMA et nous créons un data.frame uniquement pour 2025. +Les dates sont contenues dans le nom des lignes avec un format utilisant une abréviation du mois en anglais suivi de l'année. +Nous devons donc fixer la langue des dates en anglais pour récupérer la date dans le bon format puis la remettre en français. ```{r} Sys.setlocale("LC_TIME", "English") @@ -389,12 +409,20 @@ predictionsSARIMA$Date <= as.Date("2025-12-31"),] **D'après le modèle SARIMA, la valeur de concentration moyenne en CO2 en 2025 serait de `r round(mean(predictionsSARIMA2025$Point.Forecast),2)` ppm plus ou moins `r round(mean(predictionsSARIMA2025$Point.Forecast)-mean(predictionsSARIMA2025$Lo.95),2)` ppm.** -Le modèle SARIMA prédit donc une concentration de CO2 très proche par rapport au modèle simple, très légèrement inférieure. +Le modèle SARIMA prédit donc une concentration de CO2 très proche, très légèrement inférieure, par rapport au modèle simple polynomial. L'intervalle de confiance des prédictions est légèrement plus large avec le modèle SARIMA. ## Conclusion -Dans cette analyse nous avons chargé un jeu de données correspondant à l'évolution de la concentration en CO2 atmosphérique sur le site de Mauna Loa sur l'île d'Hawai. Pour construire le jeu de données à partir du fichier csv nous avons exclu des lignes correspondant à des informations autres que les données. Nous avons également géré des données manquantes codées par une valeur numérique. Enfin nous avons convertit une colonne en un format date reconnu par R. Cette dernière étape a demandé un peu de temps car les informations sur le format des colonnes représentant la date n'était pas précise. -Une fois la préparation du jeu de données réalisée nous avons représenté les données et constaté la présence d'une tendance et d'une saisonnalité fortes. Nous avons caractérisé les oscillations périodiques et la tendance en considérant les données comme une serie temporelle. Pour cela nous avons utilisé les fonction ts() et stl() du package stats. Ensuite, pour prédire la concentration en CO2 jsuqu'en 2025, nous avons construit un premier modèle simple de la tendance à l'aide d'un modèle linéaire correspondant à un polynôme de degré 2 du temps. Nous avons ensuite proposé un modèle stochastique SARIMA plus complexe mais plus adapté aux données qui permet de prédire la tendance et la saisonnalité. Les deux approches donnent des résultats très similaires probablement parceque nous avons fait des prédictions à très court terme. +Dans cette analyse nous avons chargé un jeu de données correspondant à l'évolution de la concentration en CO2 atmosphérique provenant du site de Mauna Loa sur l'île d'Hawaii. Pour construire le jeu de données à partir du fichier csv nous avons exclu des lignes correspondant à des informations autres que les données. Nous avons également géré des données manquantes codées par une valeur numérique. Enfin nous avons convertit une colonne en un format date reconnu par R. Cette dernière étape a demandé un peu de temps car les informations sur le format des colonnes représentant la date n'étaient pas précises. +Une fois la préparation du jeu de données réalisée nous avons représenté les données et constaté la présence d'une tendance et d'une saisonnalité fortes. Nous avons caractérisé les oscillations périodiques et la tendance en considérant les données comme une serie temporelle. Pour cela nous avons utilisé les fonction ts() et stl() du package stats. Ensuite, pour prédire la concentration en CO2 jsuqu'en 2025, nous avons construit un premier modèle simple de la tendance à l'aide d'un modèle linéaire correspondant à un polynôme de degré 2 du temps. Nous avons ensuite proposé un modèle stochastique SARIMA plus complexe mais plus adapté aux données qui permet de prédire la tendance et la saisonnalité. Pour cela nous avons utilisé les fonctions auto.arima() et forecast() du package forecast. Les deux approches donnent des résultats très similaires probablement parceque nous avons fait des prédictions à très court terme. L'avantage du modèle SARIMA est qu'il peut prédire également les variations saisonnières de la concentration de CO2 atmosphérique. + +## Informations sur l'environnement de travail + +```{r} +sessionInfo() + +``` + -- 2.18.1