Épreuve pratique NSI

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ÉtudesSexeSalaire
5 ans3 ansF2 400 €
3 ans3 ansM2 550 €
5 ans5 ansF2 500 €
3 ans5 ansM2 800 €
2 ans5 ansF2 300 €
2 ans3 ansM2 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

Repère

Le sujet reprend un ordre de grandeur réel (écart d'environ 15 % en 2023). Le jeu complet donne 8,57 %.

1

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

  1. Vous utilisez une variable compteur : à quoi sert-elle, et que se passerait-il si vous testiez plutôt len(employes) == 0 ?
  2. Pourquoi parcourir avec for e in employes plutôt qu'avec for i in range(len(employes)) ici ?
  3. La docstring annonce un flottant. Écrivez l'assertion de postcondition correspondante.
Point de vigilance

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 €
2

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

  1. 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 ?
Point de vigilance

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
3

Question 3Une fonction fausse

On définit l'écart de salaire moyen en pourcentage comme :

écart = salaire moyen hommes − salaire moyen femmessalaire moyen hommes × 100

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 None dans 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

  1. 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 ?
Point de vigilance

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.

4

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

  1. e_d est une liste de couples (distance, indice). Pourquoi e_d.sort() trie-t-il sur la distance ? Quelle différence avec sorted(e_d) ?
  2. Deux candidats identiques sauf le sexe : que produit le terme sexe_vers_entier dans distance ? Comment avez-vous corrigé ce biais ?
  3. Que se passe-t-il si la liste contient moins de 3 employés ?
  4. 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à ?
Point de vigilance

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.

Chargement de Python…