Rで外れ値を検出する方法

外れ値

正規分布に従うデータの外れ値の検出

グラブス検定 grubbs test

データが正規分布に従うとき、データ中に含まれる外れ値または異常値を検出する方法である。

x <- rnorm(20)    # 正規分布の乱数を20個生成
x[1] <- 8         # 1番目を外れ値をとする

library(outliers)
grubbs.test(x)
##        Grubbs test for one outlier
##
## data:  x
## G = 3.6497, U = 0.2620, p-value = 1.236e-05
## alternative hypothesis: highest value 8 is an outlier

外れ値が 2 つ存在するときの例。grubbs.test 関数に type オプションに整数値を与えて動作を切り替える。

  • この引数に 20 を与えると、「大きい値から」または「小さい値から」のどちらかの片方向からのみ、外れ値を最大 2 つまで探索する。

  • 11 を与えると、「大きい値から」と「小さい値から」の両方から最大 2 つまでの外れ値を探索する。

  • とくにこの type オプションを利用しない場合は 10 である。片方向から 1 つだけの外れ値を探索する。

# 外れ値が同じ側に2つ存在する場合
x <- rnorm(20)
x[c(1,11)] <- c(8, 9)

library(outliers)
grubbs.test(x, type = 20)
##        Grubbs test for two outliers
## 
## data:  x
## U = 0.1313, p-value < 2.2e-16
## alternative hypothesis: highest values 8 , 9 are outliers


# 外れ値が異なる側に2つ存在する場合
x <- rnorm(20)
x[c(1,11)] <- c(-4, 9)

library(outliers)
grubbs.test(x, type = 11)
##         Grubbs test for two opposite outliers
## 
## data:  x
## G = 5.1954, U = 0.2018, p-value = 0.0005646
## alternative hypothesis: -4 and 9 are outliers

ディクソン検定 dixon test

データが正規分布に従うとき、データ中に含まれる外れ値または異常値を検出する方法である。ディクソン検定の場合は、外れ値を 1 個だけしか検出できない。つまり、データ中に複数の外れ値が含まれている場合、すべて検出することはできない。

x <- rnorm(20)   # 正規分布の乱数を20個生成
x[1] <- c(8)     # 1番目を外れ値をとする

library(outliers)
dixon.test(x)
##         Dixon test for outliers
## 
## data:  x
## Q = 0.6926, p-value < 2.2e-16
## alternative hypothesis: highest value 8 is an outlier

カイ二乗検定 chisquared test

カイ二乗検定による外れ値検出方法である。

x <- rnorm(20)     # 正規分布の乱数を20個生成
x[1] <- 8          # 1番目を外れ値をとする

library(outliers)
chisq.out.test(x)
##        chi-squared test for outlier
## 
## data:  x
## X-squared = 12.1905, p-value = 0.0004803
## alternative hypothesis: highest value 8 is an outlier

コクラン検定 cochran test

コクラン検定を利用した外れ値の検出方法である。複数の実験群が存在したとき、特定の実験群から得られたデータの分散が、他に比べ大きかったり、小さかったりする場合、その値を外れ値とする方法。

x <- data.frame(
       A = rnorm(10), 
       B = rnorm(10),
       C = rnorm(10),
       D = rnorm(10, sd = 5)    # 外れのグループ
     )

library(outliers)

#分散を求めて第1引数に、実験群ラベル1-4を第2引数に与える
cochran.test(apply(x, 2, var), 1:length(x))
##        Cochran test for outlying variance
##
## data:  apply(x, 2, var)
## C = 0.7345, df = 2.5, k = 4.0, p-value = 0.1364
## alternative hypothesis: Group 4 has outlying variance
## sample estimates:
##         1         2         3         4 
## 1.1723261 0.5793089 1.0434416 7.7342000