Bonne forme pour éliminer les valeurs aberrantes?

12

Je travaille sur les statistiques des builds de logiciels. J'ai des données pour chaque build sur réussite / échec et le temps écoulé et nous générons ~ 200 de ces / semaine.

Le taux de réussite est facile à agréger, je peux dire que 45% ont réussi une semaine donnée. Mais je voudrais également agréger le temps écoulé et je veux m'assurer de ne pas déformer trop mal les données. Je pensais que je ferais mieux de demander aux pros :-)

Disons que j'ai 10 durées. Ils représentent à la fois les cas de réussite et d'échec. Certaines versions échouent immédiatement, ce qui rend la durée inhabituellement courte. Certains se bloquent pendant les tests et finissent par s'arrêter, provoquant de très longues durées. Nous fabriquons différents produits, donc même les versions réussies varient entre 90 secondes et 4 heures.

Je pourrais obtenir un ensemble comme celui-ci:

[50, 7812, 3014, 13400, 21011, 155, 60, 8993, 8378, 9100]

Ma première approche a été d'obtenir le temps médian en triant l'ensemble et en choisissant la valeur moyenne, dans ce cas 7812 (je ne me suis pas soucié de la moyenne arithmétique pour les ensembles pairs).

Malheureusement, cela semble générer beaucoup de variations, car je ne sélectionne qu'une seule valeur donnée. Donc, si je devais faire évoluer cette valeur, elle rebondirait entre 5000 et 10000 secondes selon la construction à la médiane.

Donc, pour lisser cela, j'ai essayé une autre approche - supprimer les valeurs aberrantes puis calculer une moyenne sur les valeurs restantes. J'ai décidé de le diviser en tertiles et de travailler uniquement sur celui du milieu:

[50, 60, 155, 3014, 7812, 8378, 8993, 9100, 13400, 21011] ->
[50, 60, 155], [3014, 7812, 8378, 8993], [9100, 13400, 21011] ->
[3014, 7812, 8378, 8993]

La raison pour laquelle cela me semble meilleur est double:

  • Nous ne voulons aucune action sur les versions plus rapides, elles sont déjà bien
  • Les versions les plus longues sont probablement induites par le timeout et seront toujours là. Nous avons d'autres mécanismes pour détecter ces

Il me semble donc que ce sont les données que je recherche, mais je crains d'avoir atteint la régularité en supprimant, enfin, la vérité.

Est-ce controversé? La méthode est-elle sensée?

Merci!

Kim Gräsman
la source
Vous n'avez toujours pas dit pourquoi vous voulez avoir votre mesure du temps écoulé. Avez-vous besoin d'estimer la durée totale de la machine pour laquelle vous payez? Avez-vous besoin d'estimer combien de voyages à la machine à café vous pourriez effectuer? Quelle action prendrez-vous probablement si vous connaissiez les temps?
StasK
De plus, si vous avez des produits hétérogènes que vous construisez, alors rebondir est naturel, et vous ne devriez pas essayer de vous en débarrasser. Si vous avez une mesure de la complexité d'un projet donné (# de fichiers, # de lignes de code, # de routines, etc.), alors vous pourriez être intéressé par le temps écoulé normalisé par la complexité, qui peut être plus stable. Si vous voulez le rendre vraiment stable et plat au fil du temps, vous ne pourrez pas savoir quand vous devez prendre vos mesures.
StasK
@StasK: merci pour vos commentaires, c'est un apport précieux. L'action est déjà connue: beaucoup de ces builds prennent waaaay trop longtemps, et nous devrions travailler à les rendre plus rapides. Je veux utiliser la mesure agrégée pour voir si les choses s'améliorent ou empirent.
Kim Gräsman
Et oui, idéalement, je le ferais probablement par produit, mais les données source ne conservent pas ces informations, je triche donc en fonction de ce que je sais de la distribution. Cela pourrait changer avec le temps, bien sûr, et je devrai peut-être repenser.
Kim Gräsman
Eh bien, il me semble que vous avez trois groupes dans vos données: (i) construit cette construction; (ii) les builds qui échouent (et vous dites qu'ils ont tendance à échouer assez rapidement), et (iii) les builds qui raccrochent (ou presque) - et c'est probablement le principal sinon le seul groupe sur lequel vous voulez agir. La mesure globale du temps peut ne pas être très utile; mais quelque chose comme la 10e génération la plus longue, ou le 10e centile le plus élevé de la distribution des temps de construction, pourrait être une meilleure mesure de ce qui est à l'extrême de la distribution qui vous intéresse. C'est à peu près ce que l'EPA utilise dans sa surveillance de la pollution.
StasK

Réponses:

8

Votre approche a du sens pour moi, en tenant compte de votre objectif. C'est simple, c'est simple, cela fait le travail, et vous ne voudrez probablement pas écrire un article scientifique à ce sujet.

Une chose que l'on devrait toujours faire pour traiter les valeurs aberrantes est de les comprendre , et vous faites déjà un excellent travail à ce sujet. Les moyens d'améliorer votre approche seraient donc les suivants: pouvez-vous utiliser des informations sur les builds suspendus? Vous mentionnez que vous avez «d'autres mécanismes pour les détecter» - pouvez-vous les détecter et ensuite supprimer uniquement ceux de l'échantillon?

Sinon, si vous avez plus de données, vous pourriez penser à supprimer non pas les tertiles, mais les quintiles ... mais à un moment donné, cela ne fera probablement pas beaucoup de différence.

Stephan Kolassa
la source
Quand je dis «autres» mécanismes, je veux dire complètement différent en dehors de cet ensemble de données, donc je ne peux pas prendre de décisions en fonction de cela ici. Nous agrégons des données quotidiennement et nous n'obtenons que ~ 50 builds par jour, donc je pense que les quintiles pourraient produire trop peu de données, mais merci pour la suggestion, je peux l'expérimenter!
Kim Gräsman
13

Ce que vous faites est connu comme une moyenne tronquée .

Comme vous l'avez fait, il est courant de couper la même proportion de chaque côté (la proportion de coupe).

Vous pouvez couper n'importe quoi entre 0% (une moyenne ordinaire) jusqu'à (presque) 50% (ce qui donne la médiane). Votre exemple a 30% coupé à chaque extrémité.

Voir cette réponse et l'article Wikipedia pertinent .

[Edit: Voir l' excellente discussion de Nick Cox sur ce sujet.]

C'est un estimateur d'emplacement assez raisonnable et quelque peu robuste. Il est généralement considéré comme plus approprié pour les distributions presque symétriques que celles très asymétriques, mais si cela convient à votre objectif *, il n'y a aucune raison de ne pas l'utiliser. La meilleure quantité à tailler dépend du type de distribution que vous avez et des propriétés que vous recherchez.

* Ce n'est pas tout à fait clair ce que vous voulez estimer ici.

Il existe un grand nombre d'autres approches robustes pour résumer le «centre» des distributions, dont certaines pourraient également vous être utiles. (par exemple, les estimateurs M pourraient vous être utiles, peut-être)

[Si vous avez besoin d'une mesure de variabilité correspondante pour aller avec votre moyenne ajustée, un écart-type Winsored pourrait vous être utile (essentiellement, lors du calcul du sd, remplacez les valeurs que vous couperiez lors de l'ajustement avec les valeurs les plus extrêmes que vous n'a pas coupé).]

Glen_b -Reinstate Monica
la source
Je n'ai pas réellement vérifié la forme typique de ma distribution, je pense qu'elle varie d'une semaine à l'autre selon l'endroit où les gens font des changements. Il pourrait en fait être très biaisé.
Kim Gräsman
Merci d'avoir mis un nom sur mon hack-job, btw. Cela inspire une certaine confiance :-)
Kim Gräsman
2

Encore une autre méthode consiste à calculer la médiane de toutes les moyennes par paire ou à effectuer un bootstrap.

Mise à jour:

La médiane de toutes les moyennes par paire est appelée l' estimateur de Hodges – Lehmann . Cet estimateur a généralement une efficacité élevée. Cette entrée dans l'encyclopédie de Scott L. Hershberger dit:

Bien que l'estimateur médian et Hodges-Lehmann soient tous deux préférables à la moyenne de l'échantillon pour les distributions non symétriques, l'estimateur Hodges-Lehmann a une efficacité relative asymptotique plus grande par rapport à la moyenne que la médiane par rapport à la moyenne

L'amorçage peut être moins pertinent et plus intensif en calcul, mais vous pouvez prendre un petit échantillon aléatoire des données avec remplacement et calculer la moyenne de ce sous-échantillon, le faire plusieurs fois et calculer la médiane de tous les moyens.

Dans les deux cas, vous n'avez plus à choisir une valeur parmi les valeurs de vos données (lorsque vous calculez la médiane ordinaire), mais à la place, vous choisissez parmi de nombreuses moyennes à partir de sous-ensembles de données.

Finn Årup Nielsen
la source
2
Pouvez-vous décrire les avantages et les inconvénients de ces méthodes? Une réponse sur une seule ligne est insuffisante.
StasK
1
J'ai essayé de faire une mise à jour avec plus d'explications
Finn Årup Nielsen
Les moyennes par paires et le bootstrap semblent impliquer un certain nombre de recalculs sur l'ensemble des données. L'échantillon est généralement assez petit (<500 valeurs), donc ce n'est probablement pas un problème, mais cela semble plus compliqué. Bon à savoir, il existe d'autres approches à expérimenter si la moyenne ajustée s'avère trop émoussée. Merci!
Kim Gräsman
1

Semble raisonnable ce que vous faites: juste pour information j'utilise le processus suivant assez souvent dans un but similaire: mais je ne suis jamais vraiment intéressé par les valeurs aberrantes supérieures.

Calculer le résumé à cinq chiffres: Min, Q1, Médian, Q3, Max. Calculez l'intervalle interquartile: Q3-Q1. Définissez vos `` clôtures '' aberrantes à Q1-IQR * X et Q3 + IQR * X: où une valeur raisonnable de `` X '' est de 1,5.

En utilisant Excel et vos chiffres ci-dessus (en utilisant 1,5 pour 'X' **), vous obtenez une valeur aberrante supérieure: 21011

MIN 50
Q1  3014
MEDIAN  8095
Q3  9073.25
MAX 21011
IQR 6059.25
UPPER FENCE 18162.125
LOWER FENCE -6074.875

Donc, la clôture inférieure ici n'est pas utile ou réaliste pour votre exemple en fait: ce qui confirme le point soulevé par l'autre poste concernant l'importance de comprendre la signification de vos données spécifiques.

(** Trouvé une citation pour la règle '1.5': je ne dis pas qu'elle fait autorité, mais cela me semble un point de départ raisonnable: http://statistics.about.com/od/Descriptive-Statistics/a/ What-Is-The-Interquartile-Range-Rule.htm )

Vous pouvez également décider (peut-être) d'utiliser simplement les points de données qui relèvent de l'IQR lui-même: cela semble donner des résultats raisonnables (dans la mesure où l'appartenance à votre méthode est très similaire).

en utilisant les mêmes données, cela placerait les points de données suivants dans la «zone d'intérêt»:

7812
3014
13400
21011
8993
8378
9100

Sur un Boxplot: ces points relèveraient tous de la partie boîte (plutôt que de la partie moustaches) du diagramme.

On peut voir que cette liste comprend des éléments qui ne figurent pas dans votre liste d'origine (les versions les plus longues); Je ne peux pas dire si une liste est plus précise en aucune façon. (encore une fois, revient à comprendre votre ensemble de données).

monojohnny
la source
Merci, cela semble très proche en principe de ce que je fais déjà. En quoi cette méthode pourrait-elle être meilleure que le simple partitionnement de l'ensemble de données?
Kim Gräsman
1
Je ne peux pas vraiment dire si l'une ou l'autre méthode est meilleure ou non: j'ai suggéré cela en fonction de ce que j'ai lu dans les livres de statistiques / sites. Une chose (je pense) que la méthode ajoute est qu'elle vous permet d'ajuster les «clôtures» à tout ce qui vous semble approprié (en ajustant le facteur 1,5); où le simple fait de prendre le tiers médian pourrait être plus susceptible d'inclure une valeur aberrante potentiellement élevée (qui pourrait sans doute être mieux classée à l'extérieur de la clôture) ..... mais je ne peux pas dire cela avec certitude. Une autre chose à propos de l'utilisation de Quartiles, c'est que le résumé à 5 chiffres est assez bien compris et couramment utilisé.
monojohnny
Merci pour le détail supplémentaire! Je le fais en Python, j'ai donc déjà une fonction où je partitionne l'ensemble de données en N parties, puis je retire la partie centrale. C'est un changement d'un caractère pour en faire 5 ou 7 partitions à la place. Mais votre point est bien compris et il est bon de voir une autre façon courante d'aborder ce problème. Merci encore.
Kim Gräsman
me semble bien: j'ajouterai une chose à souligner sur l'utilisation des quartiles et des clôtures (plutôt que d'avoir des partitions variables) - c'est qu'elles sont directement mappées sur des boxplots: en.wikipedia.org/wiki/Box_plot qui permettent (entre autres) une façon standard de comparer graphiquement différentes distributions.
monojohnny