wsj.
Power BI, analyse humanitaire

Genre et déplacement interne en Haïti

En mai 2026, 796 688 femmes et filles déplacées vivent dans 135 des 140 communes du pays. Cette étude part de douze classeurs publics dont les colonnes changent de nom au fil des relevés. Elle documente leur traitement jusqu’aux six pages du rapport, avec le code utilisé à chaque étape et le recalcul de chaque affirmation affichée.

Période
Mars 2023 à mai 2026, douze relevés
Source
Matrice de suivi des déplacements, OIM
Outils
Power BI, PBIR, DAX, Power Query, Python
Code
nah-yah/genre-deplacement-haiti
Sommaire

Sommaire

  1. La question posée
  2. Une source qui change en route
  3. Quatre codages pour une réponse binaire
  4. Le modèle
  5. Ampleur
  6. Origines
  7. Géographie
  8. Protection
  9. Besoins
  10. Le score de priorisation
  11. Recalculer chaque affirmation
  12. Limites
  13. Reproduire

La question posée

À chaque relevé, la Matrice de suivi des déplacements de l’OIM estime le nombre de personnes déplacées dans chaque commune d’Haïti. Ce tableau de bord isole les femmes et les filles pour examiner trois questions masquées par le total.

D’où viennent-elles, et jusqu’où le déplacement se diffuse-t-il selon la commune de départ ? Vivent-elles sur un site ou chez une famille d’accueil ? Quelle population les enquêtes sur la sécurité décrivent-elles réellement ?

Une source qui change en route

Les douze classeurs publiés sur trois ans forment une série hétérogène. Les colonnes changent de nom et de position, le périmètre géographique s’étend et certaines questions disparaissent du questionnaire.

Rupture observéeConséquence sur le rapport
Couverture géographiqueLe relevé 3 couvre la zone métropolitaine. À partir du relevé 7, la collecte couvre les dix départements. Toute série temporelle est filtrée sur les sept relevés à couverture nationale.
Questions de protectionElles disparaissent après juin 2025, onze mois avant le dernier relevé. La page Protection s’arrête donc à juin 2025 et le dit dans son titre.
Question posée aux hommesLe relevé 7 introduit la question masculine. Le calcul des écarts entre sexes commence en juin 2024.
Codage des réponsesUne même réponse binaire se présente sous quatre formes selon le relevé.

Le rapport signale chaque rupture dans le titre ou le pied de page du visuel concerné. Les calculs s’arrêtent à chaque changement de périmètre signalé.

Quatre codages pour une réponse binaire

Selon le relevé, une réponse positive à la même question de protection peut apparaître sous la forme 1, oui ou Oui toutes les latrines. La modalité Quelques-unes désigne une réponse partielle. Une seule fonction ramène ces quatre formes à une variable binaire et consigne deux choix de codage.

Normaliser une réponse binairescripts/01_extract.py
def oui_non(serie):
    valeur = pd.to_numeric(serie, errors="coerce").astype("Float64")
    valeur = valeur.where(valeur.isin([0, 1]))

    reponse = serie.astype(str).map(sans_accent).str.strip()
    valeur[reponse.str.startswith(("oui", "yes", "toutes"))] = 1
    valeur[reponse.str.startswith(("non", "no", "aucun", "quelques"))] = 0

    hors_champ = reponse.str.contains("non posee|nsp|ne sait pas|sans objet", regex=True)
    return valeur.where(~hors_champ)

« Quelques » vaut non. La protection est considérée comme assurée lorsque toutes les latrines du site sont séparées par sexe. La modalité brute reste dans une colonne modalite, ce qui permet de modifier ce choix sans retraiter les classeurs.

« NSP » devient une valeur manquante. Ce codage distingue l’absence de question d’une réponse négative. Une valeur zéro tirerait artificiellement la moyenne vers le bas.

Le modèle

Le modèle en étoile comprend quatre tables de faits, population, ménages, besoins et protection, reliées à deux dimensions communes : la commune et le relevé. Toutes les relations passent par ces deux dimensions. Les ratios restent ainsi limités aux tables qui couvrent les mêmes lieux.

Schéma en étoile du modèle : quatre tables de faits reliées aux dimensions commune, relevé et lieu
Figure 1 Le modèle en étoile. Les deux dimensions partagées portent tous les filtres du rapport, y compris les segments de relevé et de département.

Les 140 P-codes communaux du fond de carte CNIGS et OCHA correspondent à 100 % à ceux de la DTM. La jointure cartographique conserve ainsi toutes les communes.

Ampleur, combien elles sont et depuis quand

Les questions. Combien de femmes et de filles sont déplacées ? Sont-elles majoritaires ? Depuis combien de temps ces personnes ont-elles quitté leur domicile ?

Page Ampleur avec l’évolution des effectifs par sexe en indice, l’ancienneté moyenne du déplacement, la répartition par hébergement et la pyramide des âges
Figure 2 La page Ampleur. L’indice base 100 compare deux séries d’ordres de grandeur différents tout en conservant la lisibilité de la plus petite.

Sur 1 466 862 personnes déplacées, 796 688 sont des femmes et des filles, soit 54,3 % et 118,9 femmes pour 100 hommes. Ce déséquilibre justifie une analyse distincte de leur situation.

Pondérer l’ancienneté par les effectifs

Chaque ligne de la source décrit un lieu, qui peut abriter douze personnes comme douze mille. Une moyenne simple donnerait le même poids à chaque lieu, quelle que soit sa population.

Pondérer par l’effectif, ignorer les non renseignésMesures.tmdl
Ancienneté du déplacement (mois) =
VAR Renseignes =
    FILTER( fait_population, NOT ISBLANK( fait_population[anciennete_mois] ) )
RETURN
DIVIDE(
    SUMX( Renseignes, fait_population[anciennete_mois] * fait_population[effectif] ),
    SUMX( Renseignes, fait_population[effectif] )
)

Le filtre sur Renseignes retire les lieux sans ancienneté du numérateur et du dénominateur. Les laisser au dénominateur diviserait une somme partielle par un effectif complet et tirerait la moyenne vers le bas.

RelevéAncienneté moyenne, moisLecture
Mars 20233,1vague récente, déplacements tous récents
Décembre 20248,7creux de la série, un afflux de nouveaux déplacés abaisse la moyenne
Mai 202620,9déplacements prolongés, ancienneté en hausse mécanique

Une baisse de la moyenne peut signaler l’arrivée d’une nouvelle vague de personnes déplacées. La note placée sur le creux de décembre 2024 donne cette explication directement sur le graphique.

Comparer deux séries d’échelles différentes

Un indice ancré au premier relevé nationalMesures.tmdl
Indice base 100 =
VAR Base = CALCULATE( [PDI], ALL( dim_round ), dim_round[ordre] = 6 )
RETURN
DIVIDE( [PDI], Base ) * 100

ordre = 6 correspond au relevé de juin 2024, le premier à couvrir tout le pays. Un ancrage antérieur confondrait l’extension de la collecte, jusque-là métropolitaine, avec une croissance du déplacement.

Origines, d’où elles partent et jusqu’où elles vont

Les questions. Quelles communes perdent le plus d’habitantes ? Ces femmes restent-elles près de chez elles ? Le déplacement se diffuse-t-il de la même façon selon la commune de départ ?

Page Origines avec le nombre de communes d’accueil par commune de départ, la matrice dépliable des destinations, la part restée sur place et trois trajectoires communales
Figure 3 Les barres mesurent la dispersion du déplacement en comptant les communes d’accueil atteintes par chaque commune de départ.

Vingt-sept communes de provenance alimentent cent trente-cinq communes d’accueil. Trois d’entre elles concentrent 56,7 % du total et sept en concentrent 85 %.

Volume et dispersion

Le graphique en barres présentait d’abord les effectifs par commune de départ, déjà visibles dans la matrice voisine. Il compte désormais le nombre de communes d’accueil atteintes.

Compter les communes d’accueil atteintesMesures.tmdl
Communes touchées (femmes et filles) =
COUNTROWS( FILTER( VALUES( dim_commune[pcode_commune] ), [Femmes et filles] > 0 ) )
Commune de départFemmes et fillesCommunes atteintesForme du déplacement
Port-au-Prince221 00963éclatement national
Gressier133 03924volume élevé, diffusion limitée
Tabarre6 5208peu de monde, largement dispersé
Cabaret10 5441déplacement de proximité

Les deux classements décrivent des phénomènes différents. Gressier est deuxième en volume et sixième en dispersion. Cabaret envoie dix mille femmes dans une seule commune voisine ; Tabarre en envoie deux fois moins dans huit communes. Le dimensionnement de la réponse humanitaire dépend donc de la dispersion. Chaque commune d’accueil entre dans le total de chacune des origines qu’elle héberge, comme le précise le pied de page.

Sur place ou ailleurs

Une colonne calculée compare la commune déclarée de provenance à la commune où la personne se trouve.

Qualifier chaque ligne de faitfait_population.tmdl
Déplacement =
VAR CommuneAccueil = RELATED( dim_commune[commune] )
RETURN
IF(
    ISBLANK( fait_population[commune_provenance] ) || ISBLANK( CommuneAccueil ),
    "Non renseigné",
    IF( fait_population[commune_provenance] = CommuneAccueil, "Sur place", "Ailleurs" )
)

La part partie ailleurs valait 69,2 %, 72,2 %, 68,1 % puis 73,8 % sur les quatre premiers relevés nationaux, puis 77,1 %, 76,8 % et 75,9 %. Une ligne de repère à 75 % situe la bascule. Le titre « trois femmes déplacées sur quatre ont quitté leur commune » devient exact en septembre 2025.

Géographie, où elles vivent aujourd’hui

Les questions. Quelles communes accueillent ces femmes ? La zone métropolitaine de Port-au-Prince concentre-t-elle toujours le déplacement ?

Page Géographie avec le classement des 135 communes d’accueil, la carte communale en dégradé, la part métropolitaine par relevé et le détail par département
Figure 4 La page Géographie. La carte occupe l’espace laissé libre par le classement, qui défile sur 135 communes.

626 741 femmes et filles vivent hors de la zone métropolitaine, soit près de quatre sur cinq. La zone métropolitaine en accueille 169 947. Port-au-Prince reste la première commune d’accueil avec 83 102 femmes et Delmas suit avec 47 748. Cinq des sept premières communes sont hors zone métropolitaine.

En deux ans, la part métropolitaine tombe de 31,8 % à 21,3 %. Les effectifs métropolitains augmentent de 99 889 à 169 947 sur la même période. La population déplacée croît plus vite dans le reste du pays. L’empilement à 100 % montre simultanément l’évolution de cette part et celle des effectifs.

La carte communale applique un dégradé explicite aux 135 communes touchées. Les cinq communes sans donnée apparaissent en gris, hors de l’échelle. Ce traitement distingue l’absence de données d’un faible effectif lorsque le lecteur cherche où intervenir.

Protection et sécurité déclarée sur les sites

Les questions. Femmes et hommes décrivent-ils le même site de la même façon ? Les écarts suivent-ils une tendance ? Quelle population cette page couvre-t-elle ?

Page Protection avec la part de femmes hors site, la sécurité déclarée par sexe, les sites discordants et l’état des latrines
Figure 5 La première carte délimite la portée de la page : 84,5 % des femmes déplacées sont hors de son champ.

Délimiter la population concernée

La part hors siteMesures.tmdl
Part femmes hors site =
DIVIDE(
    [Femmes hors site],
    CALCULATE( [Femmes et filles], NOT ISBLANK( fait_population[hebergement] ) )
)

Le dénominateur exclut les lignes sans hébergement renseigné. Leur inclusion assimilerait une absence d’information à un hébergement en site et sous-estimerait la part hors site. Au total, 84,5 % des femmes déplacées vivent chez des familles d’accueil. Ces questions couvrent uniquement les sites.

Comparer deux sexes sur le même site et au même relevé

Deux moyennes nationales peuvent porter sur des sites différents. La mesure apparie chaque couple site-relevé et retient seulement ceux pour lesquels les deux réponses existent.

Le calcul appariéMesures.tmdl
Sites discordants défavorables =
VAR Femmes = "Femmes se sentant en sécurité sur le site"
VAR Hommes = "Hommes se sentant en sécurité sur le site"
RETURN
COUNTROWS(
    FILTER(
        SUMMARIZE( fait_protection, fait_protection[cle_lieu], fait_protection[round] ),
        VAR f = CALCULATE( MAX( fait_protection[valeur] ), fait_protection[indicateur] = Femmes )
        VAR h = CALCULATE( MAX( fait_protection[valeur] ), fait_protection[indicateur] = Hommes )
        RETURN NOT ISBLANK( f ) && NOT ISBLANK( h ) && f = 0 && h = 1
    )
)

Sur 439 sites où la question est posée aux deux sexes, 419 donnent la même réponse. Parmi les vingt sites où les réponses divergent, dix-huit associent une réponse négative des femmes à une réponse positive des hommes. Deux présentent la situation inverse.

Les trois cartes du haut utilisent le même filtre de relevés, r07, r09 et r10. Auparavant, l’écart affiché comparait une moyenne féminine de mars 2023 à juin 2025 à une moyenne masculine de juin 2024 à juin 2025. La seconde période commence avec la collecte des réponses masculines. À périmètre égal, le recalcul produit 3,9 points. La version précédente affichait 3,2.

Le graphique des latrines réunit deux polarités. Deux barres donnent une part de conformité ; la troisième, en rouge, donne la part des sites où un risque d’accès est signalé. Un risque signalé dans 23,8 % des sites et une conformité de 23,8 % décrivent des situations opposées.

Besoins déclarés par les lieux

Les questions. Quels besoins les lieux déclarent-ils en priorité ? Ces priorités changent-elles selon la zone ? Quelles communes arrivent en tête ?

Page Besoins avec la part des lieux citant chaque besoin, la comparaison entre zone métropolitaine et reste du pays, et le tableau de priorisation communale
Figure 6 La page Besoins. Le tableau de priorisation affiche les ingrédients du score à côté du score lui-même.
Calculer la part des lieux déclarantsMesures.tmdl
Lieux citant le besoin % =
DIVIDE(
    CALCULATE( DISTINCTCOUNT( fait_besoins[cle_lieu] ), fait_besoins[signale] = 1 ),
    CALCULATE( DISTINCTCOUNT( fait_besoins[cle_lieu] ) )
)

Le DISTINCTCOUNT dénombre les lieux. Comme un même lieu peut citer plusieurs besoins, la somme des taux dépasse 100 %. Le sous-titre l’indique explicitement.

Sur les 1 181 lieux interrogés en mai 2026, la nourriture est citée par 65,8 % et les moyens de subsistance par 58,8 %. La protection arrive septième sur huit, à 8,7 %.

Urgences vitales et besoins de protection

Quand deux tiers des lieux manquent de nourriture, la hiérarchie déclarée reflète d’abord l’urgence vitale. La protection reste un besoin. Le pied de page distingue fréquence de citation et présence du besoin.

Les priorités diffèrent selon la zone. La protection est citée par 12,9 % des lieux métropolitains et par 5,3 % des lieux ailleurs, soit près de deux fois et demie plus. Hors zone métropolitaine, la nourriture à 77,3 % et les moyens de subsistance à 58,6 % dominent.

Le score de priorisation

La page Besoins classe les communes selon un score construit pour cette étude. Sa première version additionnait trois termes pondérés. Deux défauts apparaissaient dans le code et le classement obtenu.

Les données manquantes avantagées

COALESCE( [Latrines séparées %], 0.5 ) assimilait l’absence de mesure à une performance moyenne. Ce choix ajoutait un demi-point aux communes sans mesure et faisait tomber vers zéro les communes mesurées et conformes. En juin 2025, où 49 communes sur 137 ont une donnée de latrines, les 88 autres étaient ainsi avantagées.

Le volume ignoré

Le terme de composition ignorait le volume. Il saturait dès dix points d’écart à la parité, si bien qu’une commune de soixante-dix-huit déplacées obtenait le quart complet du score.

CommuneFemmes et fillesÉcart de compositionAncien scoreRang
Port-Margot1 34410,934,413
Ferrier17817,433,518
Bas Limbé9312,033,419
Carice7811,933,420

Toute commune dont la part de femmes dépasse 60 % obtenait un plancher de 33,3, quelle que soit sa taille. En portant la saturation de dix à vingt points, Ferrier et ses 178 déplacées obtiendraient encore 29,1, devant une commune de dix mille déplacées qui plafonnerait à 14,7. La formule corrigée intègre donc le volume.

La correction

Dans la version corrigée, la composition et la protection déterminent un coefficient appliqué au volume.

Le score, version corrigéeMesures.tmdl
Score priorisation =
VAR VolumeMax =
    CALCULATE(
        MAXX( VALUES( dim_commune[pcode_commune] ), [Femmes et filles] ),
        ALL( dim_commune )
    )
VAR TermeVolume = DIVIDE( [Femmes et filles], VolumeMax )
VAR TermeComposition = MIN( 1, MAX( 0, DIVIDE( [Part femmes et filles] - 0.5, 0.1 ) ) )
VAR Protection = [Latrines séparées %]
VAR Modulation =
    IF(
        ISBLANK( Protection ),
        DIVIDE( 0.5 + 0.25 * TermeComposition, 0.75 ),
        0.5 + 0.25 * TermeComposition + 0.25 * ( 1 - Protection )
    )
RETURN
ROUND( Modulation * TermeVolume * 100, 1 )

Le calcul place ALL( dim_commune ) autour de MAXX. Une application à la table itérée laisserait actif le filtre de la ligne courante. Le maximum reprendrait alors la valeur de cette ligne et donnerait un terme de volume égal à 1 partout.

CommuneFemmesAncienNouveauRang
Port-au-Prince83 10272,972,91 vers 1
Delmas47 74863,352,62 vers 2
Port-Margot1 34434,41,613 vers 91
Carice7833,40,120 vers 132
Pondérations publiées avec le score

Les pondérations de 50, 25 et 25 relèvent d’un choix de l'autrice. Elles sont affichées à côté du tableau. Le volume reste le principal déterminant du classement, conformément à l’objectif de priorisation.

Recalculer chaque affirmation

Les titres du rapport formulent des constats précis. Chacun doit donc pouvoir être recalculé à partir des fichiers sources. Neuf affirmations ont été vérifiées une à une.

Affirmation affichéePageVerdict
Trois communes de provenance font 56,7 % du totalOriginesexact
Cinq des sept premières communes sont hors de la zone métropolitaineGéographieexact
L’Ouest reste le premier département, avec 30 % du totalGéographie29,6 %, exact
18 sites contre 2 répondent différemment selon le sexeProtectionexact
Le lieu pèse dix fois plus que le sexeProtection23,5 points contre 2,2, tient
98,8 % des déplacements sont dus aux attaquesAmpleurexact sur douze relevés
La protection est citée deux fois et demie plus en zone métropolitaineBesoins2,42, corrigé en « près de »
Hors zone métropolitaine, les abris et la nourriture dominentBesoinsfaux, les moyens de subsistance sont deuxièmes
Écart de perception de 3,2 pointsProtectionfaux, deux périmètres comparés

Les deux affirmations erronées révélaient des problèmes de calcul. Pour la dernière, les cartes comparaient une moyenne féminine calculée de mars 2023 à juin 2025 à une moyenne masculine calculée de juin 2024 à juin 2025. La collecte des réponses masculines commence plus tard.

Le même écart, deux périmètresvérification
tel que la page le calculait    femmes 70,20 %  (557 obs)   hommes 73,41 %   ecart -3,21
a perimetre comparable          femmes 69,53 %  (443 obs)   hommes 73,41 %   ecart -3,88

Les trois cartes portent désormais le même filtre de relevés. À périmètre comparable, l’écart est de 3,9 points.

La relecture a aussi relevé deux erreurs de construction. Sur la page Origines, un graphique en barres et le premier niveau d’une matrice utilisaient le même champ, la même mesure et le même tri. Ce doublon occupait la moitié de la surface utile. Sur la page Protection, trois barres issues de la même mesure réunissaient deux indicateurs de conformité, où une valeur élevée est favorable, et un indicateur de risque, où elle est défavorable. Le sous-titre unique annonçait une part de conformité et inversait la lecture de la troisième barre.

Limites

Le tableau de bord présente chaque limite sur la page concernée.

  • Protection limitée aux sites. 84,5 % des femmes déplacées vivent chez des familles d’accueil, où le questionnaire omet ces questions. La page Protection l’annonce en tête, avant les taux qu’elle affiche.
  • Onze mois d’écart. Les indicateurs de protection s’arrêtent en juin 2025 quand le dernier relevé du rapport est de mai 2026.
  • Le périmètre s’étend avec le temps. Toute comparaison antérieure à juin 2024 mêlerait extension de la collecte et évolution réelle, d’où le filtre de série nationale sur chaque graphique temporel.
  • Les effectifs sont des estimations. La DTM les produit à partir d’entretiens avec des informateurs clés. Les écarts précis entre deux relevés dépassent le niveau de précision de la méthode.
  • Le score est une construction. L'autrice définit sa formule et l’affiche à côté du tableau qu’elle classe.

Reproduire

Trois scripts s’exécutent dans l’ordre : chacun écrit ses sorties sur disque, puis le suivant les lit. Les classeurs sources restent versionnés dans le dépôt, car les URL de téléchargement finissent par expirer.

Reconstruire les tablesscripts/
pip install pandas openpyxl geopandas topojson

python scripts/01_extract.py   # six tables dans data/clean/
python scripts/02_geo.py       # TopoJSON communal et centroides
python scripts/03_pbit.py      # template Power BI et memo des mesures

Le contrôle de fin de chaîne tient en deux nombres : si PDI sort à 1 466 862 et Femmes et filles à 796 688 sur le relevé 13, la chaîne est intacte.

Les corrections décrites sur cette page sont regroupées dans des scripts idempotents, un par page, suivis d’une passe typographique. Une seule commande les applique. Chaque script relit l’état avant d’écrire et peut être relancé sans effet de bord. Cette précaution protège le PBIR : Power BI Desktop le réécrit depuis sa mémoire lorsqu’on recharge des modifications non enregistrées, ce qui peut effacer une demi-journée de travail.