R - 통계 언어
R 데이터 내 이상치, 극단치 제거하는 법
티멀
2022. 6. 1. 17:19
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
반응형