Update exercice_fr.Rmd mal copié

parent 13527abf
......@@ -15,80 +15,60 @@ header-includes:
- \hypersetup{colorlinks=true,pagebackref=true}
---
{r setup, include=FALSE}
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
Préparation des données
## Préparation des données
Les données de la concentration de CO2 dans l'atmosphère à l'observatoire de Mauna Loa, Hawaii, États-Unis, initié par Charles David Keeling en 1958, sont disponibles depuis le site Web de l'institut Scripps. Les observations hebdomadaires sont récupérées sous la forme d'un fichier au format CSV. Le téléchargement a été effectué le 25 novembre 2024. L'URL est:
Les données de la concentration de CO2 dans l'atmosphère à l'observatoire de Mauna Loa, Hawaii, États-Unis, initié par Charles David Keeling en 1958, sont disponibles depuis le site Web de [l'institut Scripps](https://scrippsco2.ucsd.edu/data/atmospheric_co2/primary_mlo_co2_record.html). Les observations hebdomadaires sont récupérées sous la forme d'un fichier au format CSV. Le téléchargement a été effectué le 25 novembre 2024. L'URL est:
{r}
```{r}
data_url = "https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/monthly/monthly_in_situ_co2_mlo.csv"
```
Nous faisons une copie locale de ce jeu de données car ce fichier est régulièrement mis à jour, nous téléchargeons les données seulement si la copie locale n'existe pas.
{r}
```{r}
data_file = "co2.csv"
if (!file.exists(data_file)) {
download.file(data_url, data_file, method="auto")
}
```
Voici l'explication des colonnes incluse dans le jeu de données :
Nom de colonne
| Nom de colonne | Libellé de colonne |
|-----------------|-------------------------------------------------------|
| `Yr`, `Mn`, `Date`, `Date.1` | donnent la date dans des formats différents |
| `CO2` | concentration mensuelle de CO2 à Mauna Loa en micro-mol de CO2 par mole (ppm), ajustée sur 24:00 heures pour le 15ème jour de chaque mois |
| `seasonally` | même donnée que la colonne `CO2` mais avec le cycle saisonnier retiré |
| `fit` | données lissées |
| `seasonally.1` | données lissées avec saisonnalité retirée |
| `CO2.1` | même donnée que colonne `CO2` mais avec les valeurs manquantes remplacées par les données de la colonne `fit` |
| `seasonnally.2` | même données que `seasonnally`avec valeurs manquantes remplacées par valeurs de `seasonnally.1`, les valeurs manquantes sont notées `-99.99` |
| `Sta` | identifiant en 3 lettres de la station d'échantillonnage, MLO pour l'observatoire de Mauna Loa et MKO pour le sommet du Maunakea dont les données ont été utilisées pour combler les trous laissés entre décembre 2022 et février 2023 par l'éruption de Mauna Loa. |
Libellé de colonne
Les 61 premières lignes du fichier CSV sont des commentaires sur le contenu du fichier, la manière de citer, etc... que nous ignorons en précisant `skip=61`.
Yr, Mn, Date, Date.1
### Lecture
donnent la date dans des formats différents
CO2
concentration mensuelle de CO2 à Mauna Loa en micro-mol de CO2 par mole (ppm), ajustée sur 24:00 heures pour le 15ème jour de chaque mois
seasonally
même donnée que la colonne CO2 mais avec le cycle saisonnier retiré
fit
données lissées
seasonally.1
données lissées avec saisonnalité retirée
CO2.1
même donnée que colonne CO2 mais avec les valeurs manquantes remplacées par les données de la colonne fit
seasonnally.2
même données que seasonnallyavec valeurs manquantes remplacées par valeurs de seasonnally.1, les valeurs manquantes sont notées -99.99
Sta
identifiant en 3 lettres de la station d'échantillonnage, MLO pour l'observatoire de Mauna Loa et MKO pour le sommet du Maunakea dont les données ont été utilisées pour combler les trous laissés entre décembre 2022 et février 2023 par l'éruption de Mauna Loa.
Les 61 premières lignes du fichier CSV sont des commentaires sur le contenu du fichier, la manière de citer, etc... que nous ignorons en précisant skip=61.
Lecture
{r}
```{r}
data = read.csv(data_file, skip=61)
```
Regardons ce que nous avons obtenu:
{r}
```{r}
head(data)
tail(data)
```
Modification des noms de colonnes
### Modification des noms de colonnes
Les deux premières lignes correspondent à la suite des noms de colonnes qui ont été interprétées comme observations. Nous devons donc ramener les éléments de ces deux lignes dans les noms de colonnes. Pour cela nous créons un vecteur vide new_colnamesqui permettra de stocker nos nouveaux noms de variables. Nous pouvons remarquer que certaines cases contiennent des NA, si c'est le cas il ne sert à rien de les coller au nom de colonne d'origine et nous passons ces cases. Certaines cases sont remplies d'espaces mais ne contiennent pas de NA donc nous passons également ces cases. Nous fonctionnons de manière itérative en collant les cases à chaque nom de colonne puis nous ajoutons le nouveau nom de la colonne au vecteur new_colnames. Nous vérifions les nouveaux noms de colonne en affichant le vecteur final.
Les deux premières lignes correspondent à la suite des noms de colonnes qui ont été interprétées comme observations. Nous devons donc ramener les éléments de ces deux lignes dans les noms de colonnes. Pour cela nous créons un vecteur vide `new_colnames`qui permettra de stocker nos nouveaux noms de variables. Nous pouvons remarquer que certaines cases contiennent des `NA`, si c'est le cas il ne sert à rien de les coller au nom de colonne d'origine et nous passons ces cases. Certaines cases sont remplies d'espaces mais ne contiennent pas de `NA` donc nous passons également ces cases. Nous fonctionnons de manière itérative en collant les cases à chaque nom de colonne puis nous ajoutons le nouveau nom de la colonne au vecteur `new_colnames`. Nous vérifions les nouveaux noms de colonne en affichant le vecteur final.
{r}
```{r}
new_colnames <- vector()
for (j in 1:length(colnames(data))){
x <- colnames(data)[[j]]
......@@ -104,85 +84,98 @@ for (j in 1:length(colnames(data))){
new_colnames <- c(new_colnames, x)
}
print(new_colnames)
```
Les nouveaux noms semblent corrects, nous allons à présent les indiquer comme nouveaux noms de colonnes puis nous supprimerons les deux premières lignes car elles ne sont plus utiles.
{r}
```{r}
colnames(data) <- new_colnames
data <- data[-c(1:2),]
```
Nous pouvons vérifier l'apparence du début de notre jeu de données, les noms ont bien été modifié et les 2 premières lignes retirées.
{r}
```{r}
head(data)
```
Types des colonnes
### Types des colonnes
L'observation des premières lignes de données mettent en évidence que les colonnes de concentration de CO2 (colonnes 5 à 10) sont toutes considérées comme de type characterce qui est probablement dû aux deux premières lignes qui ont été retirées et qui contenaient des mots. Nous devons donc changer le type de ces colonnes pour le type numeric.
L'observation des premières lignes de données mettent en évidence que les colonnes de concentration de CO2 (colonnes 5 à 10) sont toutes considérées comme de type `character`ce qui est probablement dû aux deux premières lignes qui ont été retirées et qui contenaient des mots. Nous devons donc changer le type de ces colonnes pour le type `numeric`.
{r}
```{r}
data[,5:10] <- lapply(data[,5:10], as.numeric)
```
Valeurs manquantes
### Valeurs manquantes
De plus, nous voyons dans les premières lignes de données des observations avec des valeurs de CO2 de -99.99. Les commentaires du fichier indiquent que les valeurs manquantes sont indiquées par cette valeur. Il faudrait donc convertir tous les -99.99 en NA afin de les traiter comme tels.
De plus, nous voyons dans les premières lignes de données des observations avec des valeurs de CO2 de `-99.99`. Les commentaires du fichier indiquent que les valeurs manquantes sont indiquées par cette valeur. Il faudrait donc convertir tous les `-99.99` en `NA` afin de les traiter comme tels.
{r}
```{r}
data[data == -99.99] <- NA
```
Maintenant, nous pouvons mesurer la quantité de NAdans nos données.
Maintenant, nous pouvons mesurer la quantité de `NA`dans nos données.
{r}
```{r}
na_records = apply(data, 1, function (x) any(is.na(x)))
data[na_records,]
```
Nous avons ainsi 9 lignes contenant des NA avec deux cas précis : - soit toutes les cases des colonnes de valeurs numériques sont des NA, c'est le cas des observations de janvier et février 1958 (les mesures ont commencées en mars 1958) et de novembre et décembre 2024 (pas encore écoulés au moment de l'analyse) - soit les deux premières colonnes présentent effectivement des NA mais les autres contiennent des valeurs calculées à partir du lissage des données permettant de remplir les cases de ces observations à l'origine manquantes. (infomation donnée dans les commentaires du fichier)
Nous avons ainsi 9 lignes contenant des `NA` avec deux cas précis : - soit toutes les cases des colonnes de valeurs numériques sont des `NA`, c'est le cas des observations de janvier et février 1958 (les mesures ont commencées en mars 1958) et de novembre et décembre 2024 (pas encore écoulés au moment de l'analyse) - soit les deux premières colonnes présentent effectivement des `NA` mais les autres contiennent des valeurs calculées à partir du lissage des données permettant de remplir les cases de ces observations à l'origine manquantes. (infomation donnée dans les commentaires du fichier)
Nous savons donc à présent que 4 mois (janvier et février 1958, novembre et décembre 2024) ne pourront pas être utilisés, pour les autres il sera possible d'utiliser une valeur approximée par lissage. Nous allons donc retirer les deux premières (janvier et février 1958) et les deux dernières (novembre et décembre 2024) lignes.
{r}
```{r}
data <- data[-c(1,2,803,804),]
```
Conversion des dates
### Conversion des dates
Les deux colonnes de dates qui nous intéressent sont Yr pour l'année et Mn pour le mois. Nous pouvons vérifier leurs classes:
Les deux colonnes de dates qui nous intéressent sont `Yr` pour l'année et `Mn` pour le mois. Nous pouvons vérifier leurs classes:
{r}
```{r}
class(data$Yr)
class(data$Mn)
```
Puisque nous travaillons sur une série temporelle, il est possible de créer un objet de type ts pour "time series" avec lequel il sera simple d'effectuer des analyses. Pour cela, il suffit d'utiliser la fonction ts avec la colonne 9, qui contient les valeurs de la colonne 5 mais avec les valeurs manquantes replies par lissage. L'argument frequency prend la valeur 12 car c'est une série mensuelle, l'argument start commence à la première ligne du tableau avec l'année contenue dans la colonne Yr et le mois dans la colonne Mn.
Puisque nous travaillons sur une série temporelle, il est possible de créer un objet de type `ts` pour "time series" avec lequel il sera simple d'effectuer des analyses. Pour cela, il suffit d'utiliser la fonction `ts` avec la colonne 9, qui contient les valeurs de la colonne 5 mais avec les valeurs manquantes replies par lissage. L'argument `frequency` prend la valeur 12 car c'est une série mensuelle, l'argument `start` commence à la première ligne du tableau avec l'année contenue dans la colonne `Yr` et le mois dans la colonne `Mn`.
{r}
```{r}
TS_CO2 <- ts(data = data$`CO2.1 filled [ppm]`, frequency = 12, start = c(data[1, "Yr"],
data[1, "Mn"]))
class(TS_CO2)
```
Inspection
### Inspection
Nous pouvons à présent regarder à quoi ressemblent nos données en visualisant notre objet de type série temporelle, c'est à dire la concentration de CO2 en fonction du temps.
{r}
```{r}
plot(TS_CO2, type="l", xlab="Date", ylab="Concentration en CO2 (ppm)", main = "Evolution de la concentration en CO2 (ppm) à Mauna Loa depuis 1958 \n (valeurs manquantes remplies)", lwd = 1.6, bty = "l")
```
Nous retrouvons la fameuse courbe mettant en évidence l'évolution systématique et l'oscillation périodique de la concentration en CO2 à Mauna Loa depuis 1958.
La fonction decompose permet de décomposer une série temporelle en séparant la tendance, la saisonnalité/périodicité et les éléments de variation aléatoire. L'objet décomposé peut ensuite être visualisé.
La fonction `decompose` permet de décomposer une série temporelle en séparant la tendance, la saisonnalité/périodicité et les éléments de variation aléatoire. L'objet décomposé peut ensuite être visualisé.
{r}
```{r}
TS_CO2_decomp <- decompose(TS_CO2)
plot(TS_CO2_decomp, xlab="Date", lwd = 1.6, bty = "l")
```
Nous pouvons visualiser la tendance et la périodicité séparément :
{r}
```{r}
plot(TS_CO2_decomp$trend, xlab="Date", ylab="Concentration en CO2 (ppm)", main = "Tendance de l'évolution de la concentration en CO2 (ppm) \n à Mauna Loa depuis 1958 \n (valeurs manquantes remplies)", lwd = 1.6, bty = "l")
plot(TS_CO2_decomp$seasonal, xlab="Date", ylab = "", main = "Périodicité de la concentration en CO2 (ppm) \n à Mauna Loa depuis 1958 \n (valeurs manquantes remplies)", lwd = 1.6, bty = "l")
```
Nous pouvons sélectionner un sous-ensemble des 5 dernières années (complètes) pour mieux visualiser la périodicité de la concentration en CO2.
{r}
```{r}
plot(window(TS_CO2_decomp$seasonal, start = 2019, end = 2024), xlab="Date", ylab="", main = "Périodicité de la concentration en CO2 (ppm) \n à Mauna Loa de 2019 à 2024 \n (valeurs manquantes remplies)", lwd = 1.6, bty = "l")
```
Nous pouvons observer que les pics semblent se produire à la fin de l'hiver/ au printemps et les creux à la fin de l'été/à l'automne.
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