Skip to content

Repository files navigation

Formation Python pour consultants — projet « Occupation des locaux »

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 projet fil rouge

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.


Par où commencer

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/

Vérifier que tout tourne, en trois commandes

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ées

Et pour ouvrir les notebooks de séance :

jupyter lab notebooks/

Le contenu du dossier

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

État de vérification

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.


Ce que la mise en œuvre a ajouté au guide

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 :

  1. 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.

  2. 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. dayfirst lit 2025-01-02 comme le 1ᵉʳ février. Les deux systèmes sont cassés, pas seulement l'américain.

  3. 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.

  4. 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é.

  5. 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.


Ce qui n'est pas dans le dossier

  • 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.csv cité par la fiche. Les fichiers de reprise de corrige_formateur/filets_securite/ remplissent le même rôle, avec un état par séance plutôt qu'un fichier unique.

Confidentialité

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.

About

Formation Python de zero

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages