Traitement de données en tables

Attendus

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

Quelles sont les données ?

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

  1. La première ligne concerne les descripteurs du fichier; il y en a 4 séparés par des points-virgule
  2. Les descripteurs sont dans l'ordre :

    • Les spécialités suivies en Première
    • Les spécialitées souhaitées en Terminale
    • La spécialité abandonnée en Terminale
    • L'option souhaitée en Terminale
  3. 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

    • Dans le fichier texte il y a des caractères accentués, d'où la nécessité de préciser l'encodage utf-8
    • Comme dit précédemment le point-virgule va servir de délimiteur, autrement dit les chaînes de caractères vont être brisées au niveau du point-virgule, pour donner une liste de chaînes de caractères
  4. 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'

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

Travail à faire

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

  2. Il n'y aura pas de tests pour ce projet (donc pas d'import de doctest)
  3. Deux fonctions sont données, il ne faut pas les modifier, la fonction de création du tableau 2D en mémoire vive creationTableau2D(nomFichier) et la fonction bilan(tableau) qui affiche les effectifs des spécialités, des options et des taux de continuité (voir plus loin), vous n'avez donc qu'à construire trois fonctions au 5., 6. et 7.
  4. 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

  5. Trouver les effectifs des spécialités en Terminale l'année prochaine

    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 le tableau de la deuxième liste jusqu'à la fin (attention la première liste concerne les descripteurs)
    • Chaque liste concerne un élève
    • De chaque liste récupérée, prendre le deuxième élément et le casser avec la fonction split() pour obtenir dans une nouvelle liste listeSpe les spécialités de l'élève en Terminale
    • 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

    • La fonction bilan(tableau) est déjà dans le main, mais commentée. Durant la phase de mise au point il faudra commenter affiche(100,lyceens) et décommenter bilan(lyceens)
  6. Trouver les effectifs des options en Terminale l'année prochaine

  7. En vous inspirant de ce qui a été fait précédemment vous devez :

    • Commenter la fonction effectifsOptTerminale(tableau)
    • Définir cette fonction
  8. Calculer pour chaque spécialité les taux de continuité

    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)