Ce projet implémente un pipeline complet de génération et d'analyse de données synthétiques de téléphonie mobile, conformément aux standards des Nations Unies (UN-MPDMS/MPDMIS).
Le prototype couvre trois axes d'analyse principaux :
- Analyse de la Pauvreté - Estimation des indicateurs socio-économiques via indices de richesse (PCA, Alkire-Foster)
- Analyse de la Migration - Détection des flux migratoires internes (permanents, saisonniers, pendulaires)
- Analyse de la Mobilité - Étude des déplacements quotidiens et matrices Origine-Destination
ci-mobility-prototype/
├── config/ # Configuration
│ └── data_params.yml # Paramètres de génération
├── src/ # Code source
│ ├── data_generation/ # Génération de données synthétiques
│ │ └── synthetic_generator.py
│ ├── indicators/ # Calcul des indicateurs
│ │ ├── poverty_index.py # Indice de pauvreté (PCA, quintiles, IPM)
│ │ ├── migration_flows.py # Flux migratoires et statistiques
│ │ └── mobility_metrics.py # Métriques de mobilité (OD, accessibilité)
│ ├── pipeline/ # Orchestration
│ │ └── run_pipeline.py # Pipeline principal (6 étapes)
│ ├── api/ # API REST (FastAPI)
│ ├── dashboard/ # Dashboard interactif
│ │ └── app.py # Application Streamlit
│ ├── privacy/ # Anonymisation et confidentialité
│ ├── utils/ # Utilitaires communs
│ └── validation/ # Validation des données
├── data/ # Données
│ ├── raw/ # Données brutes (GADM boundaries)
│ │ └── gadm41_CIV_4.json # Limites administratives Côte d'Ivoire
│ ├── processed/ # Données traitées et enrichies
│ │ ├── exploration/ # Aperçus des données
│ │ ├── stats/ # Statistiques exportées
│ │ └── figures/ # Visualisations
│ ├── synthetic/ # Données synthétiques générées
│ └── metadata/ # Métadonnées des datasets
├── notebooks/ # Notebooks Jupyter
│ └── 01_exploration_donnees.ipynb # Exploration interactive
├── tests/ # Tests unitaires
├── docs/ # Documentation
├── logs/ # Fichiers de log
├── requirements.txt # Dépendances Python
└── pyproject.toml # Configuration du projet
- Python 3.9+
- pip ou conda
- Git
# Cloner le repository
git clone <repository-url>
cd ci-mobility-prototype
# Créer un environnement virtuel
python -m venv venv
# Activer l'environnement
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows (CMD)
.\venv\Scripts\Activate # Windows (PowerShell)
# Installer les dépendances
pip install -r requirements.txt# Vérifier que tout est installé
python -c "import pandas, geopandas, streamlit, h3; print('✅ Installation OK')"python -m src.pipeline.run_pipelineLe pipeline exécute 6 étapes :
- Génération - Création des données synthétiques (users, poverty, migration, mobility)
- Indicateurs - Calcul des indices de pauvreté, migration et mobilité
- Enrichissement - Ajout des métadonnées et géolocalisation
- Agrégation - Agrégation spatiale et temporelle
- Export - Sauvegarde des résultats (CSV, JSON, YAML)
- Rapport - Génération du rapport de synthèse
streamlit run src/dashboard/app.pyLe dashboard offre :
- 🗺️ Cartes interactives - Visualisation géographique des indicateurs
- 📊 Analyse de pauvreté - Distribution des quintiles et IPM
- 🚶 Flux migratoires - Corridors et statistiques de migration
- 🚗 Mobilité - Matrices OD et répartition modale
jupyter notebook notebooks/01_exploration_donnees.ipynbpython -m src.data_generation.synthetic_generatorfrom src.indicators.poverty_index import PovertyIndexCalculator
from src.indicators.migration_flows import MigrationDetector
from src.indicators.mobility_metrics import MobilityAnalyzer
# Pauvreté
calculator = PovertyIndexCalculator()
df_result, stats = calculator.process(poverty_data)
# Migration
detector = MigrationDetector()
migration_df, migration_stats = detector.process(migration_data)
# Mobilité
analyzer = MobilityAnalyzer()
mobility_df, mobility_stats = analyzer.process(mobility_data)# Voir l'aide
python -m src.pipeline.run_pipeline --help
# Ne pas sauvegarder les fichiers
python -m src.pipeline.run_pipeline --no-save
# Utiliser une configuration personnalisée
python -m src.pipeline.run_pipeline --config path/to/config.yml
# Exécuter une seule étape
python -m src.pipeline.run_pipeline --step 1 # Génération uniquement| Colonne | Description |
|---|---|
user_id |
Identifiant anonymisé (SHA-256) |
age_group |
Groupe d'âge (18-25, 26-35, etc.) |
gender |
Genre (M/F) |
occupation |
Catégorie professionnelle |
phone_type |
Type de téléphone (basic, feature, smartphone) |
locality / region |
Localisation administrative |
home_lat / home_lon |
Coordonnées du domicile |
home_h3 |
Cellule H3 (résolution 7) |
urban_rural |
Zone urbaine ou rurale |
| Colonne | Description |
|---|---|
recharge_amount_fcfa |
Montant de recharge (FCFA) |
recharge_frequency_weekly |
Fréquence hebdomadaire |
call_duration_sec |
Durée d'appel (secondes) |
data_mb |
Consommation data (Mo) |
contact_diversity_score |
Score de diversité des contacts |
mobility_radius_km |
Rayon de mobilité (km) |
| Colonne | Description |
|---|---|
origin_locality / origin_region |
Origine |
current_locality / current_region |
Destination |
movement_type |
Type (permanent, seasonal, return, pendular) |
residence_duration_days |
Durée de résidence |
distance_km |
Distance parcourue |
is_return_migration |
Migration de retour (bool) |
| Colonne | Description |
|---|---|
origin_h3 / destination_h3 |
Cellules H3 O/D |
transport_mode |
Mode (walk, car, bus, moto, gbaka) |
trip_purpose |
Motif (work, shopping, leisure, etc.) |
distance_km |
Distance (km) |
duration_min |
Durée (minutes) |
hour_of_day |
Heure de départ |
| Indicateur | Méthode | Description |
|---|---|---|
| Indice de richesse | PCA | Analyse en composantes principales sur les features téléphonie |
| Quintiles de richesse | Quantiles | Classification en 5 groupes (Q1=plus pauvre) |
| IPM (Indice de Pauvreté Multidimensionnel) | Alkire-Foster | Score de privation (0-1) |
| Taux de pauvreté | Seuil k=0.33 | % population en pauvreté multidimensionnelle |
| Indicateur | Description |
|---|---|
| Taux de migration interne | % utilisateurs ayant migré |
| Flux nets par zone | Entrées - Sorties par région |
| Distance moyenne | Distance moyenne de migration (km) |
| Distribution par type | Répartition permanent/saisonnier/pendulaire |
| Indicateur | Description |
|---|---|
| Matrice Origine-Destination | Flux entre cellules H3 |
| Répartition modale | % par mode de transport |
| Temps de trajet moyen | Durée moyenne des déplacements |
| Distribution horaire | Heures de pointe (matin/soir) |
| Accessibilité (SDG 11.2.1) | Accès aux transports publics |
Le fichier config/data_params.yml permet de personnaliser :
# Paramètres principaux
n_users: 10000 # Nombre d'utilisateurs
days: 365 # Période de simulation (jours)
random_seed: 42 # Graine aléatoire
# Distribution géographique (191 localités GADM)
# Basé sur gadm41_CIV_4.json (limites administratives niveau 4)
# Paramètres de mobilité
mobility_sample_ratio: 0.1 # % utilisateurs avec données mobilité
trips_per_user: [10, 30] # Plage de trajets par utilisateur
# Paramètres de migration
migration_rate: 0.05 # Taux de migration (~5%)Le dashboard Streamlit (src/dashboard/app.py) offre une interface interactive :
- Vue d'ensemble : Métriques clés et résumé des données
- Analyse de pauvreté : Carte des quintiles, distribution IPM
- Analyse de migration : Flux migratoires, corridors principaux
- Analyse de mobilité : Matrices OD, heures de pointe
- Export : Téléchargement des données filtrées
streamlit run src/dashboard/app.py
# Accessible sur http://localhost:8501| Extension | ID | Description |
|---|---|---|
| Python | ms-python.python | Support Python |
| Pylance | ms-python.vscode-pylance | IntelliSense avancé |
| GitHub Copilot | github.copilot | Assistance IA |
| Jupyter | ms-toolsai.jupyter | Support notebooks |
| GitLens | eamodio.gitlens | Historique Git |
{
"python.defaultInterpreterPath": "./venv/Scripts/python.exe",
"python.analysis.typeCheckingMode": "basic",
"python.formatting.provider": "none",
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true
},
"python.linting.enabled": true
}# Exécuter tous les tests
pytest tests/ -v
# Avec couverture
pytest tests/ --cov=src --cov-report=html# Formatage
black src/
# Linting
flake8 src/
# Type checking
mypy src/Ce projet respecte les guidelines suivants :
| Standard | Description |
|---|---|
| UN-MPDMS | Mobile Positioning Data for Migration Statistics |
| UN-MPDMIS | Mobile Positioning Data for Mobility and Infrastructure Statistics |
| GDPR | Protection des données et anonymisation |
| k-Anonymité | Minimum de 10 utilisateurs par groupe |
| SDG 11.2.1 | Indicateur d'accessibilité aux transports |
| Mesure | Implémentation |
|---|---|
| Anonymisation | Hachage SHA-256 des identifiants |
| Agrégation | Minimum 10 utilisateurs par groupe |
| Géolocalisation | Cellules H3 résolution 7 (~5km²) |
| Confidentialité différentielle | Support ε = 1.0 (optionnel) |
| Rotation des sels | Sels d'anonymisation rotatifs |
pandas>=2.0.0 # Manipulation des données
geopandas>=0.14.0 # Données géospatiales
h3>=4.0.0 # Indexation spatiale H3
scikit-learn>=1.0.0 # Machine learning (PCA)
streamlit>=1.20.0 # Dashboard interactif
plotly>=5.0.0 # Visualisations
folium>=0.14.0 # Cartes interactives
loguru>=0.7.0 # Logging
pyyaml>=6.0 # Configuration YAML
- Notebook d'exploration - Exploration interactive des données
- Configuration - Paramètres de génération
- Dossier
docs/- Documentation technique détaillée
| Problème | Solution |
|---|---|
ModuleNotFoundError: h3 |
pip install h3 |
FileNotFoundError: gadm41_CIV_4.json |
Télécharger les limites GADM dans data/raw/ |
| Dashboard qui clignote | Utiliser st.cache_data et paramètre key |
numpy.int64 dans timedelta |
Convertir avec int() |
Les logs sont générés dans le dossier logs/ et affichés dans la console avec Loguru.
Les contributions sont les bienvenues ! Merci de :
- Forker le repository
- Créer une branche (
git checkout -b feature/nouvelle-fonctionnalité) - Commiter vos changements (
git commit -m 'Ajout de...') - Pousser la branche (
git push origin feature/nouvelle-fonctionnalité) - Ouvrir une Pull Request
Ce projet est développé dans le cadre des activités de l'ANStat (Agence Nationale de la Statistique) de Côte d'Ivoire.
Pour toute question concernant ce projet, contactez l'équipe DataLab de l'ANStat.
Version: 1.0.0
Standard: UN-MPDMS/MPDMIS v2.0
Dernière mise à jour: Janvier 2026
Python: 3.9+