diff --git a/module3/Document_Computationnel_Covid/Sars-CoV-DocComputationnel_NathanD.Rmd b/module3/Document_Computationnel_Covid/Sars-CoV-DocComputationnel_NathanD.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..b23ca45596a7d4f7089223888035e1d7dc817c66 --- /dev/null +++ b/module3/Document_Computationnel_Covid/Sars-CoV-DocComputationnel_NathanD.Rmd @@ -0,0 +1,507 @@ +--- +title: "Autour du SARS-CoV-2" +author: "Nathan Drogue" +date: '2024-08-22' +output: pdf_document +urlcolor: blue +header-includes: + - | + ```{=latex} + \usepackage{fvextra} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{ + showspaces = false, + showtabs = false, + breaklines, + commandchars=\\\{\} + } + ``` +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE, out.width="100%", message=FALSE) +``` + +# Sujet + +Le but est ici de reproduire des graphes semblables à ceux du South China Morning Post (SCMP), sur la page The Coronavirus Pandemic 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. + + + +# Plateforme utilisée pour l'étude +- Version R : 4.2.2 +- OS : Windows 10 x64 (build 19045) +- Packages : + - dplyr : 1.1.4 + - tidyr : 1.2.1 + - ggplot2 : 3.5.1 + - randomcoloR : 1.1.0.1 + - scales : 1.3.0 + - data.table : 1.14.6 + +Commençons par charger l'ensemble des packages que nous utiliserons par la suite. +```{r packages, warning=FALSE, results='hide'} +library(dplyr) +library(tidyr) +library(ggplot2) +library(randomcoloR) +library(scales) +library(data.table) +``` + + +# Etude de l'évolution du nombre de cas de Covid 19 entre fév.2020 et fév.2023 +## Importation des données + +Les données que nous utiliserons dans un premier temps sont compilées par le [Johns Hopkins University Center for Systems Science and Engineering (JHU CSSE)](https://systems.jhu.edu/) et sont mises à disposition sur GitHub. +```{r inputsInc, warning=FALSE} +if(!file.exists("./time_series_covid19_confirmed_global.csv")){ + download.file("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv", "./time_series_covid19_confirmed_global.csv") +} +``` + +## Exploration et mise en forme des données + +Pour commencer, récupérons le fichier de données et vérifions déjà que les types de colonnes nous semblent correctes et que les données sont intègres (pas de NA présents). +```{r inspectInc, results='hide'} +# Importation +covid_raw <- read.csv("./time_series_covid19_confirmed_global.csv", encoding = "UTF-8") + +# Type de colonnes +col_types <- unlist(lapply(covid_raw, class)) +names(col_types) <- colnames(covid_raw) +print(col_types) + +# Lignes contenant des NAs +covid_raw[apply(covid_raw, 1, function(x) any(is.na(x))),] +``` +Les types de colonnes (character, numeric, integer) permettent de dire que l'importation s'est à priori bien déroulée. Il existe deux lignes qui contiennent des NAs, mais cela concerne les coordonnées géographiques, ce qui ne posera pas de problème pour notre étude. + +Pour faciliter la manipulation des données, nous allons maintenant passer ces dernières en format long, c'est-à-dire avec l'ensemble des incidences dans une seule colonne, ainsi que convertir les dates dans un format reconnu par R. +```{r transformInc, warning = FALSE} +covid_raw_long <- covid_raw %>% + tidyr::pivot_longer(cols = 5:ncol(covid_raw), names_to = "Date", values_to = "Incidence") %>% + dplyr::mutate(Date = as.Date.character(gsub("X", "", Date), format = "%m.%d.%y")) %>% + dplyr::arrange(Date) +head(covid_raw_long) +``` + +## Visualisation de l'évolution du nombre de cas par pays + +Calculons et traçons maintenant l'évolution du nombre de cas cumulés au cours du temps pour certains pays. Commençons par sélectionner les pays qui nous intéressent, puis calculons leurs cumuls sur la période pour laquelle nous disposons de données. Nous veillons en particulier à sommer séparément Hong Kong du reste de la Chine, comme spécifié dans la consigne. +```{r cumCountryInc, warning=FALSE} +covid_byCountry <- covid_raw_long %>% + dplyr::filter(Province.State == "" | (Country.Region == "China" & Province.State != "")) %>% + dplyr::filter(Country.Region %in% c("Belgium", "China", "France", "Germany", "Iran", "Italy", "Japan", "Korea, South", "Netherlands", "Portugal", "Spain", "United Kingdom", "US")) %>% # Sélection de certains pays + dplyr::mutate(Location = dplyr::case_when(Country.Region == "China" & Province.State != "Hong Kong" ~ "China", + Country.Region == "China" & Province.State == "Hong Kong" ~ "China, Hong Kong", + TRUE ~ Country.Region)) %>% # Distinction de la Chine et de Hong Kong + dplyr::group_by(Location, Date) %>% + dplyr::summarise(Incidence = sum(Incidence, na.rm = T), + Date = unique(Date)) %>% + dplyr::ungroup() +head(covid_byCountry) +``` + +Calculer le nombre de cas cumulés au total à la dernière date disponible nous sera également utile lors de la visualisation. +```{r totalCountryInc} +total_byCountry <- covid_byCountry %>% # Récupération des totaux pour ordonner la légende + dplyr::group_by(Location) %>% # Par pays + dplyr::summarise(Incidence_Sum = max(Incidence)) %>% # Incidence totale (cumul maximum) + dplyr::arrange(desc(Incidence_Sum)) %>% + dplyr::ungroup() +total_byCountry +``` + +Nous pouvons maintenant passer à la visualisation des données. Pour cela, nous traçons un graphique des cas cumulés au cours du temps pour chacun des pays séparément, et nous classons la légende par ordre de cas cumulés décroissants à la dernière date. (Nous effectuons également quelques lignes de mise en forme à la fin pour rendre le graphique plus agréable à lire) +```{r plotInc, fig.align="center", warning=FALSE, fig.width = 9, fig.height=6} +set.seed(42) +ggplot(covid_byCountry, aes(x = Date, y = Incidence, color = Location)) + # Tracé du graphique + geom_line(size = 0.8) + + scale_x_date(breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "3 months"), + minor_breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "1 month")) + + scale_y_continuous(labels = comma, breaks = seq(0, max(total_byCountry$Incidence_Sum, na.rm=T), 10e6), minor_breaks = seq(0, max(total_byCountry$Incidence_Sum, na.rm=T), 2e6)) + + scale_color_manual(values=distinctColorPalette(14), breaks = total_byCountry$Location, labels = paste0(total_byCountry$Location, " (", format(as.numeric(total_byCountry$Incidence_Sum), scientific = TRUE, digits = 4), ")")) + + labs(title="Cumul des cas de Covid 19 par pays au cours du temps", y="Cumul des cas observés", x="Temps", color = paste0("Pays (Ordre décroissant des cas\ncumulés au ", max(covid_byCountry$Date, na.rm = T), ")")) + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black"), + axis.text.x = element_text(angle = 45, hjust = 1) + ) +``` + +## Visualisation de l'évolution du nombre de cas dans le monde + +Nous voulons également tracer sur un graphique le nombre de cas total cumulé à l'échelle mondiale. Pour ce faire, nous reprenons le jeu de données précédemment utilisé, mais nous utilisons toutes les localisations, en calculant le total des incidences mondiales par date, puis en les cumulant. +```{r cumTotalInc, warning = FALSE} +covid_Total <- covid_raw_long %>% + dplyr::group_by(Date) %>% + dplyr::summarise(Incidence_Total = sum(Incidence, na.rm = T)) %>% + dplyr::ungroup() +``` + +Visualisons les résultats obtenus sur un graphique en échelle linéaire... +```{r plotTotalLinearInc, warning = FALSE, fig.width = 9, fig.height=4} +ggplot(covid_Total, aes(x = Date, y = Incidence_Total)) + # Tracé du graphique + geom_line(size = 0.8) + + scale_x_date(breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "3 months"), + minor_breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "1 month")) + + scale_y_continuous(labels = comma) + + labs(title="Cumul global des cas de Covid 19 au cours du temps (échelle linéaire)", y="Cumul global des cas observés", x="Temps") + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black"), + axis.text.x = element_text(angle = 45, hjust = 1) + ) +``` + +... puis en échelle logarithmique ! +```{r plotTotalLogInc, warning = FALSE, fig.width = 9, fig.height=4} +ggplot(covid_Total, aes(x = Date, y = Incidence_Total)) + # Tracé du graphique + geom_line(size = 0.8) + + scale_x_date(breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "3 months"), + minor_breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "1 month")) + + scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), + labels = trans_format("log10", math_format(10^.x))) + + annotation_logticks(sides="l") + + labs(title="Cumul global des cas de Covid 19 au cours du temps (échelle logarithmique)", y="Cumul global des cas observés", x="Temps") + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black"), + axis.text.x = element_text(angle = 45, hjust = 1) + ) +``` + + + +# Etude de l'évolution du nombre de décès dus au Covid 19 entre fév.2020 et fév.2023 +## Importation des données + +Comme précédemment, les données que nous utiliserons sont compilées par le [Johns Hopkins University Center for Systems Science and Engineering (JHU CSSE)](https://systems.jhu.edu/) et sont mises à disposition sur GitHub. +```{r inputsDeaths, warning=FALSE} +if(!file.exists("./time_series_covid19_deaths_global.csv")){ + download.file("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv", "./time_series_covid19_deaths_global.csv") +} +``` + +## Exploration et mise en forme des données + +Comme précédemment, récupérons le fichier de données et vérifions les types de colonnes et l'éventuelle présence de NAs. +```{r inspectDeaths, results='hide'} +# Importation +deaths_raw <- read.csv("./time_series_covid19_deaths_global.csv", encoding = "UTF-8") + +# Type de colonnes +dth_col_types <- unlist(lapply(deaths_raw, class)) +names(dth_col_types) <- colnames(deaths_raw) +print(dth_col_types) + +# Lignes contenant des NAs +deaths_raw[apply(deaths_raw, 1, function(x) any(is.na(x))),] +``` +Les types de colonnes (character, numeric, integer) permettent à nouveau de dire que l'importation s'est à priori bien déroulée. Il existe à nouveau deux lignes qui contiennent des NAs pour les coordonnées géographiques, ce qui ne pose pas de problème. + +Passons les données au format long et convertissons les dates dans un format reconnu par R. +```{r transformDeaths, warning = FALSE} +deaths_raw_long <- deaths_raw %>% + tidyr::pivot_longer(cols = 5:ncol(deaths_raw), names_to = "Date", values_to = "Incidence") %>% + dplyr::mutate(Date = as.Date.character(gsub("X", "", Date), format = "%m.%d.%y")) %>% + dplyr::arrange(Date) +head(deaths_raw_long) +``` + +## Visualisation de l'évolution du nombre de décès par pays + +Calculons et traçons maintenant l'évolution du nombre de décè cumulés au cours du temps pour certains pays. A nouveau, nous sélectionnons les pays qui nous intéressent, puis calculons leurs cumuls sur la période pour laquelle nous disposons de données. +```{r cumCountryDth, warning=FALSE} +deaths_byCountry <- deaths_raw_long %>% + dplyr::filter(Country.Region %in% c("Belgium", "China", "France", "Germany", "Iran", "Italy", "Japan", "Korea, South", "Netherlands", "Portugal", "Spain", "United Kingdom", "US")) %>% # Sélection de certains pays + dplyr::mutate(Location = dplyr::case_when(Country.Region == "China" & Province.State != "Hong Kong" ~ "China", + Country.Region == "China" & Province.State == "Hong Kong" ~ "China, Hong Kong", + TRUE ~ Country.Region)) %>% # Distinction de la Chine et de Hong Kong + dplyr::group_by(Location, Date) %>% + dplyr::summarise(Incidence = sum(Incidence, na.rm = T), + Date = unique(Date)) %>% + dplyr::ungroup() +head(deaths_byCountry) +``` + +Calculer le nombre de décès cumulés au total à la dernière date disponible nous sera également utile lors de la visualisation. +```{r totalCountryDth} +totaldth_byCountry <- deaths_byCountry %>% # Calcul des totaux pour ordonner la légende + dplyr::group_by(Location) %>% + dplyr::summarise(Incidence_Sum = max(Incidence)) %>% + dplyr::arrange(desc(Incidence_Sum)) %>% + dplyr::ungroup() +totaldth_byCountry +``` + +Nous pouvons maintenant passer à la visualisation des données. Pour cela, nous traçons un graphique des décès cumulés au cours du temps pour chacun des pays séparément, et nous classons la légende par ordre de décès cumulés décroissants à la dernière date. (Nous effectuons également quelques lignes de mise en forme à la fin pour rendre le graphique plus facile à lire) +```{r plotDth, fig.align="center", warning=FALSE, fig.width = 9, fig.height=6} +set.seed(42) +ggplot(deaths_byCountry, aes(x = Date, y = Incidence, color = Location)) + # Tracé du graphique + geom_line(size = 0.8) + + scale_x_date(breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "3 months"), + minor_breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "1 month")) + + scale_y_continuous(labels = comma, breaks = seq(0, max(totaldth_byCountry$Incidence_Sum, na.rm=T), 10e4), minor_breaks = seq(0, max(totaldth_byCountry$Incidence_Sum, na.rm=T), 2e4)) + + scale_color_manual(values=distinctColorPalette(14), breaks = totaldth_byCountry$Location, labels = paste0(totaldth_byCountry$Location, " (", format(as.numeric(totaldth_byCountry$Incidence_Sum), scientific = TRUE, digits = 4), ")")) + + labs(title="Cumul des décès dus au Covid 19 par pays au cours du temps", y="Cumul des décès observés", x="Temps", color = paste0("Pays (Ordre décroissant des décès\ncumulés au ", max(deaths_byCountry$Date, na.rm = T), ")")) + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black"), + axis.text.x = element_text(angle = 45, hjust = 1) + ) +``` + +## Visualisation de l'évolution du nombre de décès dans le monde + +Nous voulons également tracer sur un graphique le nombre de cas total cumulé à l'échelle mondiale. Pour ce faire, nous reprenons le jeu de données précédemment utilisé, mais nous utilisons toutes les localisations, en calculant le total des incidences mondiales par date, puis en les cumulant. +```{r cumTotalDth, warning = FALSE} +deaths_Total <- deaths_raw_long %>% + dplyr::group_by(Date) %>% + dplyr::summarise(Incidence_Total = sum(Incidence, na.rm = T)) %>% + dplyr::ungroup() +deaths_Total +``` + +Visualisons les résultats obtenus sur un graphique en échelle linéaire... +```{r plotTotalLinearDth, warning = FALSE, fig.width = 9, fig.height=4} +ggplot(deaths_Total, aes(x = Date, y = Incidence_Total)) + # Tracé du graphique + geom_line(size = 0.8) + + scale_x_date(breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "3 months"), + minor_breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "1 month")) + + scale_y_continuous(labels = comma) + + labs(title="Cumul global des décès dus au Covid 19 au cours du temps (échelle linéaire)", y="Cumul global des décès observés", x="Temps") + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black"), + axis.text.x = element_text(angle = 45, hjust = 1) + ) +``` + +... puis en échelle logarithmique. +```{r plotTotalLogDth, warning = FALSE, fig.width = 9, fig.height=4} +ggplot(deaths_Total, aes(x = Date, y = Incidence_Total)) + # Tracé du graphique + geom_line(size = 0.8) + + scale_x_date(breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "3 months"), + minor_breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "1 month")) + + scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), + labels = trans_format("log10", math_format(10^.x))) + + annotation_logticks(sides="l") + + labs(title="Cumul global des décès dus au Covid 19 au cours du temps (échelle logarithmique)", y="Cumul global des cas observés", x="Temps") + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black"), + axis.text.x = element_text(angle = 45, hjust = 1) + ) +``` + +# Comparaison des résultats à la mortalité "normale" : cas de la France + +Les données sont importées d'un fichier local extrait à partir du tableau disponible sur la page web [Evolution du nombre de décès depuis le 1er janvier 2023](https://www.insee.fr/fr/statistiques/6959520#tableau-figure1), sur le site de l'[INSEE](https://www.insee.fr/fr/accueil), en date du 2024-08-23. Inspectons les rapidement en utilisant la même méthode que précédemment (types de colonnes, NAs). +```{r deathsFrance, results='hide'} +frdeaths_raw <- read.csv("./covid_deaths_france_20192023.csv", sep=";") + +# Type de colonnes +frdth_col_types <- unlist(lapply(frdeaths_raw, class)) +names(frdth_col_types) <- colnames(frdeaths_raw) +print(frdth_col_types) + +# Lignes contenant des NAs +frdeaths_raw[apply(frdeaths_raw, 1, function(x) any(is.na(x))),] +``` +Les types de colonnes obtenus (character, integer) correspondent bien à ce qui était attendu. Une ligne contient des NAs pour le nombre de décès, mais c'est le 29 février, qui n'est pas présent toutes les années, ce qui est normal et ne fausse en rien les analyses que nous ferons par la suite. + +Passons les données au format long et convertissons les dates dans un format reconnu par R. +```{r transformDeathsFrance, warning = FALSE} +frdeaths_raw_long <- frdeaths_raw %>% + tidyr::pivot_longer(cols = 2:ncol(frdeaths_raw), names_to = "Annee", values_to = "Incidence") %>% + dplyr::mutate( + Annee = gsub("X", "", Annee), + Date = as.Date.character(paste0(`Date.d.événement`, " ", Annee), format = "%d-%b %Y")) %>% + dplyr::arrange(Date) +head(frdeaths_raw_long) +``` + +La transformation du format de date étant un peu particulière, vérifions juste que tout se soit bien passé et qu'il n'y ait pas de NAs. +```{r verifDates} +frdeaths_raw_long[which(is.na(frdeaths_raw_long$Date)),] +``` +Il y a effectivement des NAs, mais qui correspondent aux 29 février qui n'existent pas pour certaines années. Nous pouvons donc supprimer ces lignes qui ne contiennent pas de données. +```{r delNaDates} +frdeaths_raw_long <- frdeaths_raw_long[!is.na(frdeaths_raw_long$Date),] +``` + +Calculons maintenant le nombre de décès cumulés en France au cours du temps à partir du 22-01-2022 (date de départ de nos données covid). +```{r deathCumFrance} +deaths_cum_fr <- frdeaths_raw_long %>% + dplyr::arrange(Date) %>% + dplyr::filter(Date >= "2020-01-22") %>% + dplyr::mutate(Incidence_Cum = cumsum(as.numeric(Incidence))) %>% + dplyr::select(Date, Incidence_Cum) +colnames(deaths_cum_fr) <- c("Date", "All_Cum_Inc") +head(deaths_cum_fr) +``` + +Nous pouvons maintenant effectuer une comparaison avec les décès observés suite au covid 19. Pour ce faire, commençons par extraire les données covid pour la France uniquement, puis effectuons une jointure avec les statistiques de l'INSEE. +```{r compCovInsee} +deaths_fromCovid_fr <- deaths_byCountry %>% # Extraction des données covid france + dplyr::ungroup() %>% + dplyr::filter(Location == "France") %>% + dplyr::select(Date, Incidence) %>% + dplyr::arrange(Date) +colnames(deaths_fromCovid_fr) <- c("Date", "Covid_Cum_Inc") + +deaths_Several_fr <- deaths_fromCovid_fr %>% + dplyr::left_join(deaths_cum_fr, by = "Date") %>% + dplyr::select(c("Date", "Covid_Cum_Inc", "All_Cum_Inc")) %>% + tidyr::pivot_longer(2:3, names_to = "Cause", values_to = "Incidence_Cum") +head(deaths_Several_fr) +``` +Maintenant que nous avons nos données à disposition, nous pouvons les tracer en parallèle sur un graphique. +```{r plotCompDthFr, warning = FALSE, fig.width = 9, fig.height=4} +ggplot(deaths_Several_fr, aes(x = Date, y = Incidence_Cum, color = Cause)) + # Tracé du graphique + geom_line(size = 0.8) + + scale_x_date(breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "3 months"), + minor_breaks = function(x) seq.Date(from = min(x), + to = max(x), + by = "1 month")) + + scale_color_manual(values=c("darkred", "darkblue"), breaks = c("All_Cum_Inc", "Covid_Cum_Inc"), labels = c("Toutes causes", "Covid-19")) + + labs(title="Comparaison des décès cumulés Covid et\ntoutes causes en France au cours du temps", y="Cumul de décès observés", x="Temps") + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black"), + axis.text.x = element_text(angle = 45, hjust = 1) + ) +``` + + + +# Normalisation de l'analyse pour 1000 habitants +## Importation des données + +Les données de population par pays ont été récupérées sur le site des [Nations Unies](https://www.un.org/), sur [cette page](https://population.un.org/wpp/Download/Standard/CSV/). La version utilisée a été téléchargée le 2024-08-23. Malheureusement, elle est trop volumineuse pour être déposée sur un Git. +```{r inputsPop, warning=FALSE} +if(!file.exists("./WPP2024_TotalPopulationBySex.csv")){ + download.file("https://population.un.org/wpp/Download/Files/1_Indicator%20(Standard)/CSV_FILES/WPP2024_TotalPopulationBySex.csv.gz", "./WPP2024_TotalPopulationBySex.csv") +} +``` + +Nous avons également besoin du nombre de lits d'hôpital pour 1000 habitants qui peut être trouvé sur le site de l'OCDE, à [cette page](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). Le lien est [celui-ci](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). Les données doivent cependant être téléchargées manuellement en local, nettoyées puis enregistrées en csv. La version actuellement en local a été téléchargée le 2024-08-23. + +## Exploration et mise en forme des données + +Vérifions le format des fichiers à la recherche d'anomalies (type de colonnes, valeurs NAs...). +```{r inspectPop} +# Importation +pop_raw <- read.csv("./WPP2024_TotalPopulationBySex.csv") +bed_raw <- fread("./ELS-2019-5047-FR-G164.csv", encoding = "Latin-1", header = TRUE) + +# Type de colonnes +unlist(lapply(pop_raw, class)) +unlist(lapply(bed_raw, class)) +``` +Les colonnes sont bien aux format escomptés ('character', 'integer', 'double'), ce qui laisse entendre que l'import s'est bien passé. + +Sélectionnons maintenant les pays qui nous intéressent dans la table de Nations Unies, et convertissons la démographie en effectuant l'opération $*10^3$. Nous sélectionnerons les données démographiques de l'année 2021 pour nos calculs (année de données pour les lits d'hôpital). Certains pays comme la Corée, l'Iran, la Chine, ne seront pas être inclus dans l'analyse car nous ne disposons pas de données adaptés les concernant. +```{r selectCountries, results='hide'} +target_countries_pop <- c("Belgium", "France", "Germany", "Italy", "Japan", "Netherlands", "Portugal", "Spain", "United Kingdom", "United States of America (and dependencies)") +target_countries_beds <- c("Belgique", "France", "Allemagne", "Italie", "Japon", "Pays-Bas", "Portugal", "Espagne", "Royaume-Uni", "États-Unis") +target_countries_SCMP <- c("Belgium", "France", "Germany", "Italy", "Japan", "Netherlands", "Portugal", "Spain", "United Kingdom", "US") + +pop_filtered <- pop_raw %>% + dplyr::filter(Location %in% target_countries_pop & Time == 2021) %>% + dplyr::mutate(Population = PopTotal *10^3) %>% + dplyr::select(Location, Population) +lapply(1:length(pop_filtered$Location), function(i){pop_filtered$Location[i] <<- target_countries_SCMP[which(target_countries_pop==pop_filtered$Location[i])]}) # Conversion des noms pour utiliser la même nomenclature + +beds_filtered <- bed_raw %>% + dplyr::filter(Country %in% target_countries_beds) %>% + dplyr::select(c("Country", "2017")) +colnames(beds_filtered) <- c("Location", "Hospital_Beds") +lapply(1:length(beds_filtered$Location), function(i){beds_filtered$Location[i] <<- target_countries_SCMP[which(target_countries_beds==beds_filtered$Location[i])]}) # Conversion des noms pour utiliser la même nomenclature +``` +```{r printTables} +pop_filtered +beds_filtered +``` + +Passons maintenant au calcul, à partir des données précédemment obtenues concernant les décès aux suites du covid ainsi que la population de chaque pays, du nombre de décès rapporté à 1000 habitants. Pour ce faire, nous récupérons le tableau du nombre total de décès, nous récupérons les pays pour lesquels nous avons des données, et nous faisons la jointure avec les données de population et de lits disponibles. +```{r death1000} +normalized_deaths <- totaldth_byCountry %>% + dplyr::filter(Location %in% target_countries_SCMP) %>% + dplyr::left_join(pop_filtered, by = "Location") %>% + dplyr::left_join(beds_filtered, by = "Location") %>% + dplyr::mutate(Normalized_Inc = Incidence_Sum/(Population/1000)) +``` + +Maintenant que nous avons les données à notre disposition, nous pouvons les tracer sur un graphique. +```{r plotNorm, fig.width = 9, fig.height=4, fig.align='center'} +ggplot(normalized_deaths, aes(x = Hospital_Beds, y = Normalized_Inc)) + + geom_point(aes(size=Incidence_Sum)) + + labs(title = "Nombre de décès dus au Covid-19 pour différents pays\nen fonction du nombre de lits d'hôpital", x = "Nombre de décès pour 1000 habitants", y = "Nombre de lits d'hôpital pour 1000 habitants", size="Nombre de décès total") + + geom_text(aes(label=Location), hjust=1.2, vjust=0.25, angle=90) + + xlim(2.5,14) + ylim(0,3.5) + + scale_color_continuous() + + theme( + plot.title = element_text(hjust = 0.5), + plot.background = element_rect(fill = "white"), + panel.background = element_rect(fill = 'white'), + panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "#e0e0e0"), + panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "#f2f2f2"), + axis.line = element_line(colour = "black") + ) +``` \ No newline at end of file