2011-01-05 24 views
17

Tengo un script de python que crea una lista de listas de tiempo de actividad del servidor y datos de rendimiento, donde cada sublista (o 'fila') contiene las estadísticas de un determinado grupo. Por ejemplo, con un formato agradable que se ve algo como esto:Encontrar valores atípicos en un conjunto de datos

------- ------------- ------------ ---------- ------------------- 
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)... 

lo tanto en forma de lista, puede ser que parezca:

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

Mi pregunta: ¿Cuál es la mejor manera de determinar los valores extremos en cada columna? ¿O los valores atípicos no son necesariamente la mejor manera de atacar el problema de encontrar "maldad"? En los datos anteriores, definitivamente quiero saber sobre bos-b y ord-b, así como ams-a, ya que su tasa de error es muy alta, pero los demás pueden descartarse. Dependiendo de la columna, dado que más alto no es necesariamente peor, ni es más bajo, estoy tratando de encontrar la manera más eficiente de hacerlo. Parece que Numpy se menciona mucho para este tipo de cosas, pero no estoy seguro de por dónde empezar (lamentablemente, soy más administrador de sistemas que estadístico ...).

¡Gracias de antemano!

+2

¿Por qué no hacer la pregunta en el sitio [stats.SE] (http://stats.stackexchange.com/)? – csgillespie

+0

@csgillespie ¡Buena idea, será suficiente! – septagram

+1

duplicado de http://stats.stackexchange.com/questions/6013/finding-outliers-in-a-data-set –

Respuesta

7

Su objetivo declarado de "encontrar maldad" implica que no son los valores atípicos que está buscando, pero las observaciones que caen por encima o por debajo de un umbral, y supongo que el umbral seguirá siendo el mismo con el tiempo.

Como ejemplo, si todos sus servidores tuvieran una disponibilidad de 98 ± 0,1%, un servidor con una disponibilidad del 100% sería un valor atípico, al igual que un servidor con una disponibilidad del 97,6%. Pero estos pueden estar dentro de los límites deseados.

Por otro lado, puede haber buenas razones para querer recibir notificaciones de cualquier servidor con una disponibilidad inferior al 95%, independientemente de si hay uno o muchos servidores por debajo de este umbral.

Por esta razón, una búsqueda de valores atípicos puede no proporcionar la información que le interesa. Los umbrales podrían determinarse estadísticamente en función de los datos históricos, p. modelando la tasa de error como poisson o porcentaje de disponibilidad como variables beta. En una configuración aplicada, estos umbrales probablemente podrían determinarse en función de los requisitos de rendimiento.

+0

Si bien hay muchas buenas respuestas aquí (específicamente enfocándome en mi pregunta sobre valores atípicos), @David parece ser la mejor desde una perspectiva estadística. Marcado como respondido, aunque todavía no he tenido la oportunidad de implementarlo. – septagram

1

Necesita calcular la media (promedio) y la desviación estándar para la columna. desviación stadard es un poco confuso, pero el hecho importante es que 2/3 de los datos está dentro de

media +/- StandardDeviation

Generalmente nada fuera media +/- 2 * StandardDeviation es un valor atípico, pero puede ajustar el multiplicador.

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

Así que para ser claros, que desea convertir los datos en desviaciones estándar de la media.

es decir

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

Numpy tiene funciones para esto.

+4

Este es solo un enfoque válido si está asumiendo que los valores son de una distribución normal. – tkerwin

+2

alternativas a lo normal incluirían la tasa de error como poisson y el porcentaje de disponibilidad como distribuciones beta –

5

Creo que su mejor opción es echar un vistazo a la función scipyscoreatpercentile. Entonces, por ejemplo, podría intentar excluir todos los valores que están por encima del percentil 99.

La media y la desviación estándar no son buenas si no tiene una distribución normal.

Generalmente es bueno tener una idea visual aproximada de cómo se ven sus datos. Hay matplotlib; Te recomiendo que hagas algunos gráficos de tus datos antes de decidir sobre un plan.

+1

Si solo hace este análisis con poca frecuencia, he encontrado que R (http://www.r-project.org/) es mucho más fácil de usar para la exploración interactiva de datos. Incluso si termina usando scipy/numpy para su solución final, podría valer la pena jugar con los datos en R primero. – Wilduck

+0

Buena sugerencia, echaré un vistazo a scoreatpercentile. – septagram

8

Una buena forma de identificar los valores atípicos visualmente es hacer un diagrama de caja (o diagrama de caja y bigotes), que mostrará la mediana, y un par de cuartiles arriba y abajo de la mediana, y los puntos que están "lejos "desde esta casilla (vea la entrada de Wikipedia http://en.wikipedia.org/wiki/Box_plot). En R, hay una función boxplot para hacer justamente eso.

Una forma de descartar/identificar valores atípicos programáticamente es utilizar el MAD, o Median Absolute Deviation. MAD no es sensible a valores atípicos, a diferencia de la desviación estándar. A veces uso una regla práctica para considerar que todos los puntos que están a más de 5 * MAD de la mediana son atípicos.

Cuestiones relacionadas