Sujet n° 2 · Session 2026 · 1 heure
Écarts de salaires entre femmes et hommes
Une liste de dictionnaires décrit les employés d'une entreprise. Le candidat écrit deux fonctions d'analyse, débusque un double bug, puis découvre qu'un algorithme des k plus proches voisins reproduit l'écart qu'il devait mesurer.
- Liste de dictionnaires
- Moyenne conditionnelle
- Dictionnaire de comptage
- Débogage
- Assertions
- k plus proches voisins
- Biais algorithmique
Mise en situationLes données
Chaque employé est un dictionnaire à quatre champs : 'experience' (années d'expérience), 'etudes' (années d'études après le baccalauréat), 'sexe' ('F' ou 'M') et 'salaire' (en euros). Le fichier donnees.py contient ce jeu de test :
| Expérience | Études | Sexe | Salaire |
|---|---|---|---|
| 5 ans | 3 ans | F | 2 400 € |
| 3 ans | 3 ans | M | 2 550 € |
| 5 ans | 5 ans | F | 2 500 € |
| 3 ans | 5 ans | M | 2 800 € |
| 2 ans | 5 ans | F | 2 300 € |
| 2 ans | 3 ans | M | 2 700 € |
donnees.employes · le jeu complet donnees_completes.employes compte 2 000 employés.
Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.
Pour l'examinateur
Le sujet reprend un ordre de grandeur réel (écart d'environ 15 % en 2023). Le jeu complet donne 8,57 %.
Question 1Salaire moyen sous condition
Écrire le code de la fonction salaire_moyen_condition qui prend en paramètres un tableau d'employés, le nom d'un des trois champs 'experience', 'etudes' ou 'sexe' ainsi qu'une valeur, et qui renvoie un nombre flottant correspondant au salaire moyen des employés dont la valeur associée au champ est la valeur fournie.
La fonction doit renvoyer None s'il n'y a pas d'employés ayant la valeur recherchée pour le champ donné.
Une fonction de test sur le jeu de données de test est fournie. Déterminer le salaire moyen des femmes et des hommes pour le jeu de données complet.
Appel professeur
À demander au candidat
- Vous utilisez une variable
compteur: à quoi sert-elle, et que se passerait-il si vous testiez plutôtlen(employes) == 0? - Pourquoi parcourir avec
for e in employesplutôt qu'avecfor i in range(len(employes))ici ? - La docstring annonce un flottant. Écrivez l'assertion de postcondition correspondante.
Tester len(employes) == 0 au lieu de compteur == 0 laisse passer le cas où aucun employé ne correspond : division par zéro.
Résultats attendus
- Femmes (complet)
- 2 229,20 €
- Hommes (complet)
- 2 438,04 €
Question 2Effectifs par sexe
Écrire en Python une fonction nommée effectif_par_sexe qui prend en paramètre un tableau non vide d'employés et qui renvoie un dictionnaire ayant deux clés 'F' et 'M' associées respectivement à l'effectif des femmes et à l'effectif des hommes employés.
Par exemple, avec le tableau de test, effectif_par_sexe(employes) renvoie {'F': 3, 'M': 3}.
Appel professeur
À demander au candidat
- Vous écrivez
effectif[e['sexe']]: que se passe-t-il si un employé a un sexe autre que'F'ou'M'? Comment protéger votre code ?
Initialiser le dictionnaire à {'F': 0, 'M': 0} avant la boucle, sinon la première incrémentation lève une KeyError.
Résultats attendus
- Jeu complet
- 984 F · 1 016 M
Question 3Une fonction fausse
On définit l'écart de salaire moyen en pourcentage comme :
Une fonction calcul_ecart_sexe est écrite dans le fichier analyse.py.
Expliquer pourquoi le code de cette fonction est incorrect et proposer quelques tests simples sous forme d'assertions qui permettent de mettre ce ou ces problèmes en évidence :
- vérifier que le résultat est
Nonedans le cas où un seul sexe est présent ; - vérifier qu'un écart de salaires exprimé en pourcentage est toujours compris entre 0 et 100.
Proposer une version corrigée de la fonction calcul_ecart_sexe qui valide ces tests et renvoie le bon écart. En déduire l'écart de salaire moyen dans les données complètes.
Appel professeur
À demander au candidat
- La fonction passe la chaîne
'employes'au lieu de la variable. Quelle erreur Python cela provoque-t-il, et à quelle ligne ? Comment l'auriez-vous trouvé sans relire le code ligne par ligne ?
Le bug est double : l'argument 'employes' entre apostrophes, et une différence brute au lieu d'un pourcentage. Corriger l'un masque souvent l'autre.
Pour tester le cas None, il faut construire un tableau d'un seul sexe.
Résultats attendus
- Erreur du code fourni
TypeError- Écart, jeu de test
- 10,56 %
- Écart, jeu complet
- 8,57 %
Avec la question 1 faite, le message est « string indices must be integers » : on parcourt les caractères de la chaîne.
Question 4Proposer un salaire d'embauche
Afin de proposer un salaire d'embauche à un nouvel employé, le service informatique de l'entreprise a proposé d'utiliser l'algorithme des k plus proches voisins et de renvoyer la moyenne des salaires des trois employés aux caractéristiques les plus proches. La fonction salaire_par_proximite effectue ce calcul.
Tester et comparer les salaires proposés aux deux futurs employés suivants :
{'experience': 3, 'etudes': 3, 'sexe': 'F'}{'experience': 3, 'etudes': 3, 'sexe': 'M'}Identifier la source des écarts entre les deux propositions de salaire dans le programme et la corriger.
Appel professeur
À demander au candidat
e_dest une liste de couples(distance, indice). Pourquoie_d.sort()trie-t-il sur la distance ? Quelle différence avecsorted(e_d)?- Deux candidats identiques sauf le sexe : que produit le terme
sexe_vers_entierdansdistance? Comment avez-vous corrigé ce biais ? - Que se passe-t-il si la liste contient moins de 3 employés ?
- Après correction, les deux reçoivent 2 229,67 €. Or 80 employés ont exactement ce profil (48 femmes, 32 hommes, moyenne 2 255,93 €). Quels trois voisins l'algorithme retient-il, et pourquoi ceux-là ?
Le biais est dans distance, pas dans k_plus_proches. Après correction, les égalités de distance sont départagées par l'indice : le résultat dépend de l'ordre du fichier.
Résultats attendus
- Avant · candidate
- 2 229,67 €
- Avant · candidat
- 2 406,00 €
- Après · les deux
- 2 229,67 €
Le fichier du candidat
Le jour de l'épreuve, le candidat travaille dans un seul fichier. Ce bouton rassemble vos cellules dans l'ordre, telles qu'elles sont à l'écran, en un analyse.py à ouvrir dans votre éditeur habituel.