R 데이터 내 이상치, 극단치 제거하는 법

728x90
반응형

이상치, 극단치란 다른 값의 패턴에 벗어난 값. 즉 분포에 비해 값이 비상식적으로 작거나 큰 값을 말한다.

 

이 값들에는 두가지 경우가 있는데 1) 비상식적인 값이나 2)극단적으로 작거나 큰 값이다

1) 비상식적인 값은 결측치로 취급하여 제외하고

2)극단적으로 작은 값이나 큰 값은 전체 분포 데이터의 정상범위내로 대체하여 입력한다

 

1) 비상식적인 값 제거 방법

결측치를 추가하고 제거하는 순서의 코드는 아래와 같다.

library(dplyr)
#데이터프레임 예시
outlier <- data.frame(gender = c(1,2,3,1,2,3),
                      score = c(3,4,5,6,1,2))
                      
#이상치를 제거하기 위한 NA 변환
outlier$gender <-  ifelse(outlier$gender == 3, NA, outlier$gender)

outlier$score <- ifelse(outlier$score>5, NA, outlier$s)

#추가된 결측치를 제외하고 평균값 산출
outlier %>% 
  filter(!is.na(score) & !is.na(gender)) %>% 
  group_by(gender) %>% 
  summarise(mean_scr = mean(score))

 

2) 극단치의 값을 변경한 후 산술 방법

일단 극단치를 찾기 위해 boxplot을 사용해서 극단치의 값을 찾는다.

#예시 데이터 할당
mpg <- as.data.frame(ggplot2::mpg)
#박스플롯 표시
boxplot(mpg$hwy)

이 아래의 박스플롯이 추출이 되는데 이 값을 알아보기 위해서는 $stats라는 함수를 boxplot에 추가하면 볼 수 있다.

boxplot(mpg$hwy)$stats

 

$stats를 사용하면 아래의 결과 값을 얻을 수 있고 각각의 행의 의미는 주석과 같다

#결과값
      [,1]
[1,]   12 #박스플롯 하단 경계선
[2,]   18 #박스플롯 1분위 수
[3,]   24 #박스플롯 중앙값
[4,]   27 #박스플롯 3분위 수
[5,]   37 #박스플롯 상단 경계선

 

이제 위의 박스플롯을 통해 값이 12미만, 37초과라면 극단치라는 것을 알 수 있으니 그 값을 filter를 통해 NA로 배정 후 제거하여 연산하면 된다.

#결측치 넣고 table로 결측치 빈도 수 확인하기
mpg$hwy <- ifelse(mpg$hwy > 37 | mpg$hwy < 12, NA, mpg$hwy)
table(is.na(mpg$hwy))

na.rm 활용

#결측치를 na.rm으로 제거하고 평균 구하기
mpg %>%
  group_by(drv) %>% 
  summarise(hwy_mean = mean(hwy, na.rm = T))
728x90
반응형