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. Données démographiques nationales
  • 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
  • Besoins en données démographiques
  • Étape par étape
    • Étape 1 : Configuration initiale
      • Étape 1.1 : Définir les fonctions et obtenir les paquets
      • Étape 1.2 : Importer les données
  • Python
    • Étape 2 : Transformer les données
      • Étape 2.1 : Remodeler les données larges en format long
      • Étape 2.2 : À quoi doivent ressembler mes données finales ?
    • Étape 3 : Alignement des unités administratives
      • Étape 3.1 : Aligner les niveaux administratifs à l’aide d’un shapefile
  • Python
  • Python
    • Étape 3.2 : Vérification des incohérences dans les valeurs administratives
  • Python
    • Étape 3.3 : Résolution des incohérences dans les unités administratives
  • Python
    • Étape 4 : Agrégation des données démographiques
  • Python
    • Étape 5 : Visualisation des données démographiques agrégées
      • Étape 5.1 : Préparation des données démographiques pour la cartographie
      • Étape 5.2 : Visualiser la population agrégée par région
  • Python
    • Étape 5.3 : Enregistrer les graphiques
    • Étape 6 : Enregistrer les données
  • Résumé
  • Code complet
  1. 2 Assemblage et gestion des données
  2. 2.5 Données démographiques
  3. Données démographiques nationales

Données démographiques nationales

Aperçu

Dans le cadre du SNT, les données démographiques sont fondamentales. Elles sont utilisées pour calculer des indicateurs tels que les taux d’incidence, évaluer les populations à risque, modéliser la charge de morbidité et orienter les interventions. Sans données démographiques fiables et bien structurées, il est difficile d’établir des priorités efficaces ou d’évaluer la couverture des interventions. Plus tard dans le processus de lutte contre le paludisme, l’ensemble des données démographiques nettoyées, souvent issues de recensements, sera fusionné avec des données de routine (par exemple celles du DHIS2) et des enquêtes (par exemple l’EDS) afin de faciliter la stratification épidémiologique et la planification au niveau infranational.

Dans de nombreux contextes, des groupes de population supplémentaires, tels que les personnes déplacées à l’intérieur de leur propre pays, les réfugiés et les communautés nomades ou migrantes, peuvent ne pas être inclus dans les ensembles de données nationaux, mais avoir des implications majeures pour la charge de morbidité du paludisme et la planification des campagnes. Ces groupes doivent être pris en compte dès le début du processus SNT. Les analystes sont encouragés à signaler toute lacune connue à l’équipe SNT afin de garantir que les populations particulières soient prises en compte dans les estimations finales et que la coordination avec les partenaires concernés (par exemple, les services d’urgence de l’OMS, le L’Agence des Nations Unies pour les réfugiés (HCR)) puisse se faire en temps utile.

Objectifs
  • Utiliser uniquement l’ensemble de données démographiques approuvé par l’équipe SNT
  • Remettre en forme les données nationales officielles afin de les rendre exploitables pour l’analyse
  • Harmoniser les champs administratifs (par exemple, noms et codes ADM3)
  • Agrégation aux niveaux administratifs pertinents (par exemple, district, région)
  • Valider les données démographiques en les cartographiant sur un shapefile

Besoins en données démographiques

Les données démographiques doivent permettre à l’équipe SNT d’évaluer les risques, de stratifier les besoins en matière d’intervention et d’orienter la planification infranationale. Cela nécessite souvent des estimations ventilées par année, par niveau administratif et, le cas échéant, par groupes de population spécifiques (par exemple, les enfants de moins de cinq ans, les femmes enceintes). Il est essentiel de s’aligner sur les unités spatiales utilisées dans votre analyse.

Dans de nombreux contextes, il convient également de prendre en compte des populations particulières supplémentaires :

  • Personnes déplacées à l’intérieur de leur propre pays (PDI)
  • Réfugiés, tant à l’intérieur qu’à l’extérieur des camps
  • Groupes migrants (par exemple, communautés minières, populations nomades)
  • Quartiers urbains informels

Ces groupes sont souvent absents ou sous-représentés dans les données de recensement. Le cas échéant, l’équipe SNT coordonnera ses efforts avec des agences telles que l’OMS Urgences, l’UNICEF ou le HCR afin d’obtenir des estimations actualisées. Des discussions au niveau local peuvent être nécessaires, en particulier lorsque les données sur les PDI ne sont communiquées qu’aux niveaux administratifs supérieurs (par exemple, les régions) et doivent être réparties entre les districts. Cela a des implications importantes pour l’examen des recensements, l’évaluation du risque de paludisme et la planification des campagnes (par exemple, la distribution de moustiquaires imprégnées d’insecticide).

Consultez l’équipe SNT

Les données démographiques doivent provenir de l’ensemble de données officiel désigné par l’équipe SNT. Il ne s’agit pas d’une décision de l’analyste.

  • Dans la plupart des cas, il s’agira de données issues du recensement et communiquées par le PNLP ou le bureau national de la statistique.
  • Les sources de données modélisées (par exemple WorldPop) ne doivent pas être utilisées, sauf autorisation expresse.
  • Les données particulières sur la population (par exemple, les personnes déplacées à l’intérieur du pays, les réfugiés) doivent provenir des partenaires nationaux et être validées par l’équipe SNT.
  • N’extrapoler ou ne projeter jamais de manière indépendante les estimations de population.

La consultation de l’équipe SNT permet de s’assurer que toutes les estimations sont conformes à la politique nationale, restent crédibles et permettent des comparaisons cohérentes entre les différentes zones géographiques.

Prise en compte des personnes déplacées dans les estimations démographiques

Des estimations démographiques précises et actualisées sont essentielles pour réviser les données de référence du recensement, éclairer les évaluations des risques de paludisme, en particulier dans les zones qui accueillent un afflux important de personnes provenant de zones à forte transmission, et orienter la planification des interventions telles que les campagnes de distribution de moustiquaires imprégnées d’insecticide. Dans le contexte des déplacements internes, cela implique de tenir compte à la fois de la localisation actuelle et du lieu d’origine des personnes déplacées, car ces deux éléments ont une impact sur les besoins en services, l’allocation des ressources et les décisions de planification dans le cadre du processus SNT. Les données officielles sont souvent en retard par rapport aux mouvements récents, ces ajustements sont donc particulièrement importants lorsque les déplacements sont continus ou généralisés.

Les données sur les personnes déplacées sont généralement disponibles au niveau administratif 1 auprès de sources telles que l’OIM, les services d’urgence de l’OMS, le HCR ou l’UNICEF. Cependant, le SNT nécessite souvent une granularité au niveau administratif 2. Lorsque des données plus détaillées ne sont pas disponibles, une validation locale peut être nécessaire pour réaffecter les chiffres de population entre les districts en fonction des schémas de déplacement connus.

Si les personnes déplacées sont pertinentes dans votre contexte, veuillez en informer rapidement l’équipe SNT afin que les estimations démographiques puissent être revues et ajustées en conséquence.

Avant d’utiliser un ensemble de données nationales, veuillez tenir compte des éléments suivants :

Les données correspondent-elles au niveau géographique approprié ?

Le SNT requiert généralement des données démographiques au niveau adm2 (district) ou inférieur. Si les données nationales ne couvrent que des niveaux supérieurs (par exemple, adm1), veuillez en informer l’équipe SNT. Elle déterminera s’il convient de demander des données désagrégées ou d’utiliser une alternative approuvée.

Les années qui vous intéressent sont-elles disponibles ?

Les estimations du recensement peuvent ne pas couvrir toute la période d’analyse du SNT. Si les chiffres de population pour les dernières années sont manquants, n’appliquez pas vos propres taux de croissance. L’équipe SNT se chargera de toute projection en utilisant des hypothèses nationales validées ou des méthodes de repli convenues avec les parties prenantes du pays.

Les populations cibles pertinentes sont-elles incluses ?

Si l’ensemble de données ne comprend pas de populations désagrégées (par exemple, les enfants de moins de cinq ans ou les femmes en âge de procréer), veuillez en informer l’équipe SNT. Elle se chargera de déterminer, en coordination avec le bureau national de la statistique, s’il existe des estimations officielles des proportions. Si ce n’est pas le cas, d’autres sources (par exemple, des enquêtes ou des données modélisées) peuvent être envisagées, mais uniquement après validation et approbation préalables par l’équipe SNT.

Il est important de retenir que les ensembles de données démographiques nationaux constituent le point de départ privilégié, mais uniquement lorsqu’ils répondent aux besoins de l’équipe SNT. Il vous appartient d’évaluer leur structure, leur couverture annuelle et leur exhaustivité. La sélection des données et l’estimation de la population sont menées par l’équipe SNT et ne sont pas effectuées de manière indépendante.

Utilisation appropriée de plusieurs sources

Différentes sources peuvent être appropriées en fonction du niveau d’analyse et cas d’utilisation spécifique de la planification. Par exemple :

  • Données de recensement – pour les estimations au niveau national ou régional
  • Données raster WorldPop – pour un accès haute résolution ou la modélisation des zones de desserte
  • Données DHIS2 sur les établissements de santé – pour les données de planification au niveau des établissements
  • Microplans de campagnes ITN – pour les ajustements démographiques basés sur les cycles de distribution passés
  • Ensembles de données SIG urbains – pour la micro-stratification dans des zones à forte densité de population
  • Données sur les réfugiés et les personnes déplacées à l’intérieur de leur propre pays – provenant du HCR, de l’OMS Urgences ou d’acteurs nationaux

Toutes les sources utilisées doivent être approuvées par l’équipe SNT et clairement documentées.

Cette page explique comment nettoyer et préparer les données démographiques nationales, c’est-à-dire les données officiellement approuvées pour être utilisées dans le SNT. Elle ne couvre pas les ensembles de données modélisés ou raster. Si vous travaillez avec WorldPop ou d’autres rasters spatiaux, veuillez vous reporter à la section Données raster WorldPop.

Étape par étape

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

Étape 1 : Configuration initiale

Étape 1.1 : Définir les fonctions et obtenir les paquets

Avant d’importer nos données localement, nous chargeons d’abord les paquets requis.

  • R
  • Python
# installer ou charger les paquets pertinents
pacman::p_load(
  tidyverse, # outils tidy de base (inclut dplyr, tidyr, readr, etc.)
  readxl,    # lire les fichiers Excel
  fs,        # gérer les chemins d'accès aux fichiers
  purrr,     # itérer sur des listes (map, walk, etc.)
  rlang,     # pour l'évaluation tidy et les messages d'erreur
  devtools   # pour télécharger les paquets github
)

Étape 1.2 : Importer les données

Nous utiliserons à titre d’exemple les données démographiques et administratives de la Sierra Leone, aimablement fournies par le PNLP de ce pays. Ces fichiers peuvent être téléchargés à partir du [référentiel GitHub snt-data-files] d’AHADI (https://github.com/ahadi-analytics/snt-data-files).

Plus précisément, les shapefiles géographiques des chefferies de Sierra Leone peuvent être téléchargés [ici] (https://github.com/ahadi-analytics/snt-data-files/tree/main/Excel%20files/Shapefiles). Il est important de télécharger tous les composants associés auxshapefiles géographiques, y compris les fichiers .dbf, .shp et .shx. Les données démographiques sont disponibles [ici] (https://github.com/ahadi-analytics/snt-data-files/tree/main/Excel%20files). Si vous suivez les exemples, les deux ensembles de données doivent être téléchargés et enregistrés dans votre environnement local désigné.

Une fois cette opération effectuée, nous importons les shapefiles de la Sierra Leone et les données démographiques depuis notre environnement local.

  • R
# importer 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
  ) |>
  sf::st_sf()

# obtenir les données démographiques
pop_df <- rio::import(
  here::here(
    "1.1_foundational",
    "1.1c_population",
    "1.1ci_national_population",
    "raw",
    "sle_pop_data.xlsx"
  )
)

# vérifier les 6 premières lignes
head(pop_df)

::: {.callout-note title=“Output” icon=“false”}## Sortie

                adm1      adm2               adm3 CSpr CSpu  CSn pop2015
1        Bo District        Bo    Badjia Chiefdom 0.03 0.75 0.20    8135
2        Bo District        Bo    Bargbo Chiefdom 0.03 0.75 0.20   25884
3        Bo District        Bo    Bagbwe Chiefdom 0.03 0.75 0.20   20926
4   Moyamba District   Moyamba   Bagruwa Chiefdom 0.03 0.75 0.20   27623
5 Port Loko District Port Loko Bake-Loko Chiefdom 0.08 0.68 0.23    7773
6   Pujehun District   Pujehun     Barri Chiefdom 0.03 0.75 0.20   36905
  pop2016 pop2017 pop2018 pop2019 pop2020 pop2021 pop2022 pop2023 FIRST_DNAM
1    8369    8602    8834    9063    9291    9518    9743    9967         BO
2   26630   27371   28107   28838   29564   30285   31001   31714         BO
3   21529   22128   22723   23314   23901   24484   25063   25640         BO
4   28419   29210   29995   30775   31550   32319   33084   33845    MOYAMBA
5    7997    8219    8441    8660    8878    9095    9310    9524  PORT LOKO
6   37968   39025   40074   41117   42151   43179   44201   45218    PUJEHUN
     FIRST_CHIE SBD SBD2 llin IRS
1        BADJIA  NO   NO  YES YES
2         BAGBO  NO   NO  YES YES
3 BAGBWE(BAGBE)  NO   NO  YES YES
4       BAGRUWA  NO   NO  YES  NO
5    BAKEH LOKO  NO   NO  YES  NO
6         BARRI  NO  YES  YES  NO

Pour adapter le code :

Cette section utilise des exemples de données provenant de GitHub. Si vous disposez de données locales ou utilisez un format différent, veuillez suivre les étapes suivantes :

  • 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 fichier shapefile, veuillez donc les adapter en conséquence.

  • Lignes 21 à 26 : Remplacez le chemin d’accès dans la fonction rio::import() par le chemin d’accès local où sont stockées vos données démographiques. Une fois la mise à jour effectuée, exécutez le code pour charger vos données de population.

Python

:::

Nous avons désormais chargé les données démographiques de la Sierra Leone au niveau adm3, couvrant les années 2015 à 2023. L’ensemble de données comprend des identifiants géographiques (adm1, adm2, adm3), des estimations démographiques annuelles (pop2015 à pop2023) et un certain nombre d’autres colonnes (par exemple CSpr, CSn, SBD, IRS) qui ne sont pas directement pertinentes pour notre analyse actuelle. Pour l’instant, nous nous concentrerons sur les chiffres de population et les colonnes de localisation nécessaires pour le SNT.

Étape 2 : Transformer les données

L’ensemble de données est actuellement au format large, avec une ligne par unité adm3 et des colonnes distinctes pour chaque année (par exemple, pop2016, pop2017, etc.). Afin de faciliter son utilisation dans le pipeline SNT, nous allons le restructurer en un format propre tidydata, dans lequel chaque ligne correspond à une seule unité administrative pour une année donnée, et les valeurs de population sont stockées dans une seule colonne. Si vos données sont déjà dans ce format long (voir la section sur les structures de données, vous pouvez ignorer l’étape de pivotement.

Certains pays peuvent déjà fournir des données dans une structure tidy, en particulier si elles ont été prétraitées ou soumises dans un format de rapport standardisé.

Étape 2.1 : Remodeler les données larges en format long

  • R
  • Python
# transformer les données pop
pop_long <- pop_df |>
  # Ajouter une colonne "Pays"
  dplyr::mutate(adm0 = "SIERRA LEONE") |>

  # conserver uniquement les colonnes admin et population
  dplyr::select(adm0,
                adm2 = FIRST_DNAM,
                adm3 = FIRST_CHIE,
                dplyr::starts_with("pop")) |>

  # remodeler au format long : une ligne par année par adm3
  tidyr::pivot_longer(
    cols = dplyr::starts_with("pop"),
    names_to = "col_name",
    values_to = "pop"
  ) |>

  # extraire l'année du nom de la colonne et supprimer l'original
  dplyr::mutate(
    year = stringr::str_extract(col_name, "\\d{4}"),
    year = as.integer(year),
    .keep = "unused"
  )

Nous ajoutons une colonne “pays” (adm0), conservons uniquement les colonnes “admin” et “population”, puis pivotons les données au format long afin que chaque ligne corresponde à une seule unité adm3 par an. Nous extrayons l’année des noms de colonnes et supprimons le nom de la colonne large d’origine. Cela nous permettra de faciliter les jointures et les calculs d’indicateurs ultérieurement. La ligne stringr::str_extract(col_name, "\\d{4}") extrait l’année à 4 chiffres (par exemple 2017) des noms de colonnes tels que pop2017, à l’aide d’une expression régulière qui correspond à n’importe quel nombre à quatre chiffres. Nous convertissons ensuite cette valeur en nombre entier afin qu’elle se comporte correctement dans les filtres ou les graphiques.

Astuce rapide : Comprendre l’expression régulière \d{4}

L’expression ‘\d{4}’ est une expression régulière (regex) utilisée pour correspondre à toute séquence de quatre chiffres exactement.

  • \\d signifie “n’importe quel chiffre (0 à 9)”

  • {4} signifie “répéter exactement quatre fois la séquence de chiffres”

Nous utilisons des doubles barres obliques inversées (\\) car R traite une seule barre oblique inversée comme un caractère d’échappement. Ainsi, pour transmettre un \d littéral au moteur d’expressions régulières, nous devons l’écrire "\\d" dans R.

Ainsi, str_extract(col_name, "\\d{4}") extrait l’année à 4 chiffres de chaînes telles que “pop2017”, et renvoie "2017".

Étape 2.2 : À quoi doivent ressembler mes données finales ?

Votre ensemble de données démographiques doit désormais être présenté dans un format long et clair : une ligne par unité administrative et par année, avec une seule colonne contenant les valeurs démographiques. Cette structure est essentielle pour l’analyse dans le pipeline SNT, où les données démographiques doivent s’aligner parfaitement avec d’autres ensembles de données spatiales et temporelles, telles que les données de cas courants ou les indicateurs d’enquête.

Le format long facilite également les opérations par groupe, la mise en relation de différentes sources et la génération de tendances temporelles. Un ensemble de données correctement remodelé devrait ressembler à l’exemple ci-dessous :

adm0 adm1 adm2 adm3 pop year
SIERRA LEONE SOUTHERN BO BADJIA 2015 8135
SIERRA LEONE SOUTHERN BO BADJIA 2016 8369
SIERRA LEONE SOUTHERN BO BADJIA 2017 8602
SIERRA LEONE SOUTHERN BO BADJIA 2018 8834
SIERRA LEONE SOUTHERN BO BADJIA 2019 9063

Étape 3 : Alignement des unités administratives

Avant d’utiliser un ensemble de données démographiques dans le workflow SNT, il est essentiel de s’assurer que tous les niveaux administratifs, tels que adm0, adm1, adm2 et/ou adm3, sont parfaitement alignés avec le shapefile utilisé dans l’analyse. Cela implique de vérifier que les noms, les structures et les références géographiques correspondent exactement entre les données démographiques et vos limites spatiales. Des valeurs administratives incohérentes ou manquantes peuvent entraîner des erreurs de jointure, fausser les résumés ou conduire à une interprétation erronée des résultats de la stratification. Cette étape consiste à aligner et à valider la structure administrative entre les différentes sources afin de garantir la cohérence et la compatibilité.

Les données démographiques semblent manquer des informations adm1 (au niveau régional). Pour combler cette lacune, nous fusionnons les valeurs adm1 à l’aide d’une recherche extraite du shapefile. Cela souligne la nécessité plus générale de s’assurer que les données démographiques sont parfaitement alignées avec les limites administratives utilisées ailleurs dans l’analyse. La cohérence des noms et de la structure entre les ensembles de données est essentielle pour obtenir des jointures propres, des agrégations précises et des comparaisons significatives dans le flux de travail SNT. Après la fusion, nous réorganisons les colonnes pour plus de clarté. Le résultat final doit être un fichier de population nettoyé et correctement structuré, aligné sur vos limites administratives et prêt à être utilisé pour la stratification épidémiologique.

Étape 3.1 : Aligner les niveaux administratifs à l’aide d’un shapefile

  • R
# créer un dataframe pour la recherche d'unités administratives
shp_lookup  <-  shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::distinct()

# vérifier les résultats
pop_long |> head()

::: {.callout-note title=“Output” icon=“false”}## Sortie

# A tibble: 6 × 5
  adm0         adm2  adm3     pop  year
  <chr>        <chr> <chr>  <dbl> <int>
1 SIERRA LEONE BO    BADJIA  8135  2015
2 SIERRA LEONE BO    BADJIA  8369  2016
3 SIERRA LEONE BO    BADJIA  8602  2017
4 SIERRA LEONE BO    BADJIA  8834  2018
5 SIERRA LEONE BO    BADJIA  9063  2019
6 SIERRA LEONE BO    BADJIA  9291  2020

Pour adapter le code :

Cette section utilise des exemples de données provenant de GitHub. Si vous disposez de données locales ou utilisez un format différent, veuillez suivre les étapes suivantes :

  • Ligne 2 : Remplacez download_shapefiles_from_github() par votre propre fichier shapefile, par exemple sf::read_sf("path/to/your_shapefile.shp")

  • Ligne 7 : mettez à jour dplyr::distinct() si votre fichier shapefile utilise des niveaux administratifs ou des noms de colonnes différents.

    • dplyr::distinct(adm0, adm1) si vous souhaitez obtenir des niveaux administratifs distincts jusqu’à adm1.

Une fois la mise à jour effectuée, exécutez le code pour charger votre fichier de référence administrative.

Python

:::

Dans notre exemple de jeu de données, le fichier de population comprend adm0, adm2 et adm3, mais il manque adm1 (région). Cependant, votre fichier peut présenter des lacunes différentes. Certains peuvent déjà inclure adm1, tandis que d’autres peuvent nécessiter des corrections différentes. Cette étape est simplement une illustration de la manière de résoudre les problèmes d’alignement.

Pour résoudre ce problème, nous extrayons une table de correspondance du shapefile et fusionnons les valeurs adm1.

  • R
# joindre l'adm1 à partir de la recherche dans le fichier df
pop_long2 <- pop_long |>
  dplyr::left_join(
    dplyr::distinct(shp_lookup, adm1, adm2),
    by = "adm2"
  ) |>
  # reorder columns
  dplyr::select(
    adm0, adm1, adm2, adm3, year, pop
  )

# Vérifier les résultats après avoir ajouté l'adm1
pop_long2 |> head()

::: {.callout-note title=“Output” icon=“false”}## Sortie

# A tibble: 6 × 6
  adm0         adm1     adm2  adm3    year   pop
  <chr>        <chr>    <chr> <chr>  <int> <dbl>
1 SIERRA LEONE SOUTHERN BO    BADJIA  2015  8135
2 SIERRA LEONE SOUTHERN BO    BADJIA  2016  8369
3 SIERRA LEONE SOUTHERN BO    BADJIA  2017  8602
4 SIERRA LEONE SOUTHERN BO    BADJIA  2018  8834
5 SIERRA LEONE SOUTHERN BO    BADJIA  2019  9063
6 SIERRA LEONE SOUTHERN BO    BADJIA  2020  9291

Pour adapter le code :

  • Ligne 1 : ajustez la clé de jointure en fonction de vos données.
    • Si vos données démographiques correspondent à adm1, remplacez by = "adm2" par ’by = “adm1”`.
    • Si elles correspondent à adm3, remplacez par by = "adm3".
    • Assurez-vous que les colonnes que vous joignez existent réellement et correspondent dans les deux ensembles de données.
  • Noms des colonnes : ajustez adm0, adm1, adm2, adm3 pour refléter la structure de votre propre shapefile.

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

Python

:::

Nous joignons les valeurs adm1 à l’ensemble de données de population à l’aide d’une table de recherche dérivée du shapefile. Cela garantit que la structure administrative est cohérente avec les autres ensembles de données spatiales. Après la fusion, nous réorganisons les colonnes pour plus de clarté. Le fichier résultant devrait maintenant contenir adm0, adm1, adm2 et adm3, dans un format ordonné et aligné avec les unités administratives utilisées ailleurs dans votre analyse. La sortie ci-dessus confirme que adm1 est maintenant présent dans les données.

Étape 3.2 : Vérification des incohérences dans les valeurs administratives

À présent, pour garantir la cohérence, nous extrayons les combinaisons distinctes des colonnes admin des deux ensembles de données et les comparons. Toute incohérence peut indiquer une erreur dans le nom d’un district, une entrée manquante ou un problème structurel dans la fusion.

  • R
# Extraire les combinaisons d'admin uniques
keys = c("adm0", "adm1", "adm2", "adm3")
lookup_keys <- pop_long2 |> dplyr::distinct(!!!rlang::syms(keys))
pop_keys <- shp_lookup |> dplyr::distinct(!!!rlang::syms(keys))

# Identifier les incohérences (dans les deux sens)
mismatches <-
  dplyr::anti_join(
    pop_keys, lookup_keys, by = keys) |>
  dplyr::bind_rows(
    dplyr::anti_join(lookup_keys, pop_keys, by = keys)
  )

# Vérifier si toutes les combinaisons de niveaux d'admin (adm0–adm3)
# correspondent entre les sources
if (nrow(mismatches) == 0) {
  cli::cli_alert_success(
    "admin levels (adm0 to adm3) match between pop data and shapefile."
  )
} else {
  cli::cli_alert_danger(
    "Mismatch detected in admin levels between pop data and shapefile."
  )
}

::: {.callout-note title=“Output” icon=“false”}## Sortie

✔ admin levels (adm0 to adm3) match between pop data and shapefile.

Pour adapter le code :

  • Ligne 2 : ajustez adm0, adm1, adm3 pour refléter la structure de votre propre fichier de formes.
    • Assurez-vous que les colonnes que vous joignez existent réellement et correspondent dans les deux ensembles de données.

Une fois la mise à jour effectuée, exécutez le code pour vérifier les incohérences administratives.

Python

:::

Nous extrayons les combinaisons uniques de adm0 à adm3 des deux ensembles de données pour vérifier l’alignement. L’utilisation de !!!rlang::syms(keys) transmet dynamiquement les noms de colonnes stockés dans keys, ce qui équivaut à écrire shp_lookup |> dplyr::distinct(adm0, adm1, adm2, adm3), mais de manière plus flexible et réutilisable. L’utilisation de anti_join() dans les deux sens permet de détecter les incohérences entre les sources.

Étape 3.3 : Résolution des incohérences dans les unités administratives

Si des incohérences sont détectées (en raison de différences orthographiques, de conventions de nommage incohérentes ou de modifications des limites), vous devrez harmoniser les noms administratifs entre les données démographiques et le shapefile. Une approche recommandée consiste à utiliser la fonction prep_geonames() du package sntutils.

Cette fonction combine une correspondance algorithmique (par exemple, la distance entre les chaînes de caractères) et une correction guidée par l’utilisateur afin de normaliser les unités administratives dans les ensembles de données. Elle prend en charge jusqu’à six niveaux hiérarchiques et peut mettre en cache les décisions pour une réutilisation ultérieure, ce qui vous évite de répéter les mêmes étapes de correspondance. Ces corrections mises en cache peuvent également être partagées avec vos collègues, ce qui permet de gagner du temps et de garantir une nomenclature cohérente entre les membres de l’équipe.

Nous ne couvrons pas tous les détails ici, mais vous trouverez ci-dessous une configuration de base. Pour une présentation complète, incluant à la fois l’utilisation interactive et scriptée, consultez la section XXX de la bibliothèque de codes [MO TO ADD THIS SECTION!]. Cette section explique comment intégrer prep_geonames() dans votre flux de nettoyage et comment enregistrer et réutiliser efficacement les décisions.

  • R
# installer le package sntutils à partir de GitHub
# contient plusieurs fonctions d'aide utiles
devtools::install_github("ahadi-analytics/sntutils")

# définir l'emplacement pour enregistrer le cache
cache_path <- "1.1_foundational/1d_cache_files"

# harmoniser les noms des administrateurs entre les données démographiques et le shapefile
pop_harmonised <-
  sntutils::prep_geonames(
    target_df = pop_long2,
    lookup_df = lookup_keys,
    level0 = "adm0",
    level1 = "adm1",
    level2 = "adm2",
    level3 = "adm3",
    interactive = TRUE,
    cache_path = here::here(cache_path, "geoname_decisions.rds")
  )

::: {.callout-note title=“Output” icon=“false”}## Sortie

ℹ Match Summary:
• adm0 (level 0): 1 out of 1 matched
• adm1 (level 1): 5 out of 5 matched
• adm2 (level 2): 16 out of 16 matched
• adm3 (level 3): 208 out of 208 matched
✔ All records matched; process completed. Exiting...

Pour adapter le code :

  • Ligne 8 : remplacez pop_long2 par votre ensemble de données sur la population.

  • Ligne 9 : remplacez lookup_keys par votre ensemble de données de référence ou de recherche.

  • Lignes 10 à 13 : ajustez les niveaux 0, 1, 2 et 3 afin qu’ils correspondent aux noms réels de vos colonnes administratives si ceux-ci sont différents dans votre ensemble de données (par exemple, “pays”, “région”, “district”, “département”).

    • Assurez-vous que les colonnes que vous joignez existent réellement et correspondent dans les deux ensembles de données.
  • Lignes 6 et 18 : mettez à jour le chemin d’accès si vous souhaitez enregistrer les décisions relatives aux noms géographiques à un autre emplacement.

Une fois la mise à jour effectuée, exécutez le code pour harmoniser les noms administratifs des données démographiques avec ceux du shapefile.

Python

:::

Cela confirme que tous les niveaux administratifs ont été alignés avec succès entre votre ensemble de données et la référence. Si des divergences persistent, l’outil vous invite à les résoudre de manière interactive.

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

Les données démographiques étant désormais remodelées et harmonisées entre les niveaux administratifs, nous pouvons commencer à les explorer à l’aide de vérifications et de résumés de base. Dans un premier temps, nous agrégons les totaux de population dans différentes unités administratives d’intérêt :

  • R
# Résumer la population totale par adm0
pop_summary_adm0 <- pop_long2 |>
  dplyr::group_by(adm0, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

# Résumer la population totale par adm1
pop_summary_adm1 <- pop_long2 |>
  dplyr::group_by(adm1, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

# Résumer la population totale par adm2
pop_summary_adm2 <- pop_long2 |>
  dplyr::group_by(adm2, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

# Résumer la population totale par adm3
pop_summary_adm3 <- pop_long2

# Vérifier si l'agrégation a fonctionné
head(pop_summary_adm1, n = 9)

::: {.callout-note title=“Output” icon=“false”}## Sortie

# A tibble: 9 × 3
  adm1     year pop_total
  <chr>   <int>     <dbl>
1 EASTERN  2015   1642370
2 EASTERN  2016   1689678
3 EASTERN  2017   1736710
4 EASTERN  2018   1783417
5 EASTERN  2019   1829792
6 EASTERN  2020   1875847
7 EASTERN  2021   1921600
8 EASTERN  2022   1967077
9 EASTERN  2023   2012312

Pour adapter le code :

  • Aucune modification majeure n’est nécessaire ici.
    • Les niveaux de regroupement (adm0, adm1, adm2, adm3) découlent des étapes précédentes de fusion et d’harmonisation.

Python

:::

Étape 5 : Visualisation des données démographiques agrégées

Étape 5.1 : Préparation des données démographiques pour la cartographie

Une fois les données démographiques agrégées et alignées avec les shapefiles administratives, l’étape suivante consiste à les préparer pour la visualisation. Cela comprend la fusion des totaux de population dans le shapefile et l’attribution de fourchettes de population.

Pour faciliter l’interprétation des tendances visuelles, les valeurs démographiques sont regroupées dans des classes. Tout emplacement dont la valeur est 0 ou NA est placé dans une catégorie spéciale “Manquant ou 0”. Ces emplacements apparaissent en gris sur la carte, ce qui permet de repérer facilement les lacunes ou les incohérences avant de poursuivre l’analyse.

  • R
  • Python
# Fusionner les données pop avec le shapefile
shp_adm3_pop <- shp_adm3 |>
  dplyr::left_join(pop_summary_adm3, by = "adm3",
                   relationship = "many-to-many") |>
  dplyr::filter(year >= 2020) |>
  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 3 : si vous avez utilisé un fichier shapefile ou un niveau de jointure administrative différent précédemment, remplacez by = "adm3" par le niveau que vous avez utilisé (par exemple, “adm2” ou “adm1”).

  • Ligne 5 : modifiez le filtre d’année si vous souhaitez utiliser une autre plage (par exemple, année >= 2015).

  • Lignes 7 à 13 : vous pouvez ajuster les classes de population afin qu’elles correspondent à des plages significatives pour votre contexte.

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

Étape 5.2 : Visualiser la population agrégée par région

Nous utilisons maintenant ggplot2 pour générer des cartes à facettes montrant la répartition de la population au niveau adm3 pour les années 2020 à 2023. Chaque facette représente une année différente, ce qui permet une comparaison visuelle dans le temps.

Les régions grises peuvent indiquer des données manquantes ou des jointures échouées. Celles-ci doivent être vérifiées avant d’utiliser l’ensemble de données dans les étapes suivantes, telles que la stratification ou le ciblage des interventions.

  • R
# générer un shapefile de niveau adm0
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
shp_adm1 <- shp_adm3 |>
    dplyr::group_by(adm1) |>
  dplyr::summarise(.groups = "drop") |>
  sf::st_union(by_feature = TRUE)

# Visualiser la population de 2020 à 2023
adm3_pop_map <- shp_adm3_pop |>
  ggplot2::ggplot() +
  ggplot2::geom_sf(
    ggplot2::aes(fill = pop_bin),
    color = "white",
    size = 0.2
  ) +
  # Ajouter un contour adm1 sous forme de bordure noire
  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 totale par chefferie (adm3)",
    subtitle = "entre 2020 et 2023",
    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
    )
  )

::: {.callout-note title=“Output” icon=“false”}## 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_pop et le titre de la carte en conséquence.

  • Ligne 23 : si votre fichier 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.

Python

:::

Toutes les chefferies sont ombrées sur la carte, indiquant que les valeurs de population ont été correctement fusionnées : aucune ne manque ou n’est égale à zéro pour les années 2020 à 2023. Cela suggère que l’étape de fusion a fonctionné correctement et qu’il n’y a pas de lacunes dans la couverture au niveau adm3.

Étape 5.3 : Enregistrer les graphiques

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

  • R
# Enregistrer le graphique
ggplot2::ggsave(
  plot = adm3_pop_map,
  here::here("03_output/3a_figures/pop_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 modifier pop_check_adm3_2020_2023.png.

  • 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. ## Python

Sur la base du code replié ci-dessus, ce graphique confirme que nos données démographiques sont complètes et bien structurées. Chaque adm3 a une valeur démographique pour toutes les années qui nous intéressent (2020-2023) et s’intègre parfaitement au shapefile. Cette vérification visuelle rapide permet de s’assurer que les données sont alignées avant de passer à une analyse plus approfondie.

Étape 6 : Enregistrer les données

Une fois que les données de recensement de la population ont été nettoyées, remodelées et alignées sur vos limites administratives, il est recommandé de les enregistrer dans un format prêt à l’emploi. Cela évite de répéter les étapes de nettoyage et facilite la jonction avec d’autres ensembles de données ultérieurement.

Nous enregistrons les données traitées au format .rds, .csv et .xlsx, afin qu’elles puissent être facilement chargées dans R ou partagées avec d’autres personnes.

  • R
  • Python
# Définir le dossier de sortie
save_path <- here::here(
  "01_data", "1.1_foundational", "1.1c_population", "1ci_country_sourced"
)

# Enregistrer en format RDS
rio::export(
  pop_long,
  here::here(save_path, "sierra_leone_pop_census_2020_2023.rds")
)

# Enregistrer en format CSV
rio::export(
  pop_long,
  here::here(save_path, "sierra_leone_pop_census_2020_2023.csv")
)

# Enregistrer en format XLSX
rio::export(
  pop_long,
  here::here(save_path, "sierra_leone_pop_census_2020_2023.xlsx")
)

Pour adapter le code :

  • Ligne 3 :

    • Mettez à jour save_path avec votre répertoire de sortie.

    • pop_long : remplacez si votre colonne de population a un nom différent.

  • Noms de fichiers : modifiez les noms de fichiers (par exemple, sierra_leone_pop_census.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 maintenant vu comment nettoyer, remodeler et préparer les données démographiques issues du recensement afin de les rendre utilisables. Nous avons importé les fichiers bruts, les avons remodelés dans un format long et ordonné, avons joint les noms administratifs à l’aide de shapefiles et avons créé des totaux agrégés pour différents niveaux administratifs. Tout est désormais nettoyé, structuré et prêt à être fusionné avec des ensembles de données d’enquête ou de routine plus tard dans le pipeline SNT. Vous trouverez le code complet au bas de cette section, réduit pour faciliter la consultation. Il peut être réutilisé tel quel ou modifié pour votre propre configuration. Il vous suffit de mettre à jour les chemins d’accès aux fichiers, les noms des colonnes ou les niveaux administratifs si nécessaire.

Code complet

  • R
  • Python
Montrer le code
#===============================================================================
# Étape 1 : Définir les fonctions et importer les données
#===============================================================================

# installer ou charger les paquets pertinents
pacman::p_load(
  tidyverse, # core tidy tools (includes dplyr, tidyr, readr, etc.)
  readxl, # read Excel files
  httr, # download files from web (GET, write_disk)
  fs, # handle file paths
  purrr, # iterate over lists (map, walk, etc.)
  rlang # for tidy evaluation and error messaging
)

# importer 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
  ) |>
  sf::st_sf()

# obtenir les données démographiques
pop_df <- rio::import(
  here::here(
    "1.1_foundational",
    "1.1c_population",
    "1.1ci_national_population",
    "raw",
    "sle_pop_data.xlsx"
  )
)

# vérifier les 6 premières lignes
head(pop_df)

#===============================================================================
# Étape 2 : Transformer les données
#===============================================================================

# transform pop data
pop_long <- pop_df |>
  # Ajouter une colonne "Pays"
  dplyr::mutate(adm0 = "SIERRA LEONE") |>

  # conserver uniquement les colonnes admin et population
  dplyr::select(adm0,
                adm2 = FIRST_DNAM,
                adm3 = FIRST_CHIE,
                dplyr::starts_with("pop")) |>

  # remodeler au format long : une ligne par année par adm3
  tidyr::pivot_longer(
    cols = dplyr::starts_with("pop"),
    names_to = "col_name",
    values_to = "pop"
  ) |>

  # extraire l'année du nom de la colonne et supprimer l'original
  dplyr::mutate(
    year = stringr::str_extract(col_name, "\\d{4}"),
    year = as.integer(year),
    .keep = "unused"
  )

#===============================================================================
# Étape 3 : Aligner les niveaux administratifs à l'aide d'un shapefile
#===============================================================================

# créer un dataframe pour la recherche d'unités administratives
shp_lookup  <-  shp_adm3 |>
  sf::st_drop_geometry() |>
  dplyr::distinct()

# joindre l'adm1 à partir de la recherche dans le fichier df
pop_long2 <- pop_long |>
  dplyr::left_join(
    dplyr::distinct(shp_lookup, adm1, adm2),
    by = "adm2"
  ) |>
  # reorder columns
  dplyr::select(
    adm0, adm1, adm2, adm3, year, pop
  )

# Extraire les combinaisons d'admin uniques
keys = c("adm0", "adm1", "adm2", "adm3")
lookup_keys <- pop_long2 |> dplyr::distinct(!!!rlang::syms(keys))
pop_keys <- shp_lookup |> dplyr::distinct(!!!rlang::syms(keys))

# Identifier les incohérences (dans les deux sens)
mismatches <-
  dplyr::anti_join(
    pop_keys, lookup_keys, by = keys) |>
  dplyr::bind_rows(
    dplyr::anti_join(lookup_keys, pop_keys, by = keys)
  )

# Vérifier si toutes les combinaisons de niveaux d'admin (adm0–adm3)
# correspondent entre les sources
if (nrow(mismatches) == 0) {
  cli::cli_alert_success(
    "admin levels (adm0 to adm3) match between pop data and shapefile."
  )
} else {
  cli::cli_alert_danger(
    "Mismatch detected in admin levels between pop data and shapefile."
  )
}

# installer le package sntutils à partir de GitHub
# contient plusieurs fonctions d'aide utiles
devtools::install_github("ahadi-analytics/sntutils")

# définir l'emplacement pour enregistrer le cache
cache_path <- "1.1_foundational/1d_cache_files"

# harmoniser les noms des administrateurs entre les données démographiques et le shapefile
pop_harmonised <-
  sntutils::prep_geonames(
    target_df = pop_long2,
    lookup_df = lookup_keys,
    level0 = "adm0",
    level1 = "adm1",
    level2 = "adm2",
    level3 = "adm3",
    interactive = TRUE,
    cache_path = here::here(cache_path, "geoname_decisions.rds")
  )

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

# Résumer la population totale par adm0
pop_summary_adm0 <- pop_long2 |>
  dplyr::group_by(adm0, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

# Résumer la population totale par adm1
pop_summary_adm1 <- pop_long2 |>
  dplyr::group_by(adm1, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

# Résumer la population totale par adm2
pop_summary_adm2 <- pop_long2 |>
  dplyr::group_by(adm2, year) |>
  dplyr::reframe(pop_total = sum(pop, na.rm = TRUE))

# Résumer la population totale par adm3
pop_summary_adm3 <- pop_long2

# Vérifier si l'agrégation a fonctionné
head(pop_summary_adm1, n = 9)

#===============================================================================
# Étape 5 : Visualisation des données démographiques agrégées
#===============================================================================

# Fusionner les données pop avec le shapefile
shp_adm3_pop <- shp_adm3 |>
  dplyr::left_join(pop_summary_adm3, by = "adm3",
                   relationship = "many-to-many") |>
  dplyr::filter(year >= 2020) |>
  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
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
shp_adm1 <- shp_adm3 |>
    dplyr::group_by(adm1) |>
  dplyr::summarise(.groups = "drop") |>
  sf::st_union(by_feature = TRUE)

# Visualiser la population de 2020 à 2023
adm3_pop_map <- shp_adm3_pop |>
  ggplot2::ggplot() +
  ggplot2::geom_sf(
    ggplot2::aes(fill = pop_bin),
    color = "white",
    size = 0.2
  ) +
  # Ajouter un contour adm1 sous forme de bordure noire
  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 totale par chefferie (adm3)",
    subtitle = "entre 2020 et 2023",
    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
    )
  )

# Enregistrer le graphique
ggplot2::ggsave(
  plot = adm3_pop_map,
  here::here("03_output/3a_figures/pop_check_adm3_2020_2023.png"),
  width = 12, height = 5, dpi = 300)

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

# Définir le dossier de sortie
save_path <- here::here(
  "01_data", "1.1_foundational", "1.1c_population", "1ci_country_sourced"
)

# Enregistrer en format RDS
rio::export(
  pop_long,
  here::here(save_path, "sierra_leone_pop_census_2020_2023.rds")
)

# Enregistrer en format CSV
rio::export(
  pop_long,
  here::here(save_path, "sierra_leone_pop_census_2020_2023.csv")
)

# Enregistrer en format XLSX
rio::export(pop_long,
            here::here(save_path, "sierra_leone_pop_census.xlsx"))

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

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