Deux bibliothèques sont nécessaires : tidyverse pour la gestion des données et highcharter pour faire de jolis graphiques.
library(tidyverse)
library(highcharter)
Deux données sont nécessaires : celui des cas avérés et celui des décès. Les données étant publiées séparemment, il faut donc les télécharger l’un après l’autre.
covid_deces <- read_csv ("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv")
covid_cas <- read_csv ("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv")
Dans les deux jeux de données, il y a les statistiques de tous les pays. Il faut donc filtrer celles de la France. Et il n’y a pas qu’une seule ligne. Il y a les informations de la métropole et de chaque DOM. Dans notre exemple, nous allons donc faire une somme pour avoir le nombre de cas et de décès pour l’ensemble du territoire national.
D’abord le fichier des décès.
covid_deces <- covid_deces %>%
rename('Pays' = 'Country/Region') %>%
filter(Pays == 'France') %>%
select(-Long,-Lat,-Pays) %>%
summarise_if(is.numeric, sum, na.rm = TRUE) %>%
rownames_to_column %>%
gather(date, value, -rowname) %>%
spread(rowname, value)
colnames(covid_deces) <- c('date','deces')
Et on fait la même chose avec le fichier des cas avérés.
covid_cas <- covid_cas %>%
rename('Pays' = 'Country/Region') %>%
filter(Pays == 'France') %>%
select(-Long,-Lat,-Pays) %>%
summarise_if(is.numeric, sum, na.rm = TRUE) %>%
rownames_to_column %>%
gather(date, value, -rowname) %>%
spread(rowname, value)
colnames(covid_cas) <- c('date','cas')
Ensuite nous allons assembler les deux fichiers en un seul, convertir la date dans un format plus lisible (ie AAAA-MM-DD) et le trier. Le tri est important pour afficher les données dans le “bon ordre”.
# Concaténation des deux données, conversion de la date et tri
covid <- merge(covid_cas, covid_deces, by = "date")
covid$date <- as.Date(covid$date, format = "%m/%d/%y")
covid <- covid[order(covid$date),]
Tous les jours, que ce soit dans la presse écrite ou télévisée, vous n’avez pas échappé au graphique de l’évolution du nombre de cas et de décès. Ici non plus…
# Premier graphique : évolution dans le temps du nombre cumulé de cas/décès
highchart() %>%
hc_plotOptions(column = list(stacking = "normal")) %>%
hc_chart(type="column") %>%
hc_add_series(name="Décès", data = covid$deces) %>%
hc_add_series(name="Cas", data = covid$cas) %>%
hc_xAxis(categories = covid$date)
Comme évoqué plus haut, les données sont cumulées : ie que chaque jour, nous avons le nombre total de cas et de décès depuis le début de l’épidémie. Ici on va s’intéresser au nombre de cas ou décès nouveaux par jour.
Pour réaliser ce nouveau traitement, il faut donc pour chaque jour soustraire les données de la veille, ce que fait ces quelques lignes supplémentaires.
# Calcul du nombre de nouveaux cas/décès par jour
# car les données sont cumulatives...
covid$deces_veille <- lag(covid$deces) # on crée une nouvelle variable avec la valeur du jour précédent
covid$cas_veille <- lag(covid$cas)
covid$deces_j <- covid$deces - covid$deces_veille # on soustrait la valeur du jour précédent à la valeur du jour
covid$cas_j <- covid$cas - covid$cas_veille
covid <- covid %>%
select(-deces_veille,-cas_veille) # on supprime les variables inutiles
Et maintenant la représentation graphique !
# Deuxième graphique : évolution dans le temps du nombre de nouveaux cas/décès chaque jour
highchart() %>%
hc_plotOptions(column = list(stacking = "normal")) %>%
hc_chart(type="column") %>%
hc_add_series(name="Décès dus à la COVID19", data = covid$deces_j) %>%
hc_add_series(name="Patients positifs à la COVID19", data = covid$cas_j) %>%
hc_xAxis(categories = covid$date) %>%
hc_yAxis(min=0)
Certaines séries temporelles peuvent avoir des irrégularités qui cachent une tendance générale. Il est possible de les gommer pour mieux la faire ressortir.
Dans l’exemple suivant, on calcule une moyenne mobile sur le nombre de décès sur 7 jours (7 est la taille de la fenêtre).
covid$deces_cvs <- rep(0,nrow(covid))
fenetre <- 7
for (i in (fenetre+1):nrow(covid))
covid$deces_cvs[i] <- mean(covid$deces_j[(i-fenetre+1):i])
Et maintenant la représentation graphique !
highchart() %>%
hc_add_series(name="Décès dus à la COVID19", type = "column", data = covid$deces_j) %>%
hc_chart(type="line") %>%
hc_add_series(name="Tendance sur 7 jours (CVS)", type = "line", data = covid$deces_cvs) %>%
hc_xAxis(categories = covid$date) %>%
hc_yAxis(min=0)
Le graphique suivant présente la même méthode de moyenne mobile que précédemment, mais cette fois-ci appliquée aux cas COVID.
L’ensemble du code est disponible ici.
Pour se tenir informé pendant la crise, le gouvernement informe les citoyens sur une page dédiée : https://www.gouvernement.fr/info-coronavirus
Pour protéger et se protéger, un rappel des gestes barrières