From 77ae6b096ca76242a39322c3ade79749a0cd8d67 Mon Sep 17 00:00:00 2001 From: 5df0875d2ff9f31ed31be4d00018d3ff <5df0875d2ff9f31ed31be4d00018d3ff@app-learninglab.inria.fr> Date: Wed, 6 Aug 2025 07:50:13 +0000 Subject: [PATCH] Update exercice_fr.Rmd --- module3/exo3/LLeymarie.Rmd | 243 +++++++++++++++++++++++++++++++++++ module3/exo3/exercice_fr.Rmd | 33 ----- 2 files changed, 243 insertions(+), 33 deletions(-) create mode 100644 module3/exo3/LLeymarie.Rmd delete mode 100644 module3/exo3/exercice_fr.Rmd diff --git a/module3/exo3/LLeymarie.Rmd b/module3/exo3/LLeymarie.Rmd new file mode 100644 index 0000000..730f6dc --- /dev/null +++ b/module3/exo3/LLeymarie.Rmd @@ -0,0 +1,243 @@ +--- +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. diff --git a/module3/exo3/exercice_fr.Rmd b/module3/exo3/exercice_fr.Rmd deleted file mode 100644 index 7eece5e..0000000 --- a/module3/exo3/exercice_fr.Rmd +++ /dev/null @@ -1,33 +0,0 @@ ---- -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 . - -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. -- 2.18.1