Aller au contenu
Marc Steven Mouthoud / data engineering
Projet 03 · Analyse et machine learning

Enquêtes FinScope · Afrique de l'Est

Inclusion financière

Kenya · Rwanda · Tanzanie · Ouganda · 2016-2018

23 524 réponses à une enquête. Une question : qui possède un compte bancaire, et peut-on le prédire ?

Mesuré le 30 septembre 2026 · Random Forest · AUC 0,81

Part des répondants qui ont un compte bancaire

  • Kenya6 066 répondants25,1 %
  • Rwanda8 734 répondants11,5 %
  • Tanzanie6 570 répondants9,2 %
  • Ouganda2 101 répondants8,6 %
14,1 %des répondants, tous pays confondus
Réponses dont la possession d'un compte est connue : 23 485 sur 23 521 après nettoyage. Les 14 réponses sans pays ne figurent pas dans les barres.

L'histoire · 1

L'emploi et l'éducation d'abord

Avoir un compte dépend moins du pays que de la situation de la personne.

Fig. 01

financial_inclusion_clean.csv

Par type d'emploi

  • Salarié du public77,5 %
  • Salarié du privé54,2 %
  • Indépendant13,2 %
  • Agriculture et pêche11,7 %
  • Emploi informel7,9 %
  • Sans revenu2,1 %

Fig. 02

financial_inclusion_clean.csv

Par niveau d'éducation

  • Formation professionnelle57,0 %
  • Enseignement supérieur51,2 %
  • Enseignement secondaire23,3 %
  • Enseignement primaire8,5 %
  • Sans instruction3,9 %

77,5 % des salariés du public ont un compte, contre 7,9 % des personnes en emploi informel. Sans instruction, la part tombe à 3,9 %.

L'histoire · 2

Le piège de la précision

Le modèle du dépôt a été entraîné sur toutes les données, sans mesure de performance. Évalué ici sur un jeu de test mis de côté, il a l'air excellent. Il ne l'est pas.

86,6 %de bonnes réponses du modèle
85,9 %en répondant toujours « pas de compte »

Seuls 14,1 % des répondants ont un compte : un modèle qui ne prédit jamais « oui » a déjà raison 85,9 % du temps. Le bon indicateur est le rappel : parmi les personnes qui ont un compte, le modèle n'en retrouve que 39,4 %.

Précision globale
86,6 %
Rappel sur « oui »
39,4 %
personnes avec compte retrouvées
Précision sur « oui »
53,5 %
AUC
0,815

Jeu de test stratifié de 4 697 réponses (662 avec compte), mesuré le 30 septembre 2026.

L'histoire · 3

L'identifiant qui gonflait le score

Dans la première version, la colonne uniqueid était encodée comme une variable : le modèle apprenait à partir d'identifiants de répondants, qui ne disent rien d'une personne. Elle est maintenant exclue.

8 782variables avec l'identifiant
47variables sans lui
ModèleVariablesRappel « oui »Précision « oui »AUC
Première version, avec l'identifiant8 78229,2 %72,0 %0,850
Version actuelle, sans l'identifiant4739,4 %53,5 %0,815

Sans l'identifiant, l'AUC passe de 0,85 à 0,81 : une partie du score venait d'un signal que le modèle n'aurait pas dû avoir. Il retrouve en revanche davantage de personnes avec un compte. Mêmes données nettoyées, même jeu de test, mêmes paramètres.

Sous le capot

Le pipeline

Un CSV brut, une analyse exploratoire dans un notebook, un CSV nettoyé, puis un modèle entraîné au démarrage d'une application Streamlit.

  1. 01 · Source

    CSV FinScope

    23 524 réponses, 13 colonnes

  2. 02 · Exploration

    notebooks/EDA.ipynb

    profilage, manquants, doublons, distributions

  3. 03 · Nettoyage

    CSV nettoyé

    267 valeurs manquantes remplacées, 3 lignes hors période retirées

  4. 04 · Modèle

    src/model.py

    Random Forest, 200 arbres, 47 variables

  5. 05 · Usage

    app.py

    formulaire Streamlit, probabilité en temps réel

§ 01Architecture et flux de donnéesLes schémas du dépôt, de la source à l'application
Architecture : source FinScope, couches brute, nettoyée et modèle, application Streamlit
Architecture : source FinScope, couches brute, nettoyée et modèle, application Streamlit. Cliquez pour agrandir.
Flux de données : du CSV brut à la probabilité affichée dans le formulaire
Flux de données : du CSV brut à la probabilité affichée dans le formulaire. Cliquez pour agrandir.
§ 02Le datasetEnquêtes FinScope, quatre pays, 2016 à 2018

Réponses aux enquêtes FinScope menées au Kenya, au Rwanda, en Tanzanie et en Ouganda : pays, année, type de localisation, accès au téléphone, taille du foyer, âge (moyenne de 38,8 ans), genre, relation avec le chef du foyer, situation matrimoniale, niveau d'éducation, type d'emploi, et la cible : la possession d'un compte bancaire.

§ 03La qualité3 défauts corrigés, 4 points restants

Le nettoyage remplace les 267 valeurs manquantes (médiane pour les nombres, « Unknown » pour les catégories), retire les lignes hors période et normalise les noms de colonnes : 23 521 lignes, aucune valeur manquante, aucun doublon. Trois défauts relevés à l'exploration ont été corrigés :

CorrigéDétail
Valeurs manquantes restées en placel'imputation par fillna(inplace=True) sur une copie de colonne ne s'appliquait plus sous pandas 3 : les 267 valeurs manquantes restaient. Les colonnes sont maintenant réaffectées : 0 manquant
Années hors période d'enquête2029, 2039 et 2056, une ligne chacune, alors que l'enquête couvre 2016 à 2018 : les 3 lignes sont retirées
Identifiant parmi les variablesuniqueid encodé en 8 735 colonnes one-hot : exclu du modèle, qui passe de 8 782 à 47 variables

Le profilage du fichier nettoyé montre ce qu'il reste à traiter :

Reste à traiterDétail
Cible inconnue36 lignes « Unknown » pour la possession d'un compte, écartées au moment de l'entraînement
Pays inconnu14 lignes dont le pays manquait, remplacé par « Unknown » comme les autres catégories
Niveau d'éducation « 6 »une modalité sans libellé, à côté des niveaux nommés
Noms de colonnes d'originefautes conservées après le passage en snake_case : level_of_educuation, the_relathip_with_head
§ 04Les décisions techniquesModules séparés, Random Forest, Streamlit
Séparer les responsabilités
Chargement et prétraitement dans src/data_processing.py, entraînement dans src/model.py, interface dans app.py.
Random Forest
Un modèle robuste aux variables catégorielles encodées, sans mise à l'échelle, avec des paramètres fixés pour être reproductible.
Aligner la saisie sur le modèle
Le formulaire est encodé de la même façon que les données d'entraînement, puis réaligné sur leurs colonnes.
Une interface en français
Libellés traduits dans le formulaire, pour un usage direct par un public non technique.
§ 05Ce que j'amélioreraisÉvaluer, contrôler, entraîner une fois
  • Évaluer le modèle. Séparer un jeu de test et publier le rappel et l'AUC, pas seulement la précision, trompeuse sur des classes aussi déséquilibrées.
  • Transformer les corrections en contrôles automatiques, relancés à chaque exécution : aucune valeur manquante, années de 2016 à 2018, identifiant absent des variables. Puis traiter ce qui reste : modalité « 6 », pays et cibles inconnus.
  • Entraîner une fois, pas à chaque démarrage. Sauvegarder le modèle entraîné plutôt que de le réentraîner à chaque lancement de l'application.
Tout le détail sur GitHub ↗