diff --git a/module3/exo3/exercice_fr_corrige.Rmd b/module3/exo3/exercice_fr_corrige.Rmd deleted file mode 100644 index 3bf464a49edef6707f587ce03f5fcddb328e066b..0000000000000000000000000000000000000000 --- a/module3/exo3/exercice_fr_corrige.Rmd +++ /dev/null @@ -1,319 +0,0 @@ ---- -title: "Autour du SARS-CoV-2 (Covid-19)" -date: "`r Sys.Date()`" -output: - html_document: - theme: flatly - highlight: tango - toc: true - toc_float: - collapsed: false - smooth_scroll: true - code_folding: show - df_print: paged ---- - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -``` - -Au début de l'année 2020, l'émergence et la diffusion mondiale du coronavirus SARS-CoV-2 (responsable de la Covid-19) ont suscité un besoin sans précédent de suivi épidémiologique en temps réel. Des médias d'information de référence, tels que le *South China Morning Post* (SCMP), ont vulgarisé ces dynamiques au moyen de visualisations interactives montrant le nombre cumulé de personnes infectées par pays depuis le début de la crise. - -Le présent document a pour objectif de reproduire ces analyses de manière transparente et rigoureusement reproductible. En nous appuyant sur les données consolidées par le **Center for Systems Science and Engineering (CSSE) de l'Université Johns Hopkins (JHU)**, nous analyserons la trajectoire de l'épidémie pour un panel de pays cibles, comparerons les représentations en échelle linéaire et logarithmique, et élargirons la réflexion à la mortalité associée. - ------------------------------------------------------------------------- - -# 1. Environnement de travail et reproductibilité - -Dans un premier temps, nous chargeons dans un premier temps l'ensemble des bibliothèques R nécessaire à la modélisation de nos données. - -- `tidyverse` : métapackage fournissant les outils de manipulation (`dplyr`, `tidyr`, `lubridate`) et de visualisation (`ggplot2`). -- `scales` : facilite la mise en forme des axes continus et logarithmiques. - -```{r packages} -# Chargement des packages -library(tidyverse) -library(scales) -``` - -Pour garantir la reproductibilité de l'étude, le fichier contenant les données à analyser se trouve dans le répertoire de travail du dépôt GitLab. Si le fichier n'est pas accessible, décommentez la commande `download.file()`. - -```{r import-cas} -# Décommenter ce bloc de code si le répertoire de travail ne contient pas le fichier -# download.file( -# url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv", -# destfile = "time_series_covid19_confirmed_global.csv" -# ) - -infection_data <- read.csv("time_series_covid19_confirmed_global.csv") -``` - -On vérifie la bonne importatation des données en affichant les premières colonnes du tableau (on limite l'affichage à 7 colonnes, le fichier en comptant plusieurs milliers, cela peut gêner la lisibilité du fichier final) : - -```{r head-cas} -head(infection_data[, 1:7]) -``` - ------------------------------------------------------------------------- - -# 2. Préparation des données - -## 2.1 Règles de filtrage - -Le jeu de données brut se présente sous un format large (*wide format*) où chaque date constitue une colonne distincte. De plus, la gestion territoriale nécessite des règles d'exclusion et d'inclusion strictes : - -1. **Chine et Hong Kong :** les données de la Chine continentale sont agrégées sur l'ensemble de ses provinces, à l'exception explicite de Hong Kong, qui est traitée comme une entité à part entière afin de respecter la présentation originale du SCMP. -2. **Métropoles européennes (France, Pays-Bas, Royaume-Uni) :** conformément aux consignes, nous excluons les territoires d'outre-mer et dépendances insulaires pour ne conserver que les territoires métropolitains (définis par une absence de mention dans le champ `Province.State`). -3. **Autres pays du panel :** Belgique, Allemagne, Iran, Italie, Japon, Corée du Sud, Portugal, Espagne et États-Unis. - -```{r filtrage-cas} -# Liste des pays d'intérêt (noms tels qu'ils figurent dans le fichier du JHU) -pays <- c("China", "France", "Germany", "Italy", "Spain", "United Kingdom", - "Japan", "Korea, South", "US", "Netherlands", "Belgium", "Portugal", "Iran") - -clean_infection_data <- infection_data |> - filter(Country.Region %in% pays) |> # On ne garde que les pays d'intérêt - filter(Province.State == "" | Country.Region == "China") |> # Territoires métropolitains + toutes les provinces chinoises - mutate(Country.Region = ifelse(Province.State == "Hong Kong", - "Hong Kong", Country.Region)) # Hong Kong devient une entité à part - -head(clean_infection_data[, 1:7]) # Même limitation à 7 colonnes pour la lisibilité -``` - -## 2.2 Réorganisation des dates - -Dans le tableau d'origine, il y a deux problèmes avec les dates : - -- elles ne sont pas dans un format facile à lire, et sont mal interprétées par R (préfixe `X`, format mois.jour.année) ; -- chaque date représente une colonne, alors qu'il serait plus simple d'avoir une colonne `date` (en abscisse) et une colonne `cases` portant les valeurs (en ordonnée). De cette manière, on s'évite aussi les colonnes vides dans la plupart des pays pour les premiers mois de 2020. - -Ce cas est fréquent et une fonction est connue pour le résoudre : `pivot_longer()` (inclut dans Tidyverse) - -```{r pivot-cas} -infection_data_long <- clean_infection_data |> - pivot_longer(cols = starts_with("X"), # Colonnes à pivoter - names_to = "date", # Nom de la colonne accueillant les noms - values_to = "cases") # Nom de la colonne accueillant les valeurs - -head(infection_data_long) -``` - -La fonction head nous permet de constater que le tableau est mainteant beaucoup plus lisible et au format désiré. - -Nous pouvons maintenant convertir les dates au format ISO, ce qui normalise leur format et les rend lisibles pour un lecteur humain : - -```{r dates-cas} -# On retire le préfixe "X", puis on convertit avec mdy() (mois-jour-année), -# fonction de lubridate, présente dans le tidyverse et robuste aux séparateurs -clean_date_data <- infection_data_long |> - mutate(date = mdy(sub("X", "", date))) - -head(clean_date_data) -class(clean_date_data$date) -``` - -Les fonctions head et class nous permette de voir que, les dates sont au bon format et qu'elles sont bien considérées comme des dates par R. - -# 3. Visualisation de la dynamique des contaminations - -Pour éviter de répéter le même code de mise en forme, nous définissons une fois pour toutes le thème commun à nos graphiques. - -```{r theme} -theme_covid <- theme(axis.title = element_text(face = "bold"), - plot.title = element_text(face = "bold.italic", hjust = 0.5)) -``` - -## 3.1 Premier essai (données non agrégées) - -Lorsqu'on essaie de tracer un graph classique à partir des données importées dans les sections précédentes, on obtient ce résultat : - -```{r cas-lineaire-brut} -ggplot(clean_date_data) + - aes(x = date, - y = cases, - colour = Country.Region) + - geom_line(linewidth = 1, alpha = 0.7) + - scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) + - labs(title = "Évolution du nombre de cas de Covid-19 (données non agrégées)", - x = "Date", - y = "Cas cumulés", - colour = "Pays") + - theme_covid -``` - - -**Problème constaté :** sur ce graphique, la courbe attribuée à la « Chine » « bave ». Cela est dû au fait que la chine est le seul pays pour lequel on a garder les territoires, et que chacun d'entre eux sont comptabilisés sur l'affichage du graph. - -Pour corriger cela, on agrège les provinces chinoises en une seule valeur par pays et par date : - -```{r agregation-cas} -data_pays <- clean_date_data |> - group_by(Country.Region, date) |> - summarise(cases = sum(cases), .groups = "drop") # Une seule courbe par pays (provinces chinoises additionnées) - -head(data_pays) -``` - -## 3.2 Représentation corrigée en échelle linéaire - -L'échelle linéaire permet d'appréhender le **volume brut absolu** de cas recensés. - -```{r cas-lineaire} -ggplot(data_pays) + - aes(x = date, - y = cases, - colour = Country.Region) + - geom_line(linewidth = 1, alpha = 0.7) + - scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) + - labs(title = "Évolution du nombre de cas de Covid-19", - x = "Date", - y = "Cas cumulés", - colour = "Pays") + - theme_covid -``` - -**Commentaire analytique :**\ -Sur ce graphique linéaire, les États-Unis écrasent visuellement l'ensemble des autres courbes, le nombre total de cas est tellement supérieur à celui des autres pays qu'il écrase les courbes des autres pays ce qui gêne l'analyse de la dynamique de l'épidémie dans les pays d'intérêts. - -## 3.3 Représentation corrigée en échelle logarithmique - -En épidémiologie, la phase initiale de contagion suit un modèle exponentiel de la forme : $$N(t) = N_0 \cdot e^{r \cdot t}$$ En appliquant le logarithme décimal, la relation devient affine : $$\log_{10}(N(t)) = \log_{10}(N_0) + \frac{r}{\ln(10)} \cdot t$$ - -L'échelle logarithmique transforme ainsi la trajectoire exponentielle en une **droite**, dont la pente reflète directement le taux de croissance $r$ (et donc la vitesse de doublement de l'épidémie), indépendamment du nombre initial de cas $N_0$. Reprenons cette fois les données agrégées par pays (`data_pays`), pour ne plus avoir l'artefact de la Chine. - -Plutôt que de transformer nous-mêmes les données, nous laissons `ggplot2` appliquer l'échelle logarithmique avec `scale_y_log10()` : l'axe reste ainsi gradué en nombre de cas. Les valeurs nulles (avant l'arrivée du virus dans un pays) n'ont pas de logarithme : nous les écartons au préalable. - -```{r cas-log} -data_pays |> - filter(cases > 0) |> - ggplot() + - aes(x = date, - y = cases, - colour = Country.Region) + - geom_line(linewidth = 1, alpha = 0.7) + - scale_y_log10(labels = label_number(scale_cut = cut_short_scale())) + - labs(title = "Évolution du nombre de cas de Covid-19 (échelle logarithmique)", - x = "Date", - y = "Cas cumulés (échelle log10)", - colour = "Pays") + - theme_covid -``` - -**Commentaire analytique :**\ -L'échelle logarithmique permet d'avoir un aperçu beaucoup plus clair de la dynamique de l'évolution de l'épidémie, montrant que la dynamique est extrêmement similaire dans tous les pays d'intérêts, indépendamment du nombre de cas. - -Ces deux graphiques permettent de voir que le nombre de cas aux États-Unis est nettement supérieur à celui du reste des pays analysés dans cet exercice mais que la dynamique exponentielle de l'augmentation du nombre de cas est similaire. - ------------------------------------------------------------------------- - -# 4. Question subsidiaire : analyse de la mortalité - -Pour approfondir l'analyse et aborder la question subsidiaire, nous téléchargeons la série temporelle globale des décès enregistrés par le JHU CSSE (`time_series_covid19_deaths_global.csv`). Normalement le fichier est déjà présent dans le dépôt Gitlab, s'il n'y ai pas, décommentez la fonction `download.file()` - -```{r import-deces} -# Décommenter ce bloc de code si le répertoire de travail ne contient pas le fichier -# download.file( -# url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv", -# destfile = "time_series_covid19_deaths_global.csv") - -mortality_data <- read.csv("time_series_covid19_deaths_global.csv") -``` - -Contrôle visuel de la bonne importation des données : - -```{r head-deces} -head(mortality_data[, 1:7]) # Même limitation à 7 colonnes pour la lisibilité -``` - -## 4.1 Uniformisation des données - -Comme le tableau de la mortalité est dans le même format que celui des infections, on peut réutiliser exactement les mêmes étapes pour le nettoyer : filtrage des pays, pivot des dates dans une colonne `date` (les valeurs allant dans une colonne `death`), conversion au format ISO et agrégation par pays. Plutôt que de copier-coller le code, nous l'encapsulons dans une fonction. - -```{r fonction-nettoyage} -preparer_donnees <- function(data, nom_valeur) { - data |> - filter(Country.Region %in% pays) |> - filter(Province.State == "" | Country.Region == "China") |> - mutate(Country.Region = ifelse(Province.State == "Hong Kong", - "Hong Kong", Country.Region)) |> - pivot_longer(cols = starts_with("X"), - names_to = "date", - values_to = nom_valeur) |> - mutate(date = mdy(sub("X", "", date))) |> - group_by(Country.Region, date) |> - summarise(across(all_of(nom_valeur), sum), .groups = "drop") -} - -clean_date_mortality <- preparer_donnees(mortality_data, "death") - -head(clean_date_mortality) -class(clean_date_mortality$date) -``` - -Les données peuvent donc maintenant être directement représentées de manière lisible. - -## 4.2 Représentation graphique de la mortalité - -```{r deces-lineaire} -ggplot(clean_date_mortality) + - aes(x = date, - y = death, - colour = Country.Region) + - geom_line(linewidth = 1, alpha = 0.7) + - scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) + - labs(title = "Évolution du nombre de décès de la Covid-19", - x = "Date", - y = "Décès cumulés", - colour = "Pays") + - theme_covid -``` - -Pour mieux visualiser les différences entre pays, on peut observer ce que donnent les données sur une échelle logarithmique : - -```{r deces-log} -clean_date_mortality |> - filter(death > 0) |> - ggplot() + - aes(x = date, - y = death, - colour = Country.Region) + - geom_line(linewidth = 1, alpha = 0.7) + - scale_y_log10(labels = label_number(scale_cut = cut_short_scale())) + - labs(title = "Évolution du nombre de décès de la Covid-19 (échelle logarithmique)", - x = "Date", - y = "Décès cumulés (échelle log10)", - colour = "Pays") + - theme_covid -``` - ------------------------------------------------------------------------- - -# 5. Conclusion générale - -Ce travail a permis de reproduire, à partir des données du CSSE de l'Université Johns Hopkins, les courbes de cas cumulés de Covid-19 pour un panel de pays, puis de les étendre à la mortalité. Sur le plan méthodologique, il a fallu restructurer un jeu de données large en format long (`pivot_longer()`), normaliser les dates, appliquer des règles territoriales strictes (métropoles seules, Hong Kong isolé de la Chine) et agréger les provinces chinoises pour éviter des courbes parasites. Le tableau ci-dessous résume la situation à la dernière date disponible. - -```{r bilan} -bilan <- data_pays |> - inner_join(clean_date_mortality, by = c("Country.Region", "date")) |> - filter(date == max(date)) |> - mutate(letalite_apparente = round(100 * death / cases, 2)) |> - arrange(desc(cases)) |> - select(Pays = Country.Region, - `Cas cumulés` = cases, - `Décès cumulés` = death, - `Létalité apparente (%)` = letalite_apparente) - -bilan -``` - -**Ce que montrent les graphiques.** En échelle linéaire, les États-Unis dominent nettement, tant pour les cas que pour les décès : leur cumul est de plusieurs fois supérieur à celui de chacun des autres pays du panel. L'échelle logarithmique met en évidence la phase exponentielle du début de l'épidémie, commune à la plupart des pays occidentaux, et rend comparables des pays de tailles très différentes. Elle révèle aussi des trajectoires atypiques : la Chine se stabilise très tôt avant une brusque hausse fin 2022, tandis que Hong Kong et la Corée du Sud connaissent une flambée massive début 2022. Côté mortalité, les pays européens (Royaume-Uni, Italie, France, Allemagne) se regroupent à un niveau nettement inférieur à celui des États-Unis. - -**Limites de l'analyse.** - -- Les valeurs sont des cumuls en valeur absolue, non rapportés à la population : la place des États-Unis est en partie liée à leur taille. Une normalisation par habitant (par exemple pour 100 000 habitants) serait la suite logique. -- Les cas confirmés dépendent des politiques de dépistage et des définitions nationales : ils sous-estiment le nombre réel d'infections, de façon différente selon les pays. La même réserve vaut pour les décès, et donc pour la létalité apparente du tableau. -- Les ruptures visibles sur certaines courbes (notamment en Chine début 2023) traduisent des changements de méthode de comptage ou de politique sanitaire autant que des évolutions épidémiques. - - -**Perspectives.** Pour aller plus loin, on pourrait calculer les nouveaux cas quotidiens (lissés sur 7 jours) plutôt que les cumuls, mais aussi pour relativiser le nombre de morts, les comparer avec données de la mortalité normale disponibles sur les sites de l'[INSEE](https://www.insee.fr/fr/information/4470857) ou de l'[OCDE](https://www.oecd-ilibrary.org/sites/5f5b6833-fr/1/2/9/3/index.html?itemId=/content/publication/5f5b6833-fr&_csp_=65ac94c7f4b2dbbf68a7eef9e558ed12&itemIGO=oecd&itemContentType=book) - diff --git a/module3/exo3/exercice_fr_corrige.html b/module3/exo3/exercice_fr_corrige.html deleted file mode 100644 index e4ace49161d07bd5bf21650c062f3cfebbd76b6c..0000000000000000000000000000000000000000 --- a/module3/exo3/exercice_fr_corrige.html +++ /dev/null @@ -1,3446 +0,0 @@ - - - - -
- - - - - - - - - -Au début de l’année 2020, l’émergence et la diffusion mondiale du -coronavirus SARS-CoV-2 (responsable de la Covid-19) ont suscité un -besoin sans précédent de suivi épidémiologique en temps réel. Des médias -d’information de référence, tels que le South China Morning -Post (SCMP), ont vulgarisé ces dynamiques au moyen de -visualisations interactives montrant le nombre cumulé de personnes -infectées par pays depuis le début de la crise.
-Le présent document a pour objectif de reproduire ces analyses de -manière transparente et rigoureusement reproductible. En nous appuyant -sur les données consolidées par le Center for Systems Science -and Engineering (CSSE) de l’Université Johns Hopkins (JHU), -nous analyserons la trajectoire de l’épidémie pour un panel de pays -cibles, comparerons les représentations en échelle linéaire et -logarithmique, et élargirons la réflexion à la mortalité associée.
-Dans un premier temps, nous chargeons dans un premier temps -l’ensemble des bibliothèques R nécessaire à la modélisation de nos -données.
-tidyverse : métapackage fournissant les outils de
-manipulation (dplyr, tidyr,
-lubridate) et de visualisation (ggplot2).scales : facilite la mise en forme des axes continus et
-logarithmiques.## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
-## ✔ dplyr 1.2.1 ✔ readr 2.2.0
-## ✔ forcats 1.0.1 ✔ stringr 1.6.0
-## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
-## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
-## ✔ purrr 1.2.2
-## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
-## ✖ dplyr::filter() masks stats::filter()
-## ✖ dplyr::lag() masks stats::lag()
-## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
-
-##
-## Attachement du package : 'scales'
-##
-## L'objet suivant est masqué depuis 'package:purrr':
-##
-## discard
-##
-## L'objet suivant est masqué depuis 'package:readr':
-##
-## col_factor
-Pour garantir la reproductibilité de l’étude, le fichier contenant
-les données à analyser se trouve dans le répertoire de travail du dépôt
-GitLab. Si le fichier n’est pas accessible, décommentez la commande
-download.file().
# Décommenter ce bloc de code si le répertoire de travail ne contient pas le fichier
-# download.file(
-# url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv",
-# destfile = "time_series_covid19_confirmed_global.csv"
-# )
-
-infection_data <- read.csv("time_series_covid19_confirmed_global.csv")On vérifie la bonne importatation des données en affichant les -premières colonnes du tableau (on limite l’affichage à 7 colonnes, le -fichier en comptant plusieurs milliers, cela peut gêner la lisibilité du -fichier final) :
- -Le jeu de données brut se présente sous un format large (wide -format) où chaque date constitue une colonne distincte. De plus, la -gestion territoriale nécessite des règles d’exclusion et d’inclusion -strictes :
-Province.State).# Liste des pays d'intérêt (noms tels qu'ils figurent dans le fichier du JHU)
-pays <- c("China", "France", "Germany", "Italy", "Spain", "United Kingdom",
- "Japan", "Korea, South", "US", "Netherlands", "Belgium", "Portugal", "Iran")
-
-clean_infection_data <- infection_data |>
- filter(Country.Region %in% pays) |> # On ne garde que les pays d'intérêt
- filter(Province.State == "" | Country.Region == "China") |> # Territoires métropolitains + toutes les provinces chinoises
- mutate(Country.Region = ifelse(Province.State == "Hong Kong",
- "Hong Kong", Country.Region)) # Hong Kong devient une entité à part
-
-head(clean_infection_data[, 1:7]) # Même limitation à 7 colonnes pour la lisibilitéDans le tableau d’origine, il y a deux problèmes avec les dates :
-X, format mois.jour.année)
-;date (en abscisse) et une colonne
-cases portant les valeurs (en ordonnée). De cette manière,
-on s’évite aussi les colonnes vides dans la plupart des pays pour les
-premiers mois de 2020.Ce cas est fréquent et une fonction est connue pour le résoudre :
-pivot_longer() (inclut dans Tidyverse)
infection_data_long <- clean_infection_data |>
- pivot_longer(cols = starts_with("X"), # Colonnes à pivoter
- names_to = "date", # Nom de la colonne accueillant les noms
- values_to = "cases") # Nom de la colonne accueillant les valeurs
-
-head(infection_data_long)La fonction head nous permet de constater que le tableau est -mainteant beaucoup plus lisible et au format désiré.
-Nous pouvons maintenant convertir les dates au format ISO, ce qui -normalise leur format et les rend lisibles pour un lecteur humain :
-# On retire le préfixe "X", puis on convertit avec mdy() (mois-jour-année),
-# fonction de lubridate, présente dans le tidyverse et robuste aux séparateurs
-clean_date_data <- infection_data_long |>
- mutate(date = mdy(sub("X", "", date)))
-
-head(clean_date_data)## [1] "Date"
-Les fonctions head et class nous permette de voir que, les dates sont -au bon format et qu’elles sont bien considérées comme des dates par -R.
-Pour éviter de répéter le même code de mise en forme, nous -définissons une fois pour toutes le thème commun à nos graphiques.
-theme_covid <- theme(axis.title = element_text(face = "bold"),
- plot.title = element_text(face = "bold.italic", hjust = 0.5))Lorsqu’on essaie de tracer un graph classique à partir des données -importées dans les sections précédentes, on obtient ce résultat :
-ggplot(clean_date_data) +
- aes(x = date,
- y = cases,
- colour = Country.Region) +
- geom_line(linewidth = 1, alpha = 0.7) +
- scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) +
- labs(title = "Évolution du nombre de cas de Covid-19 (données non agrégées)",
- x = "Date",
- y = "Cas cumulés",
- colour = "Pays") +
- theme_covidProblème constaté : sur ce graphique, la courbe -attribuée à la « Chine » « bave ». Cela est dû au fait que la chine est -le seul pays pour lequel on a garder les territoires, et que chacun -d’entre eux sont comptabilisés sur l’affichage du graph.
-Pour corriger cela, on agrège les provinces chinoises en une seule -valeur par pays et par date :
-data_pays <- clean_date_data |>
- group_by(Country.Region, date) |>
- summarise(cases = sum(cases), .groups = "drop") # Une seule courbe par pays (provinces chinoises additionnées)
-
-head(data_pays)L’échelle linéaire permet d’appréhender le volume brut -absolu de cas recensés.
-ggplot(data_pays) +
- aes(x = date,
- y = cases,
- colour = Country.Region) +
- geom_line(linewidth = 1, alpha = 0.7) +
- scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) +
- labs(title = "Évolution du nombre de cas de Covid-19",
- x = "Date",
- y = "Cas cumulés",
- colour = "Pays") +
- theme_covidCommentaire analytique :
-Sur ce graphique linéaire, les États-Unis écrasent visuellement
-l’ensemble des autres courbes, le nombre total de cas est tellement
-supérieur à celui des autres pays qu’il écrase les courbes des autres
-pays ce qui gêne l’analyse de la dynamique de l’épidémie dans les pays
-d’intérêts.
En épidémiologie, la phase initiale de contagion suit un modèle -exponentiel de la forme : \[N(t) = N_0 \cdot -e^{r \cdot t}\] En appliquant le logarithme décimal, la relation -devient affine : \[\log_{10}(N(t)) = -\log_{10}(N_0) + \frac{r}{\ln(10)} \cdot t\]
-L’échelle logarithmique transforme ainsi la trajectoire exponentielle
-en une droite, dont la pente reflète directement le
-taux de croissance \(r\) (et donc la
-vitesse de doublement de l’épidémie), indépendamment du nombre initial
-de cas \(N_0\). Reprenons cette fois
-les données agrégées par pays (data_pays), pour ne plus
-avoir l’artefact de la Chine.
Plutôt que de transformer nous-mêmes les données, nous laissons
-ggplot2 appliquer l’échelle logarithmique avec
-scale_y_log10() : l’axe reste ainsi gradué en nombre de
-cas. Les valeurs nulles (avant l’arrivée du virus dans un pays) n’ont
-pas de logarithme : nous les écartons au préalable.
data_pays |>
- filter(cases > 0) |>
- ggplot() +
- aes(x = date,
- y = cases,
- colour = Country.Region) +
- geom_line(linewidth = 1, alpha = 0.7) +
- scale_y_log10(labels = label_number(scale_cut = cut_short_scale())) +
- labs(title = "Évolution du nombre de cas de Covid-19 (échelle logarithmique)",
- x = "Date",
- y = "Cas cumulés (échelle log10)",
- colour = "Pays") +
- theme_covidCommentaire analytique :
-L’échelle logarithmique permet d’avoir un aperçu beaucoup plus clair de
-la dynamique de l’évolution de l’épidémie, montrant que la dynamique est
-extrêmement similaire dans tous les pays d’intérêts, indépendamment du
-nombre de cas.
Ces deux graphiques permettent de voir que le nombre de cas aux -États-Unis est nettement supérieur à celui du reste des pays analysés -dans cet exercice mais que la dynamique exponentielle de l’augmentation -du nombre de cas est similaire.
-Pour approfondir l’analyse et aborder la question subsidiaire, nous
-téléchargeons la série temporelle globale des décès enregistrés par le
-JHU CSSE (time_series_covid19_deaths_global.csv).
-Normalement le fichier est déjà présent dans le dépôt Gitlab, s’il n’y
-ai pas, décommentez la fonction download.file()
# Décommenter ce bloc de code si le répertoire de travail ne contient pas le fichier
-# download.file(
-# url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv",
-# destfile = "time_series_covid19_deaths_global.csv")
-
-mortality_data <- read.csv("time_series_covid19_deaths_global.csv")Contrôle visuel de la bonne importation des données :
- -Comme le tableau de la mortalité est dans le même format que celui
-des infections, on peut réutiliser exactement les mêmes étapes pour le
-nettoyer : filtrage des pays, pivot des dates dans une colonne
-date (les valeurs allant dans une colonne
-death), conversion au format ISO et agrégation par pays.
-Plutôt que de copier-coller le code, nous l’encapsulons dans une
-fonction.
preparer_donnees <- function(data, nom_valeur) {
- data |>
- filter(Country.Region %in% pays) |>
- filter(Province.State == "" | Country.Region == "China") |>
- mutate(Country.Region = ifelse(Province.State == "Hong Kong",
- "Hong Kong", Country.Region)) |>
- pivot_longer(cols = starts_with("X"),
- names_to = "date",
- values_to = nom_valeur) |>
- mutate(date = mdy(sub("X", "", date))) |>
- group_by(Country.Region, date) |>
- summarise(across(all_of(nom_valeur), sum), .groups = "drop")
-}
-
-clean_date_mortality <- preparer_donnees(mortality_data, "death")
-
-head(clean_date_mortality)## [1] "Date"
-Les données peuvent donc maintenant être directement représentées de -manière lisible.
-ggplot(clean_date_mortality) +
- aes(x = date,
- y = death,
- colour = Country.Region) +
- geom_line(linewidth = 1, alpha = 0.7) +
- scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())) +
- labs(title = "Évolution du nombre de décès de la Covid-19",
- x = "Date",
- y = "Décès cumulés",
- colour = "Pays") +
- theme_covidPour mieux visualiser les différences entre pays, on peut observer ce -que donnent les données sur une échelle logarithmique :
-clean_date_mortality |>
- filter(death > 0) |>
- ggplot() +
- aes(x = date,
- y = death,
- colour = Country.Region) +
- geom_line(linewidth = 1, alpha = 0.7) +
- scale_y_log10(labels = label_number(scale_cut = cut_short_scale())) +
- labs(title = "Évolution du nombre de décès de la Covid-19 (échelle logarithmique)",
- x = "Date",
- y = "Décès cumulés (échelle log10)",
- colour = "Pays") +
- theme_covidCe travail a permis de reproduire, à partir des données du CSSE de
-l’Université Johns Hopkins, les courbes de cas cumulés de Covid-19 pour
-un panel de pays, puis de les étendre à la mortalité. Sur le plan
-méthodologique, il a fallu restructurer un jeu de données large en
-format long (pivot_longer()), normaliser les dates,
-appliquer des règles territoriales strictes (métropoles seules, Hong
-Kong isolé de la Chine) et agréger les provinces chinoises pour éviter
-des courbes parasites. Le tableau ci-dessous résume la situation à la
-dernière date disponible.
bilan <- data_pays |>
- inner_join(clean_date_mortality, by = c("Country.Region", "date")) |>
- filter(date == max(date)) |>
- mutate(letalite_apparente = round(100 * death / cases, 2)) |>
- arrange(desc(cases)) |>
- select(Pays = Country.Region,
- `Cas cumulés` = cases,
- `Décès cumulés` = death,
- `Létalité apparente (%)` = letalite_apparente)
-
-bilanCe que montrent les graphiques. En échelle linéaire, -les États-Unis dominent nettement, tant pour les cas que pour les décès -: leur cumul est de plusieurs fois supérieur à celui de chacun des -autres pays du panel. L’échelle logarithmique met en évidence la phase -exponentielle du début de l’épidémie, commune à la plupart des pays -occidentaux, et rend comparables des pays de tailles très différentes. -Elle révèle aussi des trajectoires atypiques : la Chine se stabilise -très tôt avant une brusque hausse fin 2022, tandis que Hong Kong et la -Corée du Sud connaissent une flambée massive début 2022. Côté mortalité, -les pays européens (Royaume-Uni, Italie, France, Allemagne) se -regroupent à un niveau nettement inférieur à celui des États-Unis.
-Limites de l’analyse.
-Perspectives. Pour aller plus loin, on pourrait -calculer les nouveaux cas quotidiens (lissés sur 7 jours) plutôt que les -cumuls, mais aussi pour relativiser le nombre de morts, les comparer -avec données de la mortalité normale disponibles sur les sites de l’INSEE ou de l’OCDE
-