Frage So entfernen Sie Ausreißer aus einem Dataset


Ich habe einige multivariate Daten von Schönheit gegen Alter. Die Altersspanne liegt zwischen 20 und 40 in Intervallen von 2 (20, 22, 24 ... 40) und für jede Datenaufzeichnung erhalten sie eine Alters- und eine Schönheitsbewertung von 1-5. Wenn ich Boxplots dieser Daten mache (Alter über die X-Achse, Schönheitswerte über die Y-Achse), sind einige Ausreißer außerhalb der Whiskers jeder Box aufgetragen.

Ich möchte diese Ausreißer aus dem Datenrahmen selbst entfernen, aber ich bin mir nicht sicher, wie R Ausreißer für seine Box-Plots berechnet. Im Folgenden finden Sie ein Beispiel dafür, wie meine Daten aussehen könnten. enter image description here


75
2018-01-24 21:23


Ursprung


Antworten:


OK, Sie sollten so etwas auf Ihren Datensatz anwenden. Ersetzen und speichern Sie nicht, sonst zerstören Sie Ihre Daten! Und außerdem sollten Sie (fast) nie Ausreißer aus Ihren Daten entfernen:

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
}

Um es in Aktion zu sehen:

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

Und noch einmal sollten Sie das nie alleine machen, Ausreißer sollen nur sein! =)

BEARBEITEN: Ich fügte hinzu na.rm = TRUE als Standard.

EDIT2: Entfernt quantile Funktion, hinzugefügt Subskribierung, damit die Funktion schneller gemacht! =)

enter image description here


92
2018-01-24 22:47



Niemand hat die einfachste Antwort gepostet:

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

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


106
2018-02-08 19:24



Benutzen outline = FALSE als Option, wenn Sie den Boxplot machen (lesen Sie die Hilfe!).

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

enter image description here


25
2018-01-24 21:44



Die Boxplot-Funktion gibt die Werte zurück, die zum Plotten verwendet wurden (was dann tatsächlich von bxp () erledigt wird):

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

Ich habe absichtlich die spezifische Frage nicht beantwortet, weil ich es als statistischen Missbrauch betrachte, "Ausreißer" zu entfernen. Ich halte es für eine akzeptable Praxis, sie nicht in einem Boxplot darzustellen, aber sie zu entfernen ist eine systematische und ungerechtfertigte Verfälschung der Beobachtungsdaten.


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],]

Ich finde das sehr leicht, Ausreißer zu entfernen. Im obigen Beispiel extrahiere ich nur 2 Perzentil zu 98 Prozent der Attributwerte.


6
2017-10-23 04:55



Ich habe nach Paketen gesucht, die mit dem Entfernen von Ausreißern zu tun haben, und habe dieses Paket gefunden (überraschend "Ausreißer" genannt): https://cran.r-project.org/web/packages/outliers/outliers.pdf
Wenn Sie durchgehen, sehen Sie verschiedene Möglichkeiten, Ausreißer zu entfernen, und unter ihnen fand ich rm.outlier am bequemsten zu benutzen und wie es im obigen Link heißt: "Wenn der Ausreißer durch statistische Tests erkannt und bestätigt wird, kann diese Funktion ihn entfernen oder ersetzen Sample Mittelwert oder Median "und auch hier ist der Nutzungsteil aus der gleichen Quelle:
"Verwendung

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

Argumente 
x  ein Datensatz, am häufigsten ein Vektor. Wenn das Argument ein Datenrahmen ist, dann ist der Ausreißer aus jeder Spalte von Sapply entfernt. Das gleiche Verhalten wird angewendet wenn die Matrix gegeben ist.
füllen  Wenn TRUE gesetzt ist, wird der Median oder Mittelwert anstelle von Ausreißer gesetzt. Ansonsten der Ausreißer werden einfach entfernt.
Median  Wenn TRUE gesetzt ist, wird Median anstelle von Mittelwert in Ausreißerersatz verwendet. entgegengesetzt, wenn auf TRUE gesetzt, gibt einen entgegengesetzten Wert (wenn der größte Wert die maximale Differenz hat vom Mittelwert gibt es am kleinsten und umgekehrt) "


4
2017-12-29 01:10



Wenn Sie @sefarkas 'Vorschlag hinzufügen und Quantile als Cut-Offs verwenden, könnte man die folgende Option ausprobieren:

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

Dies entfernt die Punktepunkte über das 99. Quantil hinaus. Es sollte darauf geachtet werden, was aL3Xa über Ausreißer sagte. Es sollte nur entfernt werden, um eine alternative konservative Ansicht der Daten zu erhalten.


3
2018-03-19 06:06



Wäre nicht:

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

Bewerkstelligen Sie diese Aufgabe ganz einfach?


1
2017-07-28 17:36