Update exercice_fr.Rmd

parent 458226d0
---
title: "Module3_exo3_CO2"
author: "Luana Leymarie"
date: "2025-08-05"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Préparation des données
Les données de mesures de CO2 dans l'atmosphères ont été récupéré sur le site Web [Scripps CO2 Program](https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html). Elles ont été récupéré le 05/08/2025 sous forme d'un fichier CSV.
```{r}
data_url = "https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv"
```
Ce fichier étant mis à jour régulièrement, une copie locale a été faite et utilisé pour cette étude.
```{r}
data_file = file.choose()
head(data_file)
tail(data_file)
```
On souhaite lire le fichier en ignorant les lignes d'entêtes non pertinentes
Nous allons lire le fichier ligne par ligne pour trouver le début des données
Le début des données est marqué par la ligne "1958-03-29, 316.19"
```{r}
all_lines = readLines(data_file)
```
Trouver la ligne où les données commencent (la première ligne qui ressemble à une date)
On cherche la première ligne qui commence par "YYYY-MM-DD"
```{r}
data_start_line <- grep("^\\d{4}-\\d{2}-\\d{2}", all_lines)[1]
if (is.na(data_start_line)) {
stop("Impossible de trouver le début des données dans le fichier.")
}
```
Lire le fichier CSV en spécifiant la ligne de début des données
```{r}
co2_data <- read.csv(data_file,
skip = data_start_line - 1,
header = FALSE,
col.names = c("Date", "CO2_Concentration_ppm"),
stringsAsFactors = FALSE
)
co2_data$Date <- as.Date(co2_data$Date)
```
Vérifions qu'il n'y ait pas de données manquantes
```{r}
na_records = apply(co2_data, 1, function (x) any(is.na(x)))
data[na_records,]
```
Vérifions la classe des colonnes :
```{r}
class(co2_data$Date)
class(co2_data$CO2_Concentration_ppm)
```
Chargement du package nécessaire :
```{r}
library(ggplot2)
```
## Création du graphique :
```{r}
ggplot(data = co2_data, aes(x = Date, y = CO2_Concentration_ppm)) +
geom_line(color = "steelblue", alpha = 0.8) +
geom_smooth(method = "loess", se = FALSE, color = "darkred", linewidth = 1.2)
```
## Séparation des phénomènes
Déterminer la plage de dates
```{r}
start_filter_date <- as.Date("1959-01-01")
end_filter_date <- as.Date("2024-12-31")
co2_data_filtered <- co2_data[co2_data$Date >= start_filter_date & co2_data$Date <= end_filter_date, ]
print(range(co2_data_filtered$Date))
```
Déterminer la plage de dates pour la série TS (basée sur les données filtrées)
```{r}
start_date_ts <- min(co2_data_filtered$Date)
end_date_ts <- max(co2_data_filtered$Date)
```
Créer une séquence de dates hebdomadaires régulières pour la plage filtrée
```{r}
all_weeks_ts <- seq(start_date_ts, end_date_ts, by = "week")
```
Créer un data frame complet avec toutes les semaines de la plage filtrée puis fusionner les données filtrées avec le data frame complet
```{r}
full_co2_data_ts <- data.frame(Date = all_weeks_ts)
full_co2_data_ts <- merge(full_co2_data_ts, co2_data_filtered, by = "Date", all.x = TRUE)
```
Convertir la colonne CO2_Concentration_ppm en série ts
On va démarrer la série ts au 1er janvier 1959 (année de début du filtre)
```{r}
co2_ts_simple <- ts(full_co2_data_ts$CO2_Concentration_ppm,
start = c(1959, 1),
frequency = 52)
```
Gérer les NA avant decompose()
install.packages("forecast")
```{r}
library(forecast)
co2_ts_simple_imputed <- na.interp(co2_ts_simple)
```
Appliquons une décomposition additive:
```{r}
co2_decomposed <- decompose(co2_ts_simple_imputed, type = "additive")
plot(co2_decomposed)
```
### Caractérisation de l'oscillation périodique
Premièrement, on extrait la composante saisonnière :
```{r}
seasonal_component <- co2_decomposed$seasonal
```
On va maintenant calculer l'amplitude de l'oscillation
```{r}
max_seasonal_effect <- max(seasonal_component, na.rm = TRUE)
min_seasonal_effect <- min(seasonal_component, na.rm = TRUE)
amplitude_seasonal <- max_seasonal_effect - min_seasonal_effect
cat("Amplitude moyenne de l'oscillation saisonnière :", round(amplitude_seasonal, 2), "ppm\n")
```
Ensuite, on va identifier les semaines des pics et des creux
```{r}
week_of_peak <- which.max(seasonal_component)
week_of_trough <- which.min(seasonal_component)
cat("Semaine du pic saisonnier : Semaine", week_of_peak, "\n")
cat("Semaine du creux saisonnier : Semaine", week_of_trough, "\n")
```
Visualisation de la saisonnalité
```{r}
seasonal_cycle_data <- data.frame(
Week = 1:52,
Seasonal_Effect = seasonal_component[1:52]
)
ggplot(seasonal_cycle_data, aes(x = Week, y = Seasonal_Effect)) +
geom_line(color = "darkgreen") +
labs(title = "Composante Saisonnière (Oscillation Périodique) du CO2 à Mauna Loa",
subtitle = "Effet moyen sur une année",
x = "Semaine de l'année", y = "Effet saisonnier (ppm)") +
theme_minimal()
```
On retrouve bien le pic saisonnier en semaine 26 (vers fin juin) et le creux en semaine 46 (vers mi novembre).
### Modèle de contribution lente
Filtrer les données
```{r}
start_filter_date <- as.Date("1959-01-01")
end_filter_date <- as.Date("2024-12-31")
co2_data_filtered <- co2_data[co2_data$Date >= start_filter_date & co2_data$Date <= end_filter_date, ]
```
On vérifie que cette data frame contient des données
```{r}
if (nrow(co2_data_filtered) == 0) {
stop("Aucune donnée disponible dans la plage de dates spécifiée.")
}
```
Conversion de la colonne CO2 et imputer les valeurs manquantes
```{r}
co2_ts <- ts(co2_data_filtered$CO2_Concentration_ppm,
start = c(1959, 1),
frequency = 52)
co2_ts_imputed <- na.interp(co2_ts)
```
Création d'un data frame avec les années et les valeurs de CO2
```{r}
years <- time(co2_ts_imputed)
co2_df <- data.frame(Year = years, CO2 = as.numeric(co2_ts_imputed))
```
Ajustement du modèle de régression linéaire
```{r}
model <- lm(CO2 ~ Year, data = co2_df)
summary (model)
```
Extrapolation jusqu'en 2025
```{r}
future_years <- data.frame(Year = seq(1959, 2025, by = 1))
print(head(future_years))
future_contributions <- predict(model, newdata = future_years)
```
Ajuster les prédictions au data frame
```{r}
future_years$Predicted_CO2 <- future_contributions
```
Visualisation
```{r}
ggplot(co2_df, aes(x = Year, y = CO2)) +
geom_point(color = "blue") +
geom_line(aes(y = predict(model)), color = "red") +
geom_line(data = future_years, aes(y = Predicted_CO2), color = "black", linetype = "dashed") +
labs(title = "Modèle de Contribution Lente du CO2 à Mauna Loa",
subtitle = "Ajustement et Extrapolation jusqu'en 2025",
x = "Année", y = "Concentration de CO2 (ppm)") +
theme_minimal()
```
Le bleu correspond aux points de données historiques (valeurs récupérés dans le jeu de données), la tendance est en rouge et la présiction en pointillés vert.
Faisons un zoom sur la période 2020-2025
```{r}
ggplot(co2_df, aes(x = Year, y = CO2)) +
geom_point(color = "blue") +
geom_line(aes(y = predict(model)), color = "red") +
geom_line(data = future_years, aes(x = Year, y = Predicted_CO2), color = "black", linetype = "dashed") +
labs(title = "Modèle de Contribution Lente du CO2 à Mauna Loa",
subtitle = "Ajustement et Extrapolation jusqu'en 2025",
x = "Année", y = "Concentration de CO2 (ppm)") +
xlim(2020, 2025) +
theme_minimal()
```
Il semble que les valeurs de CO2 collectées soient au dessus de la prédiction faite pour les années à venir.
---
title: "Votre titre"
author: "Votre nom"
date: "La date du jour"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Quelques explications
Ceci est un document R markdown que vous pouvez aisément exporter au format HTML, PDF, et MS Word. Pour plus de détails sur R Markdown consultez <http://rmarkdown.rstudio.com>.
Lorsque vous cliquerez sur le bouton **Knit** ce document sera compilé afin de ré-exécuter le code R et d'inclure les résultats dans un document final. Comme nous vous l'avons montré dans la vidéo, on inclue du code R de la façon suivante:
```{r cars}
summary(cars)
```
Et on peut aussi aisément inclure des figures. Par exemple:
```{r pressure, echo=FALSE}
plot(pressure)
```
Vous remarquerez le paramètre `echo = FALSE` qui indique que le code ne doit pas apparaître dans la version finale du document. Nous vous recommandons dans le cadre de ce MOOC de ne pas utiliser ce paramètre car l'objectif est que vos analyses de données soient parfaitement transparentes pour être reproductibles.
Comme les résultats ne sont pas stockés dans les fichiers Rmd, pour faciliter la relecture de vos analyses par d'autres personnes, vous aurez donc intérêt à générer un HTML ou un PDF et à le commiter.
Maintenant, à vous de jouer! Vous pouvez effacer toutes ces informations et les remplacer par votre document computationnel.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment