Joueurs de rugby

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 \text{ m}\) pour \(80 \text{ kg}\) ?

Simplification

Pour simplifier le problème, on se limitera à trois postes : Pilier, Deuxiè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 :

>>> joueurs[0]  # l'ensemble des informations du 1er joueur
{'Nom': ABADIE, 'Prénom' : 'Paul', 'Poste' : 'Mêlée', 'Age' : 25, 'Taille' : 176, 'Poids' : 88, 'Nationalité' : 'France'}

Les joueurs peuvent occuper les postes suivants : "Pilier", "Talonneur", "Deuxiè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.
Exemple pour trois joueurs
>>> donnees_postes
[(178, 83, 'Arrière'), (172, 112, 'Pilier'), (195, 116, 'Deuxième ligne')]

Compléter les instructions suivantes (on rappelle que les données sont chargées en mémoire dans la variable joueurs):

###(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
Évaluations restantes : 10/10

.128013:p(40ed3N 1jo5_êAn)h]6,qc[yuv8i2Dxms7=wlSatf9Rrg.*TéPkbè/050h0g0R0Q0F0O0K0k0z0O0Q0K0K0M010R0F0c010406050K0C0J0J0Q0V0B040P0n0O0C0}0n0s050)1416181a120c041j1q051t0)1t1v1q120h0F0D0=0@0_0{0u0F0W0u0O1J0u0R10050-0%0O0g1E0^0`011I1K1M1K0R1S1U1Q0R0%0n0h1a1R0V1r0R0u0=1d0K0c0Q0s0{0G011W1G010S0/0g0s0Q0J0g1Q1{1}221Y251U282a100a0k0#0V0n0c0n0K0F1g0s0k0+1_0V0V0g0z2v1j2d0s1r0)1@2I0R1=1;1?0h2f0{1M0s272s1Q1B1D0?1X2S0F2U0s1.1C1Q0c2B1r2G2I2:131|2w2!232)0V170O100k0l2F2@112?2e2_1Y2{2}2 0G321}342G2R01390Q2~040k0i3d2H123g370{3j3l0k0e3p3f2@3h3v2 0o3z3r3B3t3i0n2|3k2 0w3G352^1F383L3a3m0L3Q3s3T3u3V3N3m0E3Z3I3#3K3M3w0T3+363-3D040l0f3=3S2#3.3W0l311k333H3?3~3^0l3c433e453}2`3%3l0l3o4b3q3R3C4g100l3y4k3A464f3/4p3F4s1s2.1j2Y2L0h2P3h0z1.2b1r4D1u4B2=4z4I0+2/3,3~0z0l10030k0U0g0y0C0q0R1V0l0k0b2n0n0F0h0;0+0;0c0/0F0g0V0K3|3C102r4;0K0p4_1M4|4~4s0k4m3J0n100M3z5b3!3~0 040A3z5c3@100m0n0C0g0C0V5o5j235l5n4z5z1Y0K2004010#4:4=015y4U5A100v5h5p3~0$100S3L5T5E3u5r5t5v5x5a5U230n0N102%5!5P385%5u5w592:0k5i5?0{5W040F0S5=4u5@045s5_5*2=5#015B5O660{5G105J2s4*5N5D5 6e5R654e1Y5e040M5g5+6d6j5I0#4`4|6o6c6q5l5S4s064d4H4X044Z4#4%4)1V0G4-5}1)0g0Q0C2x1V0R0C0c1U0;4I0s4*286:2x1}6.0,0k3L0h2B6Y0-0/1U0x0k524=0k6`2r0K4*4 3J4W4Y6(0k0R5t0;6-0k695)0;0!0-6?000H5v0I0F0(2a0k1$2U00730k000r2A7x2B006{6%006E570V000X7c5q040h1h2U0g54794*5{335~6h016w6z5|5,1Y5B0d6g6u5$685(5w7@3h6f6p7+6C010Z0.0O1*7}3J6K0x6t507`6a883-7 6I815H6l536H337:0{8a8c3J0s5^5)8g5k105C8j7^01825K7a2b8y5Q040v0t8t3-615Y6b7)8q3i8w7|6A6q5.5:1i8Y7+8v8e7o5h7*8D61638O478W8S3e8U8i8p6B8l8G6n8J7;6s8%8D8!628$7/6d5l7?808D8F6F0V8o8^99108b933h827u0C7w7y1V7B8I9c7~9k906i8l7H0V7J9v8C9x048N9m89922:6N8U7e6R4!4$4(4*3n6Y0j0n0J0%6~2y7n5`0k7q1}0R7F9p9r7z9u7D7F9C9E7L5t7F7P4{7R7U8=040s9#0g0p9(4}8;5-5fa9380%102i9z6r049b9G8u107X0s7Z7#6m7!ah5l9J9N6O7d6Q6S9T6V3x6Y0m5v2x00272M0.2U2a6?4I0J790!6(0;0i0)0e742B0J9~0;272B0W0F7aa!aK4?1Vao2Uar8H7(4c8U8)a754aK0VaM0gaO0R8,8U7-ac8r8Aah8)a;0g7!55asa^2H8_b99wam62au9M8T6d8Q5Z9K7V0Fb77,5/96bxa310a 0s0W0gboajba10a32Ba67{a8bl3-6w0Yaha#104jalbS100)0)bV0F104rbZ8z9I6Lax9PaA9S6U9V0oaFaH2y7%9-aQaS2x6%0laXaIa(0ga*a,b1a.0k2B7a9,a/2x7Ybe7$at6Ma`8?54b}bxb6bub-8B8{6qbbcicjbgbIcv9icx5:bIb/bq6qbs8@2H8-8dbwct5-bz5;cRadbD1}bGbIakcw8(bLa4bO6abh4T7+bTb(bXah6wb$c:04b+c$8D5l9l98cFa2c)a|bI0tcIa_0)4R0g2I2-da4C1C4E2L2N2J1-1/2L0Q1Tdd0)4D12dq0,850K04.

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

On souhaite dans cette question calculer la distance entre un joueur inconnu - caractérisé par un couple (taille, poids) - avec chaque joueur du jeu de données.

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.

Ainsi un joueur inconnu d'\(1m80\) et \(110\) kg sera plus proche d'un pilier de \(1 \text{ m }72\) et \(112 \text{ kg}\) que d'un arrière de \(1\text{ m }75\) et \(85 \text{ kg}\).

🐍 Console Python
>>> joueur_inconnu = (180, 110)
>>> joueur1 = (172, 112, "Pillier")
>>> joueur2 = (175, 85, "Aillier")
>>> calcul_distance(joueur_inconnu, joueur1)
8.246211251235321
>>> calcul_distance(joueur_inconnu, joueur2)
25.495097567963924

Pour chaque joueur du jeu de données :

  • on calcule sa distance avec le joueur inconnu,
  • on forme un couple (distance, poste),
  • on place ce couple dans une liste de façon à ce que les couples soient classés par ordre croissant de distance.

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,
  • 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.

Exemple

>>> donnees_postes = [ (178, 83, 'Arrière'),
                       (172, 112, 'Pilier'),
                       (195, 116, 'Deuxième ligne')]
>>> estimation_distance(donnees_postes, (180,80))
[(3.605551275463989, 'Arrière'), (32.984845004941285, 'Pilier'), (39.0, 'Deuxième ligne')]
Indice

On utilise ici le principe du tri par insertion.

###(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
Évaluations restantes : 10/10

.128013:pbv(40i2edm3;sN7= 1jo5w_lSnatf-)9h]6,crg[yPku8/050l0k0E0D0i0A0p0t0N0A0D0p0p0s010E0i0c010406050p0U0m0m0D0O0R040B0w0A0U0;0w0C050W0{0}0 110_0c041a1h051k0W1k1m1h0_0l0i0e0)0+0-0/0J0i0P0J0A1A0J0E0@050!0d0A0k1v0,0.011z1B1D1B0E1J1L1H0E0d0w0l111I0O1i0E0J0)140p0c0D0C0/0j011N1x010F0$0k0C0D0m0k1H1/1;1_1P1|1L1 210@0a0t0S0O0w0c0w0p0i170C0t0Y1-0O0O0k0N2m1a240C1i0W1+2z0E1)1(1*0l260/1D0C1~2j1H1s1u0*1O2J0i2L0C1#1t1H0c2s1i2x2z2%0`1:2n2R1`2W0O0~0A0@0t0u2w2+0^2*252-1P2/2;2?0j2_1;2{2x2I01300D2=040t0n342y0_372~0/3a3c0t0g3g362+383m2?0x3q3i3s3k390w2:3b2?0L3x2|2,1w2 3C313d0r3H3j3K3l3M3E3d0V3Q3z3S3B3D3n0I3Y2}3!3u040u0h3)3J2S3#3N0u2^1b2`3y3*3=3,0u333`353|3;2.3U3c0u3f422y1j2#1a2P2C0l2G380N1#221i4g1l4e2)4b1i4l0Y2$3Z3=0T0@0Y0F3q3I380y2?4E3R3~0F0@0k0p0;0~2m0z1s4P1;0N4O4J4y1`0?040f4Z3}2.4B182L4Y4t4F3A4$0M3q0t4;3+0@2U4l0C0C0U4)451P4$0H0b3x0t594_4K4+040C0d2s0z0v0w0U0k0U0O0p4^4`3=0w0@0s5q5c2 0d0@2952384$4(4:5x3l4,4 0k4/2)5H0155585a5r5d4O4Q0D2v4t5b4!1P5t045v5Z5T540@0Q5C3A0T0N0@0q180k5w5#0/4A040F3C5`4*2 4|61530/0w4H042U653t5z040O1;0P5_5G5{5P0@5F5N6l0C0@5f5h5j5l5n5p6k620/550K5R595+5|0@5 0O6c3A6r6a6L3!684|195*5O5f0@6g0C6i5/3!5E6#3~6s5g0k5i5k5m5o6(4#0@566E5a6F6V0@6v6/6P5s5u6 5d0l4-5L6y6p6A6m045.6z6639647d5D0@6D4t066_6_6G7f044U0!0C4X725$716U6q0@0N3b0N0U0A4T0i4V7u6j787e6%7h6M6S4~506;5,044@7z797O7M3t6|6.5n7U6B5-7*010m0i0@3/7P6$7j7X2%5!796N6}7)7?3=4$7c7#3A7/0@3_847@040K0H0H3x7m7n6`7A040v7w677y7`7p6N0i6^7o5O5}0y1z1L8m7q8l7Y7e5%020P0E0o8A86047=8p5O6R041;0l8A6N5V0i4R0i187-827-7}8A5%0G8K7:3-8#7j832`7p8L8N8=5O4$7k8O6l8F8H8J8D7$7r7I7t7v806=04577l8h8h8q4N4P8X5X8Z6T89817,98638k8/8b8)8o2`7{7e8V9h8Y8!9p7+7b8%6|9u048+92858-888_6l8{8t9d9f9r9L6Q9v359x938C8}798*8,879S8i7|9g5W5Y9m998;359U9$9P7Z7j9I5)9%7N6n9G947J979=7V7_9w9_7(6K9D7a9@4c5O8L41a79E8c6^7p5}2s0E5n9laa6{048W9Bau431a4v0k2z2!aE4f1t4h2C2E2A1!1$2C0D1KaH0W4g0_aU0Z0#0%04.
Question 3 : Détermination du poste

Ecrire la fonction comptabilise_classe qui prend en paramètres un tableau de couples (distance, poste) trié selon les distances croissantes 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.

>>> voisins = [ (3.7, 'Arrière'),
                (5.6, 'Deuxième ligne'),
                (6.2, 'Deuxième ligne'),
                (8.4, 'Arrière'),
                (12.2, 'Deuxième ligne')]
>>> comptabilise_classe(voisins, 3)
{'Arrière':1, 'Deuxième ligne':2}

###(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
Évaluations restantes : 10/10

.128013:pbv(4i2+edm3s7= 1}o5w_lSnatf)9h]{6,crg[yPku8/050l0k0C0B0h0y0o0r0L0y0B0o0o0q010C0h0c010406050o0S0m0m0B0M0P040z0u0y0S0/0u0A050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0l0h0e0%0)0+0-0G0h0N0G0y1y0G0C0=050Y0d0y0k1t0*0,011x1z1B1z0C1H1J1F0C0d0u0l0 1G0M1g0C0G0%120o0c0B0A0-0i011L1v010D0!0k0A0B0m0k1F1-1/1@1N1`1J1}1 0=0a0r0Q0M0u0c0u0o0h150A0r0W1+0M0M0k0L2k18220A1g0U1)2x0C1%1$1(0l240-1B0A1|2h1F1q1s0(1M2H0h2J0A1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0M0|0y0=0s2u2)0?2(232+1N2-2/0=0i2?1/2^2v2G012}0B2:040n312w0@342{0-37390g3c332)353i0=0v3l3e3n3g360u2.380=0J3s2_2*1u2|3x2~040p3C3f3F3h3H3z040T3L3u3N3w3y390F3l1h2Z182N2A0l2E350L1Z201g3(1j3$2%192@053-0W2!3U2Q010R0=0W0D3!3M3 0w0=0r453~2,0D0=3-0m0c1H0!0h0o0k0x2{0k4b2`3V0;040f4r3E3 0A0=0e0u4l2S0o4x354u0K3l4a462,0=0R4H3v4u0E0b3s0r4X4M4c2|4f3F0k4G3^324Z4s3 0u0=0q4L3D4I0=0I0t4W4Y4?3v41040D3x4=4N4#040h534!0-0u4856174*2w4,4y2,0d0=0M1/0N4q5f3}4-1^4u4w5q4}3V4A044Q5w540-4T4V5q064Y5J5h3o0=2g0o0C5p2#5L3v4/044;5q5T5y4B4D2i0A4)2%5D014u0O4R5!565/3 4u0H5.5C59010m0h2;5=5t0=0H4{5K5Z3 4 0h445Y5x4z5N2h5Q585s1N5b0=2S6h5i554p5)3_5+4u5G2#5I655K6c4O046q601N5-6E3h6e5P5R6s5{5@6n355V0j5X5S6A1N5}5 5H6y661^4 0k0#6L326V5E0=6v2@6x6!4X6,364$1M4(6H5,0=5_5*5{5z5O6g5`6i6-04636b5+5V6T2@6#6W5~042=6Z4|5+4 2q0C0S0M5e6U5+5z6D5H183{0k2x2Y7A3%1r3)2A2C2y1Y1!2A0B1I7D0U3(0@7Q0X0Z0#04.

###(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
Évaluations restantes : 10/10

.128013:pbv(4i2+edm3s7= 1}o5w_lSnatf)9h]{6,crg[yPku8/050l0k0C0B0h0y0o0r0L0y0B0o0o0q010C0h0c010406050o0S0m0m0B0M0P040z0u0y0S0/0u0A050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0l0h0e0%0)0+0-0G0h0N0G0y1y0G0C0=050Y0d0y0k1t0*0,011x1z1B1z0C1H1J1F0C0d0u0l0 1G0M1g0C0G0%120o0c0B0A0-0i011L1v010D0!0k0A0B0m0k1F1-1/1@1N1`1J1}1 0=0a0r0Q0M0u0c0u0o0h150A0r0W1+0M0M0k0L2k18220A1g0U1)2x0C1%1$1(0l240-1B0A1|2h1F1q1s0(1M2H0h2J0A1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0M0|0y0=0s2u2)0?2(232+1N2-2/0=0i2?1/2^2v2G012}0B2:040n312w0@342{0-37390g3c332)353i0=0v3l3e3n3g360u2.380=0J3s2_2*1u2|3x2~040p3C3f3F3h3H3z040T3L3u3N3w3y390F3l1h2Z182N2A0l2E350L1Z201g3(1j3$2%192@053-0W2!3U2Q010R0=0W0D3!3M3 0w0=0r453~2,0D0=3-0m0c1H0!0h0o0k0x2{0k4b2`3V0;040f4r3E3 0A0=0e0u4l2S0o4x354u0K3l4a462,0=0R4H3v4u0E0b3s0r4X4M4c2|4f3F0k4G3^324Z4s3 0u0=0q4L3D4I0=0I0t4W4Y4?3v41040D3x4=4N4#040h534!0-0u4856174*2w4,4y2,0d0=0M1/0N4q5f3}4-1^4u4w5q4}3V4A044Q5w540-4T4V5q064Y5J5h3o0=2g0o0C5p2#5L3v4/044;5q5T5y4B4D2i0A4)2%5D014u0O4R5!565/3 4u0H5.5C59010m0h2;5=5t0=0H4{5K5Z3 4 0h445Y5x4z5N2h5Q585s1N5b0=2S6h5i554p5)3_5+4u5G2#5I655K6c4O046q601N5-6E3h6e5P5R6s5{5@6n355V0j5X5S6A1N5}5 5H6y661^4 0k0#6L326V5E0=6v2@6x6!4X6,364$1M4(6H5,0=5_5*5{5z5O6g5`6i6-04636b5+5V6T2@6#6W5~042=6Z4|5+4 2q0C0S0M5e6U5+5z6D5H183{0k2x2Y7A3%1r3)2A2C2y1Y1!2A0B1I7D0U3(0@7Q0X0Z0#04.

Ecrire la fonction classe_dominante qui prend en paramètre un dictionnaire qui associe à chaque poste 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
Évaluations restantes : 10/10

.128013:pbv(40i2edxm3;s7= 1o5w_lSnatf)9h6,crg.yPku8/050l0k0D0C0i0z0q0t0K0z0C0q0q0s010D0i0c010406050q0R0n0n0C0L0O040A0v0z0R0.0v0B050T0^0`0|0~0?0c04171e051h0T1h1j1e0?0l0i0e0$0(0*0,0H0i0M0H0z1x0H0D0;050X0d0z0k1s0)0+011w1y1A1y0D1G1I1E0D0d0v0l0~1F0L1f0D0H0$110q0c0C0B0,0j011K1u010E0Z0k0B0C0n0k1E1,1.1?1M1_1I1|1~0;0a0t0P0L0v0c0v0q0i140B0t0V1*0L0L0k0K2j17210B1f0T1(2w0D1$1#1%0l230,1A0B1{2g1E1p1r0%1L2G0i2I0B1Y1q1E0c2p1f2u2w2!0@1-2k2O1@2T0L0{0z0;0t0u2t2(0=2%222*1M2,2.2:0j2?1.2^2u2F012}0C2/040t0o312v0?342{0,37390t0g3d332(353j2:0w3n3f3p3h360v2-382:0I3u2_2)1t2|3z2~3a0r3E3g3H3i3J3B3a0S3N3w3P3y3A3k0G3V2`3X3r040u0h3$3G2P3Y3K0u2=182@3v3%3/3)0u303@321g2Y172M2z0l2D350K1Y1 1f441i422$3 2v05490V2Z3W3/0Q0;0V0E3n3F350x2:4t3O3{0E0;2{0k0y0l0v0n2R1.0D0k4y4n1@0:040f4N3`2+4C3H0k0q4T3.4P0;0F0b3u0t4+0t4u3x0B0;0{0m0i3n4-4z1@0v0;0s4^4.3X4I0;3,4h0=4,4_4O2|4W1L4E4=4 4`1M4|044~55584U1M0q1;0401014*4,504o0;0E3z5f593i5b0*4M555w4$040J5B5n5D042T0n0d2p5M4#5h4w042R5U3q5E0q4Y4!355i0N5)4/0;2i0k0n4Z5H5g0,4Q0f4(5u574+5I1M4p5Y4s5l605O5Q5S5G2!5m5V0,5i020M0D0p5!5.044=4@5@5C014Q4)55065~6w6c5#6m0C4?6k3X5i5k6b66360;685T6u6x5~6I4:044D0y5e655^016F6D3{5$6a3^6O6I620k1A646H6X6R6L6%326y3x6F6G2@6^3(4;6B6o6/6q0v5X1.0l6!4V6S4X785h0;020z6i7c5O6T6V2$6X6s5}6O6}6#6A6C6W734}7i6J5P4H697p6)6:6$6U6B7y6Z7v5N7z4D3u6v5v6X622p0D0R0L167L6d7N4X7H0m3E0T4k0k2w2X7,431q452z2B2x1X1Z2z0C1H7/0T440?7 0W0Y0!04.

###(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
Évaluations restantes : 10/10

.128013:pbv(40i2edxm3;s7= 1o5w_lSnatf)9h6,crg.yPku8/050l0k0D0C0i0z0q0t0K0z0C0q0q0s010D0i0c010406050q0R0n0n0C0L0O040A0v0z0R0.0v0B050T0^0`0|0~0?0c04171e051h0T1h1j1e0?0l0i0e0$0(0*0,0H0i0M0H0z1x0H0D0;050X0d0z0k1s0)0+011w1y1A1y0D1G1I1E0D0d0v0l0~1F0L1f0D0H0$110q0c0C0B0,0j011K1u010E0Z0k0B0C0n0k1E1,1.1?1M1_1I1|1~0;0a0t0P0L0v0c0v0q0i140B0t0V1*0L0L0k0K2j17210B1f0T1(2w0D1$1#1%0l230,1A0B1{2g1E1p1r0%1L2G0i2I0B1Y1q1E0c2p1f2u2w2!0@1-2k2O1@2T0L0{0z0;0t0u2t2(0=2%222*1M2,2.2:0j2?1.2^2u2F012}0C2/040t0o312v0?342{0,37390t0g3d332(353j2:0w3n3f3p3h360v2-382:0I3u2_2)1t2|3z2~3a0r3E3g3H3i3J3B3a0S3N3w3P3y3A3k0G3V2`3X3r040u0h3$3G2P3Y3K0u2=182@3v3%3/3)0u303@321g2Y172M2z0l2D350K1Y1 1f441i422$3 2v05490V2Z3W3/0Q0;0V0E3n3F350x2:4t3O3{0E0;2{0k0y0l0v0n2R1.0D0k4y4n1@0:040f4N3`2+4C3H0k0q4T3.4P0;0F0b3u0t4+0t4u3x0B0;0{0m0i3n4-4z1@0v0;0s4^4.3X4I0;3,4h0=4,4_4O2|4W1L4E4=4 4`1M4|044~55584U1M0q1;0401014*4,504o0;0E3z5f593i5b0*4M555w4$040J5B5n5D042T0n0d2p5M4#5h4w042R5U3q5E0q4Y4!355i0N5)4/0;2i0k0n4Z5H5g0,4Q0f4(5u574+5I1M4p5Y4s5l605O5Q5S5G2!5m5V0,5i020M0D0p5!5.044=4@5@5C014Q4)55065~6w6c5#6m0C4?6k3X5i5k6b66360;685T6u6x5~6I4:044D0y5e655^016F6D3{5$6a3^6O6I620k1A646H6X6R6L6%326y3x6F6G2@6^3(4;6B6o6/6q0v5X1.0l6!4V6S4X785h0;020z6i7c5O6T6V2$6X6s5}6O6}6#6A6C6W734}7i6J5P4H697p6)6:6$6U6B7y6Z7v5N7z4D3u6v5v6X622p0D0R0L167L6d7N4X7H0m3E0T4k0k2w2X7,431q452z2B2x1X1Z2z0C1H7/0T440?7 0W0Y0!04.
Question 4 : Mesure de la fiabilité

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
Évaluations restantes : 10/10

.128013:pv(4ui2edm3s=1 ow_lSnatf)h,crgyPkb/050k0j0y0x0h0u0n0q0D0u0x0n0n0o010y0h0c010406050n0g0l0l0x0E0G040v0r0u0g0#0r0w050K0,0.0:0=0*0c040~1505180K181a150*0k0h0d0T0V0X0Z0B0h0F0B0u1o0B0y0(050O0J0u0j1j0W0Y011n1p1r1p0y1x1z1v0y0J0r0k0=1w0E160y0B0T0^0n0c0x0w0Z0i011B1l010z0Q0j0w0x0l0j1v1Z1#1*1D1-1z1:1=0(0a0q0H0E0r0c0r0n0h0{0w0q0M1X0E0E0j0D2a0~1^0w160K1V2n0y1T1S1U0k1`0Z1r0w1/271v1g1i0U1C2x0h2z0w1P1h1v0c2g162l2n2R0+1!2b2F1+2K0E0/0u0(0p2k2V0)2U1_2X1D2Z2#0(0i2)1#2+2l2w012:0x2$040m2@2m0*2`2.0Z2}2 0f322n2O0j2n2D2q0k2u2{0D1P1?163g192P2,2m3b053l0M2Q2V2{0I0(0M0z3u351k1D0s0(0q3F3z362|0z0(0I0w0}0 2*3s2{0%040e3M2-3H373C0|2z0j0n3$2W3(013Z0C3b3L3G2G2|3R3/3Y0(3@3V2^3_3N3;0w0(2I3l3T0g3~3O3Z0A0b3b060q4k443%3{47043-0#0/2a3.422m4m3:3{0r0(0o3^3X3O4p4r0h4t0h0|0t1g0n0O0w0D3-4d3;3Z3#4w3y4n2Y3*3T0j4T4Y4F4V404E3`4#04493+4c4*4/1D4f4i4l4y2{4p2.4)2R4~3O4B044D4Y54460(3l0l0c1x0Q0h0n0j0t514U3{4W5n4:4I4K0|4v2T4_0Z3?4.454o3}4^5B1+4{4Y4j4l4+3{3B042g0y0g0E3U535L4:514N0r0l2I1#0y0j5q4`0(4X5w5F2/5c3H523W5x3=0(0A4i0~3w3e173r0K3p2o3i0~2r2q1O1Q2q0x1y5~611h2+610N0P0R04.