On se propose de déterminer le poste qu'un joueur de rugby peut occuper à partir de sa morphologie (poids et taille). Par exemple, à quel poste pourrait évoluer un joueur de \(1.80 m\) pour \(80 kg\) ?
Simplification
Pour simplifier le problème, on se limitera à trois postes : pilier, 2ème ligne et arrière.
Pour ce faire, nous allons utiliser un jeu de données issues du site AllRugby concernant des joueurs de rugby professionnels qui ont joué dans le championnat français.
Méthode
Nous allons utiliser dans cet exercice la méthode des k plus proches voisins.
Cet algorithme consiste à :
calculer la distance entre le joueur inconnu et chacun des joueurs du jeu de données,
classer les joueurs selon les distances croissantes,
comptabiliser le nombre d'apparitions de chaque poste parmi les k premiers joueurs,
déterminer le poste le plus fréquent.
Représentation des données
Chaque joueur est décrit par les attributs suivants :
Attributs
Type Python
Nom
str
Prénom
str
Poste
str
Age
int
Taille
int
Poids
int
Nationalité
str
Ces données ont été importées dans une liste Python nommée joueurs. Chacun des éléments de cette liste est un dictionnaire contenant les informations décrivant un joueur. On affiche ci-dessous le premier élément de la liste joueurs :
Les joueurs peuvent occuper les postes suivants : "Pilier", "Talonneur", "2ème ligne", "3ème ligne", "Mêlée", "Ouverture", "Centre", "Ailier" ou "Arrière".
Question 1 : Extraction
Nous allons extraire du jeu de données global les jeux de données nécessaires pour l'exercice, contenant les informations de taille, poids et poste :
un jeu de données d'entraînement, composé des \(3/4\) des données totales et qui servira directement à l'algorithme,
un jeu de données de test, composé du \(1/4\) restant et qui servira à tester l'efficacité de l'algorithme.
Dans la fenêtre ci-dessous, a été générée une représentation des différents joueurs sous la forme d'un nuage de points : chaque point représente un joueur, la taille en abscisse et le poids en ordonnées. (Un point de couleur plus intense indique la présence de plusieurs points superposés.)
Votre figure
Votre tracé sera ici
Question 2 : Distance
Distance euclidienne
Pour calculer la distance entre deux joueurs, on utilisera la fonction calcul_distance, déjà chargée en mémoire, qui calcule la distance euclidienne entre deux points.
Compléter la fonction estimation_distance :
qui prend en paramètres donnees un jeu de données et inconnu un couple d'entiers représentant les caractéristiques du joueur inconnu,
qui renvoie une liste de couples contenant, pour chaque joueur du jeu de données, sa distance avec le joueur inconnu ainsi que son poste, triée par ordre croissant des distances.
Ecrire la fonction comptabilise_classe qui prend en paramètres un tableau de couples (poste, distance) trié selon les distances et un entier k indiquant le nombre de voisins, et qui renvoie un dictionnaire qui associe à chaque poste le nombre d'apparitions parmi les k premiers éléments du tableau.
Ces k premiers éléments constitueront ainsi nos k plus proches voisins.
Ecrire la fonction classe_dominante qui prend en paramètre un dictionnaire qui associe chaque poste avec son nombre d'apparitions et renvoie la chaine de caractères correspondant au poste le plus fréquent. (en cas d'égalité, on prendra la classe qui arrive première dans l'ordre alphabétique)
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Ecrire la fonction knn qui prend en paramètres le jeu de données, un entier k représentant le nombre de voisins à prendre à compte et un couple d'entiers inconnu correspondant à la taille et au poids du joueur inconnu, et qui renvoie le poste du joueur sous forme d'une chaîne de caractères.
Evaluation de la fiabilité
La fonction sera testée, avec plusieurs valeurs de k allant de \(1\) à \(15\), sur le jeu de test joueurs_entrainement défini au début de l'exercice et déjà chargé en mémoire.
On va ensuite comparer le poste prédit par l'algorithme avec le poste réel du joueur. Le programme affichera alors le taux de réussite de l'algorithme.
Pour quelle valeur de k la fonction fournit-elle le résultat le plus fiable ?
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)