Add new file

parent 319a88da
---
title: "CO2 concentration in the atmosphere"
author: "Solene Loembe Riant"
date: "2025-12-09"
output: html_document
---
# Concentration du CO2 dans l'atmosphere
## Consignes
1. Réalisez un graphique qui vous montrera une oscillation périodique superposée à une évolution systématique plus lente.
2. Séparez ces deux phénomènes. Caractérisez l'oscillation périodique. Proposez un modèle simple de la contribution lente, estimez ses paramètres et tentez une extrapolation jusqu'à 2025 (dans le but de pouvoir valider le modèle par des observations futures).
```{r}
library(ggplot2)
path <- "monthly_in_situ_co2_mlo.csv"
path
```
```{r}
# On lit toutes les lignes
lines <- readLines(path)
lines
```
On constate que les données exploitables dans le document commencent ligne [65]. On va nettoyer le csv et regenerer un csv df.
```{r}
header_line <- lines[62] # nom des colonnes
data_lines <- lines[65:length(lines)] # les données
csv_text <- c(header_line, data_lines)
con <- textConnection(csv_text)
df <- read.csv(con, stringsAsFactors = FALSE)
close(con)
```
## 1. Graphique de l'oscillation + évolution lente
```{r}
names(df) <- c("year", "month", "excel_date", "decimal_date",
"co2_raw", "co2_seas_adj", "fit", "fit_seas_adj",
"co2_filled", "co2_seas_adj_filled", "station")
to_clean <- c("co2_raw", "co2_seas_adj", "fit", "fit_seas_adj",
"co2_filled", "co2_seas_adj_filled")
for (col in to_clean) {
df[[col]] <- as.numeric(df[[col]])
df[[col]][df[[col]] == -99.99] <- NA
}
# Créer une colonne date (milieu du mois)
df$date <- as.Date(sprintf("%04d-%02d-15", df$year, df$month))
ggplot(df, aes(x = excel_date, y = co2_filled)) +
geom_line() +
labs(
x = "Date",
y = expression(paste("CO"[2], " (ppm)")),
title = expression(paste("CO"[2], " mensuel à Mauna Loa : ",
"oscillation saisonnière + tendance à long terme"))
) +
theme_minimal()
```
## 2. Modèle simple de la tendance lente
```{r}
# On ajuste sur la série seasonally adjusted filled pour les années ≤ 2015
mask_fit <- !is.na(df$co2_seas_adj_filled) & df$year <= 2015
lm_trend <- lm(co2_seas_adj_filled ~ decimal_date, data = df[mask_fit, ])
coef(lm_trend)
# a = pente, b = intercept
a <- coef(lm_trend)["decimal_date"]
b <- coef(lm_trend)["(Intercept)"]
# Calcul de la tendance sur toute la série
df$trend_linear <- a * df$decimal_date + b
# Composante oscillante (résidu)
df$oscillation <- df$co2_filled - df$trend_linear
# Graphique : série + tendance
ggplot(df, aes(x = date)) +
geom_line(aes(y = co2_filled, colour = "CO2 mensuel (rempli)")) +
geom_line(aes(y = trend_linear, colour = "Tendance linéaire (ajustée jusqu'en 2015)")) +
labs(
x = "Date",
y = expression(paste("CO"[2], " (ppm)")),
title = "Décomposition simple : série observée = tendance lente + oscillation",
colour = ""
) +
theme_minimal()
```
## 2'.Oscillation saisonnière
```{r}
df$month_int <- df$month
monthly_cycle <- aggregate(oscillation ~ month_int, data = df, FUN = mean, na.rm = TRUE)
amp <- (max(monthly_cycle$oscillation) - min(monthly_cycle$oscillation)) / 2
month_of_max <- monthly_cycle$month_int[which.max(monthly_cycle$oscillation)]
month_of_min <- monthly_cycle$month_int[which.min(monthly_cycle$oscillation)]
#Pour la lisibilité
cat("Amplitude ~", amp, "ppm\n")
cat("Mois du maximum moyen :", month_of_max, "\n")
cat("Mois du minimum moyen :", month_of_min, "\n")
```
```{r}
ggplot(monthly_cycle, aes(x = month_int, y = oscillation)) +
geom_line(color = "red") +
geom_point(color = "red") +
scale_x_continuous(breaks = 1:12) +
labs(
x = "Mois",
y = "Résidu (ppm)",
title = expression(paste("Cycle saisonnier moyen du CO"[2],
" (résidu après retrait de la tendance linéaire)"))
) +
theme_minimal()
```
## 2". Extrapolation de la tendance lente jusqu'à 2025
```{r}
co2_trend_2025 <- a * 2025 + b
cat("Tendance linéaire prédite pour 2025 :", co2_trend_2025, "ppm\n")
# Pour comparer avec les données 2025 (si présentes)
mean_2025_adj <- with(subset(df, year == 2025), mean(co2_seas_adj_filled, na.rm = TRUE))
mean_2025_raw <- with(subset(df, year == 2025), mean(co2_filled, na.rm = TRUE))
cat("Moyenne 2025 (seasonally adjusted filled) :", mean_2025_adj, "ppm\n")
cat("Moyenne 2025 (raw filled) :", mean_2025_raw, "ppm\n")
```
## Observations
*L’analyse réalisée à partir des mesures mensuelles de CO₂ atmosphérique à l’observatoire de Mauna Loa met clairement en évidence deux composantes distinctes du signal : une augmentation systématique à long terme et une oscillation saisonnière bien marquée.*
La tendance générale met en évidence une ***augmentation presque linéaire durant les premières décennies***. Le modèle linéaire ajusté sur la période historique (jusqu’en 2015) fournit une estimation d’environ +1,5 ppm/an, ce qui reflète l’accélération des émissions de gaz à effet de serre depuis.
Cependant, la comparaison avec les valeurs réellement observées en 2025 montre que le modèle linéaire sous-estime la concentration future, ce qui suggère que **la croissance du CO₂ n’est plus simplement linéaire mais s’accélère avec le temps**.
Pour ce qui est de l'oscillation saisonnière, elle est régulière sur l'année. Son amplitude moyenne est d’environ ±3 ppm autour de la tendance, pour un cycle complet de 12 mois. **La concentration atteint généralement un maximum au printemps (mai) puis décroît jusqu’à un minimum en automne (octobre)**.
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