결측값
데이터가 없는 것을 결측값이라 한다. 데이터가 0 이거나 계산될 수 없는 것과는 다르다. R 에서는 NA
로 표기한다.
결측값이 포함되면 당연하게도 데이터 분석에 지장이 생긴다. 다양한 함수에서 해당 데이터를 그대로 사용하지 못하는 것부터 계산했더라도 결측값이 있는 데이터가 얼마나 정확한지에 대한 검증이 없기 때문에 신뢰성에 문제가 생긴다. 따라서 결측값을 사전에 전처리(preprocessing) 해주어야 한다.
- 결측값 확인
is.na(data)
is.na()
함수로 결측값을 확인할 수 있는데, 결측값이면 TRUE를, 없으면 FALSE를 반환한다. 만약 단일 변수가 아니라면 해당 자료형에 맞춰 TRUE와 FALSE를 반환한다.
예를 들어 아래와 같은 코드가 있다 해보자.
vdata <- c(1,5,NA,3,5,NA,3)
dfdata <- data.frame(c(0,1,3,NA,3,NA), c(1,2,5,NA,4,9))
is.na(vdata)
is.na(dfdata)
출력은 다음과 같다.
> is.na(vdata)
[1] FALSE FALSE TRUE FALSE FALSE TRUE FALSE
> is.na(dfdata)
c.0..1..3..NA..3..NA. c.1..2..5..NA..4..9.
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,] TRUE TRUE
[5,] FALSE FALSE
[6,] TRUE FALSE
이를 활용하여 데이터에 얼마나 많은 결측값이 있는지 확인할 수 있다. sum()
함수를 통해 계산된 TRUE, FALSE를 모두 더해주면 TRUE는 1, FALSE는 0으로 계산되므로 결측값의 수가 반환된다.
> sum(is.na(vdata))
[1] 2
> sum(is.na(dfdata))
[1] 3
rowSums()
함수를 이용하면 데이터 각 행별 결측값도 확인할 수 있다.
rowSums(is.na(data))
위에서 사용한 데이터프레임 데이터를 사용하면 출력은 다음과 같다.
> rowSums(is.na(dfdata))
[1] 0 0 0 2 0 1
- 결측값 대체 및 제거
is.na()
함수를 이용해서 데이터의 결측값에 접근할 수 있다. 그리고 이를 통해서 결측값을 대체할 수 있다.
위와 같은 데이터에 대해서 다시 결측값을 모두 0으로 대체하는 코드는 아래와 같다.
vdata[is.na(vdata)] <- 0
dfdata[is.na(dfdata)] <- 0
na.omit()
함수를 이용하여 결측값을 제거할 수도 있다.
na.omit(data)
na.omit()
함수는 결측값을 제거한 데이터를 반환하는데, 데이터프레임이나 매트릭스의 경우 결측값이 포함된 행이나 열을 제거한다. 이때 반환된 데이터를 as.vector()
와 같은 함수를 이용하여 다시 사용하던 자료형으로 만들어 처리하여야 한다.
complete.cases(data)
complete.cases()
함수는 어떤 데이터셋에서 결측값이 없는 완전한 행을 반환한다. 이를 이용하여 아래와 같이 결측값이 포함된 행들을 제거할 수도 있다.
clean_data <- data[complete.cases(data),]
특이값
특이값은 정상적인 데이터 분포에서 벗어난 값으로 이상치라고도 하며, 데이터 분석 시 주의 깊게 다루어야 한다. 예를 들어, 한국인의 키 데이터를 조사할 때 220cm라는 값이 있다면 이는 정상적인 분포에서 벗어난 값으로 볼 수 있다. 또, 1800cm와 같은 값이 포함되어 있다면, 이는 입력 오류로 인해 발생한 값일 가능성이 크다. 이때 이러한 데이터를 그대로 포함하여 분석을 진행한다면, 특이값의 영향력으로 인해 편향된 분석이 될 가능성이 크다.
즉, 특이값이 실제 존재하는 극단적인 데이터이든, 오류로 인해 생긴 데이터이든 이를 확인하는 과정은 필수적이다. 특이값을 제거하거나 적절히 처리함으로써 보다 정밀하고 신뢰성 있는 데이터 분석을 수행할 수 있다.
일반적으로 박스플롯을 이용하여 특이값을 확인하고, 처리한다. 박스플롯은 4분위수를 이용하여 정상 범위를 지정하고, 정상 범위를 넘는 값을 특이값으로 처리하여 시각화해주기 때문에 특이값처리에 유용하다.
vdata <- c(1,5,3,3,5,7,3,9,12,3,22)
boxplot(vdata)
위와 같은 코드에 대한 출력으로 나온 박스플롯 이미지는 아래와 같다.
위에 있는 점 하나가 특이값으로 데이터의 22에 해당하는 값이다.
특이값 자체는 아래와 같은 코드로 확인할 수 있다.
boxplot.stats(data)$out
위 벡터 데이터에 대한 출력은 다음과 같다.
boxplot.stats(vdata)$out
[1] 22
특이값을 추출하였다면 이 특이값을 결측값으로 대체하고, 다시 결측값을 제거하는 방법으로 특이값을 제거할 수 있다. 벡터에서 특이값을 제거하는 코드는 아래와 같다.
out.val <- boxplot.stats(vdata)$out
vdata[vdata %in% out.val] <- NA
clean_vdata <- as.vector(na.omit(vdata))
데이터프레임이나 매트릭스에서는 각 행이나 열마다 이를 실행해주면 된다.
'Language > R' 카테고리의 다른 글
[R] 다중변수 탐색적 자료 분석(EDA) (0) | 2024.10.28 |
---|---|
[R] 단일변수 탐색적 자료 분석(EDA) (0) | 2024.10.28 |
[R] which 를 이용한 데이터 위치 확인 (0) | 2024.10.27 |
[R] for 와 while 을 통한 반복문 및 apply (0) | 2024.10.27 |
[R] 데이터 파일과 사용자 정의 함수 및 변수 불러오기 (0) | 2024.10.14 |