web-dev-qa-db-ja.com

データセットから外れ値を削除する方法

美と年齢の多変量データがあります。年齢は2(20、22、24 .... 40)の間隔で20〜40の範囲であり、データの各レコードには、年齢と1〜5の美しさの評価が与えられます。このデータの箱ひげ図(X軸の年齢、Y軸の美しさの評価)を行うと、各箱のひげの外側にいくつかの外れ値がプロットされます。

これらの外れ値をデータフレーム自体から削除したいのですが、Rがそのボックスプロットの外れ値をどのように計算するのかわかりません。以下は、私のデータがどのように見えるかの例です。 enter image description here

90
Dan Q

OK、このようなものをデータセットに適用する必要があります。置き換えて保存しないでください。データが破壊されます。そして、ところで、(ほとんど)データから外れ値を削除しないでください:

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
}

動作を確認するには:

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

繰り返しになりますが、これを自分で行うことは絶対にしないでください。 =)

編集:デフォルトとしてna.rm = TRUEを追加しました。

EDIT2:quantile関数を削除し、添え字を追加したため、関数が高速になりました! =)

enter image description here

105
aL3xa

誰も最も簡単な答えを投稿していません:

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

こちらもご覧ください: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/

121
J. Win.

Boxplotを実行するときに、オプションとしてoutline = FALSEを使用します(ヘルプをお読みください!)。

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

enter image description here

26

Boxplot関数は、プロットの実行に使用される値を返します(実際には、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

「外れ値」を削除することは統計上の不正行為であると考えているため、意図的に特定の質問に答えませんでした。それらを箱ひげ図にプロットしないことは許容できる慣行であると考えていますが、それらが標準偏差の数または四分位幅の数を超えているという理由だけでそれらを削除することは、観測記録の体系的で非科学的なマングリングです。

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

外れ値を削除するのは非常に簡単です。上記の例では、属性値の2パーセンタイルから98パーセンタイルを抽出しています。

6
Gaurav Khare

外れ値の削除に関連するパッケージを探したところ、このパッケージが見つかりました(驚くほど「外れ値」と呼ばれています!): https://cran.r-project.org/web/packages/outliers/outliers.pdf =
それを調べてみると、外れ値を削除するさまざまな方法がありますが、その中でrm.outlierを使用するのが最も便利であり、上記のリンクで述べているように:関数はそれを削除するか、サンプルの平均値または中央値で置き換えることができます」と同じソースからの使用部分もここにあります:
"使用法

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

引数
xデータセット、最も頻繁にはベクトル。引数がデータフレームの場合、sapplyにより各列から外れ値が削除されます。マトリックスが指定されている場合、同じ動作がapplyによって適用されます。
fillTRUEに設定すると、外れ値の代わりに中央値または平均値が配置されます。それ以外の場合、外れ値は単純に削除されます。
medianTRUEに設定すると、外れ値の置換で平均の代わりに中央値が使用されます。 TRUEに設定すると、反対の値を返します(最大値が平均との差が最大の場合、最小値を返します)

6
Peyman

@sefarkasの提案に加えて、分位点をカットオフとして使用して、次のオプションを検討できます。

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

これにより、99番目の分位点を超えるポイントが削除されます。 aL3Xaが異常値を保持することについて言っているように注意する必要があります。データの代替の保守的なビューを取得するためにのみ削除する必要があります。

4
KarthikS

しません:

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

このタスクを簡単に達成できますか?

3
d8aninja