데이터 분석/R 데이터 처리 & 분석

R 결측치 처리하기(is.na, complete.cases 등)

love R 2020. 6. 13. 04:20
반응형

데이터셋에는 항상 값이 정상적으로 들어가 있지 않습니다. 실제로 결측치를 포함한 데이터셋을 다룰 일이 훨씬 더 많습니다. 이 떄 결측치를 적절하게 처리를 할 수 있어야 합니다. 결측치란 NA(Not Available)라고도 하는데, 원래 정상적으로 데이터가 있어야 하지만 없음을 뜻합니다. 결측치 처리를 잘하느냐 못하느냐에 따라 결과도 달라질 수 있기 때문에 전처리 과정에서 매우 중요한 과정이라고 볼 수 입니다.

 

 

먼저 데이터에 대해 NA가 포함되었는지 여부는 is.na 함수를 사용합니다.

이 함수를 데이터에 적용하면 그 결과형태가 TRUE 또는 FALSE 로 반환되는 logical vector의 형태입니다.

결측치가 포함되어 있다면 결과값이 TRUE 이고 그 반대는 FALSE를 반환합니다.

 

1. NA를 포함한 데이터프레임 생성

다음과 같이 var1 과 var2 에 각각 결측값이 있는 데이터프레임을 생성합니다.

 

 

2. 결측치의 개수 파악하기

결측치를 파악하기 위해 is.na(test)를 입력하면 아래와 같이 logical 타입의 행렬이 나옵니다.

이때 전체 결측치의 개수를 알고 싶다면 sum함수를 이용하여 구합니다. R에서 논리형 타입의 값은 TRUE= 1, FALSE =0 으로 인식합니다. 따라서 TRUE가 두 개 있으므로 그 합은 2가 됩니다.

 

3. 어떤 행이 결측인지 알아내기

complete.cases 함수는 결측치가 없으면 TRUE, 있으면 FALSE를 반환합니다. 행렬 또는 데이터프레임이 인자로 주어질 경우에 해당 행에 NA가 없으면 TRUE를 반환하고, 해당 행에 NA가 하나라도 존재할 시에는 FALSE를 반환합니다.

 

 

test라는 객체에 complete.cases 함수를 적용하면 해당 행에 결측치가 없으면 TRUE, 있으면 FALSE를 반환합니다.

따라서 3행과 5행이 FALSE를 반환하여 결측치가 있다고 판단합니다.

 

이때, 데이터를 추출하기 위해서는 FALSE를 TRUE로 전환시켜줘야 합니다. 왜냐하면 데이터프레임에 접근하는 방법이 TRUE인 행을 반환하기 때문입니다. 느낌표(!)를 앞에 붙여주면 반대의 결과로 나타나게 됩니다..

 

위의 조건을 바탕으로 데이터프레임에 접근하면 NA를 포함한 행이 반환됩니다.

 

4. 결측치를 포함한 계산 방법

test의 var2열의 합을 수행하면  NA가 나오는 것을 볼 수 있습니다. NA를 포함하여 계산을 수행하면 그 반환값도 NA가 됩니다. 따라서 NA를 없어야 제대로 된 계산을 수행합니다. na.rm=TRUE 를 인자로 넣어주게 된다면 NA를 빼고 계산합니다. NA를 제외한 var2열의 합은 10+20+30+40+60 = 160인 것을 확인할 수 있습니다. sum함수 뿐만 아니라 mean, sd, median 등 함수에 동일하게 적용됩니다.

 

 

5. 결측치를 다른 값으로 대체하기

NA를 아예 빼버리고 계산할 수도 있지만 때에 따라서 NA를 다른 값으로 대체하여 계산을 수행할 수도 있습니다. 만약 대체가 필요할 경우 자주쓰는 함수는 ifelse 입니다. ifelse는 조건을 걸고 그 조건이 참일 경우의 반환값, 거짓일 경우의 반환값에 대한 기능을 가지고 있습니다.

 

여기서는 var2의 결측치를 0으로 대체해봅시다. 아래 코드는 var2가 결측치를 포함하고 있으면 0, 그렇지 않으면 원래 숫자 그대로 나오도록 반환합니다. 수행결과를 test2라는 이름으로 저장하고 sum함수를 써보면 위와 동일한 결과를 얻을 수 있습니다. NA가 0으로 대체되었기 때문에 당연히 sum함수 안에 na.rm=TRUE 인자를 넣을 필요가 없습니다.

 

이번에는 NA를 var2열의 평균값으로 대체하고 다시 모든 값의 합을 구해봅시다. NA가 평균값인 32로 대체되었고 그 합은 192로 변경된 것을 확인할 수 있습니다.

 

상황에 따라 결측치를 처리하는 방법이 달라지기 때문에, 위 방법들을 기초로 하여 여러 방식으로 응용해보고 궁금한 점은 댓글로 남겨주세요.

반응형