web-dev-qa-db-fra.com

Comment supprimer les points aberrants d'un jeu de données

J'ai des données multivariées sur la beauté et l'âge. Les âges vont de 20 à 40 ans à des intervalles de 2 (20, 22, 24 ... 40), et pour chaque enregistrement de données, un âge et une note de beauté de 1-5 sont attribués. Lorsque je réalise des boîtes à moustaches de ces données (âges sur l'axe des abscisses, évaluations de la beauté sur l'axe des ordonnées), des valeurs aberrantes sont tracées en dehors des moustaches de chaque boîte.

Je souhaite supprimer ces valeurs aberrantes du bloc de données lui-même, mais je ne suis pas sûr de savoir comment R calcule les valeurs aberrantes pour ses diagrammes en boîtes. Vous trouverez ci-dessous un exemple de ce à quoi mes données pourraient ressembler. enter image description here

91
Dan Q

OK, vous devriez appliquer quelque chose comme ceci à votre jeu de données. Ne remplacez pas et ne sauvegardez pas ou vous allez détruire vos données! Et, d'ailleurs, vous ne devriez (presque) jamais supprimer les données aberrantes de vos données:

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
}

Pour le voir en action:

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

Et encore une fois, vous ne devriez jamais le faire vous-même, les valeurs aberrantes sont simplement destinées à être! =)

EDIT: J'ai ajouté na.rm = TRUE par défaut.

EDIT2: Suppression de la fonction quantile, ajout d'un indice, rendant ainsi la fonction plus rapide! =)

enter image description here

105
aL3xa

Personne n'a posté la réponse la plus simple:

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

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

121
J. Win.

Utilisez outline = FALSE comme une option lorsque vous réalisez la boîte à moustaches (lisez l'aide!).

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

enter image description here

26
Prasad Chalasani

La fonction boxplot retourne les valeurs utilisées pour faire le tracé (ce qui est en fait fait par 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

Je n'ai volontairement pas répondu à la question précise, car j'estime qu'il est de la faute statistique d'éliminer les "valeurs aberrantes". Je considère comme une pratique acceptable de ne pas les tracer dans une boîte à moustaches, mais les supprimer simplement parce qu’ils dépassent un certain nombre d’écarts-types ou un certain nombre de largeurs inter-quartiles est une altération systématique et non scientifique du compte rendu d’observation.

16
42-

J'ai cherché des paquets liés à la suppression des valeurs éloignées et trouvé ce paquet (étonnamment appelé "valeurs éloignées"!): https://cran.r-project.org/web/packages/outliers/outliers.pdf =
si vous passez au travers, vous voyez différentes manières de supprimer les valeurs aberrantes et, parmi elles, j’ai trouvé rm.outlier la plus pratique à utiliser, comme il est dit dans le lien ci-dessus: tests statistiques, cette fonction peut l’enlever ou la remplacer par un échantillon de moyenne ou médiane "et voici aussi la partie utilisation de la même source:
" Utilisation

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

Arguments
x un ensemble de données, le plus souvent un vecteur. Si argument est un cadre de données, les valeurs aberrantes sont supprimées de chaque colonne par sapply. Le même comportement est appliqué par apply lorsque la matrice est donnée.
fill Si la valeur est TRUE, la médiane ou la moyenne est placée à la place de la valeur aberrante. Sinon, la ou les valeurs aberrantes sont simplement supprimées.
médiane Si défini sur VRAI, la médiane est utilisée à la place de la moyenne pour le remplacement des valeurs aberrantes. inverse si défini sur TRUE, donne la valeur opposée (si la plus grande valeur a la différence maximale par rapport à la moyenne, elle est la plus petite et vice versa) "

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

Je trouve cela très facile à éliminer les valeurs aberrantes. Dans l'exemple ci-dessus, je viens d'extraire 2 à 98 pourcent des valeurs d'attribut.

6
Gaurav Khare

En ajoutant à la suggestion de @sefarkas et en utilisant un quantile comme limite, on pourrait explorer l'option suivante:

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

Cela supprimera les points points au-delà du 99e quantile. Des précautions doivent être prises comme ce que aL3Xa disait sur le maintien des valeurs aberrantes. Il ne devrait être supprimé que pour obtenir une vue conservatrice alternative des données.

4
KarthikS

Ne serait pas:

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

accomplir cette tâche assez facilement?

4
d8aninja