Tout le nécessaire pour animer une formation Python de 12 séances de 2 heures, destinée à des consultants sans aucune expérience de la programmation, autour d'un projet unique mené de bout en bout.
À l'arrivée, le participant sait lire du code Python, en écrire de zéro, dialoguer avec des ingénieurs et transposer la méthode à un projet de son propre métier.
Le Groupe Meridian emploie 1 000 personnes sur deux sites — 13 075 m², 1 005 postes, 7,1 M€ par an. Depuis le télétravail, la direction de l'immobilier soupçonne un sur-dimensionnement sans savoir le chiffrer.
Combien de postes faut-il réellement, et que coûte le vide ?
287 000 mouvements de badge, cinq fichiers sales, treize pièges. Réponse attendue : fermer un étage, économiser 1 531 400 € par an.
| Vous êtes… | Commencez par |
|---|---|
| l'animateur, et vous découvrez le dossier | plan_formation/PLAN_DE_FORMATION.md |
| l'animateur, et vous préparez la séance N | plan_formation/seances/ |
| l'animateur, et vous voulez le notebook à projeter | notebooks/corrige_formateur_complet.ipynb — livré exécuté, sorties comprises |
| curieux du résultat final | projet_occupation/resultats/note_de_synthese.md |
| un participant | supports_participants/installation.md puis notebooks/participants/ |
pip install -r requirements.txt
cd projet_occupation && python main.py # l'analyse complète, ~30 s
python -m pytest tests/ -q # 35 tests
cd ../corrige_formateur && python analyse_pas_a_pas.py # les 15 étapes commentéesEt pour ouvrir les notebooks de séance :
jupyter lab notebooks/formation_python/
├── plan_formation/ ★ LE PLAN DE FORMATION
│ ├── PLAN_DE_FORMATION.md programme des 12 séances (diffusable)
│ └── seances/ déroulé minuté de chaque séance (animateur)
│
├── notebooks/ ★ LES SÉANCES 1 À 10 SE FONT ICI
│ ├── corrige_formateur_complet.ipynb les 15 étapes, livré exécuté
│ ├── participants/S01..S10.ipynb un carnet amorcé par séance
│ └── construire_notebooks.py le générateur (source de vérité)
│
├── donnees_atelier/
│ └── 01_donnees_participants/ les 5 fichiers bruts distribués
│
├── corrige_formateur/ le corrigé en script (contrôle automatisé)
│ ├── analyse_pas_a_pas.py les 15 étapes, avec les résultats attendus
│ ├── produire_filets_securite.py génère les fichiers de reprise
│ └── filets_securite/ un fichier par séance, pour ceux qui décrochent
│
├── projet_occupation/ ★ LE PROJET STRUCTURÉ (séances 11 et 12)
│ ├── main.py, config.py point d'entrée et paramètres
│ ├── src/ chargement, nettoyage, kpis, graphiques, restitution
│ ├── tests/ 35 tests
│ └── resultats/ note de synthèse, tableaux, graphiques
│
├── supports_participants/ à distribuer
│ ├── installation.md
│ ├── aide_memoire_pandas.md
│ └── glossaire_pour_parler_aux_ingenieurs.md
│
└── docs_source/ le guide et la fiche formateur d'origine
Les 15 étapes du guide ont été réexécutées sur le jeu de données livré. Tous les chiffres se reproduisent à l'identique, sous Python 3.11 et pandas 3.0.5 :
| Attendu | Obtenu | |
|---|---|---|
| Mouvements Paris / Lyon / total | 208 659 / 78 297 / 286 956 | ✅ identique |
| Matricules distincts, avant → après | 2 747 → 1 164 | ✅ identique |
| Doublons de badgeage | 8 138 | ✅ identique |
| Journées de présence | 117 764 | ✅ identique |
| Jointure interne / gauche | 113 264 / 117 764 | ✅ identique |
| Parc immobilier | 13 075 m² · 1 005 postes · 7 104 850 € | ✅ identique |
| Pic réel du cumul / somme des pics | 167 / 171 | ✅ identique |
| Économie annuelle | 1 531 400 € | ✅ identique |
Le projet structuré retrouve seul la recommandation — étage 4 vers étage 6 — sans qu'aucun étage ne soit codé en dur : il teste tous les regroupements possibles et ne retient que ceux qui tiennent au pic réel.
Le manque comblé. Le guide s'arrêtait à l'étape 16 en la décrivant sans la
livrer : « il manque les quatre modules de src/, le main.py, la gestion
des erreurs et le README ». Ils sont là, exécutables, testés, avec une
interface en ligne de commande et une documentation d'extension à 2026 et à
Marseille.
Quatre points relevés en réexécutant le guide, tous intégrés aux fiches de séance :
-
La vérification suggérée en étape 2 ne fonctionne pas. « Combien de badgeages en février ? » donne 16 299 avec la bonne méthode contre 16 285 avec
dayfirst=True— quatorze d'écart, le piège reste invisible. Le bon test est le mois d'août : 8 039 contre 10 757, soit +34 %, sur le seul mois dont toute la salle connaît la réponse d'avance. -
Les 37,3 % de lignes mal datées sont exacts, mais pour une raison plus forte que celle annoncée. Sur les 77 920 lignes corrompues par
dayfirst=True, 52 186 sont au format ISO — déjà bien écrites.dayfirstlit2025-01-02comme le 1ᵉʳ février. Les deux systèmes sont cassés, pas seulement l'américain. -
La carte de chaleur montre 9 cases blanches alors que 2025 compte 10 jours fériés en semaine. Le 31 décembre 2025 appartient à la semaine ISO 1 : les 428 badgeurs de ce jour masquent le férié du 1ᵉʳ janvier. Excellent point avancé sur le fait qu'un axe de temps n'est jamais neutre.
-
Le comptage de 2 747 matricules porte sur Paris et Lyon. Sur Paris seul, il vaut 2 081 → 908. À savoir si l'on introduit le nettoyage des identifiants avant l'arrivée de Lyon, comme le fait le plan proposé.
-
Le piège n° 9 de la fiche formateur — les dates RH — n'était exploité nulle part dans le guide. Il l'est maintenant, en séance 9, et il porte la meilleure leçon statistique du parcours : 112 personnes (11,2 % de l'effectif) sont arrivées ou parties en cours d'année, mais leur taux de présence est calculé sur 251 jours comme celui des autres.
Taux sur 251 j Taux corrigé Interne 36,9 % 38,8 % Prestataire 58,8 % 61,7 % Les 112 concernés 25,6 % 46,2 % L'agrégat absorbe l'erreur — la recommandation tient — mais les lignes individuelles passent du simple au double. Une moyenne peut être juste alors que chacune des valeurs qui la composent est fausse.
generateur_donnees.py, mentionné par la fiche formateur pour piloter la difficulté (--difficulte facile,--seed 7). Il n'a pas été fourni. Le jeu de données livré correspond à la difficulté standard, graine 2025.- Le corrigé
02_corrige_formateur/presences_reelles.csvcité par la fiche. Les fichiers de reprise decorrige_formateur/filets_securite/remplissent le même rôle, avec un état par séance plutôt qu'un fichier unique.
Aucun résultat, aucun graphique, aucun tri ne descend en dessous de l'équipe. Les matricules sont des identifiants techniques et ne sont jamais publiés. Le sujet, ce sont les mètres carrés — pas les personnes.
C'est un choix professionnel, pas une contrainte technique, et il se pose dès la première minute de la séance 1.