Math et stats

UniXUniX Membre
20:58 modifié dans Actualités #1
Salut.

J'ai un petit problème de maths. J'ai une série d'équations qui me donne tout un tas de résultats. Je veux ensuite moyenner ces résultats. Or, dans ces résultats, il y en a qui sont absurdes.
Je m'explique avec un exemple réel : j'ai 83 valeurs, dans ces 83 valeurs, j'en ai 78 comprises entre -14 et +12, puis j'ai un 489, un531, un 8541, un 8789, et un 10213. Si je moyenne avec les 83 valeurs, j'obtiens un résultat qui ne représente pas la réalité. Il faudrais donc que je puisse supprimer les 5 valeurs absurdes.

En résumé, j'ai un nuage de résultats, je souhaiterais pouvoir virer tous ceux qui sont en dehors de ce nuage, par calcul, de façon automatique.
Comment je peux m'y prendre ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    décembre 2006 modifié #2
    Hello,

    Pourrais-tu nous donner en gros quelques "stats" sur tes valeurs ?
    - 78/83 de bonnes, c'est toujours dans ces eaux-là  ? où y'a des cas où c'est plus catastrophique que ça, genre 50/83 ?
    - Les valeurs fausses sont de part et d'autres de la moyenne recherchée ? Ou toujours au largement dessus, ou largement au dessous ?
    - Les valeurs fausses sont de l'ordre de combien, maximum, au dessus de la valeur moyenne recherchée ? Ca peut monter et descendre jusqu'à  combien ?
    - La valeur moyenne recherchée tourne-t-elle toujours autour du même chiffre (tu sais que tu vas avoir des valeurs autour de zéro, entre +/- 20, par exemple ? Ce qui pourrais te permettre de supprimer d'office les valeurs trop grandes ? J'imagine que ce n'est pas aussi simple)


    Le plus simple à  mon avis est de calculer la valeur médiane. Ou alors la valeur (arrondie à  l'entier le plus proche si tes nombres sont des flottants) à  plus forte fréquence d'apparition. Quitte à  se prendre une fenêtre de plus d'une unité (calculer la fréquence d'apparition des nombres entre 0 et 5, entre 5 et 10, entre 10 et 15, etc, donc fenêtre d'histogramme de taille 5 unités, par ex)

    Ca te donnera une valeur M qui va te donner une idée de la valeur centrale autour de laquelle tes valeurs tournent, en général. Et grace à  cette valeur M, tu pourras zapper les valeurs trop éloignées de M, pour calculer ta moyenne que sur les nombres qui sont dans le voisinage de M.

    L'autre solution plus mathématique, et peut-être plus adaptée, c'est de calculer l'écart-type E de ta série (au passage tu auras besoin de calculer la moyenne M avant), puis de ne garder ensuite que les valeurs qui sont dans la fenêtre [M-aE,M+aE], où a est un coefficient pondérateur, la valeur 1 pouvant aller, mais une valeur un peu inférieure genre 0.9 te permettra d'enlever un peu plus de valeurs, ça dépend si les valeurs erronées sont loin ou pas de la moyenne.
    M = MOYENNE(A) = SOMME(Ai)/N<br />E = ECARTTYPE(A) = SQRT( SOMME( (Ai - M)^2 ) / N )<br />Moy = SOMME(Ai)/N pour (Ai&gt;M-aE) &amp;&amp; (Ai&lt;M+aE) avec a autour de 0.8 ou 0.9 par exemple
    
  • UniXUniX Membre
    20:58 modifié #3
    Salut Ali, merci pour tes conseils.

    Concernant les stats, j'ai pas beaucoup de retour, car pas beaucoup de données à  exploiter .....
    Ce que je peux dire :
    - 78/83, c'est toujours dans ces eaux là  .... je pense pas moins de 72/83
    - les valeurs fausses sont à  priori au dessus de la moyenne, largement ça dépend .... Elles sont largement au dessus du nuage, mais parfois la moyenne est tellement élevée, que les valeurs sont finalement proches d'elle
    - les valeurs varient tout le temps ....


    Je vais regarder tes conseils, et faire quelques essais pour voir comment ça réagi ...
  • UniXUniX Membre
    20:58 modifié #4
    Bon, j'ai réussi à  filtrer correctement mes valeurs avec ta méthode sur l'écart-type. Je l'applique plusieurs fois, et j'ai ajusté le coef à  3 pour avoir un résultat correct.

    Maintenant, il faut que je valide sur plusieurs jeux de données.
  • AliGatorAliGator Membre, Modérateur
    décembre 2006 modifié #5
    En effet l'appliquer plusieurs fois n'est pas une bête idée, mais dans ce cas plutôt que de le faire 3 fois à  tous les coups, je te conseille de le faire "tant que l'écart-type est supérieur à  un seuil", car plus l'écart-type est grand plus ça veut dire que tu as des données qui s'éloignent de la moyenne, alors que s'il est petit ça veut dire que tes données sont plutôt concentrées autour de la moyenne.

    Donc du genre tant que ton écart type est > 5, tu réapplique ton "filtre"
  • AliGatorAliGator Membre, Modérateur
    décembre 2006 modifié #6
    Je viens de penser à  une autre solution, mais attention ça ne fera pas forcément la même chose. C'est plus rapide dans le filtrage (moins de calculs, une seule passe), mais ça ne donnera pas forcément la même moyenne. Mais c'est quand même en général efficace et de plus, simple à  implémenter, donc je te conseille au moins de voir ce que ça donne avec tes données.

    L'idée est simplement de faire un filtrage médian. C'est ce qu'on fait avec les images bruitées pour supprimer le bruit (type "salt & pepper", petits grains/pics dans l'image sur certains pixels qui ont des valeurs n'ayant rien à  voir avec leurs voisins)

    Si tu ne sais pas en quoi consiste un filtrage médian c'est vraiment pas compliqué : tu parcourres ta série de valeurs, et tu retiens la valeur médiane entre la valeur courante, précédente et suivante. (Pour la première et dernière valeur, il suffit de "faire le tour"). Pour rappel la médiane de 3 valeurs c'est la valeur qui n'est ni le max ni le min, juste celle entre les 2.

    Exemple : une série "3,40,2,5,4,230,3,2"
    1) Pour la valeur 3, tu retiens la médiane entre les valeurs 2 (dernier élément de ta série, on boucle pour ce cas particulier),3 et 40, donc 3.
    2) Pour la valeur 40, tu retiens la médiane entre 3,40,2 : donc 3
    3) Pour 2, tu retiens médiane(40,2,5) donc 5
    ...
    6) Pour 230, tu retiens médiane de 4,230,3, donc 4

    Et tu vois qu'ainsi avec cette méthode à  chaque fois que tu as une valeur "pic", elle es substituée par la valeur d'un de ses voisins, donc après l'application du filtre (qui consite juste en un boucle for ou un Enumerator, puis un test pour savoir la valeur que tu mets dans ton tableau résultat), les pics ont disparus, et tu peux calculer la moyenne.

    Ce n'est pas la même chose que d'éliminer totalement ces valeurs "pics", mais c'est plus rapide au niveau algo pour finalement pas bcp de différence sur le résultat final.
  • ClicCoolClicCool Membre
    20:58 modifié #7
    Ouahou c'est rigolo ton truc Ali :)

    J'espère qu'Unix n'a pas à  trier des valeurs genre issue d'un appareillage dont les valeurs erronnées seraient systématiquement les 10 consécutives, les premières (genre le temps qu'un capteur "chauffe") ou les dernières en fin de mesure ...
  • AliGatorAliGator Membre, Modérateur
    20:58 modifié #8
    Oui, t'as raison de le préciser ClicCool !

    C'est pour ça que j'ai dit que ma 2e solution c'était juste pour filter le bruit de type "Salt & Pepper", et que ça avait pour avantage d'être très facilement implémentable (le filtre médian est l'un des plus simples) tout en étant relativement efficace...
    ... mais évidemment on ne peut pas tout avoir : il n'est pas sans défauts, et il est évident que s'il y a plusieurs valeurs erronnées consécutives, ça nous met dedans ;)

    La meilleure solution à  mon avis reste encore celle où l'on utilise l'écart-type, et on fait de la décimation jusqu'à  ne garder qu'un ensemble de valeurs  plutôt regroupées (écart type faible)
  • UniXUniX Membre
    20:58 modifié #9
    Ca vaut le coup d'être tenté ta méthode Ali .....
    Je vais le mettre en place pour comparer avec la précedente méthode.

    Parcequ'en fait, je n'ai pas toujours 83 valeurs, parfois, j'en ai moins (jusqu'à  3). Il faut que je fasse un test lorsque je n'ai que 3 valeurs (dans ce cas là , la probabilité pour avoir une abérante dans le lot est très très faible ...).
Connectez-vous ou Inscrivez-vous pour répondre.