Boa forma de remover valores discrepantes?


12

Estou trabalhando em estatísticas para compilações de software. Eu tenho dados para cada build em aprovação / reprovação e tempo decorrido e geramos ~ 200 deles / semana.

A taxa de sucesso é fácil de agregar, posso dizer que 45% passaram em uma determinada semana. Mas também gostaria de agregar tempo decorrido e quero garantir que não deturpemos muito os dados. Achei melhor perguntar aos profissionais :-)

Digamos que eu tenho 10 durações. Eles representam casos de aprovação e reprovação. Algumas construções falham imediatamente, o que torna a duração extraordinariamente curta. Alguns ficam paralisados ​​durante o teste e eventualmente atingem o tempo limite, causando durações muito longas. Construímos produtos diferentes, portanto, mesmo compilações bem-sucedidas variam entre 90 segundos e 4 horas.

Eu posso obter um conjunto como este:

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

Minha primeira abordagem foi obter o tempo médio, classificando o conjunto e escolhendo o valor médio, neste caso 7812 (eu não me incomodei com a média aritmética dos conjuntos pares).

Infelizmente, isso parece gerar muita variação, pois apenas escolho um determinado valor. Portanto, se eu tivesse tendência para esse valor, ele retornaria entre 5000-10000 segundos, dependendo de qual build estava na mediana.

Então, para suavizar isso, tentei outra abordagem - remova valores discrepantes e calcule uma média sobre os valores restantes. Decidi dividi-lo em tercis e trabalhar apenas no meio:

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

A razão pela qual isso me parece melhor é duplo:

  • Não queremos nenhuma ação nas versões mais rápidas, elas já estão boas
  • As compilações mais longas provavelmente são induzidas pelo tempo limite e sempre estarão lá. Temos outros mecanismos para detectar aqueles

Parece-me que esses são os dados que estou procurando, mas estou preocupado que tenha conseguido suavidade removendo, bem, a verdade.

Isso é controverso? O método é sadio?

Obrigado!


Você ainda não disse por que deseja medir seu tempo decorrido. Você precisa estimar o tempo total da máquina pelo qual está pagando? Você precisa estimar quantas viagens à máquina de café você seria capaz de fazer? Qual é a ação que você provavelmente tomará se souber os tempos?
StasK 28/08

Além disso, se você possui produtos heterogêneos que você cria, é natural que você se movimentar por aí e não tente se livrar dele. Se você tem uma medida da complexidade de um determinado projeto (número de arquivos, número de linhas de código, número de rotinas etc.), pode estar interessado no tempo decorrido normalizado pela complexidade, que pode ser mais estável. Se você quiser torná-lo realmente estável e estável ao longo do tempo, não poderá saber quando precisa executar suas ações.
StasK 28/08/14

@StasK: obrigado por seus comentários, esta é uma entrada valiosa. A ação já é conhecida: muitas dessas construções demoram muito e devemos trabalhar para torná-las mais rápidas. Eu quero usar a medida agregada para ver se as coisas estão melhorando ou piorando.
Kim Gräsman

E sim, idealmente eu provavelmente faria isso por produto, mas os dados de origem não mantêm essas informações, então trapaceio com base no que sei sobre a distribuição. Isso pode mudar com o tempo, é claro, e talvez eu precise repensar.
Kim Gräsman

Bem, parece-me que você tem três grupos em seus dados: (i) cria essa construção; (ii) cria que falha (e você diz que eles tendem a falhar rapidamente) e (iii) cria que fica suspensa (ou quase) - e esse é provavelmente o principal, senão o único grupo em que você deseja agir. A medida agregada de tempo pode não ser de grande utilidade; mas algo como a 10ª construção mais longa ou o 10º percentil mais alto da distribuição dos tempos de construção, pode ser uma medida melhor do que está no extremo da distribuição com a qual você se preocupa. Isso é aproximadamente o que a EPA usa no monitoramento de poluição.
Stask

Respostas:


8

Sua abordagem faz sentido para mim, levando em consideração seu objetivo. É simples, é direto, faz o trabalho e você provavelmente não quer escrever um artigo científico sobre isso.

Uma coisa que sempre devemos fazer ao lidar com discrepantes é entendê- los, e você já faz um ótimo trabalho sobre isso. As formas possíveis de melhorar sua abordagem seriam: você pode usar informações sobre quais builds estão suspensas? Você menciona que possui "outros mecanismos para detectá-los" - você pode detectá-los e depois remover apenas os da amostra?

Caso contrário, se você tiver mais dados, poderá pensar em remover não tercis, mas quintis ... mas em algum momento, isso provavelmente não fará muita diferença.


Quando digo "outros" mecanismos, quero dizer completamente diferente fora deste conjunto de dados, portanto não posso tomar decisões com base aqui. Estamos agregando dados diariamente e temos apenas 50 compilações por dia, então acho que os quintis podem gerar muito poucos dados, mas, graças à sugestão, posso experimentar!
Kim Gräsman 28/08

13

O que você está fazendo é conhecido como uma média aparada .

Como você fez, é comum aparar a mesma proporção de cada lado (a proporção de aparar).

Você pode cortar algo entre 0% (uma média comum) e até (quase) 50% (o que indica a mediana). Seu exemplo possui 30% de corte em cada extremidade.

Veja esta resposta e o artigo relevante da Wikipedia .

[Editar: Veja a excelente discussão de Nick Cox sobre este tópico.]

É um estimador de localização bastante razoável e robusto. Geralmente é considerado mais adequado para distribuições quase simétricas do que as altamente distorcidas, mas se for adequado ao seu objetivo *, não há razão para não usá-lo. Quanto é melhor cortar depende dos tipos de distribuição que você possui e das propriedades que procura.

* Não está completamente claro o que você deseja estimar aqui.

Há um grande número de outras abordagens robustas para resumir o 'centro' de distribuições, algumas das quais você também pode achar útil. (por exemplo, estimadores M podem ter alguma utilidade para você, talvez)

[Se você precisar de uma medida correspondente de variabilidade para ir com sua média aparada, um desvio padrão Winsorized pode ser útil (essencialmente, ao calcular o sd, substitua os valores que você cortaria ao aparar com os valores mais extremos que você não cortou).]


Na verdade, não verifiquei o formato típico da minha distribuição, acho que varia semana a semana, dependendo de onde as pessoas fazem alterações. Na verdade, pode ser altamente distorcido.
Kim Gräsman

Obrigado por colocar um nome no meu trabalho de hacker, btw. Ela inspira alguma confiança :-)
Kim Gräsman

2

Ainda outro método é calcular a mediana de todas as médias aos pares ou executar bootstrap.

Atualizar:

A mediana de todas as médias de pares é chamada estimador de Hodges-Lehmann . Esse estimador geralmente possui uma alta eficiência. Esta entrada da enciclopédia por Scott L. Hershberger diz:

Embora o medidor e o estimador de Hodges-Lehmann sejam ambos preferíveis à média da amostra para distribuições não simétricas, o estimador de Hodges-Lehmann tem maior eficiência relativa assintótica em relação à média do que a mediana

O bootstrapping pode ser menos relevante e mais intensivo em computação, mas você pode coletar uma pequena amostra aleatória dos dados com substituição e calcular a média dessa subamostra, fazê-lo várias vezes e calcular a mediana de todos os meios.

Nos dois casos, você não precisa mais escolher um valor entre os valores dos seus dados (ao calcular a mediana comum), mas, em vez disso, escolhe entre muitas médias dos subconjuntos dos dados.


2
Você pode descrever vantagens e desvantagens desses métodos? Uma resposta de uma linha é insuficiente.
StasK 28/08/14

1
Eu tentei fazer uma atualização com mais explicações
Finn Årup Nielsen

As médias aos pares e o bootstrap parecem envolver vários recálculos em todo o conjunto de dados. A amostra geralmente é muito pequena (<500 valores), portanto, provavelmente não é um problema, mas parece mais complicado. É bom saber que existem mais abordagens para experimentar se a média aparada for muito direta. Obrigado!
Kim Gräsman 30/08/14

1

Parece razoável o que você está fazendo: apenas para obter informações, uso o processo a seguir com bastante frequência para uma finalidade semelhante: mas só estou realmente interessado nos Outliers Superiores.

Calcule o resumo de cinco números: Mín, Q1, Mediana, Q3, Máx. Calcular intervalo interquartil: Q3-Q1. Defina suas 'cercas' externas em Q1-IQR * X e Q3 + IQR * X: onde um valor razoável de 'X' é 1,5.

Usando o Excel e suas figuras, o valor acima (usando 1.5 para 'X' **) gera um valor externo superior: 21011

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

Portanto, a cerca inferior aqui não é útil ou realista para o seu exemplo: de fato, o que sustenta o argumento do outro post sobre a importância de entender o significado de seus dados específicos.

(** Encontrei uma citação para a regra '1.5': não estou dizendo que é autoritativa, mas parece um ponto de partida razoável para mim: http://statistics.about.com/od/Descriptive-Statistics/a/ O que é a regra do intervalo interquartil.htm )

Você também pode decidir (talvez) apenas usar os pontos de dados que se enquadram no próprio IQR: isso parece produzir resultados razoáveis ​​(na medida em que a associação ao seu método é muito semelhante).

usando os mesmos dados, isso colocaria os seguintes pontos de dados na 'área de interesse':

7812
3014
13400
21011
8993
8378
9100

Em um Boxplot: todos esses pontos se encaixariam na parte da caixa (e não na parte dos bigodes) do diagrama.

Pode-se ver que esta lista inclui alguns itens que não estão na sua lista original (compilações mais antigas); Não sei dizer se uma lista é mais precisa de alguma forma. (novamente, tudo se resume a entender seu conjunto de dados).


Obrigado, isso parece muito próximo em princípio do que já estou fazendo. De que maneiras esse método pode ser melhor do que apenas particionar o conjunto de dados?
Kim Gräsman 31/08/14

1
Não sei dizer se um dos métodos é melhor ou não: sugeri isso com base no que li nos sites / livros de estatísticas. Uma coisa (eu acho) que o método acrescenta é que permite ajustar as 'cercas' para o que achar adequado (ajustando o fator 1,5); onde apenas tirar o terço do meio pode ser mais suscetível a incluir um outlier potencialmente alto (que sem dúvida poderia ser melhor classificado fora da cerca) ..... mas não posso dizer isso com certeza. Uma outra coisa sobre o uso de quartis é que o resumo de 5 números é bastante bem compreendido e comumente usado.
monojohnny

Obrigado pelos detalhes adicionados! Eu faço isso em Python, então já tenho uma função em que particiono o conjunto de dados em N partes e depois retiro a parte do meio. É uma alteração de um caractere para fazer 5 ou 7 partições. Mas seu ponto de vista é bem aceito e é bom ver outra maneira comum de abordar esse problema. Obrigado novamente.
Kim Gräsman

soa bem para mim: acrescentarei mais uma coisa a enfatizar sobre o uso de quartis e cercas (em vez de ter partições variáveis) - é que eles são mapeados diretamente para boxplots: en.wikipedia.org/wiki/Box_plot que permitem (entre outras coisas) uma maneira padrão de comparar diferentes distribuições graficamente.
monojohnny
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.