R で外れ値を削除する方法
外れ値とは、データセット内の他の値から異常に離れている観測値です。外れ値は分析結果に影響を与える可能性があるため、問題となる場合があります。
このチュートリアルでは、R で外れ値を特定して削除する方法を説明します。
R で外れ値を特定する方法
外れ値を削除する前に、まず何を外れ値とみなすかを決定する必要があります。これを行うには、次の 2 つの一般的な方法があります。
1. 四分位範囲を使用します。
四分位範囲 (IQR) は、データセット内の 75 パーセンタイル (Q3) と 25 パーセンタイル (Q1) の差です。値の平均 50% の分布を測定します。
観測値が第 3 四分位 (Q3) より上の四分位範囲の 1.5 倍、または第 1 四分位 (Q1) より下の四分位範囲の 1.5 倍である場合、その観測値を外れ値として定義できます。
外れ値 = 観測値 > Q3 + 1.5*IQR または < Q1 – 1.5*IQR
2. Z スコアを使用します。
Z スコアは、指定された値が平均からどれだけ標準偏差があるかを示します。次の式を使用して Z スコアを計算します。
z = (X – μ) / σ
金:
- X は単一の生データ値です
- μ は母平均です
- σ は母集団の標準偏差です
Z スコアが -3 未満または 3 より大きい場合、観測値を外れ値として定義できます。
外れ値 = Z スコアが 3 を超える、または -3 未満の観測値
R で外れ値を削除する方法
何が外れ値であると考えるかを決定したら、それらを特定してデータセットから削除できます。これを行う方法を説明するために、次のデータ フレームを使用します。
#make this example reproducible set.seed(0) #create data frame with three columns A', 'B', 'C' df <- data.frame(A=rnorm(1000, mean=10, sd=3), B=rnorm(1000, mean=20, sd=3), C=rnorm(1000, mean=30, sd=3)) #view first six rows of data frame head(df) ABC 1 13.78886 19.13945 31.33304 2 9.02130 25.52332 30.03579 3 13.98940 19.52971 29.97216 4 13.81729 15.83059 29.09287 5 11.24392 15.58069 31.47707 6 5.38015 19.79144 28.19184
次に、Z スコア法または四分位範囲法を使用して外れ値を定義し、削除できます。
Zスコア法:
次のコードは、データ フレームの各列の各値の Z スコアを計算し、絶対値が 3 より大きい Z スコアを少なくとも 1 つ持つ行を削除する方法を示しています。
#find absolute value of z-score for each value in each column z_scores <- as.data.frame (sapply(df, function(df) (abs(df-mean(df))/sd(df)))) #view first six rows of z_scores data frame head(z_scores) ABC 1 1.2813403 0.25350805 0.39419878 2 0.3110243 1.80496734 0.05890232 3 1.3483190 0.12766847 0.08112630 4 1.2908343 1.32044506 0.38824414 5 0.4313316 1.40102642 0.44450451 6 1.5271674 0.04327186 0.70295309 #only keep rows in dataframe with all z-scores less than absolute value of 3 no_outliers <- z_scores[!rowSums(z_scores>3), ] #view row and column count of new data frame dim(no_outliers) [1] 994 3
元のデータ フレームには 1000 行と 3 列がありました。新しいデータ フレームには 994 行と 3 列があり、いずれかの列に絶対値が 3 より大きい Z スコアが少なくとも 1 つ含まれていたため、6 行が削除されたことがわかります。
四分位範囲法:
場合によっては、データ フレームの列内の外れ値のみを特定したい場合があります。たとえば、データ フレームの列 “A” にある外れ値のある行のみを削除したいとします。
次のコードは、列 “A” の値が第 3 四分位 (Q3) より上の四分位範囲の 1.5 倍、または第 1 四分位より下の四分位範囲 (Q1) の 1.5 倍である行をデータ フレームから削除する方法を示しています。 。
#find Q1, Q3, and interquartile range for values in column A Q1 <- quantile(df$A, .25) Q3 <- quantile(df$A, .75) IQR <- IQR(df$A) #only keep rows in dataframe that have values within 1.5*IQR of Q1 and Q3 no_outliers <- subset(df, df$A> (Q1 - 1.5*IQR) & df$A< (Q3 + 1.5*IQR)) #view row and column count of new data frame dim(no_outliers) [1] 994 3
元のデータ フレームには 1000 行と 3 列がありました。新しいデータ フレームには 994 行と 3 列があり、列 A に少なくとも 1 つの外れ値が含まれていたために 6 行が削除されたことがわかります。
外れ値を削除する場合
1 つ以上の外れ値が存在する場合は、まず、それらがデータ入力エラーの結果ではないことを確認する必要があります。データを保存するときに、単純に間違ったデータ値を入力してしまうことがあります。
外れ値がデータ入力エラーの結果であることが判明した場合は、データ セットの平均や中央値などの新しい値を割り当てることができます。
値が本当に外れ値であり、分析全体に重大な影響を与える場合は、その値を削除することを選択できます。最終レポートまたは分析では、外れ値を削除したことを必ず明記してください。
追加リソース
このチュートリアルでは、 rnorm()を使用して、ベクトル長n 、母平均μ 、母標準偏差σを与えられた正規分布確率変数のベクトルを生成しました。この機能の詳細については、こちらをご覧ください。
また、 sapply()を使用して、Z スコアを計算するデータ フレーム内の各列に関数を適用しました。この機能の詳細については、こちらをご覧ください。