SW/R

R : 데이터 전처리, 결측값-missing value ( 개념 및 예제 )

얇은생각 2019. 3. 4. 12:30
반응형

데이터 전처리 개요

분석을 위한 데이터셋을 확보했다 하더라도 바로 분석을 할 수 없는 경우가 많습니다. 그 이유는 바로 결측값, 이상치, 오입력 등이 있습니다. 따라서 데이터 분석에 적합하도록 데이터셋을 정제해야 합니다. 바로 이것을 전처리(data preprocessing)라고 합니다. 실제 데이터를 분석하는 시간보다 전처리에 더 많은 시간이 소요되는 경우가 많습니다. 효율적으로 데이터를 전처리 할 수 있는 능력이 중요합니다.

데이터 전처리



결측값(missing value)

결측값은 입력이 누락된 값을 의미합니다. 보통 NA로 출력됩니다. 결측값이 포함되면 산술 연산에 문제가 생깁니다. 대부분의 산술 연산 함수는 결측값을 제외할 수 있는 옵션을 제공합니다. 아래 예제를 참고하세요.


x <- c(1,2,3,NA,5,8) # 데이터 입력
sum(x)
# [1] NA
sum(x, na.rm=T) # 결측값을 제외하고 연산
# [1] 19



또 Vector에 NA 가 몇 개나 포함되어 있는지 확인할 수 있습니다. 아래 예제를 참고하세요.


z <- c(1,2,3,NA,5,NA,8)
is.na(z)
# [1] FALSE FALSE FALSE TRUE FALSE TRUE FALSE
sum(is.na(z))
# [1] 2



또 결측값을 0으로 치환할 수 도 있습니다. 산술 연산 시 0으로 바꿀 수 있겠죠?


z[is.na(z)] <- 0
z
# [1] 1 2 3 0 5 0 8



또한, Vector에 포함된 NA를 제거할 수 있습니다. 아래 예제를 참고하세요.


x <- c(1,2,3,NA,5,8)
x
# [1] 1 2 3 NA 5 8
y <- as.vector(na.omit(x)) # vector 에서 NA 제거
y
# [1] 1 2 3 5 8



2차원 배열의 NA 실습


# NA 를 포함하는 test 데이터 생성
x <- iris
x[1,2]<- NA; x[1,3]<- NA
x[2,3]<- NA; x[3,4]<- NA
head(x)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 NA NA 0.2 setosa
# 2 4.9 3.0 NA 0.2 setosa
# 3 4.7 3.2 1.3 NA setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa



위 예제에서 생성한 예제로 각 컬럼별로 결측값이 몇 개 있는지 확인해보겠습니다.


col_na <- function(y) {
return(sum(is.na(y)))
}
na_count <-sapply(x, FUN=col_na)
na_count
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 0 1 2 1 0



반대로, NA를 포함한 행(row)은 몇 개인지 파악해보겠습니다.


is.na(x) # 데이터셋 전체
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# [1,] FALSE TRUE TRUE FALSE FALSE
# [2,] FALSE FALSE TRUE FALSE FALSE
# [3,] FALSE FALSE FALSE TRUE FALSE

rowSums(is.na(x)) # 행별 NA 개수
# [1] 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# [38] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# [75] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# [112] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# [149] 0 0
sum(rowSums(is.na(x))>0) # NA 가 포함된 행의개수
# [1] 3



NA 를 포함한 행(row)을 제외하고 새로운 데이터 생성할 수 있습니다. 불필요한 데이터를 제거할 수 있습니다.

head(x)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 NA NA 0.2 setosa
# 2 4.9 3.0 NA 0.2 setosa
# 3 4.7 3.2 1.3 NA setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
x[!complete.cases(x),]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 NA NA 0.2 setosa
# 2 4.9 3.0 NA 0.2 setosa
# 3 4.7 3.2 1.3 NA setosa
y <- x[complete.cases(x),]
head(y)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# 7 4.6 3.4 1.4 0.3 setosa
# 8 5.0 3.4 1.5 0.2 setosa
# 9 4.4 2.9 1.4 0.2 setosa



결측값을 적당한 값으로 추정하여 치환할 수 있습니다. mice 해당 라이브러리를 활용해보겠습니다.


library(mice) # 결측값 추정 지원
md.pattern(x) # 결측값 통계
# Sepal.Length Species Sepal.Width Petal.Width Petal.Length
# 147 1 1 1 1 1 0
# 1 1 1 1 1 0 1
# 1 1 1 1 0 1 1
# 1 1 1 0 1 0 2
# 0 0 1 1 2 4
result <- mice(x, m=5, maxit = 50,
method = 'pmm', seed = 500) # 결측값 예측
# iter imp variable
# 1 1 Sepal.Width Petal.Length Petal.Width
# 1 2 Sepal.Width Petal.Length Petal.Width

impute_x <- complete(result,2) # 예측값 반영
head(x)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 NA NA 0.2 setosa
# 2 4.9 3.0 NA 0.2 setosa
# 3 4.7 3.2 1.3 NA setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
head(impute_x)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.2 1.5 0.2 setosa
# 2 4.9 3.0 1.5 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa


반응형