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
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")
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"