Application R Shiny de visualisation et d'analyse des évaluations communales dans le cadre du programme PADGOF, développée pour le MINDDEVEL en partenariat avec la GIZ — Cameroun.
🌐 Démo en ligne : charlesmoute.shinyapps.io/igl_dashboard
L'Indice de Gouvernance Locale (IGL) est un outil de mesure de la qualité de gouvernance des communes camerounaises. Il couvre 360 communes sur quatre domaines : gouvernance administrative, financière, participative et exercice des compétences transférées.
Ce tableau de bord permet aux équipes terrain, aux délégations régionales et aux responsables de programme de consulter, filtrer et exporter les résultats des évaluations — le tout depuis une interface sécurisée, sans compétences techniques particulières.
Ce que vous pouvez faire avec l'application :
- Visualiser les scores IGL à l'échelle nationale, régionale, départementale et communale sur une carte interactive
- Comparer les communes et identifier les domaines à renforcer en priorité
- Générer des rapports HTML individuels par commune, prêts à partager
- Synchroniser automatiquement les données depuis KoboToolbox au démarrage
- Gérer les accès utilisateurs avec des périmètres de données restreints par région, département ou commune
┌─────────────────────────────────────────────────────────────────────┐
│ IGL Dashboard v2 [sync: 18/05 14:32] [Admin ▾]│
├───────────────┬─────────────────────────────────────────────────────┤
│ │ Score IGL │ Communes │ Meilleure │ À surveiller│
│ Navigation │ 0,62 │ 360 │ Centre │ Extrême-Nord│
│ ├─────────────────────────────────────────────────────┤
│ Vue Nationale│ │
│ Analytique │ [Carte interactive] │
│ Classement │ │
│ Export │ [Répartition] [Scores par région] │
│ Admin │ │
│ │ [Tableau de synthèse régional] │
│ ───────── │ │
│ Filtres │ │
│ Région ▾ │ │
│ Département ▾│ │
│ Commune ▾ │ │
└───────────────┴─────────────────────────────────────────────────────┘
Cinq vues complémentaires pour analyser les données à n'importe quelle échelle :
| Vue | Ce qu'elle montre |
|---|---|
| Nationale | Carte interactive, KPIs nationaux, répartition de la performance par région |
| Régionale | Profil radar de la région, classement des départements |
| Départementale | Classement des communes, profil de gouvernance du département |
| Commune | Fiche complète avec scores, radar, recommandations par domaine |
| Classement | Tableau interactif trié et filtrable de toutes les communes |
- Distribution des scores (histogramme) avec repère de la moyenne
- Boîtes à moustaches pour comparer la dispersion entre régions
- Carte de chaleur Domaines × Régions pour repérer les points faibles systémiques
- Barres empilées par niveau de performance
- Top 10 / Bottom 10 dynamiques selon les filtres actifs
Trois rôles distincts avec des droits progressifs :
| Fonctionnalité | Visualiseur | Évaluateur | Administrateur |
|---|---|---|---|
| Consultation des tableaux de bord | ✅ | ✅ | ✅ |
| Filtres géographiques | ✅ | ✅ | ✅ |
| Téléchargement CSV | ❌ | ✅ | ✅ |
| Génération de rapports HTML | ❌ | ✅ | ✅ |
| Synchronisation KoboToolbox | ❌ | ❌ | ✅ |
| Gestion des utilisateurs | ❌ | ❌ | ✅ |
| Journal d'activité | ❌ | ❌ | ✅ |
Chaque utilisateur peut avoir un périmètre de données restreint (régions, départements ou communes spécifiques) défini par l'administrateur à la création du compte.
Les données sont chargées selon une logique en cascade au démarrage :
- KoboToolbox — synchronisation directe via l'API (package
robotoolbox) - Cache local — dernier jeu de données sauvegardé sur le disque
- Démonstration — 360 communes fictives générées automatiquement
Un badge dans le header indique en permanence quelle source est active.
- R ≥ 4.2 — cran.r-project.org
- RStudio ≥ 2023.06 (recommandé) — posit.co
git clone https://github.com/votre-organisation/igl-dashboard.git
cd igl-dashboardinstall.packages(c(
"shiny", "shinydashboard", "shinyWidgets", "shinymanager",
"plotly", "leaflet", "DT", "dplyr", "tidyr", "scales",
"htmltools", "waiter", "DBI", "RSQLite"
))
# Optionnel : pour la connexion KoboToolbox
install.packages("robotoolbox")Copiez .Renviron.example en .Renviron et renseignez vos identifiants :
cp .Renviron.example .Renviron# Connexion KoboToolbox
KOBO_URL=https://kf.kobotoolbox.org
KOBO_TOKEN=votre_token_api
KOBO_ASSET_UID=identifiant_du_formulaire
# Passphrase de chiffrement de la base utilisateurs
IGL_CREDS_PASSPHRASE=une_phrase_longue_et_unique_2025Comment trouver votre token KoboToolbox ? Connectez-vous sur KoboToolbox → Profil → Paramètres du compte → API → copiez le token.
# Depuis RStudio : ouvrir app.R et cliquer sur "Run App"
# Ou depuis la console :
shiny::runApp(".")L'application crée automatiquement le dossier data/ et initialise la base des utilisateurs au premier lancement.
igl-dashboard/
├── app.R # Point d'entrée
├── global.R # Config, chargement des données, utilitaires
├── ui.R # Interface utilisateur
├── server.R # Logique serveur
├── generate_data.R # Générateur de données de démonstration
├── www/
│ ├── style.css # Charte graphique
│ └── logo_igl.svg # Logo
├── data/ # Créé automatiquement
│ ├── credentials.sqlite # Base des utilisateurs (chiffrée)
│ ├── igl_data.RData # Cache des données
│ └── activity_log.rds # Journal d'activité
├── .Renviron.example # Modèle de configuration
└── logs/ # Logs applicatifs
Trois comptes sont créés automatiquement au premier lancement.
| Identifiant | Mot de passe | Rôle |
|---|---|---|
admin |
Admin@IGL2025! |
Administrateur |
evaluateur |
Eval@IGL2025! |
Évaluateur |
visualiseur |
View@IGL2025! |
Visualiseur |
⚠️ Ces mots de passe sont publics. Changez-les immédiatement après le premier lancement. L'interface d'administration complète est accessible en ajoutant?adminà l'URL de l'application.
L'administrateur peut restreindre les données visibles pour chaque utilisateur. La logique suit une cascade : si des communes sont définies, elles priment sur tout ; sinon les départements priment sur les régions.
Communes définies → ces communes uniquement
↓ sinon
Départements définis → toutes leurs communes
↓ sinon
Régions définies → toutes leurs communes et départements
↓ sinon
Aucun filtre → toutes les données
Le périmètre est configuré dans l'onglet Administration lors de la création du compte, avec des sélecteurs en cascade qui se mettent à jour automatiquement.
# Déposer l'application dans le dossier des apps Shiny Server
cp -r igl-dashboard /srv/shiny-server/igl/
# Le fichier .Renviron doit être dans le dossier de l'app
cp .Renviron /srv/shiny-server/igl/.RenvironPuis accéder à http://votre-serveur/igl/.
Publier directement depuis RStudio via le bouton Publish ou avec rsconnect :
rsconnect::deployApp(
appDir = ".",
appName = "igl-dashboard",
account = "votre-compte"
)Les variables d'environnement doivent être configurées dans l'interface de Posit Connect, pas dans le
.Renvironlocal.
┌─────────────────────────────────────────────────┐
│ global.R │
│ - Chargement données (KoboToolbox / cache / │
│ démo) avec logique en cascade │
│ - Initialisation base utilisateurs SQLite │
│ - Migration automatique des DBs existantes │
│ - apply_user_scope() pour les périmètres │
└────────────────┬────────────────────────────────┘
│
┌────────┴─────────┐
▼ ▼
┌─────────┐ ┌──────────┐
│ ui.R │ │ server.R │
│ │ │ │
│secure_ │ │secure_ │
│app() │ │server() │
│ │ │ │
│sidebarM │ │observe() │
│enuOutput│ │user_state│
│ │ │reactiveV.│
└─────────┘ └──────────┘
Les éléments clés de l'implémentation :
- Authentification via
shinymanageravec base SQLite chiffrée - Gestion des rôles via
reactiveValuespeuplé dans unobserve()surres_auth$user_info— la seule approche fiable pour lire les infos utilisateur sans bloquer le rendu - Menu conditionnel via
sidebarMenuOutput/renderMenu(méthode officielle shinydashboard —hideTab/showTabne fonctionne pas sur lesmenuItem) - Périmètre de données via
igl_data_scoped(), un réactif qui appliqueapply_user_scope()à chaque render - Radar plots :
mode = "lines+markers"explicite pour éviter les warnings plotly - Couleurs plotly :
unname()systématique pour éviter le warning jsonlite sur les vecteurs nommés
L'IGL est calculé à partir de 26 indicateurs répartis sur 4 domaines :
IGL = D1 × 0,35 + D2 × 0,25 + D3 × 0,25 + D4 × 0,15
| Domaine | Poids | Indicateurs couverts |
|---|---|---|
| D1 — Gouvernance Administrative | 35% | Sessions du conseil, délégations du maire, ressources humaines, contentieux |
| D2 — Gouvernance Financière | 25% | Exécution budgétaire, recouvrement fiscal, investissements, dette |
| D3 — Gouvernance Participative | 25% | Comités de quartier, participation citoyenne, information, réclamations |
| D4 — Compétences Transférées | 15% | Écoles, centres de santé, eau potable, voiries, éclairage, environnement |
Chaque score est interprété selon l'échelle officielle du Guide Méthodologique IGL (MINDDEVEL, 2026) :
| Score | Niveau |
|---|---|
| > 0,85 | Très bonne gouvernance |
| 0,70 – 0,85 | Bonne gouvernance |
| 0,50 – 0,70 | Gouvernance moyenne |
| 0,25 – 0,50 | Gouvernance faible |
| < 0,25 | Gouvernance critique |
Les contributions sont les bienvenues, notamment pour :
- La traduction de l'interface en anglais
- L'ajout de visualisations supplémentaires (évolution temporelle, comparaisons inter-cycles)
- L'intégration avec d'autres plateformes de collecte de données (ODK, CommCare)
- L'amélioration du générateur de rapports HTML
Pour contribuer : forkez le dépôt, créez une branche descriptive (feature/evolution-temporelle), puis ouvrez une Pull Request avec une description claire des changements.
Ce projet est développé dans le cadre d'un programme de coopération technique public. Tout usage à des fins commerciales sans accord préalable du MINDDEVEL est interdit.
Développé pour le programme PADGOF (Programme d'Appui à la Décentralisation et à la Gouvernance des Finances publiques locales) dans le cadre de la coopération technique MINDDEVEL / GIZ au Cameroun.
Pour toute question technique, ouvrez une issue. Pour les questions relatives à l'IGL et à son interprétation, contactez directement la Direction de la Décentralisation au MINDDEVEL.