결측값 비율 | 내 용 |
---|---|
10% 미만 | 어떤 방법으로든 결측값을 제거한다. |
10% 이상 20% 미만 | Hot-deck, Regression(회귀대체), Model based method |
20% 이상 | Regression, Model based method |
data <- data.frame(sex=c("M","F", NA, "F","M"), score = c(4,5,3,4,NA))
data
is.na(data)
table(is.na(data))
① 단일변수 결측값 제거
install.packages("dplyr");
library(dplyr);
library(ggplot2)
search()
# data 변수에 포함되어 있는 값을 사용한다.
data %>% filter(is.na(score)) #스코어의 결측지를 찾는다.
data %>% filter(!is.na(score)) #스코어의 결측지를 제거한다.
data
#새로운 변수를 만들어 결측지를 제거하고 평균을 계산한다.
data_nomiss <- data %>% filter(!is.na(score))
# score의 평균을 계산한다.
mean(data_nomiss$score)
② N개 변수 결측값 제거
# AND연산자를 사용하여 2개의 변수의 결측값을 제거할 수 있다.
data_nomiss <- data%>%filter(!is.na(score) & !is.na(sex))
# 위와 동일하게 모든 결측값을 제거한다.
data_nomiss <- na.omit(data)
③ 평균값으로 결측값을 대체
#na.rm =T 옵션은 결측값을 제거하고 평균을 계산한다.
x = mean(data$score, na.rm=T)
#만약 data의 score가 결측값일 경우 평균값을 넣고 아닐 경우 그대로 둔다.
data$score <- ifelse(is.na(data$score), x, data$score)
data # 마지막 행의 값이 결측값에서 평균값으로 바뀌었다.
#극단적인 값(이상값)을 가진 벡터데이터를 만들어보자
test = c(1,500,550,560,600)
boxplot(test)
위 사진 자료의 값 1이 다른값에 비에 동떨어진 것을 볼 수 있다.
삭제하는 로직은 다음과 같다.
# 극단적인 값을 제외할 수 있도록 특정값의 범위를 만들어서 그 외의 수를 NA로 넣자
test <- ifelse(test>=500 & test<=600, test, NA)
# 이상 값은 이제 NA로 바뀌었다.이제 NA값을 na.rm=T 옵션을 두어 결측값을 제거하자
boxplot(test, na.rm=T)
boxplot의 의미
사자그림은 사분위수 데이터를 나타낸다.
- 0사분위수 : 최소값
- 1사분위수 : 최소값 ~ 25%번째 값
- 2사분위수 : 중앙값
- 3사분위수 : 중앙값 ~ 75%번째 값
- 4사분위수 : 최대값