Qual detecção de outlier pode detectar esses outliers?

7

Eu tenho um vetor e quero detectar outliers nele.

A figura a seguir mostra a distribuição do vetor. Pontos vermelhos são outliers. Pontos azuis são pontos normais. Pontos amarelos também são normais.

Eu preciso de um método de detecção de outlier (um método não paramétrico) que possa apenas detectar pontos vermelhos como outliers. Eu testei alguns métodos como IQR, desvio padrão, mas eles detectam pontos amarelos como outliers também.

Eu sei que é difícil detectar apenas o ponto vermelho, mas acho que deve haver uma maneira (mesmo combinação de métodos) de resolver esse problema.

insira a descrição da imagem aqui

Pontos são leituras de um sensor por um dia. Mas os valores do sensor mudam devido à reconfiguração do sistema (o ambiente não é estático). Os horários das reconfigurações são desconhecidos. Os pontos azuis são para o período anterior à reconfiguração. Os pontos amarelos são para após a reconfiguração, que causa desvio na distribuição das leituras (mas são normais). Pontos vermelhos são resultados da modificação ilegal dos pontos amarelos. Em outras palavras, são anomalias que devem ser detectadas.

Estou pensando se a estimativa da função de suavização do Kernel ('pdf', 'survivor', 'cdf', etc.) Pode ajudar ou não. Alguém ajudaria sobre sua principal funcionalidade (ou outros métodos de suavização) e justificativa para usar em um contexto para resolver um problema?

Arkan
fonte
3
O que torna esses valores extremos e não os amarelos? Você tem exemplos de outliers ou você acabou de fazer um set? Parece semelhante a este? Quantas dimensões?
Jan van der Vegt
Obrigado. Pontos são leituras de um sensor por um dia. Mas os valores do sensor mudam devido às reconfigurações do sistema (o ambiente não é estático). Os pontos azuis são para o período anterior à reconfiguração. Os pontos amarelos são para após a reconfiguração, causando desvio na distribuição das leituras (mas são normais). Pontos vermelhos são resultados de pontos amarelos modificados ilegais. É uma dimensão.
quer
1
Com que frequência essas reconfigurações acontecem? Esses pontos vermelhos sempre acontecem? Você pode olhar para alguns métodos de suavização de séries temporais.
Jan van der Vegt
É dinâmico e nada é definitivo. Não. Os pontos vermelhos são anomalias criadas por modificações ilegais e nem sempre acontecem. Gostaria de pedir para você citar alguns métodos conhecidos (métodos de suavização)? Qual é a principal funcionalidade deles?
Arkan
Ao procurar mudanças de nível, você pode encontrar alterações na interceptação. Publique seus dados Veja o artigo de Balke Detectando Mudanças de Nível em Séries Temporais Nathan S. Balke Journal of Business & Economic Statistics vol. 11, No. 1 (Jan., 1993), pp. 81-92
Tom Reilly

Respostas:

3

Você pode visualizar seus dados como uma série temporal em que uma medição comum produz um valor muito próximo ao valor anterior e uma recalibração produz um valor com uma grande diferença em relação ao predecessor.

Aqui estão dados de amostra simulados com base na distribuição normal com três meios diferentes semelhantes ao seu exemplo. insira a descrição da imagem aqui

Ao calcular a diferença para o valor anterior (uma espécie de derivação), você obtém os seguintes dados:

insira a descrição da imagem aqui

Minha interpretação de sua descrição é que você tolera a recalibração (ou seja, pontos a uma distância maior de zero, vermelho no diagrama), mas eles devem alternar entre valores positivos e negativos (ou seja, correspondentes à mudança do estado azul para o amarelo e de volta).

Isso significa que você pode configurar um alarme vendo um segundo ponto vermelho no lado negativo ou positivo .

Marmite Bomber
fonte
Eu realmente aprecio sua resposta. Sim, podemos dizer que é como recalibração e essa é uma boa analogia. Sua abordagem é boa. Eu testei. O resultado é exatamente igual ao que você desenhou. O primeiro ponto vermelho é o primeiro ponto dos pontos amarelos. O segundo ponto é o primeiro ponto dos pontos vermelhos. O terceiro ponto vermelho é o último ponto dos pontos vermelhos. Portanto, é difícil descobrir o conhecimento desses dados. Isso ocorre porque não conseguimos discutir os pontos vermelhos após o primeiro ponto vermelho. Podemos precisar visualizar os dados primários para concluir, mas isso é intervenção humana.
Arkan
@ Bombardeiroarmite Seria bom se você compartilhar o trecho de códigos para capturar a ideia do ponto de vista da programação.
Mario
@Mario boa idéia - deixe-me ver se eu posso encontrá-lo depois de mais de dois anos;)
Marmite Bomber
@Mario ver minha outra resposta;)
Bomber Marmite
@MarmiteBomber obrigado pelo feedback, mas cara, eu estava interessado em código Python!
Mario
0

Se você usar o log, poderá usar uma média atual que será redefinida se a configuração for alterada. No entanto, isso terá a fraqueza de que você precisa de pelo menos alguns dados antes de poder detectar esses valores extremos.

Seus dados parecem "agradáveis" (sem muito barulho). Eu recomendaria tirar a média dos últimos 10 a 20 pontos na mesma configuração. Se esses valores forem algum tipo de quantidade contada, você poderá cometer um erro de poisson para pontos de dados individuais e calcular o erro em média.

Quantos dados históricos você possui? Se você tem muito, pode usá-lo para ajustar sua taxa de alarme de forma a capturar uma proporção aceitável de todos os valores extremos reais e obter um número mínimo de avisos falsos. O que é aceitável depende do problema específico. (Custo de falsos positivos ou valores não detectados e sua abundância).

El Burro
fonte
Obrigado. Infelizmente, as reconfigurações são diferentes e isso não nos permite ajustar uma taxa de alarme. Você pode explicar um pouco mais sobre a média de pontos recentes?
quer
Estou sob a suposição de que esses pontos de dados estão em ordem cronológica - correto? Em cada ponto, você pode usar as informações do eixo y (dados em seu gráfico) dos últimos XX pontos. Vamos dizer 10, mas isso obviamente depende um pouco da aparência dos seus dados. Para esses 10 pontos, você calcula a média ou melhor, se tiver uma estimativa de erro nas medições individuais do erro ponderado.
El burro
Você ainda pode ajustar a taxa de alarme porque não define um alarme como um desvio de um valor fixo maior que X, mas como o desvio de uma média móvel.
El Burro
Obrigado. Eles em ordem cronológica. Gostaria de saber se a estimativa da função de suavização do Kernel é uma ajuda ou não.
quer
Eu sugeriria começar com uma média móvel simples que seja redefinida para cada alteração na configuração e ver se ela é executada. Se você não tiver as informações disponíveis quando ocorrer uma alteração na configuração com base na aparência, não vejo outra opção confiável para separar o amarelo do vermelho. Pelo menos no exemplo dado, não parece que a forma seja muito diferente entre os dois.
El Burro
0

Vamos ilustrar a abordagem proposta na outra resposta com um exemplo simples

Adquirir dados

Simularemos os dados com sete pedaços produzidos com distribuição normal com diferentes meios.

Isso é importante, pois nos permite distinguir claramente entre os grupos e simplesmente detectar os pontos de ruptura. Esta resposta usa uma abordagem de limite elementar; pode ser necessária uma maneira mais avançada para seus dados reais.

dt <- rbind(
data.frame(color=1, x =  round(runif(50, min = 0, max = 50)), y = rnorm (50,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 50, max = 65)), y = rnorm (15,mean=4.5, sd=.03)),
data.frame(color=2, x =  round(runif(15, min = 65, max = 80)), y = rnorm (15,mean=3.3, sd=.03)),
data.frame(color=1, x =  round(runif(70, min = 80, max = 150)), y = rnorm (70,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 150, max = 165)), y = rnorm (15,mean=3.3, sd=.03)), 
data.frame(color=3, x =  round(runif(15, min = 165, max = 180)), y = rnorm (15,mean=2.9, sd=.03)), 
data.frame(color=1, x =  round(runif(120, min = 180, max = 300)), y = rnorm (120,mean=3.9, sd=.03))
)
dt$color <- as.factor(dt$color)
dt <- as_tibble(dt)

insira a descrição da imagem aqui

Derivar os pontos de ruptura

Com uma simples diferença em relação ao ponto anterior lag(y) , obtemos os valores extremos. Eles são classificados usando um limite.

insira a descrição da imagem aqui

Classificação de Mudança de Comportamento

Com base nas regras que você descreveu, os pontos de ruptura são classificados como OKe problem.

A regra declara que não são permitidas duas alterações na mesma direção. O segundo movimento na direção anterior é considerado um problema.

Pode ser necessário ajustar essa interpretação simples se o seu logik for mais avançado.

## extract outliers and get previous value
dt2 <- filter(dt2, diff != 0) %>%
   mutate(cs = cumsum(diff),
          prev = lag(diff),
          cls = case_when(
                      diff * prev >  0 ~ "problem",
                      TRUE ~ "OK"))
## show 
dt2 %>% select(x,y,diff,prev,cls)                       
## # A tibble: 6 x 5
##       x     y  diff  prev cls    
##   <dbl> <dbl> <dbl> <dbl> <chr>  
## 1    50  4.53     1    NA OK     
## 2    66  3.32    -1     1 OK     
## 3    80  3.87     1    -1 OK     
## 4   151  3.32    -1     1 OK     
## 5   167  2.91    -1    -1 problem
## 6   180  3.87     1    -1 OK

Apresentação

Finalmente, você projeta os valores discrepantes reconhecidos com os dados originais

## project in the original data
ggplot(data=dt, mapping = aes(x=x, y=y) )  +
  geom_point(mapping = aes(color = color) )  +
  scale_color_manual(values=c("blue", "yellow", "red","green","red")) +
  theme(legend.position="none") +
  geom_vline(data=dt2, aes(xintercept=x, color=cls),
             linetype="dashed", size = 2)

insira a descrição da imagem aqui

Marmite Bomber
fonte