Lycée Thiers TP PYTHON - 07 Analyser, ordonner, classer des données et visuellement s’il vous plait ! 1 - Pyplot, dessine moi un nuage Le nuage de points de Rp , p 2, c’ est la matière première du statisticien. Il apparaît lorsque on étudie plusieurs caractères quantitatifs sur une population. En e↵et chaque individu est représenté par un p-uplet (x1 , ..., xp ) où xi est égal à la valeur que prend le i-ème caractère sur l’individu concerné. Lorsque p = 2 ou p = 3, on peut représenter graphiquement un tel nuage. Dans le module matplotlib de python, on trouve un sous-module pyplot qui comporte, entre autres, la fonction scatter ( éparpiller en français) permettant de dessiner un nuage de points. Exécuter le script suivant pour découvrir cette fonction : from matplotlib . pyplot import * from random import random scatter ([ random () *50 for k in range (20)], [ random () *50 -25 for k in range (20)],c=’rb ’,s=[80 ,100] , marker =’*’) Les deux premiers paramètres sont deux listes de même longueur de nombres entiers ou flottants. Les paramètres c et s gèrent respectivement les couleurs et la taille des points. Ils se présentent sous la forme d’un objet ou d’une liste d’objets, désignant les couleurs des points et les aires occupées par ceux-ci. Pour désigner une couleur, on peut utiliser un format (r,g,b). Le paramètre marker désigne le caractère utilisé pour représenter les points. Essayer : scatter ([ random () *50 for k in range (20)], [ random () *50 -25 for k in range (20)],c=[(1 ,0 ,0.6) ,(0,0,1) ,(0.2 ,1 ,0.4)],s=[40*i for i in range (1 ,10)], marker =’x’) [Qu. 1] Quelle commande faut-il saisir dans le shell pour obtenir les nuages qui ressemblent à ceux-ci ? TP PYTHON - 07 2 2 - Scruter les nuages Lorsqu’on est en présence d’un grand nombre de données, on essaie de réduire ces données à quelques valeurs qui permettront de comparer plus facilement deux ou plusieurs nuages de points. [Qu. 2] Point moyen. On considère un nuage de n points N. On appelle point moyen du nuage, l’isobarycentre G de ses points. On rappelle que ce point vérifie : X ! ! GP = 0 P2N 1) Montrer que le minimum de la fonction M 7! point moyen de N. 1X MP2 est atteint si et seulement si M est le n P2N Ceci justifie l’utilisation du point moyen pour résumer un nuage de points puisqu’il est « le plus proche » au sens de la fonction précédente du nuage de points. 2) Dans la suite de ce TP, on suppose que le nuage est donné par deux listes de même longueur X et Y de flottants, listes des abscisses et des ordonnées des points du nuage. Ecrire deux fonctions pointMoyen et visuelPointMoyen dont les paramètres sont les deux listes précédentes et qui renvoient, le point moyen pour la première, et affiche, sur une même figure, le nuage et son point moyen, pour la deuxième. On fera en sorte que le point moyen soit bien discernable des autres points. 3) Tester vos fonctions sur le nuage défini par : X=[ i for i in range(1,11) for j in range(3)] Y=[i*sin(i) for i in range(30)]. Voici un résultat : 4) Faire de même avec le nuage : X=[k/40 for k in range(41)] Y=[4*k*(40-k)/40**2 for k in range(41)] pour obtenir : TP PYTHON - 07 3 [Qu. 3] Inertie d’un nuage. Deux nuages ayant le même point moyen peuvent avoir des formes très di↵érentes : Pour mesurer la dispersion des points du nuage par rapport au point moyen, on définit l’inertie du nuage, I(N), par : 1X I(N) = GP2 (1) n P2N On remarquera que cette inertie correspond au minimum de la fonction définie dans la question 1.1. et qu’elle se comporte comme une aire. En e↵et, si l’on transforme le nuage par une homothétie de rapport ↵, celle-ci est multipliée par ↵2 . 1) Formule de Huyghens. On note O le couple (0, 0). Démontrer que : 0 1 CC 1 BBB X I(N) = BB@ OP2 CCCA OG2 (2) n P2N 2) Selon que l’on calcule l’inertie en utilisant la définition (1) ou l’égalité (2), combien d’étapes le calcul comporte-t-il ? Écrire une fonction efficace calculant I(N). 3) Calculer l’inertie des nuages des questions 2.3 et 2.4. Vous devez obtenir : 145.392728945346 et 0.18532500000000002. [Qu. 4] De l’interactivité, de l’animation ! Pour réaliser des modifications d’une figure pendant l’exécution d’un script ou d’une fonction, il faut activer le mode intéractif en exécutant l’instruction ion() (lire « ail one » pour « interactive mode on » en anglo-marseillais). On utilisera aussi les fonctions, clf() pour e↵acer la figure avant de la mettre à jour et pause() pour temporiser avant une modification ultérieure. La fonction pause demande un argument qui est un nombre positif correspondant au nombre de secondes de cette temporisation. Essayer : ion () for i in range (1 ,50): X=[k/i for k in range(i+1)] Y=[4*k*(i-k)/i**2 for k in range(i+1)] color =[(X[k],X[k],X[k]) for k in range(i+1)] aire =[(1 -Y[k]) *200 for k in range (i+1)] clf () scatter (X,Y,c=color ,s=aire , marker =’o’) pause (0.1) Rem. L’utilisation de la commande pause rend superflue celle du mode interactif. Réaliser une animation analogue avec la fonction x 7! sin(2⇡x) sur [0, 1]. TP PYTHON - 07 4 [Qu. 5] Point extrémaux d’une fonction sur le nuage. Étant donnée une fonction f définie de R2 dans R, on souhaite déterminer un point du nuage qui minimise f sur le nuage et un point qui la maximise sur le nuage. 1) Écrire une fonction argValeurMin de paramètres X, Y et f qui retourne un point du nuage qui minimise la fonction f sur le nuage. 2) Vous avez peut-être remarqué que les animations réalisées dans la question 4 n’étaient pas très fluides. Même en réduisant le temps de pause et avec des nuages peu volumineux, cela reste lent. On peut penser que ceci provient du fait que le nuage est recréé et redessiné totalement à chaque fois. Si l’on ne doit modifier que l’aspect de certains points du nuage, il est donc maladroit de redessiner tout le nuage à chaque modification de celui-ci. On peut alors utiliser deux membres modifiables de l’objet renvoyé par la fonction scatter : _facecolors, qui contient la liste des couleurs des points sous la forme de quadruplets (r,g,b,t), t indiquant de niveau de transparence et _sizes qui permet d’accéder aux tailles de ces points. Essayer le script suivant : X=[ random () for k in range (100)] Y=[ random () for k in range (100)] couleur =[(0 ,0 ,1 ,0.5) for k in range (100) ] taille =[50 for k in range (100) ] nuage= scatter (X,Y,c=couleur ,s= taille ) for i in range (50): k= randint (0 ,99) nuage. _facecolors [k]=(1 ,0 ,0 ,1) nuage. _sizes [k]=150 pause (0.1) Attention : Il est indispensable de mémoriser l’objet renvoyé par scatter dans une variable pour pouvoir utiliser les fonctions précédentes et modifier l’aspect du nuage. Le nombre de points, de couleurs et de tailles sont fixés à l’initialisation. 3) On aimerait visualiser cette recherche en traduisant graphiquement l’algorithme utilisé dans la fonction argValeurMin. Chaque point pourra prendre quatre couleurs di↵érentes durant le déroulement de l’algorithme et en prendra trois au moins. Suivant que le point, n’a pas encore été examiné, est en train d’être examiné, est le point qui réalise le minimum des points déjà examinés, a déjà été examiné, sa couleur et sa taille, éventuellement, devront être di↵érentes. Par exemple, l’entête de la fonction peut se présenter comme suit : def visuelArgValeurMin(X,Y,f,ptInit,ptMin,ptVu,ptCourant,marque) où les paramètres ptInit,ptMin,ptVu,ptCourant sont des couples (taille,couleur) décrivant les di↵érents états possibles d’un point du nuage. 4) Tester votre fonction en ajoutant le code suivant après sa définition dans le script : def fLin(x,y): return 2*x+3*y visuelArgValeurMin ([ random () *50 for k in range (50) ],[ random () *50 for k in range (50)],fLin ,(200 ,(1 ,1 ,1 ,1)) ,(400 ,(0 ,1 ,1 ,1)) ,(200 ,(0 ,0 ,0 ,1)) ,(400 ,(1 ,0 ,0 ,1)),’*’) 5) Écrire une fonction nommée visuelArgValeurMinMax similaire à la précédente pour visualiser la recherche simultanée d’un minimum et d’un maximum d’une fonction f sur le nuage. 6) Utiliser la fonction précédente pour la recherche d’un point le plus proche et d’un point le plus éloigné du point moyen d’un nuage. TP PYTHON - 07 5 Annexe Rappel des notations : un nuage de points N est partitionné en p sous-nuages N1 , · · · , Np . On note p X n = card (N) ainsi que nk = card (Nk ) (pour 1 6 k 6 p) de sorte que n = nk . Le point moyen k=1 (isobarycentre) de N est noté G et celui de Nk est noté Gk . Par définition de l’inertie d’un nuage et vu que N = p G k=1 Nk : p 1 X 1X X 2 I (N) = GM = GM2 n n M2N Or : k=1 M2Nk ⇣ ! !⌘2 ! ! GM2 = GGk + Gk M = GG2k + 2 GGk .Gk M + Gk M2 donc : X M2Nk ! X ! X GM2 = nk GG2k + 2 GGk . Gk M + Gk M2 Mais, par définition d’un barycentre, X M2Nk M2Nk ! ! Gk M = 0 . Ainsi, en reprenant (1) : M2Nk p p 1X 1X X 2 I (N) = nk GGk + Gk M2 n n k=1 M2Nk k=1 Or, d’une part : p 1X nk GG2k = Ir n et, d’autre part : k=1 0 1 p p p X BB 1 X CC 1 X 1X X 1 BB 2 2C C Gk M = nk BB Gk M CC = nk I (Nk ) = Ia @ nk A n n n k=1 M2Nk d’où la conclusion : k=1 M2Nk I (N) = Ir + Ia k=1 (1)