코딩스토리

4 일차 - 데이터 정제 본문

데이터 분석

4 일차 - 데이터 정제

kimtaehyun98 2021. 1. 27. 16:58

# 이 글을 "Do it! 쉽게 배우는 R 데이터 분석"의 내용을 바탕으로 작성한 글입니다.

 

 

데이터를 사용할 때, 반드시 모든 데이터가 정상적이고 오류가 없을 수는 없다.

 

데이터의 오류는 크게 두 가지 경우로 생각할 수 있다.

 

1. 결측치 : 데이터가 누락됨

2. 이상치 : 정상 범주에서 크게 벗어난 값

 

이제 이러한 오류 데이터들을 어떻게 해결할 것인지에 대해 알아보자.

 

 

결측치

 

결측치가 존재한다면 함수가 제대로 적용되지 않거나, 분석 결과가 왜곡될 수 있다.

 

따라서 미리 결측치가 있는지 확인하고 제거해야 한다.

 

R에서는 결측치를 'NA'로 나타낸다.

 

위의 그림을 보자.

 

반 이름과 학점에 대한 데이터 프레임을 만들어 보았다.

 

이때 5번째 학생의 클래스가 <NA>이고, 2번째 학생의 학점이 NA 이다.

 

그럼 이렇게 결측치를 찾아내려면 모든 데이터를 출력해놓고 NA를 찾아야 할까?

 

당연히 아니다.

 

is.na()란 함수 하나로 결측치들을 찾아낼 수 있다.

 

또한 table() 함수까지 더한다면 더욱 간단하게 확인할 수 있다.

 

그럼 이제 결측치를 제거해보자.

 

먼저 결측치가 있는 행만 추출해보자.

 

library(dplyr)

exam %>% filter(is.na(class))

 

빨간 메시지만 보면 오류 메세지 같아서 약간의 PTSD가 오는데..

 

다행히 읽어보면 오류 메시지는 아닌 것을 확인할 수 있다.

 

그럼 이런 결측치들을 없애고 새롭게 데이터 프레임을 만들어보자.

 

correct_data <- exam %>% filter(!is.na(class) & !is.na(score))

correct_data

 

 

처음에는 이 부분을 보고 이상하게 생각했다.

 

데이터가 잘못된 부분이 있으면 고치는 게 맞지 않나..?? 왜 빼고 새롭게 만들지?

 

근데 잘 생각해보면 없애는 것이 당연하다.

 

데이터를 고친다는 건 내 맘대로 바꾼다는 것이므로 절대 하면 안 될 행동이다.

 

또한 지금은 데이터가 몇 개 없어서 결측치를 제거하면 굉장히 잘못될 것 같지만

 

빅데이터.. 그 정도의 데이터에서 결측치 몇 개 빠진다고 전혀 문제 될 건 없을 것 같다.

(오히려 더 정확해지겠지..)

 

 

이제 결측치를 좀 더 빠르게 제거해보자.

 

앞의 코드들에서는 !is.na(score) 같이 각 변수들을 찾아서 해당하는 행을 제거했다.

 

이번에는 변수를 지정하지 않고 제거해보자.

 

na.omit() 함수를 사용하면 따로 변수를 지정하지 않아도 한 번에 제거해준다.

 

 

근데 잘 생각해보면 가장 좋은 방법은 결측치를 건너뛰고 계산하는 방법 아닐까?

 

내가 이런 생각을 했다면 당연히 똑똑한 사람들도 이런 생각을 이미 했을 것이고 그 방법 또한 만들었을 것이다.

 

그 방법이 바로 na.rm을 사용하는 것이다.

 

위 그림을 보자.

 

원래의 exam$score 변수에는 결측치가 들어있었기 때문에 비정상적인 출력을 한다.

 

우리가 원하는 것은 결측치를 건너뛰고 계산하는 것이다.

 

 

오... 대박

 

내가 계산해보진 않았지만 아마 결측치를 제외한 평균은 4.05가 맞을 것이다.

 

이렇게 na.rm 사용법을 알아보았다. (참고로 na.rm => NA Remove 란 뜻이라고 함)

 

마지막으로 데이터가 적을 때, 아까 말했듯이 결측치를 제외한다면 생각보다 많은 변화로 인해 비정상적인 결과가 나올 수 있다.

 

이러한 경우 결측치를 평균값 또는 최빈값 같은 대표값을 구해 대체하는 방법이 있다고 한다.

 

 

이상치 

 

당연한 말이지만 어느 데이터에나 극단적인 값은 존재할 수 있다.

 

내가 주로 성적에 대한 데이터를 사용했으므로 예를 들어보자면

 

평균 5등급의 친구가 수학은 1등급 최상위권일 수 있다는 이야기이다.

 

이런 경우 데이터의 분석 결과가 왜곡될 수 있기 때문에 미리 제거하는 작업이 필요하다.

 

이제 이상치를 가진 데이터를 생성해보자.

우리 과는 분명 B반까지밖에 없는데 C반이라는 데이터가 존재한다.

 

그리고 우리 학교는 최대 학점이 4.5인데 5.0이란 학점을 받은 데이터가 존재한다.

 

음.. 아주 괘씸한 친구들이야

 

이렇게 이상치를 확인했다.

 

이제 이상치를 없애보자. 앞에 공부했던 내용을 잘 이해했다면 생각보다 간단하다.

 

과정 : 이상치를 확인한다 -> 이상치를 결측치로 변환한다 -> 결측치를 제외한 데이터를 분석한다.

 

전부 앞에서 배웠던 코드들이다.

 

ifelse()를 통해 NA로 변환시켜주면 된다.

 

이후의 작업은 앞에서 했던 작업과 동일하다.

 

 

자, 이제 극단적인 값, 극단 치를 제거해보자.

 

예를 들자면 졸업 학점을 4.5를 받은 데이터가 있다고 생각해보자.

 

물론 받을 수 없는 학점은 아니지만 굉장히, 극히, 아주, 매우 드문 경우이기 때문에 데이터 분석을 할 때 극단치로 간주한다.

 

이제 실제 데이터들로 확인해보자.

 

먼저 첫 시간에 사용했던 mpg 데이터를 불러와서 사용한다.

 

 

굉장히 간단한 코드다.

 

저 오른쪽의 그래프 부분 말고는 다 이해가 가능하다.

 

저 이상하게 생긴 그래프는 어떻게 해석해야 할까?

 

 

책에 나와있는 설명인데 너무 잘 나와있어서..

 

이렇게 극단치를 찾아내었다면, 위에서 했던 작업 똑같이 하면 된다.

 

 

이렇게 4일 차 공부가 끝났다.

 

오늘도 굉장히 깔끔하고 좋았다.

 

이 책이 잘 나와있는 건진 모르겠지만 데이터 분석에 굉장히 애정이 생긴다.ㅎ

 

 

 

 

 

'데이터 분석' 카테고리의 다른 글

6 일차 - 데이터 분석 프로젝트 1  (0) 2021.01.30
5 일차 - 그래프 만들기  (0) 2021.01.28
3 일차 - 데이터 가공  (0) 2021.01.26
2 일차 - 데이터 프레임, 데이터 파악  (0) 2021.01.24
1 일차 - R 기초  (2) 2021.01.22
Comments