Vous devez rendre pour le début mai via l'E.N.T un fichier Python de la forme NOM.py
Le squelette du programme est ici
Le fichier de données est ici
Il s'agit d'un fichier .csv terminale_20_21.csv contenant le choix de tous les élèves de première du lycée concernant les spécialités et options pour l'année de Terminale (le fichier est anonymisé)
Dans un premier temps il est conseillé d'ouvrir le fichier de données avec un éditeur de textes pour comprendre le travail qui doit être fait sur les données avant leur exploitation par programmation
Voici quelques observations
Les descripteurs sont dans l'ordre :
Avec la bibliothèque csv de Python on va dans un premier temps transformer le fichier texte terminale_20_21.csv, situé dans la mémoire morte (disque dur), en une liste de listes dans la mémoire vive de l'ordinateur, pour pouvoir la traiter ensuite par programmation
La fonction qui fait cette transformation est donnée, et voici ci-dessous le corps de cette fonction
Deux observations
On peut ensuite afficher cette liste de liste en mémoire vive et voici les premiers éléments :
On observe des listes de chaînes de caractères
On observe aussi que les spécialités sont inaccessibles individuellement, ce qui est gênant si on veut les comptabiliser. Ainsi le deuxième élève (flèche rouge) a pris comme spécialités en Première 'Mathématiques, Sciences Physique et Chimie, Sciences et Vie de la Terre'
Pour pouvoir comptabiliser chacune de ces trois matières, elles doivent être chacune être une chaîne de caractère isolée, par exemple, 'Mathématiques', ou 'Sciences Physique et Chimie'
Il faut donc "casser" ces chaînes de caractères avec la fonction split() de Python en prenant comme délimiteur ", " et non pas "," pour avoir des listes de spécialités
Essayez les commandes suivantes à la console Python pour comprendre la différence
Vous constatez que le mot pomme suivant sa position dans la chaîne de caractères,si on utilise le mauvais délimiteur, ",", va ensuite apparaître dans une liste soit sous la forme 'pomme' soit sous la forme ' pomme', et ces deux chaînes sont différentes!!!
Dans notre problème si on veut compter le nombre de fois où apparaît la spécialité 'Sciences Physique et Chimie', il faut que celle-ci apparaisse toujours sous la même forme et non pas avec un espace
Toutes les fonctions devront être documentées suivant la formulation de numpy (une bibliothèque de Python) voir ici, dans l'idéal tout devra être en anglais pour ce projet, même le programme
Cependant ce n'est pas obligatoire, et ce ne sera pas pris en compte pour la note
Une fonction affiche(nbLignes,tableau) est donnée pour que vous puissez voir la liste de listes tableau sur un certain nombre de lignes nbLignes
Cette fonction est appelée dans le main, dans la phase de mise au point elle peut vous être utile, il suffit de la commenter pour la rendre muette
Vous devez définir une fonction effectifSpeTerminale(tableau) dont voici la documentation
def effectifsSpeTerminale(tableau):
"""
calcule les effectifs des spécialités en Terminale
paramètres:
----------
tableau : list
liste des choix des élèves
résultat:
---------
list
une liste des effectifs des spécialités
"""
Cependant pour calculer ces effectifs vous devez suivre cette stratégie
Il y a 11 spécialités en Terminale donc au début de la fonction on initialise une liste d'effectifs nommé effectifs ainsi :
effectifs = [0]*11
Mais à quelle spécialité correspond effectifs[0] ? effectifs[1] ?
On classe les spécialités suivant la longueur de leur nom ainsi 'Littérature' est une chaîne de caractères de longueur 9 et c'est le nom le plus court donc effectifs[0] correspond au nombre de fois où on aura détecté 'Littérature'
Concrètement on procèdera ainsi:
Parcourir la liste listeSpe et pour chaque chaîne de caractères, mesurer sa longueur avec la fonction len() puis convertir cette longueur en un indice de la liste effectifs grâce au dictionnaire suivant (donné dans le programme)
long_Ind = {9:0, 11:1,13:2,25:3,26:4,27:5,28:6,32:7,35:8,42:9}
Ainsi si on a mesuré une longueur de 9 on met à jour effectifs[0]
Vous n'avez pas à vous préoccuper de l'affichage des résultats, c'est la fonction bilan(tableau) qui est déjà codée qui fait le travail, cependant il est bon de savoir que l'on se sert de deux tuples SPE et OPT pour afficher les résultats
Il y a cependant un léger problème deux intitulés de spécialités ont même longueur 32, 'Sciences Economiques et Sociales', et 'Langue et Civilisation Anglaises', on a choisit de mettre une des deux spécialités,'Sciences Economiques et Sociales' en position 7 dans le tableau effectifs et l'autre, 'Langue et Civilisation Anglaises' en position 10
A vous de distinguer ces deux cas en faisant un test
En vous inspirant de ce qui a été fait précédemment vous devez :
Le taux de continuité d'une spécialité est défini comme étant le rapport [Nombre d'élèves en Terminale]/[Nombre d'élèves en Première], plus ce nombre est proche de 1 moins il y a eu d'abandons de cette spécialité en Terminale
On vous demande de définir la fonction tauxDeContinuité(tableau) dont voici la documentation
def tauxDeContinuite(tableau):
"""
calcule pour chaque spécialité le taux de continuité
définit comme le rapport (effectif en Terminale)/(effectif en première)
Comme un taux de réussite à un examen = reçus/inscrits
paramètres:
----------
tableau : list
liste des choix des élèves
résultat:
---------
tuple
une liste des effectifs des spécialités en Term,une liste de taux de continuité
"""
Lorsque vous avez fini de mettre au point la fonction effectifsSpeTerminale(tableau) il faudra commenter dans la fonction bilan(tableau) la ligne suivante
effSpe = effectifsSpeTerminale(tableau)
et décommenter
#effSpe,taux = tauxDeContinuite(tableau)
Car avec cette fonction, on calcule en même temps les effectifs des spécialités et les taux de continuité des spécialités, pour éviter de parcourir deux fois le tableau
On réutilise les idées de la fonction effectifsSpeTerminale(tableau) mais on n'appelle pas cette fonction dans tauxDeContinuite(tableau)