17 votes

Trouver les valeurs aberrantes dans un ensemble de données

J'ai un script python qui crée une liste de listes de données sur le temps de fonctionnement et les performances du serveur, où chaque sous-liste (ou 'ligne') contient les statistiques d'un cluster particulier. Par exemple, joliment formaté, cela ressemble à quelque chose comme ceci :

-------  -------------  ------------  ----------  -------------------
Cluster  %Availability  Requests/Sec  Errors/Sec  %Memory_Utilization
-------  -------------  ------------  ----------  -------------------
ams-a    98.099          1012         678          91
bos-a    98.099          1111         12           91
bos-b    55.123          1513         576          22
lax-a    99.110          988          10           89
pdx-a    98.123          1121         11           90
ord-b    75.005          1301         123          100
sjc-a    99.020          1000         10           88
...(so on)...

Donc, sous forme de liste, ça pourrait ressembler à ça :

[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]

Ma question : Quelle est la meilleure façon de déterminer les valeurs aberrantes dans chaque colonne ? Ou bien les valeurs aberrantes ne sont-elles pas nécessairement la meilleure façon d'aborder le problème de la recherche de la "méchanceté" ? Dans les données ci-dessus, je voudrais certainement connaître bos-b et ord-b, ainsi que ams-a puisque son taux d'erreur est si élevé, mais les autres peuvent être écartés. En fonction de la colonne, puisque plus haut n'est pas nécessairement pire, ni plus bas, j'essaie de trouver la manière la plus efficace de le faire. Il semble que numpy soit souvent mentionné pour ce genre de choses, mais je ne sais pas trop par où commencer (malheureusement, je suis plus administrateur système que statisticien...).

Merci d'avance !

8voto

Prasad Chalasani Points 9020

Une bonne façon d'identifier visuellement les valeurs aberrantes est de réaliser un boxplot (ou tracé en boîte et moustaches), qui montrera la médiane, et deux quartiles au-dessus et au-dessous de la médiane, ainsi que les points qui se trouvent "loin" de cette boîte (voir l'entrée Wikipedia http://en.wikipedia.org/wiki/Box_plot ). Dans R, il y a un boxplot pour ce faire.

Une façon d'éliminer/identifier les valeurs aberrantes de manière programmatique est d'utiliser la méthode MAD, ou Médiane Écart absolu . Le MAD n'est pas sensible aux valeurs aberrantes, contrairement à l'écart-type. J'utilise parfois une règle empirique qui consiste à considérer comme aberrants tous les points qui se trouvent à plus de 5*MAD de la médiane.

7voto

David Points 6520

L'objectif que vous vous êtes fixé, à savoir "trouver la méchanceté", implique que ce ne sont pas les valeurs aberrantes que vous recherchez, mais les observations qui se situent au-dessus ou au-dessous d'un certain seuil, et je présume que ce seuil reste le même au fil du temps.

Par exemple, si tous vos serveurs sont à 98 ± 0,1 % de disponibilité, un serveur à 100 % de disponibilité serait une aberration, tout comme un serveur à 97,6 % de disponibilité. Mais ces chiffres peuvent se situer dans les limites que vous souhaitez.

D'autre part, il peut y avoir de bonnes raisons apriori de vouloir être notifié de tout serveur à moins de 95% de disponibilité, qu'il y ait ou non un ou plusieurs serveurs en dessous de ce seuil.

Pour cette raison, une recherche des valeurs aberrantes peut ne pas fournir les informations qui vous intéressent. Les seuils pourraient être déterminés statistiquement sur la base de données historiques, par exemple en modélisant le taux d'erreur comme un poisson ou le pourcentage de disponibilité comme des variables bêta. Dans un cadre appliqué, ces seuils pourraient probablement être déterminés en fonction des exigences de performance.

5voto

Navi Points 3644

Je pense que votre meilleure chance est de jeter un coup d'oeil à la section scipy 's scoreatpercentile fonction. Ainsi, par exemple, vous pouvez essayer d'exclure toutes les valeurs qui sont supérieures au 99e percentile.

La moyenne et l'écart-type ne servent à rien si vous n'avez pas une distribution normale.

En général, il est bon d'avoir une idée visuelle approximative de ce à quoi ressemblent vos données. Il existe matplotlib Je vous recommande d'établir des graphiques de vos données avec ce logiciel avant de décider d'un plan.

1voto

wmil Points 1683

Vous devez calculer la moyenne et l'écart-type de la colonne. L'écart-type est un peu confus, mais le fait important est que 2/3 des données se situent à l'intérieur de l'écart-type.

Moyenne +/- écart-type

En général, tout ce qui est en dehors de la moyenne +/- 2 * écart-type est une aberration, mais vous pouvez modifier le multiplicateur.

http://en.wikipedia.org/wiki/Standard_deviation

Donc, pour être clair, vous voulez convertir les données en écarts types de la moyenne.

c'est-à-dire

def getdeviations(x, mean, stddev):
   return math.abs(x - mean) / stddev

Numpy dispose de fonctions pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X