Algorithme sur des moyennes de prix

muqaddarmuqaddar Administrateur
février 2018 modifié dans Objective-C, Swift, C, C++ #1

Salut,

Ceci est purement un problème d'algorithmique. B)
Je souhaite faire une moyenne sur des prix donnés à une référence.

Seulement, je veux ne pas prendre en compte les prix dont les écarts seraient trop importants par rapport à la future moyenne, on va dire par exemple + ou - 30%. Il peut en effet s'agir d'erreurs d'utilisateurs ou de saisie.

Selon les cas, il peut y avoir 1, 2...10... ou même 100 prix avant de faire la moyenne.

On va essayer de travailler sur une moyenne de 10 prix (avec des entiers) pour faire un exemple simple:
1, 18, 18, 19, 18, 16, 13, 17, 45, 84

Ici, on voit tout de suite que la moyenne va être autour de 17, et que 1, 45 et 84 sont démesurés. Ces 3 données fausseraient grandement la moyenne. 13 doit pouvoir contribuer à la moyenne, car il est probablement compris dans la tolérance de 30% sur la moyenne.

Bon, ici, c'est simple, mais j'aimerais savoir s'il existe une méthode infaillible pour dégager les trop petits et trop grands nombres.
Le problème c'est que si je fais une première moyenne pour avoir mon delta de 30% ensuite, cette moyenne n'a aucun sens car elle sera faussée par 1, 45 et 84. Je ne peux pas non plus compter le nombre d'occurrences d'un nombre, car ce ne seront pas des entiers au final: 18,56, 18,90, 19,13, 19,67...

Bref, il faudrait inclure seulement les prix qui sont dans une fourchette, sauf que je ne connais pas cette fourchette. :-)

Mots clés:

Réponses

  • Il y a quelques infos .
    Le truc facile à faire, c'est de faire un sort, et de prendre le médian (celui à la "moitié" de la liste ordonnée), à partir de laquelle tu pourrais supprimer les valeurs ensuite soit trop grande, soit trop faibles. J'aime bien le calcul à "poids" aussi sur la liste ordonnée.

  • muqaddarmuqaddar Administrateur
    février 2018 modifié #3

    Super merci.

    Oui, suivant le lien, 2 pistes:

    • utiliser le médian, puis tolérer ma marge d'erreur positive et négative (30%)
    • retirer arbitrairement les 10% les plus faibles et les 10% les plus forts avant de faire la moyenne, puis tolérer ma marge d'erreur positive et négative (30%)

    Je préfère la solution du médian ! :)

  • @Larme a dit :
    Il y a quelques infos .
    Le truc facile à faire, c'est de faire un sort, et de prendre le médian (celui à la "moitié" de la liste ordonnée), à partir de laquelle tu pourrais supprimer les valeurs ensuite soit trop grande, soit trop faibles. J'aime bien le calcul à "poids" aussi sur la liste ordonnée.

    Moi j’essayerait d’utiliser la liste ordonnée pour calculer les « distances » entre chaque point. Les valeurs « aberrantes » sont des pics (ou des creux) par rapport au « nuage » des chiffres normaux. En triant les distances dans un tableau tu dois pouvoir repérer facilement les valeurs habituelles des variations aléatoires.

    Ceci dit, si j’avais vraiment à faire ce genre de calculs j’irais me plonger dans un livre d’initiation à la statistique pour chercher la méthode la plus efficace.

  • CéroceCéroce Membre, Modérateur
    février 2018 modifié #5

    @Draken je crois que c'était bien l'idée de tout le monde dès le départ, mais la question est plutôt de savoir quand on sort de la norme.

    Je partirais sur un calcul d'écart-type. Dans l'article, il y a un exemple pour la Loi normale, et on voit qu'un écart de ±1 σ correspond à ±34,1 %.

    Sur Khan Academy tu trouveras une explication du calcul beaucoup moins intimidante que sur Wikipédia (où presque tous les articles concernant les maths sont affreux).

  • @Céroce a dit :
    tu trouveras une explication du calcul beaucoup moins intimidante que sur Wikipédia (où presque tous les articles concernant les maths sont affreux).

    Carrément. WikiPedia en Maths, c'est juste pour trouver le keyword (nom du théorème/principe, etc.) à chercher.

  • Ouai mais dans cette solution il y a un OS. Imaginons que les 4 premiers utilisateurs saisissent n'importe quoi. Imaginons que le PVC soit de 17€ et que tu reçoives 71,72,70,61 puis 17 et 18. Avec cette méthode, tu seras plus proche de 70 que de 17.

    Second élément, si le prix fluctue durant le temps (cours du dollar, de l'essence) cette méthode ne peux pas fonctionner, si ?

  • CéroceCéroce Membre, Modérateur

    @Jérémy a dit :wink: Imaginons que les 4 premiers utilisateurs saisissent n'importe quoi. Imaginons que le PVC soit de 17€ et que tu reçoives 71,72,70,61 puis 17 et 18. Avec cette méthode, tu seras plus proche de 70 que de 17.

    Ça reste une méthode statistique, qui n'a de sens qu'avec un nombre suffisant d'échantillons. Toutefois, ton hypothèse que les 2/3 des saisies sont fausses semble peu réaliste.

    Second élément, si le prix fluctue durant le temps (cours du dollar, de l'essence) cette méthode ne peux pas fonctionner, si ?

    C'est vrai, à moins de compenser selon le cours de la monnaie au moment de chaque saisie.
    Dans cette situation précise, il s'agit de vin, dont les prix sont souvent en Euros, je ne suis pas sûr que ce soit très nécessaire, on n'a pas une variation du cours de 30 % en quelques années, si ?

  • muqaddarmuqaddar Administrateur
    février 2018 modifié #9

    Oui, il s'agit de faire une moyenne sur des prix payés pour des vins.
    Et non d'avoir la valeur du marché d'un vin. Mais ça donne une indication.

    En amont, je récupère des prix avec devise, je convertis tout en USD avec le taux de change courant de la devise originale. J'obtiens ma liste de prix.

    Globalement, les données obtenues sont correctes, mais on va dire que 1 cas sur 50 peut être du n'importe quoi. C'est ce genre de cas que je veux exclure.

    Je vais regarder le fonctionnement de l'écart type.

  • muqaddarmuqaddar Administrateur

    Voici quelques résultats en conditions réelles:

    SORTED DATA: [15.99]
    MEDIAN: 15.99
    STANDARD DEVIATION: 0
    SUGGESTED DATA: [15.99]
    AVERAGE PRICE: 15.99
    
    SORTED DATA: [9.43, 9.43]
    MEDIAN: 9.43
    DEVIATION: 0.0
    SUGGESTED DATA: [9.43, 9.43]
    AVERAGE PRICE: 9.43
    
    SORTED DATA: [11.18, 19.95, 23.34]
    MEDIAN: 19.95
    DEVIATION: 6.27522376759055
    SUGGESTED DATA: [19.95, 23.34]
    AVERAGE PRICE: 21.64
    
    SORTED DATA: [3.44, 7.76, 7.76]
    MEDIAN: 7.76
    DEVIATION: 2.4941531628991833
    SUGGESTED DATA: [7.76, 7.76]
    AVERAGE PRICE: 7.76
    
    SORTED DATA: [30.44, 40.0, 42.11, 43.63, 47.68, 48.24, 48.7, 55.0]
    MEDIAN: 45.655
    STANDARD DEVIATION: 7.3327796327761785
    SUGGESTED DATA: [40.0, 42.11, 43.63, 47.68, 48.24, 48.7]
    AVERAGE PRICE: 45.06
    
    SORTED DATA: [25.23, 30.64, 31.05, 32.71, 33.27, 35.48, 35.91, 39.92, 40.59, 43.8, 46.57, 51.99, 57.66, 66.53]
    MEDIAN: 37.915
    STANDARD DEVIATION: 11.534879856188502
    SUGGESTED DATA: [33.27, 35.48, 39.92, 40.59, 35.91, 32.71, 31.05, 30.64, 43.8, 46.57]
    AVERAGE PRICE: 36.99
    
    SORTED DATA: [8.87, 10.53, 10.98, 11.03, 11.03, 11.03, 11.03, 12.2, 12.2, 12.85, 13.13, 14.3, 14.38, 14.57, 14.72, 14.72, 14.72, 15.51, 15.71, 17.18, 17.74, 17.74, 21.07, 21.31, 22.0, 23.66, 1928.2, 1928.2]
    MEDIAN: 14.645
    STANDARD DEVIATION: 501.8383953062693
    SUGGESTED DATA: [8.87, 10.53, 10.98, 11.03, 11.03, 11.03, 11.03, 12.2, 12.2, 12.85, 13.13, 14.3, 14.38, 14.57, 14.72, 14.72, 14.72, 15.51, 15.71, 17.18, 17.74, 17.74, 21.07, 21.31, 22.0, 23.66]
    AVERAGE PRICE: 14.78
    
    SORTED DATA: [13.0, 17.25, 22.18, 24.16, 25.37, 25.39, 25.39, 25.39, 25.87, 26.28, 26.28, 26.61, 26.61, 26.85, 27.67, 27.67, 27.72, 27.72, 28.22, 28.29, 28.83, 29.39, 29.39, 29.99, 30.0, 30.0, 31.05, 31.05, 31.05, 31.45, 32.67, 32.93, 33.27, 33.48, 33.99, 35.48, 36.53, 36.53, 37.7, 38.56, 39.06, 44.77]
    MEDIAN: 29.11
    STANDARD DEVIATION: 5.713825546947717
    SUGGESTED DATA: [24.16, 25.37, 25.39, 25.39, 25.39, 25.87, 26.28, 26.28, 26.61, 26.61, 26.85, 27.67, 27.67, 27.72, 27.72, 28.22, 28.29, 28.83, 29.39, 29.39, 29.99, 30.0, 30.0, 31.05, 31.05, 31.05, 31.45, 32.67, 32.93, 33.27, 33.48, 33.99]
    AVERAGE PRICE: 28.75
    

    On voit bien les valeurs délirantes dans l'avant dernier exemple.

  • Ca semble bon ce que tu nous montres ici. B)

Connectez-vous ou Inscrivez-vous pour répondre.