놀고 싶어요

[R Programming] 데이터 전처리 / 결측값 및 이상값 처리 본문

R

[R Programming] 데이터 전처리 / 결측값 및 이상값 처리

챌린지 2021. 5. 9. 00:23

 

데이터 전처리

데이터 정제(data cleansing)

없는 데이터는 채우고 잡음은 제거하며 모순된 데이터는 정합성이 맞는 데이터로 교정하는 작업

데이터 통합(data integration)

여러개의 파일로 나뉘어 있는 데이터를 결합하여 하나의 통합된 파일로 만드는 작업

데이터 축소(data reduction)

샘플링 등을 통해서 데이터 볼륨을 줄이거나 분석 대상 속성, 변수의 개수를 줄이는 작업

데이터 변환(data transformation)

데이터를 정규화하거나 집단화 하는 작업

 

 

결측값(missing value) 처리하는 방법

1. 정확한 데이터로 다시 준비하거나 2. 해당 데이터 삭제 3. 특정 값으로 채운다.(ex. 평균값으로 채우기)

 

 

is.na 함수를 이용하여 NA 여부를 알 수는 있어도 결측값이 어디에 있는지 알기는 어렵다.

 

R에서는 TRUE는 1 FALSE는 0으로 취급한다. 반환된 18,351은 TRUE 개수를 의미하므로 18,351개의 NA 값이 들어 있다는 것을 의미한다.

 

결측값이 들어있는 행을 확인하는 방법

sum(is.na(변수$컬럼명))

너무 불편하고, 컬럼이 아주 많으면 실수할 확률이 큼 -> colSums(is.na(변수))

 

colSums(is.na(변수))

각 컬럼 이름과 해당 컬럼의 결측값 수를 반환해 준다.

 

colSums을 통해 얻은 결측값이 많은 컬럼에 대하여 결측값 처리를 해준다.

 

1. Gender

컬럼별로 비어있는 결과 값을(NA) 찾는다.

bike_data$Gender[is.na(bike_data$Gender)]

--> Gender에서 NA인 결과 값이 많으므로 데이터 삭제는 불가능.

 

NA인 결과값에 U를 집어 넣는다.

bike_data$Gender[is.na(bike_data$Gender)] <- 'U'

 

모든 결측값이 U로 대체 되어서 is.na에 걸리는 데이터가 없음을 알 수 있다.

 

 

 

 

 

gender 컬럼에 있는 데이터 중 f -> F, m -> M으로 바꿔준다.

bike_data$Gender[bike_data$Gender == 'f' ] <- 'F'

bike_data$Gender[bike_data$Gender == 'm' ] <- 'M'

 

 

2. Momentum 

 

filter함수를 사용하여 Momentum 컬럼이 NA인 행을 조회해온다.

Momentum 컬럼에서 NA인 데이터 (9개 모두)를 모든 컬럼을 포함해서 보여준다.

ex) filter(bike_data, is.na(Momentum))= bike_data %>% filter(is.na(Momentum))

filter(파일 변수, is.na(컬럼명))
파일 변수 %>% filter(is.na(Momentum))

%>% : 파이프연산자

중간에 생기는 임시변수의 사용을 줄여주고 앞의 연산 결과를 뒤에 있는 함수로 넘겨서 효율을 높이고 이해하기 쉽게 흐름에 따라 작성된다. (코드 효율성)

- magrittr 패키지를 사용하면 쓸 수 있는 기능

- tidyverse 패키지에 포함되어 있음

- 단축키 Shift + Ctrl + M (Mac: Shift+Command+M)

 

 

 

Momentum 값이 NA가 아닌 행들 조회

Momentum 컬럼의 값이 NA인 데이터들은 삭제한다.

bike_data <- bike_data %>% filter(is.na(Momentum))

NA가 아닌 결과값으로 이루어진 데이터를 다시 원래 데이터 bike_data에 입력해준다.

-> 다시 조회하게 되면 전체 총 행 수는 9개 행을 제외한 36,586행이 조회된다.

 

 

다시 sum(is.na(bike_data))를 실행하여 결측값을 조회해보면 0 으로 조회될 것이다.

 

 

이상값 처리 방법 (outlier)

특정 범위로 벗어나는 극단값으로 대개 분석에서 제외된다.

Tukey 방식

1사분위수 위아래로  IQR의 1.5배에 해당하는 값보다 작고 큰 값의 바깥 값

(Tukey는 1, 3사분위수에서 IQR의 1.5배, IQR은 데이터의 50%를 담고 있다.)

함수 실행시, 함수 전체 코드를 선택하여 Ctrl+Enter를 누른다.

 

tukey_outliers <- function(x, k=1.5, na.rm=TRUE) {

  q <- quantile(x, probs=c(0.25, 0.75), na.rm=na.rm)

  iqr <- diff(q)

  (q[1]-k*iqr <= x) & (x <= q[2]+k*iqr)

}

 

tukey_outliers(bike_data$Distance)

이상값에 해당하는 경우, FALSE 아닐 경우 TRUE

 

데이터 파일의 새로운 컬럼에 outlier 컬럼을 추가하여 입력한다.

outlier sum값을 조회할 경우 Distance 컬럼 중 3058개의 데이터가 이상값에 해당하는 걸 알 수 있다. (Tukey방식 기준)