Les bibliotèques

Deux bibliothèques sont nécessaires : tidyverse pour la gestion des données et highcharter pour faire de jolis graphiques.

library(tidyverse)
library(highcharter)

Le chargement des données

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

Le traitement des données

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),]

Un premier graphique : évolution des cas avérés et des décès

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) 

Un deuxièmes graphique : évolution des cas et décès par jour

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)

Un troisième graphique pour mieux identifier la tendance

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.

Le code

L’ensemble du code est disponible ici.

La prudence