So entfernen Sie Ausreißer aus einem Datensatz

98

Ich habe einige multivariate Daten von Schönheit gegen Alter. Das Alter reicht von 20 bis 40 in Intervallen von 2 (20, 22, 24 ... 40), und für jede Datenaufzeichnung erhalten sie ein Alter und eine Schönheitsbewertung von 1 bis 5. Wenn ich Boxplots dieser Daten mache (Alter auf der X-Achse, Schönheitsbewertungen auf der Y-Achse), werden einige Ausreißer außerhalb der Whisker jeder Box dargestellt.

Ich möchte diese Ausreißer aus dem Datenrahmen selbst entfernen, bin mir aber nicht sicher, wie R Ausreißer für seine Box-Plots berechnet. Unten finden Sie ein Beispiel dafür, wie meine Daten aussehen könnten. Geben Sie hier die Bildbeschreibung ein

Dan Q.
quelle
2
Die boxplotFunktion gibt die Ausreißer (unter anderem Statistiken) unsichtbar zurück. Versuchen Sie zu foo <- boxplot(...); foolesen ?boxplot, um die Ausgabe zu verstehen.
Joshua Ulrich
Sie sollten Ihre Frage gemäß dem Kommentar bearbeiten, den Sie zu @ Prasads Antwort gegeben haben!
aL3xa
@ aL3xa: Es steht im ersten Satz des zweiten Absatzes.
Joshua Ulrich
24
Relevant: davidmlane.com/ben/outlier.gif
eyjo
Können Sie einen Link zu den Daten senden?
Worte für den

Antworten:

119

OK, Sie sollten so etwas auf Ihren Datensatz anwenden. Nicht ersetzen und speichern, sonst zerstören Sie Ihre Daten! Übrigens sollten Sie (fast) niemals 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, Sie sollten dies niemals alleine tun, Ausreißer sollen es nur sein! =)

BEARBEITEN: Ich habe na.rm = TRUEals Standard hinzugefügt .

EDIT2: Entfernte quantileFunktion hinzugefügt Subskribierung, damit die Funktion schneller gemacht! =)

Geben Sie hier die Bildbeschreibung ein

aL3xa
quelle
Danke für die Hilfe! Ich würde denken, wenn R in der Lage ist, die Ausreißer im Boxplot auszugeben, sollte ich diese Zwischenberechnungen nicht durchführen müssen. Das Löschen von Ausreißern dient nur einer Zuweisung.
Dan Q
3
OK, mir fehlt hier etwas. Sie möchten Ausreißer aus Daten entfernen, damit Sie sie zeichnen können boxplot. Das ist überschaubar, und Sie sollten dann die Antwort von @ Prasad markieren, da Ihre Frage beantwortet wurde. Wenn Sie Ausreißer mithilfe der "Ausreißerregel" ausschließen möchten q +/- (1.5 * H), führen Sie daher eine Analyse durch, und verwenden Sie diese Funktion. Übrigens, ich habe das von Grund auf neu gemacht, ohne zu googeln, also besteht die Möglichkeit, dass ich das Rad mit meiner Funktion neu erfunden habe ...
aL3xa
10
Sie sollten keine Zuordnungsfragen zum Stackoverflow stellen!
Hadley
7
Bedeutet das, dass wir es auch nicht beantworten sollten? =)
aL3xa
5
"Ausreißer sollen nur sein"? Nicht unbedingt. Sie können von Messfehlern herrühren und müssen gründlich überprüft werden. Wenn der Ausreißer zu groß ist, kann dies etwas bedeuten oder nicht so viel. Deshalb sagt der Median (zumindest in der Biologie) normalerweise mehr über eine Population als den Mittelwert aus.
Rodrigo
132

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/

J. Win.
quelle
4
Wirklich elegant. Vielen Dank. Aber seien Sie vorsichtig, wenn die Verteilung mehr als einen Modus hat und Ausreißer in der Tat nur wenige und verstreut sind.
KarthikS
Es wäre großartig gewesen, wenn Sie einen Index von ihnen in einem Datensatz erhalten könnten. Die Art und Weise, wie Sie fertig sind, wird basierend auf dem Datenwert gefiltert. Wenn das Box-Plot auch eine Gruppierung durchführt, ist nicht unbedingt derselbe Datenwert in jeder Gruppe ein Ausreißer
Adam,
2
Es ist auch wichtig zu erwähnen, dass der Datensatz dadurch nicht geändert wird. Dies ist nur eine Filtermethode. Wenn Sie das Dataset also ohne Ausreißer verwenden möchten, weisen Sie es einer Variablen zu. zBresult = x[!x %in% boxplot.stats(x)$out]
Victor Augusto
Nur eine Codezeile zu haben bedeutet nicht unbedingt, dass es einfach ist! Es ist nicht immer einfach, einen einzeiligen Code zu verstehen, insbesondere für Anfänger und ohne Kommentare.
PeyM87
29

Verwenden outline = FALSESie diese Option als Option, wenn Sie das Boxplot erstellen (lesen Sie die Hilfe!).

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

Geben Sie hier die Bildbeschreibung ein

Prasad Chalasani
quelle
4
Dadurch werden zwar die Ausreißer aus dem Boxplot selbst entfernt, aber ich möchte die Ausreißer aus dem Datenrahmen entfernen.
Dan Q
2
Ich sehe, dann, wie @Joshua sagte, müssen Sie sich die von der Boxplot-Funktion zurückgegebenen Daten ansehen (insbesondere die outund groupElemente in der Liste).
Prasad Chalasani
16

Die Boxplot-Funktion gibt die Werte zurück, die für das Plotten verwendet wurden (was dann tatsächlich von bxp () gemacht 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 die spezifische Frage absichtlich nicht beantwortet, weil ich es für statistisch falsch halte, "Ausreißer" zu entfernen. Ich halte es für akzeptabel, sie nicht in einem Boxplot zu zeichnen, sondern sie zu entfernen, nur weil sie eine bestimmte Anzahl von Standardabweichungen oder eine bestimmte Anzahl von Interquartilbreiten überschreiten, ist eine systematische und unwissenschaftliche Verfälschung des Beobachtungsprotokolls.

IRTFM
quelle
4
Nun, die Frage zu umgehen, ohne zu wissen, warum die Frage gestellt wurde, ist auch keine gute Praxis. Ja, es ist nicht gut, Ausreißer aus den Daten zu entfernen, aber manchmal benötigen Sie die Daten ohne Ausreißer für bestimmte Aufgaben. In einer Statistikzuweisung, die ich kürzlich hatte, mussten wir einen Satz ohne Ausreißer visualisieren, um das beste Regressionsmodell für die Daten zu ermitteln. Also da!
Alex Essilfie
4
Ich halte den Rat, den Sie in dieser Hinsicht erhalten haben, um "das beste Regressionsmodell zu bestimmen", nicht für besonders überzeugend. Wenn Sie stattdessen Ausreißer für diesen vage angegebenen Zweck entfernen mussten, spiegelt dies meiner Meinung nach die Personen, die ihn beraten haben, nur schlecht wider, anstatt ein Beweis für die Ungültigkeit meiner Position zu sein.
IRTFM
Ich denke, es ist legitim, wenn Sie wissen, dass Sie "Lärm" entfernen. insbesondere in physiologischen Daten.
Roscoe1895
Ja. Wenn Sie Grund zu der Annahme haben, dass ein separater Prozess das Signal erzeugt, ist dies eine Rechtfertigung für die Entfernung aus den Daten.
IRTFM
9

Ich habe nach Paketen gesucht, die sich auf das Entfernen von Ausreißern beziehen, und dieses Paket gefunden (überraschenderweise "Ausreißer" genannt!): Https://cran.r-project.org/web/packages/outliers/outliers.pdf,
wenn Sie es durchgehen Sehen Sie sich verschiedene Möglichkeiten zum Entfernen von Ausreißern an. Unter diesen fand ich rm.outlierdie bequemste und wie im obigen Link angegeben: "Wenn der Ausreißer durch statistische Tests erkannt und bestätigt wird, kann diese Funktion ihn entfernen oder durch Stichprobenmittelwert oder Median ersetzen." und auch hier ist der Nutzungsteil aus derselben Quelle:
" Nutzung

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

Argumente
x ein Datensatz, am häufigsten ein Vektor. Wenn das Argument ein Datenrahmen ist, wird der Ausreißer durch sapply aus jeder Spalte entfernt. Das gleiche Verhalten wird angewendet, indem angewendet wird, wenn die Matrix angegeben wird.
fill Wenn auf TRUE gesetzt, wird der Median oder Mittelwert anstelle des Ausreißers platziert. Andernfalls werden die Ausreißer einfach entfernt.
Median Wenn TRUE festgelegt ist, wird beim Ersetzen von Ausreißern anstelle des Mittelwerts der Median verwendet. Gegenteil, wenn auf WAHR gesetzt, ergibt sich ein entgegengesetzter Wert (wenn der größte Wert eine maximale Differenz zum Mittelwert aufweist, ergibt er den kleinsten und umgekehrt) "

Peyman
quelle
Dies scheint großartig zu sein, aber wenn Sie eine Zeitreihenspalte in Ihrem Datenrahmen haben, ändert sich die Zeitreihe.
PeyM87
7
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

Ich finde es sehr einfach, Ausreißer zu entfernen. Im obigen Beispiel extrahiere ich nur 2 Perzentile bis 98 Perzentile der Attributwerte.

Gaurav Khare
quelle
5

Würde 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), ] #rows

diese Aufgabe ganz einfach erfüllen?

d8aninja
quelle
4

Wenn man den Vorschlag von @sefarkas ergänzt und Quantil als Grenzwert verwendet, könnte man die folgende Option untersuchen:

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

Dadurch werden die Punktpunkte jenseits des 99. Quantils entfernt. Vorsicht ist geboten, wie es aL3Xa über das Halten von Ausreißern gesagt hat. Es sollte nur entfernt werden, um eine alternative konservative Ansicht der Daten zu erhalten.

KarthikS
quelle
ist es 0.91oder 0.99? wie in mydata$var < quantile(mydata$var, probs=c(.01, .91))[1])odermydata$var < quantile(mydata$var, probs=c(.01, .99))[1])
Komal Rathi
Wenn Sie einen bestimmten Grund haben, das 91. Perzentil anstelle des 99. Perzentils zu verwenden, können Sie es verwenden. Es ist nur eine Heuristik
KarthikS
1

Ein Weg, dies zu tun, ist

my.NEW.data.frame <- my.data.frame[-boxplot.stats(my.data.frame$my.column)$out, ]

oder

my.high.value <- which(my.data.frame$age > 200 | my.data.frame$age < 0) 
my.NEW.data.frame <- my.data.frame[-my.high.value, ]
Seyma Kalay
quelle
0

Ausreißer sind Spitzen sehr ähnlich, daher kann ein Spitzendetektor zur Identifizierung von Ausreißern nützlich sein. Die hier beschriebene Methode hat unter Verwendung von Z-Scores eine recht gute Leistung. Die Animation auf der Seite zeigt die Methodensignalisierung für Ausreißer oder Peaks.

Peaks sind nicht immer dasselbe wie Ausreißer, aber sie sind häufig ähnlich.

Hier wird ein Beispiel gezeigt: Dieser Datensatz wird über serielle Kommunikation von einem Sensor gelesen. Gelegentliche serielle Kommunikationsfehler, Sensorfehler oder beides führen zu wiederholten, eindeutig fehlerhaften Datenpunkten. In diesem Punkt gibt es keinen statistischen Wert. Sie sind wohl keine Ausreißer, sie sind Fehler. Der Z-Score-Peakdetektor konnte auf falschen Datenpunkten signalisieren und erzeugte einen sauberen resultierenden Datensatz:Geben Sie hier die Bildbeschreibung ein

Marc Compere
quelle
-1

Versuche dies. Geben Sie Ihre Variable in die Funktion ein und speichern Sie das O / P in der Variablen, die entfernte Ausreißer enthalten würde

outliers<-function(variable){
    iqr<-IQR(variable)
    q1<-as.numeric(quantile(variable,0.25))
    q3<-as.numeric(quantile(variable,0.75))
    mild_low<-q1-(1.5*iqr)
    mild_high<-q3+(1.5*iqr)
    new_variable<-variable[variable>mild_low & variable<mild_high]
    return(new_variable)
}
Adipta Biwas
quelle
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu. Siehe Antworten .
Ejderuby