Pertanyaan Cara menghapus pencilan dari kumpulan data


Saya punya beberapa data multivariat kecantikan vs usia. Usia berkisar antara 20-40 dengan interval 2 (20, 22, 24 .... 40), dan untuk setiap catatan data, mereka diberi usia dan peringkat kecantikan dari 1-5. Ketika saya melakukan boxplots dari data ini (usia di sepanjang sumbu X, peringkat kecantikan di sepanjang sumbu Y), ada beberapa outlier yang diplot di luar kumis setiap kotak.

Saya ingin menghapus pencilan ini dari frame data itu sendiri, tetapi saya tidak yakin bagaimana R menghitung outliers untuk plot kotaknya. Di bawah ini adalah contoh dari apa yang tampak seperti data saya. enter image description here


75
2018-01-24 21:23


asal


Jawaban:


Oke, Anda harus menerapkan sesuatu seperti ini ke kumpulan data Anda. Jangan gantikan & simpan atau Anda akan menghancurkan data Anda! Dan, btw, Anda harus (hampir) tidak pernah menghapus pencilan dari data Anda:

remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- NA
  y[x > (qnt[2] + H)] <- NA
  y
}

Untuk melihatnya beraksi:

set.seed(1)
x <- rnorm(100)
x <- c(-10, x, 10)
y <- remove_outliers(x)
## png()
par(mfrow = c(1, 2))
boxplot(x)
boxplot(y)
## dev.off()

Dan sekali lagi, Anda tidak seharusnya melakukan ini sendiri, pencilan hanya dimaksudkan untuk menjadi! =)

EDIT: saya tambahkan na.rm = TRUE sebagai default.

EDIT2: Dihapus quantile berfungsi, menambahkan subscripting, sehingga membuat fungsi lebih cepat! =)

enter image description here


92
2018-01-24 22:47



Tidak ada yang memposting jawaban yang paling sederhana:

x[!x %in% boxplot.stats(x)$out]

Lihat juga ini: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/


106
2018-02-08 19:24



Menggunakan outline = FALSE sebagai pilihan ketika Anda melakukan boxplot (baca bantuan!).

> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)

enter image description here


25
2018-01-24 21:44



Fungsi boxplot mengembalikan nilai yang digunakan untuk melakukan penggambaran (yang sebenarnya kemudian dilakukan oleh bxp ():

bstats <- boxplot(count ~ spray, data = InsectSprays, col = "lightgray") 
#need to "waste" this plot
bstats$out <- NULL
bstats$group <- NULL
bxp(bstats)  # this will plot without any outlier points

Saya sengaja tidak menjawab pertanyaan spesifik karena saya menganggapnya malpraktik statistik untuk menghapus "outliers". Saya menganggapnya sebagai praktik yang dapat diterima untuk tidak merencanakannya dalam sebuah kotak, tetapi menghapusnya adalah pengandaian yang sistematis dan tidak beralasan dari catatan pengamatan.


16
2018-01-24 22:04



x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

Saya menemukan ini sangat mudah untuk menghapus outlier. Dalam contoh di atas saya hanya mengekstraksi 2 persentil menjadi 98 persentil dari nilai atribut.


6
2017-10-23 04:55



Saya mencari paket yang berkaitan dengan penghapusan pencilan, dan menemukan paket ini (secara mengejutkan disebut "pencilan"!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
jika Anda melaluinya Anda melihat cara-cara berbeda untuk menghilangkan pencilan dan di antara mereka saya temukan rm.outlier paling nyaman untuk digunakan dan seperti yang tertulis di tautan di atas: "Jika pencilan terdeteksi dan dikonfirmasi oleh uji statistik, fungsi ini dapat menghapusnya atau mengganti dengan sampel mean atau median "dan juga di sini adalah bagian penggunaan dari sumber yang sama:
"Pemakaian

rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)

Argumen 
x  kumpulan data, paling sering sebuah vektor. Jika argumen adalah dataframe, maka outlier adalah dihapus dari masing-masing kolom dengan sapply. Perilaku yang sama diterapkan dengan menerapkan ketika matriks diberikan.
mengisi  Jika diset TRUE, median atau mean ditempatkan sebagai ganti outlier. Jika tidak, itu outlier (s) hanya dihapus.
median  Jika diset TRUE, median digunakan sebagai ganti pengganti outlier. sebaliknya jika diatur ke TRUE, memberikan nilai yang berlawanan (jika nilai terbesar memiliki perbedaan maksimum dari mean, itu memberi terkecil dan sebaliknya) "


4
2017-12-29 01:10



Menambah saran @sefarkas dan menggunakan kuantil sebagai cut-off, seseorang dapat menjelajahi opsi berikut:

newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) ) 

Ini akan menghapus poin poin di luar kuantil ke-99. Perawatan harus diambil seperti apa yang dikatakan L3Xa tentang menjaga outliers. Ini harus dihapus hanya untuk mendapatkan pandangan konservatif alternatif dari data.


3
2018-03-19 06:06



Tidak akan:

z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) & 
        df$x < quantile(df$x, .75) + 1.5*IQR(df$x)]

menyelesaikan tugas ini dengan mudah?


1
2017-07-28 17:36