--- title: "Autour du SARS-CoV-2 (Covid-19)" author: "Doévi BIAOU" date: "`r Sys.Date()`" output: pdf_document: toc: yes number_sections: yes fig_caption: yes --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` # Présentation Le but est ici de reproduire des graphes semblables à ceux du [South China Morning Post (SCMP)](https://www.scmp.com/), sur la page [The Coronavirus Pandemic](https://www.scmp.com/coronavirus?src=homepage_covid_widget) et qui montrent pour différents pays le nombre cumulé (c'est-à-dire le nombre total de cas depuis le début de l'épidémie) de personnes atteintes de la maladie à coronavirus 2019. # Exercice proprement dit ## Méthodes Les données utilisées sont celles fournies par le Johns Hopkins University Center for Systems Science and Engineering (JHU CSSE) et accessibles sous ce [lien](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv). Les données ainsi recueillies ont été épurées puis analysées avec `r R.Version()$version.string` s'exécutant sous `r R.Version()$os`. Les graphiques ont été générés avec le package {ggplot2}. ## Import des données ```{r data_import} # Enregistrement du lien de la base dans l'objet "link" link <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv" # Import du contenu du fichier csv dans une base de données : df <- read.csv(file = link, header = TRUE, sep = ",") df <- as.data.frame(df) # Transformation en base de données ``` ## Manipulation des données Nous utiliserons essentiellement le paquet {dplyr} de {Tidyverse} à cet effet. En premier un aperçu de la base. ```{r} head(df[1:8]) # Affiche les dix premières lignes des colonnes 1 à 8. ``` la manipulation va consister à : - filtrer la base initiale pour ne retenir que les lignes concernant les pays qui nous intéressent - pivoter de sorte à avoir trois colonnes : Pays ou région, date et incidence journalière. - calculer les incidences nationales journalières (certains pays comme la Chine ont des données provenant de différentes provinces) - mettre en forme les dates sous format iso : les dates étant sous format "Xmm.jj.aa" ```{r data_wrangling, include=FALSE} # Outils library(tidyverse) # Filtrer la base dff <- filter(df, Country.Region == "Belgium"| Country.Region == "China" | Country.Region == "China, Hong-Kong" | Country.Region == "France" | Country.Region == "Germany" | Country.Region == "Iran" | Country.Region == "Italy" | Country.Region == "Japan" | Country.Region == "Korea, South" | Country.Region == "Netherlands" | Country.Region == "Portugal" | Country.Region == "Spain" | Country.Region == "United Kingdom" | Country.Region == "US") # Pivoter la base dff_p <- dff %>% select(Country.Region, starts_with("X")) %>% # Sélection des colonnes utiles pivot_longer(cols = !Country.Region, names_to = "Dates", values_to = "Incidence") # Nettoyage - mise en forme de la colonne "Dates" dff_p <- dff_p %>% mutate(Dates = substr(Dates, start = 2, stop = 100000L), # élimine le "X" Dates = as.Date(Dates, "%m.%d.%y") ) # Calcul des incidences nationales dff_p <- dff_p %>% arrange(Dates) %>% # Trier les lignes selon la date group_by(Dates, Country.Region) %>% summarise(Incidence = sum(Incidence)) # Aperçu de la base head(dff_p) ``` ## Représentation graphique proprement dite Le graphique sera réalisé avec le paquet {ggplot2} déjà chargé au sein du {Tidyverse}. Un aperçu du graphique de la Belgique. ```{r fig.cap="Nombre de cas confirmés, Belgique"} dff_p %>% filter(Country.Region == "Belgium") %>% ggplot(aes(x = Dates, y = Incidence)) + geom_line() + theme_bw() + scale_y_continuous(labels = scales::label_number()) + labs(title = "Nombre de cas confirmés, Belgique") ``` L'on se rend compte que les incidences présentées dans la base de données sont des incidences cumulées. Nous pouvons recalculer les incidences quotidiennes. ```{r} # Calcul des incidences journalières dff_p <- dff_p %>% group_by(Country.Region) %>% # Pour les regrouper par pays mutate(Incidence_journaliere = Incidence - lag(Incidence)) # calcul des incidences journalières # Aperçu de la base tail(dff_p) ``` ## Graphique des incidences journalières ```{r} dff_p %>% ggplot(aes(x = Dates, y = Incidence_journaliere, color = Country.Region)) + geom_line() ``` Quelques cas d'incidences négatives pouvant correspondre en réalité à des rectifications de statistiques nationales. Nous les définirons comme données manquantes. ```{r} # Aperçu, dates problématiques : subset(dff_p, Incidence_journaliere < 0, c(Dates, Country.Region, Incidence_journaliere)) # Les définir comme données manquantes dff_p <- dff_p %>% mutate(Incidence_journaliere_2 = ifelse(Incidence_journaliere < 0, NA, Incidence_journaliere)) ``` ### Le nouveau graphe, tous les pays ```{r message=FALSE, warning=FALSE, fig.cap="Incidence journalière de covid 19, tous les pays"} dff_p %>% ggplot(aes(x = Dates, y = Incidence_journaliere_2, color = Country.Region)) + geom_line() + scale_color_viridis_d() + scale_y_continuous(labels = scales::label_number()) + theme_bw() + labs(x = "", y = "Incidence journalière", color = "Pays", title = "Incidence journalière de covid 19") ``` ### Incidence journalière : Pays par pays, sur le même graphique ```{r fig.width=9, fig.height=9, fig.cap="Incidence journalière, pays par pays", warning=FALSE} dff_p %>% ggplot(aes(x = Dates, y = Incidence_journaliere_2, color = Country.Region)) + geom_line() + scale_color_viridis_d() + scale_y_continuous(labels = scales::label_number()) + facet_wrap(~Country.Region, ncol = 3, scales = "free_y") + theme_bw() + labs(x = "", y = "Incidences journalières", color = "Pays", title = "Incidences journalières de covid 19") + theme(legend.position = "none") # Pour supprimer la légende ``` ## Nombre total de cas confirmés Les incidences présentées par défaut étant des incidences cumulées, le nombre total de cas correspond donc à l'incidence cumulée à la date la plus récente, ou à l'incidence maximale renseignée (au cas où un pays serait en retard dans la notification de ses données). ```{r fig.cap="Nombre de cas confirmés de covid 19"} max(dff_p$Dates) dff_p %>% filter(Dates == max(dff_p$Dates)) %>% # Date la plus récente uniquement ggplot(aes(x = fct_reorder(Country.Region, Incidence), y = Incidence)) + geom_col() + coord_flip() + theme_bw() + labs(x = "", title = paste("Nombre de total de cas confirmés de covid 19 au", Sys.Date())) + scale_y_continuous(labels = scales::number_format()) ```