R에서 이상값을 제거하는 방법


이상값 은 데이터 세트의 다른 값과 비정상적으로 멀리 떨어져 있는 관측값입니다. 이상값은 분석 결과에 영향을 미칠 수 있으므로 문제가 될 수 있습니다.

이 튜토리얼에서는 R에서 이상값을 식별하고 제거하는 방법을 설명합니다.

R에서 이상값을 식별하는 방법

이상값을 제거하려면 먼저 이상값으로 간주할 항목을 결정해야 합니다. 이를 수행하는 두 가지 일반적인 방법이 있습니다.

1. 사분위간 범위를 사용합니다.

IQR(사분위수 범위)은 데이터 세트에서 75번째 백분위수(Q3)와 25번째 백분위수(Q1) 간의 차이입니다. 평균 50% 값의 분포를 측정합니다.

관측치가 세 번째 사분위수(Q3) 위 사분위수 범위의 1.5배이거나 첫 번째 사분위수(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-점수가 하나 이상 있는 행을 제거하는 방법을 보여줍니다.

 #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 점수가 하나 이상 있기 때문에 6개의 행이 제거되었음을 알려줍니다.

사분위간 범위 방법:

어떤 경우에는 데이터 프레임 열의 이상값만 식별하고 싶을 수도 있습니다. 예를 들어 데이터 프레임의 “A” 열에서 이상값이 있는 행만 제거한다고 가정해 보겠습니다.

다음 코드는 열 “A”의 값이 세 번째 사분위수(Q3) 위 사분위수 범위의 1.5배이거나 첫 번째 사분위수(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 열에 하나 이상의 이상값이 포함되어 있기 때문에 6개의 행이 제거되었음을 알려줍니다.

이상값을 제거해야 하는 경우

하나 이상의 이상값이 있는 경우 먼저 데이터 입력 오류로 인한 결과가 아닌지 확인해야 합니다. 때로는 개인이 데이터를 저장하는 동안 단순히 잘못된 데이터 값을 입력하는 경우도 있습니다.

이상값이 데이터 입력 오류의 결과인 것으로 판명되면 데이터 세트의 평균이나 중앙값 과 같은 새 값을 할당하기로 결정할 수 있습니다.

값이 실제로 이상값인 경우 전체 분석에 상당한 영향을 미칠 경우 해당 값을 제거하도록 선택할 수 있습니다. 최종 보고서나 분석에서 이상치를 제거했다는 사실을 꼭 언급하세요.

추가 리소스

이 튜토리얼에서는 rnorm()을 사용하여 벡터 길이 n , 모집단 평균 μ 및 모집단 표준 편차 σ 가 주어진 정규 분포 확률 변수의 벡터를 생성했습니다. 이 기능에 대한 자세한 내용은 여기에서 알아볼 수 있습니다.

또한 sapply()를 사용하여 z-점수를 계산하는 데이터 프레임의 각 열에 함수를 적용했습니다. 이 기능에 대한 자세한 내용은 여기에서 알아볼 수 있습니다.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다