Introduction

En 1958, Charles David Keeling a initié une mesure de la concentration de CO2 dans l’atmosphère à l’observatoire de Mauna Loa, Hawaii, États-Unis qui continue jusqu’à aujourd’hui. L’objectif initial était d’étudier la variation saisonnière, mais l’intérêt s’est déplacé plus tard vers l’étude de la tendance croissante dans le contexte du changement climatique. En honneur à Keeling, ce jeu de données est souvent appelé “Keeling Curve” (voir pour l’histoire et l’importance de ces données).

Les données sont disponibles sur le site Web de l’institut Scripps. Utilisez le fichier avec les observations hebdomadaires. Attention, ce fichier est mis à jour régulièrement avec de nouvelles observations. Notez donc bien la date du téléchargement, et gardez une copie locale de la version précise que vous analysez. Faites aussi attention aux données manquantes.

Le fichier a été téléchargé le 08/12/2023. On télécharge le document via le site Scrippsco2 On observe le fichier et on voir que les 44 premières lignes sont des commentaires. On va donc retirer les 43 premières lignes.

knitr::opts_chunk$set(eval = TRUE)
data_url = "https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv"
data = read.csv2(data_url, header= TRUE, sep= ",", skip=43, row.names = NULL)

Une copie locale du fichier a été sauvegarder au cas où les donnée soient modifiées ou supprimées. Il est possible d’ouvrir le fichier soit avec la version en ligne, soit via la copie locale.

data_file = "weekly_in_situ_co2_mlo.csv"
if (!file.exists(data_file)) {
    download.file(data_url, data_file, method="auto")
}
data <- weekly_in_situ_co2_mlo
## Error in eval(expr, envir, enclos): objet 'weekly_in_situ_co2_mlo' introuvable

Préparation et inspection des données

On regarde la base de données et comment sont codées les variables.

head(data)
##    row.names
## 1 1958-03-29
## 2 1958-04-05
## 3 1958-04-12
## 4 1958-04-19
## 5 1958-04-26
## 6 1958-05-03
##   X.indicated.by.the.date.in.the.first.column..............................
## 1                                                                    316.19
## 2                                                                    317.31
## 3                                                                    317.69
## 4                                                                    317.58
## 5                                                                    316.48
## 6                                                                    316.95
tail(data)
##       row.names
## 3342 2023-09-09
## 3343 2023-09-16
## 3344 2023-09-23
## 3345 2023-09-30
## 3346 2023-10-07
## 3347 2023-10-14
##      X.indicated.by.the.date.in.the.first.column..............................
## 3342                                                                    418.28
## 3343                                                                    418.52
## 3344                                                                    417.77
## 3345                                                                    417.89
## 3346                                                                    418.10
## 3347                                                                    418.82

Les données vont de 1958 à 2023, et la concentration en CO2 est représenté par un indice chaque semaine.

On regarde s’il y a des données manquantes

na_records = apply(data, 1, function (x) any(is.na(x)))
data[na_records,]
## [1] row.names                                                                
## [2] X.indicated.by.the.date.in.the.first.column..............................
## <0 lignes> (ou 'row.names' de longueur nulle)

Aucune données n’est manquantes dans la base de données.

On va renommer les colonnes pour pouvoir mieux analyser les données

colnames(data) <- c("Date", "CO2")
data<-data[-1,]

On regarde ensuite comment sont codés les variables.

class(data$Date) #character
## [1] "character"
class(data$CO2) #numeric
## [1] "character"

La variable Date est codé comme un character et la variable CO2 comme un numérique. On va transformer la variable Date en format date. Les données date sont sous le format Année-mois-jour.

data$Date = as.Date(data$Date)
class(data$Date)
## [1] "Date"

La vairable “Date” est maintenant codé comme une date.

On vérifie bien qu’il y est 7 jours entre chaque semaine

data = data[order(data$Date),]
all(diff(data$Date) == 7)
## [1] FALSE

chaque semaine commence un samedi.

On crée une variable année et une variable mois, pour regarder l’évolution annuelle et mensuelle de la concentration en CO2

data$Année <- format(as.Date(data$Date, format= "%Y-%m-%d"), "%Y")
data$Mois<- format(as.Date(data$Date, format= "%Y-%m-%d"), "%Y-%m")

Observation des données

On regarde ensuite la distibution de la moyenne de la concentration anuuelle de 1958 à 2023

class(data$Année)
## [1] "character"
data$Année = as.numeric(data$Année)

library(dplyr)
## 
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     filter, lag
## Les objets suivants sont masqués depuis 'package:base':
## 
##     intersect, setdiff, setequal, union
data_annual_mean <- data %>%
  group_by(Année) %>%
  summarise(mean_CO2 = mean(CO2, na.rm= TRUE))
  
plot(data_annual_mean, type="l", xlab="Année", ylab="Concentratin moyenne annuelle en CO2")
## Error in plot.window(...): valeurs finies requises pour 'ylim'

Interprétation: on observe une augmentation de la concentration moyenne en CO2 de 1958 à 2023.

On cherche maintenant à montrer une oscillation périodique et l’évolution systématique plus lente. Pour cela nous avons utilisé la sinusoide avec le package ggplot2

library(ggplot2)
## Warning: le package 'ggplot2' a été compilé avec la version R 4.2.3
x <- data$Date
y <- sin(data$CO2)
## Error in sin(data$CO2): argument non numérique pour une fonction mathématique
data_periodique <-data.frame(x, y, data$CO2)
## Error in data.frame(x, y, data$CO2): objet 'y' introuvable
ggplot(data_periodique, aes(x, y)) + geom_line(aes(y= y), color = "blue") + geom_line(aes(y= data.CO2), color = "red")
## Error in ggplot(data_periodique, aes(x, y)): objet 'data_periodique' introuvable

On regarde l’oscillation seule des années 2000 à 2023:

year_2000 <- subset(data, Année >= 2000)
evolution <- sin(year_2000$CO2)
## Error in sin(year_2000$CO2): argument non numérique pour une fonction mathématique
data_periodique_2000 <-data.frame(year_2000$Date, year_2000$CO2)
ggplot(data_periodique_2000, aes(year_2000.Date, year_2000.CO2)) + geom_line()

Sur le graphique on voit bien que l’on a une oscillation chaque année et que ces oscillations augmentent chaque année. On regarde ensuite en détaille une année. Nous avons chois l’année 2000 comme exemple.

year_2000_2 <- subset(data, Année == 2000)
evolution <- sin(year_2000_2$CO2)
## Error in sin(year_2000_2$CO2): argument non numérique pour une fonction mathématique
data_periodique_2000_2 <-data.frame(year_2000_2$Date, year_2000_2$CO2)
ggplot(data_periodique_2000_2, aes(year_2000_2.Date, year_2000_2.CO2)) + geom_line()

Nous pouvons observer que le pique de l’oscillation se trouve vers le mois de juin, là où nous avons la concentration la plus haute en CO2. La concentration la plus base se situe vers le mois d’octobre.

Nous regardons ensuite la modélisation de l’évolution de la concentration en CO2. Ici, nous allons utiliser une régression linéaire siple.

model <- lm(Date ~ CO2, data)
summary(model)
## Error in Ops.difftime((f - mean(f)), 2): '^' non defini pour des objets "difftime"