Dev Site — You are viewing the development build. Go to Main Site

  • English
  • Français
  1. 2 Assemblage et gestion des données
  2. 2.5 Données démographiques
  3. Raster de population WorldPop
  • Bibliothèque de code pour l'adaptation infranationale
    Version française
  • 1 Pour commencer
    • 1.1 À propos et comment nous contacter
    • 1.2 Pour tous
    • 1.3 Pour l’équipe SNT
    • 1.4 Pour les analystes
    • 1.5 Produire des résultats de haute qualité
  • 2 Assemblage et gestion des données
    • 2.1 Utilisation des shapefiles
      • Aperçu des données spatiales
      • Examiner les données du fichier shapefile
      • Shapefile management and customization
      • Merge shapefile with excel
    • 2.2 Formations sanitaires
      • Health facility active/inactive status
      • Health facility coordinates
      • Master facility lists
    • 2.3 Données de cas de routine (DHIS2)
      • Health facility reporting rate
      • Outlier detection methods
      • Imputation of missing data
      • Final database
      • Data extraction from DHIS2
      • Import dataset
      • Outlier correction
      • Quality control/checks
    • 2.4 Données du stock
      • lmis
    • 2.5 Données démographiques
      • Données démographiques nationales
      • Raster de population WorldPop
    • 2.6 Enquêtes nationales auprès des ménages
      • DHS Data Overview and Preparation
      • All-Cause Child Mortality
      • Extraction of ITN ownership, access, and usage
      • Extracion of prevalence data
      • Calculation of treatment-seeking data
    • 2.7 Données entomologiques
    • 2.8 Données climatiques et environnementales
      • Extraction de données climatiques et environnementales à partir de données raster
    • 2.9 Données modélisées
      • Generating spatial modeled estimates
      • Travailler avec les estimations modélisées géospatiales
      • Modeled Estimates of Entomological Indicators
      • Mortality estimates from IHME
  • 3 Stratification
    • 3.1 Stratification épidémiologique
    • 3.2 Stratification des déterminants de la transmission du paludisme
  • 4 Revue des interventions passées
    • 4.1 Prise en charge des cas
    • 4.2 Interventions de routine
    • 4.3 Interventions de campagne
    • 4.4 Autres interventions
  • 5 Ciblage des interventions
  • 6 Analyse rétrospective
  • 7 Microstratification urbaine

On this page

  • Aperçu
  • Quand utiliser les rasters de population
  • Comment fonctionnent les rasters
    • Étape par étape
      • Étape 1 : Importer le raster
      • Étape 2 : Extraire les valeurs de population par unité administrative
        • Étape 2.1 : Obtenir le shapefile et définir le SRC
        • Étape 2.2 : Extraire la population du raster
      • Étape 3 : Agrégation des données démographiques
      • Étape 4 : Extension des estimations démographiques au-delà de 2020
        • Étape 4.1 : Préparation de l’interpolation
        • Étape 4.2 : Remise en format long
      • Étape 5 : Visualisation des données démographiques extraites du raster
        • Étape 5.1 : Joindre et regrouper les données démographiques
        • Étape 5.2 : Générer une carte et vérifier les résultats
        • Étape 5.3 : Enregistrer les cartes
      • Étape 6 : Autres utilisations des données démographiques raster
        • Étape 6.1 : Calculer la proportion de la population par district
        • Étape 6.2 : Normaliser la population par pixel au sein de chaque unité administrative
        • Étape 6.3 : Comparer les rasters de population d’origine et normalisés
      • Étape 7 : Enregistrer les données
    • Résumé
    • Code complet
  1. 2 Assemblage et gestion des données
  2. 2.5 Données démographiques
  3. Raster de population WorldPop

Raster de population WorldPop

Aperçu

Si les données démographiques nationales constituent la principale source d’informations pour le SNT, des ensembles de données modélisées à haute résolution tels que WorldPop peuvent apporter une valeur ajoutée, en particulier lorsque l’on travaille à des échelles spatiales fines (par exemple, des mailles de 100 m ou 1 km). Ces estimations maillées sont utiles pour des tâches spécifiques telles que l’estimation de l’accès aux soins ou la cartographie de la répartition de la population au sein d’unités administratives vastes ou hétérogènes.

WorldPop peut être utile lorsque a) vous avez besoin d’estimations au niveau des pixels pour modéliser l’accès ou calculer les populations desservies ; b) vous estimez des groupes cibles tels que les enfants de moins de cinq ans ou les femmes en âge de procréer ; c) les données administratives sur la population ne correspondent pas bien à vos limites spatiales ; ou d) les projections nationales récentes ne sont pas disponibles et l’équipe SNT a autorisé l’utilisation d’autres sources de données modélisées.

Objectifs
  • Comprendre le fonctionnement des ensembles de données démographiques raster
  • Télécharger et importer directement des fichiers .tif WorldPop
  • Utiliser des shapefiles pour extraire les totaux de population au niveau des unités administratives
  • Aligner les SRC entre les couches raster et vectorielles avant l’extraction
  • Appliquer les taux de croissance annuels pour projeter la population au-delà de 2020
  • Remodeler les données démographiques au format long pour faciliter l’intégration
  • Valider visuellement les résultats extraits à l’aide de cartes de population
  • Explorer d’autres cas d’utilisation des données de population raster pour l’analyse SNT
  • Normaliser les valeurs raster au sein de chaque unité pour prendre en charge la pondération spatiale
  • Enregistrer les résultats traités et générés pour les réutiliser

Quand utiliser les rasters de population

Les rasters de population haute résolution ne sont pas seulement des comptages autonomes, ils peuvent être intégrés directement dans des tâches de modélisation, de pondération et d’allocation : les rasters de population peuvent être utilisés à des fins autres que le simple comptage de la population brute. Les estimations issues de rasters de population tels que WorldPop peuvent servir à bien plus qu’à compter la population au niveau infranational :

  • Répartition proportionnelle : lorsque des données officielles existent à des niveaux supérieurs (par exemple adm2) mais que les détails de niveau inférieur (par exemple adm3) sont manquants ou obsolètes, WorldPop peut fournir des parts de population afin de répartir spatialement les totaux connus.

  • Pondération de la population : les rasters haute résolution peuvent pondérer des indicateurs modélisés tels que PfPR2-10, l’accès aux moustiquaires ou les taux de recherche de soins, garantissant ainsi des résumés plus précis au niveau des districts.

  • Modélisation des zones de desserte et d’accès : combinez les rasters de population et de temps de trajet pour estimer le pourcentage de personnes se trouvant à l’intérieur ou à l’extérieur de seuils d’accès spécifiques (par exemple, à 5 km des formations sanitaires), puis appliquez ces proportions aux totaux du recensement.

  • Populations particulières : lorsque les données de recensement excluent des groupes tels que les réfugiés, les personnes déplacées ou les travailleurs migrants, WorldPop peut mettre en évidence les concentrations de population ou faciliter la triangulation à l’aide de données opérationnelles (par exemple, HCR, OMS Urgences).

Ces cas d’utilisation considèrent WorldPop comme un outil de distribution et d’inférence spatiale, et non comme un substitut aux recensements.

Consultez l’équipe SNT

WorldPop et d’autres ensembles de données modélisées peuvent fournir des estimations démographiques à haute résolution, particulièrement utiles pour des analyses telles que la modélisation de l’accès aux soins ou des zones de desserte. Toutefois, ces sources ne sont pas officielles et ne doivent pas être utilisées sans l’accord de l’équipe SNT.

  • L’équipe SNT vous indiquera si et quand les données modélisées peuvent être utilisées dans votre contexte.
  • Ne remplacez jamais ces ensembles de données par des chiffres issus du recensement, sauf indication contraire explicite.
  • Si vous n’êtes pas certain que leur utilisation soit appropriée, veuillez toujours consulter l’équipe SNT au préalable.

Cela garantit que les estimations démographiques restent crédibles, conformes à la politique nationale et comparables d’une région à l’autre.

In this section, we’ll walk through how to source WorldPop data, extract values using shapefiles, and get everything cleaned and aggregated for your SNT analysis.

Comment fonctionnent les rasters

Les jeux de données raster fonctionnent différemment des feuilles de calcul. Au lieu de lignes et de colonnes de texte ou de chiffres, un raster ressemble à une matrice de pixels. Chaque pixel a une valeur, tout comme chaque cellule dans Excel, mais au lieu de faire partie d’un tableau, il fait partie d’une grille spatiale. Cette grille est liée à des coordonnées géographiques réelles. À titre d’exemple, voici une carte raster de la densité de population du Rwanda utilisant les estimations ajustées par l’ONU pour 2020.

Figure

Densité de population estimée par WorldPop au Rwanda (2020). Source : WorldPop, raster 1 km ajusté par l’ONU.

Dans le cas de WorldPop, chaque pixel représente le nombre estimé de personnes vivant dans une petite zone, généralement de 100 m × 100 m ou 1 km × 1 km. Cela nous permet d’estimer la densité de population à une très haute résolution, puis de l’agréger vers le haut dans des zones administratives.

Les rasters WorldPop sont généralement stockés sous forme de fichiers .tif (format GeoTIFF). Chaque fichier représente généralement un pays, une année et un groupe de population (par exemple, la population totale, les moins de cinq ans, les femmes en âge de procréer, etc.).

Note

Les unités pour chaque pixel sont le nombre de personnes par pixel (ppp), et non le nombre de personnes par kilomètre carré. Si vous utilisez un raster de 100 m, une valeur de 25 signifie qu’il y a 25 personnes dans ce carré de 100 m × 100 m.

Ces valeurs sont modélisées à l’aide de l’apprentissage automatique (machine learning) et de covariables spatiales (telles que l’utilisation des sols, les réseaux routiers et l’éclairage nocturne), puis contraintes à l’aide des données de recensement disponibles. Ainsi, bien qu’elles offrent une bonne résolution spatiale, elles restent des estimations et peuvent ne pas correspondre exactement aux chiffres officiels.

Voici ce à quoi vous pouvez vous attendre lorsque vous ouvrez un raster :

Nom de la couche WCe qu’elle représente
sle_ppp_2020_UNadj.tif Sierra Leone, population totale, 2020
nga_f_0_4_2021_UNadj.tif Nigeria, population féminine âgée de 0 à 4 ans, 2021
eth_m_15_49_2019_UNadj.tif Éthiopie, population masculine âgée de 15 à 49 ans, 2019

Pourquoi est-ce important pour le SNT ?

Parce que les données raster ne sont pas organisées par districts ou régions, vous devez extraire les valeurs à l’aide de shapefiles. C’est là qu’intervient l’analyse spatiale. Vous superposez vos limites administratives (par exemple, un fichier de formes adm3) et additionnez les valeurs de tous les pixels qui se trouvent dans chaque unité. Vous obtenez ainsi une estimation de la population par district, chefferie ou zone de desserte.

Étape par étape

Pour passer l’explication étape par étape, passez directement au code complet à la fin de cette page.

Étape 1 : Importer le raster

Dans cette section, nous allons travailler avec des ensembles de données raster WorldPop. Nous devons d’abord télécharger le dernier raster de population pour le pays qui nous intéresse. Vous pouvez explorer les rasters disponibles par année et par pays sur le WorldPop Data Hub. Nous utilisons le package terra pour importer directement le raster dans R à partir du serveur WorldPop.

  • R
  • Python
# installer ou charger les paquets requis
pacman::p_load(
  httr,           # accès API (par exemple MAP, WorldPop)
  sf,             # données vectorielles (shapefiles)
  scales,         # formatage des légendes
  patchwork,      # combiner des ggplots
  terra,          # gestion des rasters
  exactextractr   # statistiques zonales à partir de rasters
)

# définir un lien direct vers le raster de la population de la Sierra Leone en 2020
sle_pop_path <- paste0(
  "https://data.worldpop.org/GIS/Population_Density/",
  "Global_2000_2020_1km_UNadj/2020/SLE/sle_pd_2020_1km_UNadj.tif"
)

# importer le raster
sle_2020_rast <- terra::rast(sle_pop_path)

Pour adapter le code :

  • Lignes 10-11 : Remplacez l’URL par le lien vers le fichier raster de votre pays ou précisez le chemin d’accès au dossier si vous disposez déjà du fichier raster localement.

Une fois la mise à jour effectuée, exécutez le code pour lire le fichier raster localement.

Étape 2 : Extraire les valeurs de population par unité administrative

Une fois que nous disposons de notre raster de population et du shapefile administratif, l’étape suivante consiste à extraire les totaux de population pour chaque unité administrative.

Il est préférable d’utiliser un shapefile qui correspond au niveau d’analyse. Par exemple, si votre analyse SNT est au niveau adm3, extrayez la population au niveau adm3. Évitez d’utiliser des shapefiles de niveau supérieur (par exemple, adm1) et d’essayer de désagréger vers le bas. Cela introduit souvent des erreurs ou des hypothèses irréalistes.

Bien que l’extraction à partir d’un niveau inférieur (par exemple, adm3) puisse offrir une certaine souplesse pour l’agrégation vers le haut, cela n’est utile que si le shapefile de niveau inférieur est complet et fiable. Dans la pratique, certains pays ont une couverture insuffisante ou des incohérences à des niveaux très fins comme adm3 ou adm4. Par conséquent, à moins d’avoir une raison spécifique de descendre plus bas, faites correspondre votre shapefile au niveau d’analyse.

Étape 2.1 : Obtenir le shapefile et définir le SRC

  • R
  • Python
# obtenir le shapefile
shp_adm3 <- sf::read_sf(
  here::here(
    "1.1_foundational",
    "1.1a_administrative_boundaries",
    "Chiefdom2021.shp"
  )
) |>
  dplyr::mutate(adm0 = "SIERRA LEONE") |>
  dplyr::select(
    adm0,
    adm1 = FIRST_REGI,
    adm2 = FIRST_DNAM,
    adm3 = FIRST_CHIE
  )

# assurer que les deux couches utilisent le même SRC
shp_adm3 <- sf::st_transform(shp_adm3, crs = terra::crs(sle_2020_rast))

Pour adapter le code :

  • Lignes 5 à 7 : remplacez le chemin d’accès dans la fonction sf::read_sf par le chemin d’accès local où sont stockées vos données shapefile.

  • Lignes 10 à 15 : ces étapes sont facultatives et permettent de créer la colonne adm0 et de sélectionner ou renommer les colonnes administratives pertinentes. Elles varient en fonction de votre shapefile, veuillez donc les adapter en conséquence.

Une fois les modifications effectuées, exécutez le code pour charger votre shapefile.

Dans le code ci-dessus, nous téléchargeons d’abord le fichier de formes adm3, qui contient les limites que nous souhaitons utiliser pour résumer les données démographiques. Cependant, les opérations spatiales exigent que les couches raster et vectorielle partagent le même système de référence de coordonnées (SRC). Nous gérons cela à l’aide de sf::st_transform() pour aligner le fichier de formes sur le SRC utilisé par le raster.

Astuce rapide : Pourquoi l’alignement des projections est-il important avant l’extraction ?

Avant d’extraire les valeurs de population, veuillez toujours vous assurer que votre raster et votre fichier de formes sont dans le même système de référence de coordonnées (SRC).

  • Des projections mal alignées peuvent entraîner des erreurs d’extraction, des décomptes de population incorrects ou le déplacement d’éléments en dehors des limites attendues.

  • Les rasters de population tels que WorldPop sont généralement fournis en WGS84 (EPSG:4326), mais vos shapefiles peuvent utiliser des systèmes différents tels que l’UTM ou des projections spécifiques à un pays.

  • Vérifiez toujours et réprojectez si nécessaire pour éviter les projections incohérentes.

Vous pouvez vérifier le SCR de vos couches dans R :

terra::crs(raster_file)
sf::st_crs(shapefile)

Si ils diffèrent, reprojetez votre shapefile pour qu’il corresponde au raster :

shapefile <- sf::st_transform(shapefile, crs = terra::crs(raster_file))

L’alignement des projections garantit la précision et la reproductibilité des superpositions d’extraction. Il est recommandé de toujours procéder ainsi au début.

Étape 2.2 : Extraire la population du raster

Nous utilisons la fonction exact_extract() du package exactextractr. Elle est parfaitement adaptée à nos besoins pour les raisons suivantes :

  • Elle calcule des résumés pondérés en fonction de la superficie, ce qui est important lorsque les cellules du raster ne recouvrent que partiellement les limites administratives. Cela garantit des totaux plus précis, en particulier autour des frontières irrégulières.

  • Elle est plus rapide et plus économe en mémoire que des alternatives telles que raster::extract() ou terra::extract(), car elle est construite sur un backend C++ optimisé pour les performances.

  • Elle respecte précisément les limites géométriques et évite les doubles comptages, ce qui donne des résultats propres et fiables qui s’adaptent bien aux rasters de niveau national.

  • R
  • Python
# Utiliser exactextractr pour extraire les sommes pondérées
shp_adm3$pop <- exactextractr::exact_extract(
  sle_2020_rast, shp_adm3, 'sum',
  progress = FALSE # Nous désactivons la barre de progression
) |> round()

# créer une colonne pour l'année
shp_adm3 <- shp_adm3 |>
  dplyr::mutate(year = 2020)

# Prévisualiser le résultat
shp_adm3 |>
  dplyr::select(adm0, adm1, adm2, adm3, year, pop) |> head()
Output

Sortie

          adm0    adm1     adm2        adm3 year   pop
1 SIERRA LEONE EASTERN KAILAHUN         DEA 2020 20003
2 SIERRA LEONE EASTERN KAILAHUN        JAHN 2020 10116
3 SIERRA LEONE EASTERN KAILAHUN       JAWIE 2020 76665
4 SIERRA LEONE EASTERN KAILAHUN  KISSI KAMA 2020 26207
5 SIERRA LEONE EASTERN KAILAHUN  KISSI TENG 2020 44124
6 SIERRA LEONE EASTERN KAILAHUN KISSI TONGI 2020 62577

Pour adapter le code :

  • Ligne 3 : Remplacez sle_2020_rast par votre objet raster et shp_adm3 par votre objet shapefile

  • Lignes 9 : Ajustez les colonnes dans dplyr::select() afin qu’elles correspondent à vos colonnes de niveau administratif (si elles ont un nom différent).

Une fois la mise à jour effectuée, exécutez le code pour extraire la population du raster.

Cette étape crée une nouvelle colonne, pop, contenant la population totale estimée pour chaque unité adm3 en 2020, extraite du raster WorldPop. Nous ajoutons également une colonne année, year, définie sur 2020 afin d’indiquer clairement la référence temporelle. Ces valeurs peuvent désormais être traitées comme des totaux basés sur le recensement, prêtes à être agrégées, visualisées ou intégrées dans le pipeline d’analyse SNT plus large.

Étape 3 : Agrégation des données démographiques

Au cours de cette étape, nous agrégons les chiffres de population au niveau administratif 2 (adm2). Cela nous permet de produire des estimations démographiques résumées par district ou unité équivalente, qui peuvent être utilisées dans des analyses ultérieures ou des exercices de cartographie.

  • R
  • Python
# résumer la population totale par adm0
pop_summary_adm2 <- shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::group_by(adm1, adm2, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

pop_summary_adm2
Output

Sortie

        adm1      adm2 year pop_total
1    EASTERN  KAILAHUN 2020    669106
2    EASTERN    KENEMA 2020    959041
3    EASTERN      KONO 2020    401503
4 NORTH EAST   BOMBALI 2020    458349
5 NORTH EAST    FALABA 2020    261306
6 NORTH EAST KOINADUGU 2020    228451

Pour adapter le code :

  • Ligne 4 : mettez à jour adm1 et adm2 afin qu’ils correspondent aux niveaux administratifs avec lesquels vous travaillez (par exemple, région, district, etc.), en fonction des attributs de votre shapefile.

Une fois la mise à jour effectuée, exécutez le code pour charger les données démographiques agrégées.

Étape 4 : Extension des estimations démographiques au-delà de 2020

Les données raster WorldPop ne sont disponibles que jusqu’en 2020 pour la plupart des pays. Cela pose un problème si des estimations démographiques sont nécessaires pour des années plus récentes.

Étape 4.1 : Préparation de l’interpolation

Pour préparer l’interpolation, nous convertissons d’abord l’ensemble de données du format long au format large. Cela implique de supprimer la colonne « année » et de renommer la colonne pop extraite en pop2020. Nous utilisons ensuite un taux de croissance annuel fixe (par exemple 1,5 %) pour projeter les totaux de population pour les années suivantes. Cette structure facilite les calculs d’une année sur l’autre et convient lorsque les données raster ne sont disponibles que pour une seule année de référence.

Consultez l’équipe SNT

Si des taux de croissance démographique sont nécessaires pour projeter des valeurs au-delà de l’année de référence (par exemple, pour extrapoler les estimations WorldPop), le taux approprié doit provenir du bureau national des statistiques (ou d’un organisme équivalent). N’appliquez pas de taux de croissance supposés ou ad hoc.

  • L’équipe SNT est chargée de rechercher et d’approuver tous les paramètres de croissance.
  • Veuillez toujours consulter l’équipe SNT avant d’utiliser des projections dans votre analyse.

Cela garantit que les estimations démographiques restent techniquement fiables, crédibles et conformes aux directives nationales.

  • R
  • Python
# appliquer le taux de croissance démographique
# pour les trois prochaines années
sl_pop_2020_2023 <- shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::select(-year) |>
  dplyr::rename(pop2020 = pop) |>
  dplyr::mutate(
    pop2021 = round(pop2020 * 1.015),
    pop2022 = round(pop2021 * 1.015),
    pop2023 = round(pop2022 * 1.015)
  )

# verifier les resultats
sl_pop_2020_2023
Output

Sortie

          adm0    adm1     adm2        adm3 pop2020 pop2021 pop2022 pop2023
1 SIERRA LEONE EASTERN KAILAHUN         DEA   20003   20303   20608   20917
2 SIERRA LEONE EASTERN KAILAHUN        JAHN   10116   10268   10422   10578
3 SIERRA LEONE EASTERN KAILAHUN       JAWIE   76665   77815   78982   80167
4 SIERRA LEONE EASTERN KAILAHUN  KISSI KAMA   26207   26600   26999   27404
5 SIERRA LEONE EASTERN KAILAHUN  KISSI TENG   44124   44786   45458   46140
6 SIERRA LEONE EASTERN KAILAHUN KISSI TONGI   62577   63516   64469   65436

Pour adapter le code :

  • Ligne 3 : Remplacez shp_adm3 par votre objet shapefile, s’il porte un autre nom.

  • Lignes 8 à 10 :

    • Ajoutez des lignes supplémentaires en suivant le même modèle si vous devez étendre les projections au-delà de 2023 (par exemple, ajoutez pop2024, pop2025, etc.).

    • Mettez à jour les libellés des années si vous effectuez des projections pour des années différentes ou si vous partez d’une année de référence différente.

  • Lignes 8 à 10 : mettez à jour le taux de croissance (1.015) si votre contexte nécessite un taux de croissance démographique annuel différent.

Une fois la mise à jour effectuée, exécutez le code pour interpoler les données démographiques.

Étape 4.2 : Remise en format long

Une fois les valeurs interpolées préparées en format large, nous convertissons à nouveau l’ensemble de données en format long. Cela garantit que chaque ligne correspond à une unité administrative pour une année, ce qui facilite la fusion avec d’autres ensembles de données, la génération d’indicateurs ou la représentation graphique des tendances au fil du temps.

  • R
  • Python
# tourner une population large en long
sl_pop_long <- sl_pop_2020_2023 |>
tidyr::pivot_longer(
    cols = dplyr::starts_with("pop"),
    names_to = "year",
    values_to = "pop"
  ) |>
  dplyr::mutate(
    year = stringr::str_remove(year, "pop") |>
      as.integer()
  )

Pour adapter le code :

  • Ligne 3 : si vous avez renommé les colonnes différemment (sans commencer par pop), mettez à jour dplyr::starts_with("pop") pour qu’il corresponde à votre préfixe réel.

  • Lignes 8 à 10 : si vous avez utilisé un autre modèle de dénomination (par exemple, population2020), modifiez stringr::str_remove("pop") pour qu’il corresponde à ce modèle (par exemple, stringr::str_remove("population")).

Une fois la mise à jour effectuée, exécutez le code pour remodeler vos données de population interpolées.

Étape 5 : Visualisation des données démographiques extraites du raster

Après avoir extrait et projeté les estimations démographiques à partir du raster, il est utile de visualiser les résultats. Cela vous permet de vérifier que les jointures spatiales ont été effectuées correctement et de rechercher des anomalies (zones manquantes, valeurs irréalistes ou lacunes dans la couverture) avant de poursuivre.

Étape 5.1 : Joindre et regrouper les données démographiques

Nous commençons par joindre l’ensemble de données démographiques au format long à la géométrie du shapefile correspondant. Nous regroupons également les valeurs démographiques dans des classes afin de simplifier l’interprétation sur la carte. Le regroupement permet de mettre en évidence les fourchettes de population et de repérer rapidement les valeurs anormalement élevées ou faibles. Afin de faciliter les contrôles de qualité, nous regroupons les valeurs de population dans des classes. Il est important de noter que nous incluons également une catégorie « Manquant ou 0 » afin de détecter les unités administratives pour lesquelles la valeur est absente ou nulle. Cette catégorie est représentée en gris sur la carte, ce qui vous permet de repérer rapidement les lacunes potentielles dans les étapes d’extraction ou de projection du raster.

  • R
  • Python
# Joindre la population raster extraite au shapefile
shp_adm3_raster_pop <- sl_pop_long |>
  dplyr::left_join(
    # Joindre le shapefile aux données de population
    dplyr::select(shp_adm3, -pop, -year),
    by = c("adm0", "adm1", "adm2", "adm3")
  ) |> sf::st_as_sf() |>
  # Créer une version catégorielle de la colonne pop
  dplyr::mutate(
    pop_bin = dplyr::case_when(
      is.na(pop) | pop == 0 ~ "Manquant ou 0",
      pop <= 15000 ~ "<15k",
      pop <= 30000 ~ "15k–30k",
      pop <= 50000 ~ "30k–50k",
      pop <= 100000 ~ "50k–100k",
      pop > 100000 ~ "100k+"
    ),
    pop_bin = factor(
      pop_bin,
      levels = c("Manquant ou 0", "<15k",
                 "15k–30k", "30k–50k",
                 "50k–100k", "100k+")
    )
  )

Pour adapter le code :

  • Ligne 6 : si vous avez utilisé un shapefile ou un niveau de jointure administrative différent précédemment, remplacez = adm3 par le niveau que vous avez utilisé (par exemple, adm2 ou adm1).

  • Lignes 11 à 16 : vous pouvez ajuster les classes de population afin qu’elles correspondent à des fourchettes significatives pour votre contexte.

Une fois la mise à jour effectuée, exécutez le code pour configurer vos données démographiques en vue de la cartographie.

Étape 5.2 : Générer une carte et vérifier les résultats

Nous utilisons ggplot2 pour créer une carte à facettes, indiquant la population par chefferie (adm3) de 2020 à 2023. La superposition des limites adm1 améliore la référence spatiale. Si des chefferies ont des valeurs manquantes ou nulles, elles apparaîtront clairement, ce qui fait de cette étape un contrôle de qualité important.

  • R
  • Python
# visualiser la population raster extraite

# générer un shapefile de niveau adm0 pour la carte
shp_adm0 <- shp_adm3 |>
  dplyr::group_by(adm0) |>
  dplyr::summarise(.groups = "drop") |>
  sf::st_union(by_feature = TRUE)

# générer un shapefile de niveau adm1 pour la carte
shp_adm1 <- shp_adm3 |>
  dplyr::group_by(adm1) |>
  dplyr::summarise(.groups = "drop") |>
  sf::st_union(by_feature = TRUE)

adm3_raster_pop_map <- shp_adm3_raster_pop |>
  ggplot2::ggplot() +
  ggplot2::geom_sf(
    ggplot2::aes(fill = pop_bin),
    color = "white",
    size = 0.2
  ) +
  # ajouter le contour adm1
  ggplot2::geom_sf(
    data = shp_adm1,
    fill = NA, color = "black", size = 0.5
  ) +
  ggplot2::scale_fill_manual(
    name = "Population",
    values = c("Manquant ou 0" = "grey80",
               "<15k" = "#fee5d9",
               "15k–30k" = "#fcae91",
               "30k–50k" = "#fb6a4a",
               "50k–100k" = "#de2d26",
               "100k+" = "#a50f15"),
    na.value = "grey80",
    guide = ggplot2::guide_legend(
      label.position = "bottom",
      title.position = "top"
    )
  ) +
    ggplot2::facet_wrap(~year, nrow = 1) +
  ggplot2::labs(
    title = "Population extraite des rasters pour chaque chefferie (adm3) pour la période 2020-2023",
    subtitle = "Extrait des données WorldPop Raster (2020)",
    caption = "Remarque : Population estimée pour 2021-2023 sur la base d'un taux de croissance de 1,5 %.",
    fill = "Population"
  ) +
  ggplot2::theme_minimal() +
  ggplot2::theme(
    legend.position = "bottom",
    legend.title.position = "top",
    legend.key.width = grid::unit(1, "cm"),
    axis.text.x = ggplot2::element_text(
      angle = 75, vjust = 1, hjust = 1
    )
  )
Output

Sortie

Pour adapter le code :

  • Lignes 14 et 42 : si vous avez rejoint le projet à un autre niveau administratif (par exemple, adm2), mettez à jour shp_adm3_raster_pop et le titre de la carte en conséquence.

  • Ligne 23 : si votre shapefile admin1 porte un autre nom, remplacez data = shp_adm1 par le nom de votre objet.

  • Lignes 28 à 33 : ajustez les valeurs et les plages de couleurs si vous avez défini des classes de population différentes.

Une fois la mise à jour effectuée, exécutez le code pour cartographier vos données agrégées.

Étape 5.3 : Enregistrer les cartes

La carte est ensuite enregistrée au format PNG haute résolution pour référence ultérieure.

  • R
  • Python
# enregistrer la carte
ggplot2::ggsave(
  plot = adm3_raster_pop_map,
  here::here("03_output/3a_figures/pop_rast_check_adm3_2020_2023.png"),
  width = 12, height = 5, dpi = 300)

Pour adapter le code :

  • Ligne 4 :
    • Mettez à jour le chemin d’accès au fichier afin qu’il corresponde à la structure de vos dossiers.
    • Vous pouvez remplacer pop_rast_check_adm3_2020_2023.png par le nom de votre fichier.
  • Ligne 5 : ajustez la largeur, la hauteur et la résolution si vous avez besoin d’une image de taille ou de qualité différente.

Une fois la mise à jour effectuée, exécutez le code pour enregistrer le graphique au format PNG.

Étape 6 : Autres utilisations des données démographiques raster

Si les rasters démographiques sont couramment utilisés pour générer des totaux infranationaux, ils peuvent également servir à d’autres analyses spatiales qui contribuent à la prise de décision en matière de SNT. Cette section décrit comment WorldPop peut être utilisé pour compléter les données de recensement dans le cadre de tâches d’adaptation infranationale, en particulier lorsqu’une résolution géographique plus fine ou des modèles démographiques relatifs sont nécessaires.

Bien que les rasters modélisés tels que WorldPop ne correspondent pas toujours parfaitement aux totaux du recensement, ils reflètent souvent bien la répartition relative de la population, en particulier entre les sous-districts ou au sein de districts hétérogènes de grande taille. Ils sont donc utiles pour des tâches telles que la pondération, la répartition proportionnelle et l’évaluation de l’accès spatial.

Étape 6.1 : Calculer la proportion de la population par district

WorldPop est couramment utilisé pour calculer la proportion de la population nationale représentée par chaque unité de votre shapefile. Dans ce cas, nous travaillons au niveau adm3 et calculons la part de chaque unité dans la population nationale totale, ainsi que sa part dans les limites de ses frontières adm1 et adm2. Cela est utile lorsque les totaux de la population nationale sont disponibles, mais que les répartitions infranationales sont obsolètes ou peu fiables. Cela vous permet également de répartir les ressources proportionnellement entre les zones, de générer des pondérations relatives pour une analyse plus approfondie ou de comparer la répartition de la population entre les hiérarchies spatiales. Cette approche ne considère pas les estimations raster de WorldPop comme un substitut aux recensements, mais comme un moyen de déduire des proportions spatiales cohérentes lorsque des données plus granulaires font défaut.

Dans le code ci-dessous, nous calculons la population totale aux niveaux national, adm1 et adm2, puis nous calculons la part de chaque unité adm3 par rapport à chacun de ces trois totaux.

  • R
  • Python
# Calculer la repartition de la population au niveau national, adm1 et adm2
pop_share <- shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::mutate(
    adm0_total = sum(pop, na.rm = TRUE)
  ) |>
  dplyr::group_by(adm1) |>
  dplyr::mutate(
    total_adm1 = sum(pop, na.rm = TRUE)
  ) |>
  dplyr::group_by(adm1, adm2, .add = TRUE) |>
  dplyr::mutate(
    total_adm2 = sum(pop, na.rm = TRUE),
    prop_adm0 = pop / adm0_total,
    prop_adm1 = pop / total_adm1,
    prop_adm2 = pop / total_adm2
  ) |>
  dplyr::ungroup()

# Vérifier la tête
pop_share |>
  dplyr::filter(
    adm2 == "WESTERN URBAN"
    ) |>
  dplyr::select(
    adm1, adm2, adm3, year, pop,
    prop_adm0, prop_adm1, prop_adm2
  ) |>
    dplyr::arrange(desc(prop_adm0)) |>
  head()
Output

Sortie

# A tibble: 6 × 8
  adm1    adm2          adm3       year    pop prop_adm0 prop_adm1 prop_adm2
  <chr>   <chr>         <chr>     <dbl>  <dbl>     <dbl>     <dbl>     <dbl>
1 WESTERN WESTERN URBAN EAST III   2020 614851   0.0664     0.315     0.415 
2 WESTERN WESTERN URBAN WEST III   2020 481525   0.0520     0.247     0.325 
3 WESTERN WESTERN URBAN WEST II    2020 153241   0.0165     0.0785    0.103 
4 WESTERN WESTERN URBAN WEST I     2020  64695   0.00699    0.0331    0.0436
5 WESTERN WESTERN URBAN CENTRAL I  2020  55202   0.00596    0.0283    0.0372
6 WESTERN WESTERN URBAN EAST I     2020  49774   0.00538    0.0255    0.0336

Pour adapter le code :

  • Remplacez adm1, adm2 et pop par les noms de colonnes appropriés dans votre shapefile.

  • Assurez-vous que votre shapefile comprend la variable de population extraite de WorldPop pour chaque sous-unité.

  • Ajustez le regroupement si vous travaillez à un niveau différent (par exemple, adm1 → adm0).

Une fois la mise à jour effectuée, exécutez le code pour générer les parts proportionnelles de la population pour chaque sous-unité, qui pourront ensuite être utilisées pour désagréger les totaux ou orienter le ciblage.

Ce résultat confirme que le calcul est correct : en 2020, les sous-unités EAST III et WEST III représentaient ensemble 74 % de la population de Western Urban et plus de 11 % de la population nationale. Cela montre à quel point la population est concentrée dans quelques unités adm3 seulement dans une grande agglomération urbaine.

Ces proportions peuvent servir à des cas d’utilisation futurs, tels que l’analyse pondérée ou l’allocation des ressources, et peuvent être converties en chiffres absolus à l’aide des totaux officiels du recensement.

Étape 6.2 : Normaliser la population par pixel au sein de chaque unité administrative

Lorsque l’objectif est de comprendre comment les personnes sont réparties au sein d’une unité administrative donnée, telle qu’un district, et non pas combien de personnes y vivent au total, nous utilisons une surface de population normalisée. Chaque pixel est redimensionné afin de refléter sa part de la population totale au niveau de l’unité administrative, ce qui facilite le calcul de données telles que : quelle proportion du district vit à moins de 5 km d’une installation ?

Pourquoi normaliser ?

La normalisation du raster de population par district permet de mieux déterminer où vivent réellement les personnes au sein de chaque unité. Cela est particulièrement utile lorsque vous combinez des rasters (par exemple, la population avec les surfaces d’accès) ou lorsque vous estimez la part d’une population touchée par une caractéristique spatiale telle que la zone tampon d’un établissement de santé.

L’utilisation de la population brute ou normalisée dépend de votre objectif : - La population brute donne le nombre de personnes par pixel. - La population normalisée donne la part de chaque pixel dans le total du district (la somme est égale à 1 dans chaque unité).

Utilisez les chiffres bruts lorsque vous avez besoin de nombres absolus. Utilisez les valeurs normalisées pour les proportions au sein d’un district ou pour la pondération spatiale.

Votre objectif Utiliser la pop brute ? Normaliser ?
Compter les personnes dans une zone tampon ✅ Oui ❌ Non
Visualiser où vivent la plupart des personnes ✅ Oui ⚠️ Peut-être – à utiliser si l’on se concentre sur la densité relative
Désagréger le total d’un district (par exemple, 500 cas) ❌ Non ✅ Oui
Pondérer les valeurs raster dans un district ❌ Non ✅ Oui

Nous normalisons le raster WorldPop 2020 afin que les valeurs des pixels de chaque district s’éliminent mutuellement en utilisant sntutils::normalize_raster_by_polygon(). Le résultat est un raster où chaque pixel représente sa part de la population dans l’unité administrative concernée. Cette surface relative est utile pour les étapes ultérieures impliquant une pondération spatiale ou une désagrégation proportionnelle, par exemple pour obtenir une estimation au niveau du district de la prévalence moyenne du parasite Plasmodium falciparum chez les enfants de 2 à 10 ans (PfPR2-10) à l’aide d’une surface modélisée géospatiale de (PfPR2-10).

  • R
  • Python
# Normaliser la pop par pixel dans chaque adm2
normed_wp_raster <- sntutils::normalize_raster_by_polygon(
  raster = sle_2020_rast,
  shp = shp_adm3,
  id_col = "adm2"
)

Pour adapter le code :

  • Remplacez shp_adm3 par votre propre shapefile si vous utilisez une géographie différente.
  • Remplacez adm2 par le nom de la colonne qui identifie votre unité administrative cible.
  • Assurez-vous que sle_2020_rast correspond au raster de population que vous souhaitez normaliser.

Une fois la mise à jour effectuée, exécutez le code pour générer un raster normalisé au sein de l’unité, où les valeurs s’additionnent pour donner 1 par zone administrative.

Étape 6.3 : Comparer les rasters de population d’origine et normalisés

Maintenant que nous avons créé une version normalisée du raster WorldPop 2020, nous pouvons le comparer visuellement au raster d’origine. Cela permet d’illustrer comment la normalisation met l’accent sur la distribution relative plutôt que sur le nombre absolu de personnes.

  • R
  • Python
Montrer le code
# Convertir les rasters en data.frames
df_orig <- as.data.frame(sle_2020_rast, xy = TRUE, na.rm = T)
df_norm <- as.data.frame(normed_wp_raster, xy = TRUE, na.rm = T)

# Raster de population d'origine
p1 <- ggplot2::ggplot(
  df_orig,
  ggplot2::aes(x, y, fill = sle_pd_2020_1km_UNadj)
) +
  ggplot2::geom_raster() +
  ggplot2::coord_quickmap() +
  ggplot2::labs(
    title = "Raster d'origine (adm2)",
    fill = "Population"
  ) +
  ggplot2::scale_fill_distiller(
    palette = "OrRd",
    direction = 1,
    labels = scales::label_comma(big.mark = ","),
    guide = ggplot2::guide_colorbar(
      title.position = "top",
      title.hjust = 0.5,
      barheight = grid::unit(0.2, "cm"),
      barwidth = grid::unit(5.5, "cm")
    )
  ) +
  ggplot2::theme_void() +
  ggplot2::theme(
    legend.position = "bottom",
    plot.title = ggplot2::element_text(hjust = 0.5),
    legend.title.align = 0.5
  )

# Raster de population normalisé
p2 <- ggplot2::ggplot(
  df_norm,
  ggplot2::aes(x, y, fill = sle_pd_2020_1km_UNadj * 100)
) +
  ggplot2::geom_raster() +
  ggplot2::coord_quickmap() +
  ggplot2::labs(
    title = "Raster normalisé (adm2)",
    fill = "Population (%)"
  ) +
  ggplot2::scale_fill_distiller(
    palette = "OrRd",
    direction = 1,
    labels = scales::label_number(suffix = "%", accuracy = 0.1),
    guide = ggplot2::guide_colorbar(
      title.position = "top",
      title.hjust = 0.5,
      barheight = grid::unit(0.2, "cm"),
      barwidth = grid::unit(5.5, "cm")
    )
  ) +
  ggplot2::theme_void() +
  ggplot2::theme(
    legend.position = "bottom",
    plot.title = ggplot2::element_text(hjust = 0.5),
    legend.title.align = 0.5
  )

# assembler des graphiques
(p1 + p2) & ggplot2::theme(legend.position = "bottom")
Output

Sortie

Pour adapter le code :

  • Remplacez sle_2020_rast par votre raster d’origine et normed_wp_raster par votre raster normalisé.

  • Mettez à jour la variable fill si votre raster utilise un nom de couche différent.

  • Ajustez adm2 ou toute autre étiquette afin de refléter votre niveau administratif.

  • Cette comparaison fonctionne mieux lorsque les deux rasters sont alignés spatialement et temporellement.

Une fois la mise à jour effectuée, exécutez le code pour générer vos graphiques de comparaison.

Étape 7 : Enregistrer les données

Après avoir agrégé et validé les données démographiques, il est recommandé d’enregistrer les données démographiques finales. Cela vous permettra de réutiliser les données nettoyées et structurées lors des étapes suivantes sans avoir à les retraiter depuis le début.

Nous enregistrons le raster brut (.tif) et le tableau démographique agrégé aux formats .rds, .csv et .xlsx.

  • R
  • Python
# configurer le chemin de sortie
save_path <- here::here(
  "01_data",
  "1.1_foundational",
  "1.1c_population",
  "1ci_worldpop_rasters"
)

# enregistrer le raster brut
terra::writeRaster(
  sle_2020_rast,
  here::here(save_path, "1ci_worldpop_rasters", "sle_2020_pop_rast.tif")
)

# enregistrer le raster brut normalisé
terra::writeRaster(
  normed_wp_raster,
  here::here(save_path, "1ci_worldpop_rasters", "sle_2020_pop_rast_normed.tif")
)

# enregistrer au format rds
rio::export(
  pop_share,
  here::here(save_path, "1ci_population", "sle_2020_pop_rast.rds")
)

# enregistrer au format csv
rio::export(
  pop_share,
  here::here(save_path, "1ci_population", "sle_2020_pop_rast.csv")
)

# enregistrer au format xlsx
rio::export(
  pop_share,
  here::here(save_path, "1ci_population", "sle_2020_pop_rast.xlsx")

*Pour adapter le code :

  • Ligne 3 :
    • Mettez à jour save_path avec votre répertoire de sortie.
    • pop_long : remplacez si votre colonne de précipitations porte un nom différent.
  • Noms de fichiers : modifiez les noms de fichiers (par exemple, sle_2020_pop_rast.csv) pour refléter votre ensemble de données ou votre plage de temps.

Une fois la mise à jour effectuée, exécutez le code pour enregistrer vos résultats aux formats brut et traité.

Résumé

Nous avons examiné comment travailler avec des rasters de population modélisés tels que WorldPop, notamment l’importation de fichiers .tif, l’extraction de valeurs à l’aide de shapefiles et la projection des totaux pour les dernières années. Ces couches sont particulièrement utiles lorsque les données de recensement sont manquantes ou trop approximatives, et nous fournissent des estimations de population flexibles et haute résolution qui peuvent être alignées sur n’importe quelle unité spatiale. Nous avons également abordé les bonnes pratiques : harmonisation des projections, validation des jointures et enregistrement des résultats nettoyés dans des formats réutilisables.

Nous avons également exploré d’autres utilisations, telles que le calcul des parts de population entre les districts et la normalisation des rasters au sein des unités afin de faciliter la pondération spatiale et la désagrégation. Ces méthodes traitent le raster comme une surface de distribution, et non comme une simple couche de comptage. Le code complet est disponible à la fin de cette section (réduit pour plus de commodité). Vous pouvez l’utiliser comme modèle : il vous suffit de mettre à jour les chemins d’accès ou les niveaux administratifs en fonction de votre contexte.

Code complet

  • R
  • Python
Montrer le code
#===============================================================================
### Étape 1 : Importer le raster
#===============================================================================

# installer ou charger les paquets requis
pacman::p_load(
  httr,           # accès API (par exemple MAP, WorldPop)
  sf,             # données vectorielles (shapefiles)
  scales,         # formatage des légendes
  patchwork,      # combiner des ggplots
  terra,          # gestion des rasters
  exactextractr   # statistiques zonales à partir de rasters
)

# définir un lien direct vers le raster de la population de la Sierra Leone en 2020
sle_pop_path <- paste0(
  "https://data.worldpop.org/GIS/Population_Density/",
  "Global_2000_2020_1km_UNadj/2020/SLE/sle_pd_2020_1km_UNadj.tif"
)

# importer le raster
sle_2020_rast <- terra::rast(sle_pop_path)

#===============================================================================
# Étape 2 : Extraire les valeurs de population par unité administrative
#===============================================================================

# obtenir le shapefile
shp_adm3 <- sf::read_sf(
  here::here(
    "1.1_foundational",
    "1.1a_administrative_boundaries",
    "Chiefdom2021.shp"
  )
) |>
  dplyr::mutate(adm0 = "SIERRA LEONE") |>
  dplyr::select(
    adm0,
    adm1 = FIRST_REGI,
    adm2 = FIRST_DNAM,
    adm3 = FIRST_CHIE
  )

# assurer que les deux couches utilisent le même SRC
shp_adm3 <- sf::st_transform(shp_adm3, crs = terra::crs(sle_2020_rast))

# Utiliser exactextractr pour extraire les sommes pondérées
shp_adm3$pop <- exactextractr::exact_extract(
  sle_2020_rast, shp_adm3, 'sum',
  progress = FALSE # Nous désactivons la barre de progression
) |> round()

# créer une colonne pour l'année
shp_adm3 <- shp_adm3 |>
  dplyr::mutate(year = 2020)

# Prévisualiser le résultat
shp_adm3 |>
  dplyr::select(adm0, adm1, adm2, adm3, year, pop) |> head()

#===============================================================================
# Étape 3 : Agrégation des données démographiques
#===============================================================================

# résumer la population totale par adm0
pop_summary_adm2 <- shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::group_by(adm1, adm2, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

# prévisualiser le résultat
pop_summary_adm2 |>
  as.data.frame() |>
  dplyr::select(adm1, adm2, year, pop_total) |>
  head()

#===============================================================================
# Étape 4 : Extension des estimations démographiques au-delà de 2020
#===============================================================================

sl_pop_2020_2023 <- shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::select(-year) |>
  dplyr::rename(pop2020 = pop) |>
  dplyr::mutate(
    pop2021 = round(pop2020 * 1.015),
    pop2022 = round(pop2021 * 1.015),
    pop2023 = round(pop2022 * 1.015)
  )

sl_pop_2020_2023 |>
  as.data.frame() |>
  head()

sl_pop_2020_2023

# tourner la pop large en long
sl_pop_long <- sl_pop_2020_2023 |>
  tidyr::pivot_longer(
    cols = dplyr::starts_with("pop"),
    names_to = "year",
    values_to = "population"
  ) |>
  dplyr::mutate(
    year = stringr::str_remove(year, "pop") |>
      as.integer()
  )

#===============================================================================
# Étape 5 : Visualisation des données démographiques extraites du raster
#===============================================================================

# Joindre la population raster extraite au shapefile
shp_adm3_raster_pop <- sl_pop_long |>
  dplyr::left_join(
    # Joindre le shapefile aux données de population
    dplyr::select(shp_adm3, -pop, -year),
    by = c("adm0", "adm1", "adm2", "adm3")
  ) |> sf::st_as_sf() |>
  # Créer une version catégorielle de la colonne pop
  dplyr::mutate(
    pop_bin = dplyr::case_when(
      is.na(pop) | pop == 0 ~ "Manquant ou 0",
      pop <= 15000 ~ "<15k",
      pop <= 30000 ~ "15k–30k",
      pop <= 50000 ~ "30k–50k",
      pop <= 100000 ~ "50k–100k",
      pop > 100000 ~ "100k+"
    ),
    pop_bin = factor(
      pop_bin,
      levels = c("Manquant ou 0", "<15k",
                 "15k–30k", "30k–50k",
                 "50k–100k", "100k+")
    )
  )

# générer un shapefile de niveau adm0 pour la carte
shp_adm0 <- shp_adm3 |>
  dplyr::group_by(adm0) |>
  dplyr::summarise(.groups = "drop") |>
  sf::st_union(by_feature = TRUE)

# générer un shapefile de niveau adm1 pour la carte
shp_adm1 <- shp_adm3 |>
  dplyr::group_by(adm1) |>
  dplyr::summarise(.groups = "drop") |>
  sf::st_union(by_feature = TRUE)

adm3_raster_pop_map <- shp_adm3_raster_pop |>
  ggplot2::ggplot() +
  ggplot2::geom_sf(
    ggplot2::aes(fill = pop_bin),
    color = "white",
    size = 0.2
  ) +
  # ajouter le contour adm1
  ggplot2::geom_sf(
    data = shp_adm1,
    fill = NA, color = "black", size = 0.5
  ) +
  ggplot2::scale_fill_manual(
    name = "Population",
    values = c("Manquant ou 0" = "grey80",
               "<15k" = "#fee5d9",
               "15k–30k" = "#fcae91",
               "30k–50k" = "#fb6a4a",
               "50k–100k" = "#de2d26",
               "100k+" = "#a50f15"),
    na.value = "grey80",
    guide = ggplot2::guide_legend(
      label.position = "bottom",
      title.position = "top"
    )
  ) +
    ggplot2::facet_wrap(~year, nrow = 1) +
  ggplot2::labs(
    title = "Population extraite des rasters pour chaque chefferie (adm3) pour la période 2020-2023",
    subtitle = "Extrait des données WorldPop Raster (2020)",
    caption = "Remarque : Population estimée pour 2021-2023 sur la base d'un taux de croissance de 1,5 %.",
    fill = "Population"
  ) +
  ggplot2::theme_minimal() +
  ggplot2::theme(
    legend.position = "bottom",
    legend.title.position = "top",
    legend.key.width = grid::unit(1, "cm"),
    axis.text.x = ggplot2::element_text(
      angle = 75, vjust = 1, hjust = 1
    )
  )

ggplot2::ggsave(
  plot = adm3_raster_pop_map,
  here::here("03_output/3a_figures/pop_rast_check_adm3_2020_2023.png"),
  width = 12,
  height = 5,
  dpi = 300
)


#===============================================================================
# Étape 6 : Autres utilisations des données démographiques raster
#===============================================================================

# Calculer la repartition de population au niveau national, adm1 et adm2
pop_share <- shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::mutate(
    adm0_total = sum(pop, na.rm = TRUE)
  ) |>
  dplyr::group_by(adm1) |>
  dplyr::mutate(
    total_adm1 = sum(pop, na.rm = TRUE)
  ) |>
  dplyr::group_by(adm1, adm2, .add = TRUE) |>
  dplyr::mutate(
    total_adm2 = sum(pop, na.rm = TRUE),
    prop_adm0 = pop / adm0_total,
    prop_adm1 = pop / total_adm1,
    prop_adm2 = pop / total_adm2
  ) |>
  dplyr::ungroup()

# Vérifier la tête
pop_share |>
  dplyr::filter(
    adm2 == "WESTERN URBAN"
  ) |>
  dplyr::select(
    adm1,
    adm2,
    adm3,
    year,
    pop,
    prop_adm0,
    prop_adm1,
    prop_adm2
  ) |>
  dplyr::arrange(desc(prop_adm0)) |>
  head()

# Normaliser la pop par pixel dans chaque adm2
normed_wp_raster <- sntutils::normalize_raster_by_polygon(
  raster = sle_2020_rast,
  shp = shp_adm3,
  id_col = "adm2"
)

# Convertir les rasters en data.frames
df_orig <- as.data.frame(sle_2020_rast, xy = TRUE, na.rm = T)
df_norm <- as.data.frame(normed_wp_raster, xy = TRUE, na.rm = T)

# Raster de population d'origine
p1 <- ggplot2::ggplot(
  df_orig,
  ggplot2::aes(x, y, fill = sle_pd_2020_1km_UNadj)
) +
  ggplot2::geom_raster() +
  ggplot2::coord_quickmap() +
  ggplot2::labs(
    title = "Raster d'origine (adm2)",
    fill = "Population"
  ) +
  ggplot2::scale_fill_distiller(
    palette = "OrRd",
    direction = 1,
    labels = scales::label_comma(big.mark = ","),
    guide = ggplot2::guide_colorbar(
      title.position = "top",
      title.hjust = 0.5,
      barheight = grid::unit(0.2, "cm"),
      barwidth = grid::unit(5.5, "cm")
    )
  ) +
  ggplot2::theme_void() +
  ggplot2::theme(
    legend.position = "bottom",
    plot.title = ggplot2::element_text(hjust = 0.5),
    legend.title.align = 0.5
  )

# Raster de population normalisé
p2 <- ggplot2::ggplot(
  df_norm,
  ggplot2::aes(x, y, fill = sle_pd_2020_1km_UNadj * 100)
) +
  ggplot2::geom_raster() +
  ggplot2::coord_quickmap() +
  ggplot2::labs(
    title = "Raster normalisé (adm2)",
    fill = "Population (%)"
  ) +
  ggplot2::scale_fill_distiller(
    palette = "OrRd",
    direction = 1,
    labels = scales::label_number(suffix = "%", accuracy = 0.1),
    guide = ggplot2::guide_colorbar(
      title.position = "top",
      title.hjust = 0.5,
      barheight = grid::unit(0.2, "cm"),
      barwidth = grid::unit(5.5, "cm")
    )
  ) +
  ggplot2::theme_void() +
  ggplot2::theme(
    legend.position = "bottom",
    plot.title = ggplot2::element_text(hjust = 0.5),
    legend.title.align = 0.5
  )

# assembler des graphiques
(p1 + p2) & ggplot2::theme(legend.position = "bottom")

#===============================================================================
# Étape 7 : Enregistrer les données
#===============================================================================

# configurer le chemin de sortie
save_path <- here::here(
  "01_data",
  "1.1_foundational",
  "1.1c_population",
  "1ci_worldpop_rasters"
)

# enregistrer le raster brut
terra::writeRaster(
  sle_2020_rast,
  here::here(save_path, "1ci_worldpop_rasters", "sle_2020_pop_rast.tif")
)

# enregistrer le raster brut normalisé
terra::writeRaster(
  normed_wp_raster,
  here::here(save_path, "1ci_worldpop_rasters", "sle_2020_pop_rast_normed.tif")
)

# enregistrer au format rds
rio::export(
  pop_share,
  here::here(save_path, "1ci_population", "sle_2020_pop_rast.rds")
)

# enregistrer au format csv
rio::export(
  pop_share,
  here::here(save_path, "1ci_population", "sle_2020_pop_rast.csv")
)

# enregistrer au format xlsx
rio::export(
  pop_share,
  here::here(save_path, "1ci_population", "sle_2020_pop_rast.xlsx")

#===============================================================================
# Fin du code
#===============================================================================
 

©2025 Applied Health Analytics for Delivery and Innovation. All rights reserved