Deteksi outlier mana yang dapat mendeteksi outlier ini?

7

Saya memiliki vektor dan ingin mendeteksi outlier di dalamnya.

Gambar berikut menunjukkan distribusi vektor. Poin merah adalah outlier. Poin biru adalah poin normal. Titik kuning juga normal.

Saya memerlukan metode deteksi outlier (metode non-parametrik) yang hanya dapat mendeteksi titik merah sebagai outlier. Saya menguji beberapa metode seperti IQR, standar deviasi tetapi mereka mendeteksi titik kuning sebagai outlier juga.

Saya tahu sulit mendeteksi hanya titik merah tapi saya pikir harus ada cara (bahkan kombinasi metode) untuk menyelesaikan masalah ini.

masukkan deskripsi gambar di sini

Poin adalah pembacaan sensor selama sehari. Tetapi nilai-nilai sensor berubah karena konfigurasi ulang sistem (lingkungan tidak statis). Waktu konfigurasi ulang tidak diketahui. Poin biru adalah untuk periode sebelum konfigurasi ulang. Poin kuning adalah untuk setelah konfigurasi ulang yang menyebabkan penyimpangan dalam distribusi bacaan (tetapi normal). Poin merah adalah hasil modifikasi ilegal dari poin kuning. Dengan kata lain, mereka adalah anomali yang harus dideteksi.

Saya ingin tahu apakah estimasi fungsi pemulusan Kernel ('pdf', 'survivor', 'cdf', dll.) Dapat membantu atau tidak. Adakah yang bisa membantu tentang fungsi utama mereka (atau metode perataan lainnya) dan pembenaran untuk digunakan dalam konteks untuk menyelesaikan masalah?

Arkan
sumber
3
Apa yang membuat outlier ini dan bukan yang kuning? Apakah Anda memiliki contoh outlier atau Anda hanya mendapatkan satu set? Apakah ini mirip dengan yang ini? Berapa dimensi?
Jan van der Vegt
Terima kasih. Poin adalah pembacaan sensor selama sehari. Tetapi nilai-nilai sensor berubah karena konfigurasi ulang sistem (lingkungan tidak statis). Poin biru adalah untuk periode sebelum konfigurasi ulang. Poin kuning adalah untuk setelah konfigurasi ulang yang menyebabkan penyimpangan dalam distribusi bacaan (tetapi normal). Poin merah adalah hasil dari memodifikasi poin kuning secara ilegal. Itu adalah satu dimensi.
Arkan
1
Seberapa sering konfigurasi ulang ini terjadi? Apakah poin merah ini selalu terjadi? Anda bisa melihat beberapa metode penghalusan seri waktu.
Jan van der Vegt
Ini dinamis dan tidak ada yang pasti. Tidak. Poin merah adalah anomali yang diciptakan oleh modifikasi ilegal dan tidak selalu terjadi. Apakah saya akan meminta Anda menyebutkan beberapa metode terkenal (metode smoothing)? Apa fungsi utama mereka?
Arkan
Saat Anda mencari perubahan level, Anda dapat menemukan perubahan dalam intersep. Posting data Anda Lihat kertas oleh Balke Mendeteksi Pergeseran Tingkat dalam Rangkaian Waktu Nathan S. Balke Jurnal Bisnis & Statistik Ekonomi Vol. 11, No. 1 (Jan., 1993), hlm. 81-92
Tom Reilly

Jawaban:

3

Anda dapat melihat data sebagai deret waktu di mana pengukuran biasa menghasilkan nilai yang sangat dekat dengan nilai sebelumnya dan kalibrasi ulang menghasilkan nilai dengan perbedaan besar dengan pendahulunya.

Berikut adalah contoh data yang disimulasikan berdasarkan distribusi normal dengan tiga cara berbeda yang serupa dengan contoh Anda. masukkan deskripsi gambar di sini

Dengan menghitung selisih dengan nilai sebelumnya (semacam derivasi) Anda mendapatkan data berikut:

masukkan deskripsi gambar di sini

Interpretasi saya dari deskripsi Anda adalah, bahwa Anda mentolerir kalibrasi ulang (yaitu menunjuk pada jarak yang lebih besar dari nol, merah dalam diagram), tetapi mereka harus bertukar antara nilai positif dan negatif (yaitu sesuai dengan pergeseran dari kondisi biru ke warna kuning dan kembali).

Ini berarti Anda dapat mengatur alarm melihat titik merah kedua di sisi negatif atau positif .

Pembom Marmite
sumber
Saya sangat menghargai tanggapan Anda. Ya, kita dapat mengatakan itu seperti kalibrasi ulang dan ini analogi yang bagus. Pendekatanmu bagus. Saya mengujinya. Hasilnya persis seperti yang Anda gambar. Titik merah pertama adalah titik pertama dari titik kuning. Titik kedua adalah titik pertama dari titik merah. Titik merah ketiga adalah titik terakhir dari titik merah. Karena itu, sulit untuk menemukan pengetahuan dari data ini. Ini karena kita tidak bisa membahas titik merah setelah titik merah pertama. Kita mungkin perlu memvisualisasikan data primer untuk menyimpulkan tetapi ini adalah intervensi manusia.
Arkan
@Marmite Bomber Akan lebih baik jika Anda berbagi potongan kode untuk menangkap ide dari sudut pandang pemrograman.
Mario
@ Mario ide bagus - biarkan saya melihat apakah saya dapat menemukannya setelah lebih dari dua tahun;)
Marmite Bomber
@ Mario lihat jawaban saya yang lain;)
Marmite Bomber
@MarmiteBomber terima kasih atas umpan baliknya tetapi saya tertarik pada kode Python!
Mario
0

Jika Anda menggunakan pencatatan Anda dapat menggunakan rata-rata berjalan yang me-reset jika konfigurasi berubah. Namun, ini akan memiliki kelemahan yang Anda butuhkan setidaknya beberapa data sebelum Anda dapat mendeteksi pencilan seperti itu.

Data Anda terlihat agak "bagus" (tidak terlalu berisik). Saya akan merekomendasikan mengambil rata-rata selama 10-20 poin terakhir dalam konfigurasi yang sama. Jika nilai-nilai ini adalah semacam jumlah yang dihitung, Anda dapat mengambil kesalahan poisson untuk masing-masing poin data dan menghitung rata-rata kesalahan.

Berapa banyak data historis yang Anda miliki? Jika Anda memiliki banyak, Anda dapat menggunakannya untuk menyempurnakan tingkat alarm Anda sedemikian rupa sehingga Anda mendapatkan rasio yang dapat diterima dari semua pencilan nyata saat mendapatkan sedikit peringatan palsu. Apa yang dapat diterima tergantung pada masalah spesifik. (Biaya Positif Palsu atau tidak terdeteksi outlier dan kelimpahannya).

El Burro
sumber
Terima kasih. Sayangnya, konfigurasi ulangnya berbeda dan ini tidak memungkinkan kami menyetel laju alarm. Bisakah Anda menjelaskan lebih banyak tentang rata-rata poin terbaru?
Arkan
Saya berasumsi bahwa titik data ini berada dalam urutan kronologis yang benar? Kemudian Anda dapat untuk setiap titik menggunakan informasi sumbu y (Data dalam plot Anda) dari titik XX terakhir. Katakanlah 10 tetapi ini jelas sedikit tergantung pada bagaimana data Anda terlihat. Untuk 10 poin ini Anda kemudian menghitung rata-rata atau lebih baik jika Anda memiliki perkiraan kesalahan pada pengukuran individu kesalahan tertimbang.
El Burro
Anda masih dapat menyetel laju alarm karena Anda tidak mendefinisikan alarm sebagai penyimpangan dari nilai tetap lebih besar dari X tetapi sebagai penyimpangan dari rata-rata bergerak.
El Burro
Terima kasih. Mereka dalam urutan kronologis. Saya bertanya-tanya apakah estimasi fungsi pemulusan kernel adalah bantuan atau tidak.
Arkan
Saya akan menyarankan mulai dengan rata-rata bergerak sederhana yang mengatur ulang untuk setiap perubahan konfigurasi dan melihat apakah itu menyelesaikan pekerjaan. Jika Anda tidak memiliki informasi yang tersedia ketika perubahan konfigurasi terjadi berdasarkan bagaimana ini terlihat oleh mata saya tidak melihat pilihan lain yang dapat diandalkan untuk memisahkan kuning dari merah. Setidaknya dalam contoh yang diberikan itu tidak terlihat seperti bentuk yang sangat berbeda antara keduanya.
El Burro
0

Mari kita ilustrasikan pendekatan yang diusulkan dalam jawaban lain dengan contoh sederhana

Dapatkan Data

Kami akan mensimulasikan data dengan tujuh potongan yang diproduksi dengan distribusi normal dengan cara yang berbeda.

Ini penting karena memungkinkan kita untuk secara jelas membedakan antara kelompok dan untuk mendeteksi titik-titik pemecahan. Jawaban ini menggunakan pendekatan ambang batas dasar, beberapa cara yang lebih maju mungkin diperlukan untuk data Anda yang sebenarnya.

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)

masukkan deskripsi gambar di sini

Turunkan Breaking Points

Dengan perbedaan sederhana ke titik sebelumnya lag(y) kita mendapatkan outlier. Mereka diklasifikasi menggunakan ambang.

masukkan deskripsi gambar di sini

Perubahan Klasifikasi Perilaku

Berdasarkan aturan yang Anda jelaskan, titik puncaknya diklasifikasikan sebagai OKdan problem.

Aturan menyatakan bahwa tidak ada dua perubahan dalam arah yang sama diizinkan. Langkah kedua dalam arah previos dianggap sebagai masalah.

Anda mungkin perlu menyesuaikan interpretasi sederhana ini jika logik Anda lebih maju.

## 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

Presentasi

Akhirnya Anda memproyeksikan outlier yang diakui ke data asli

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

masukkan deskripsi gambar di sini

Pembom Marmite
sumber