여정의 기록

데이터의 NaN값을 확인하고 어떻게 처리할지 생각해보자 (대체하기) 본문

공부/data 전처리, 분석

데이터의 NaN값을 확인하고 어떻게 처리할지 생각해보자 (대체하기)

Chelsey 2021. 9. 7. 02:17
728x90

좌표간의 거리를 구할수 있다. 유클리디아 거리 법 등 방법을 이용해서.

 

 

데이터를 처리하기 위해서는 제일 먼저

1. 구조를 확인한다. 행과 열, 몇 차원인지 이런 것들...

str(data)

2. 값의 형태를 확인한다.

table(data$col)

3. NaN 값이 있는지 동시 확인가능하다.

 table(data$col, useNA="ifany")

4. 기술통계를 확인하여 뭔가... 상식적으로 이상하다는 점을 파악할 수 있다. (이상한 데이터는 다른 데이터로 대체 혹은 NaN값으로 만들 수 있음)

(그런데 여기서 우리는 데이터에 대한 어느정도 상식을 가지고 있어야한다는 점을 생각할 수 있다)

summary(data$col)

 

자, 그러면 이제 NaN값으로 변경해 보자.

1. 해당 컬럼의 summary를 봤을 때 이건 영 아닌 것 같은 값에 대해서

2. 컬럼의 범위를 내가 정해주고 범위를 벗어나면 NaN값으로 만들 수 있다.

   (연습 때는 age라는 열이 sns를 사용하고 졸업연도라는 열과 관련해 생각하면 말이 안되는 값이라고 생각해서, 졸업연도에 맞춰 나이의 범위를 주었다)

3. NaN값을 주고나서 나이의 평균을 확인해보았다.

NaN값이 있으므로, mean(data$col, na.rm=TRUE) 라는 na.rm을 추가적으로 사용해야 NaN값까지 모두 나온다.

 

성별 컬럼의 NaN값이 있는 경우, F, M, NaN 값 세가지를 세 열로 나누었다.

M, F 식으로 값이 매겨져 있는 경우 성별을 수치화해보았다.

1. female이라는 열을 추가, 정의한다. 만약 F인 경우 값을 1로주고, 나머지 M과 NaN값은 0으로 줬다.

data$female <- ifelse(data$gender=='F' & !is.na(data$gender), 1, 0)

처리 후 늘 table함수를 통해 값이 의도대로 되어있는지 확인해야 하나보다.

table(data$female)

2. no_gender 라는 열을 추가, 정의한다.  만약 gender열에 NaN값이 있다면 해당 NaN값에 1을 준다. 나머지는 0이다.

data$no_gender <- ifelse(is.na(data$gender), 1, 0)

 

요번에는 앞서 age라는 열에 NaN값과 잘못입력된듯한 데이터를 NaN값으로 바꾼 값들을 졸업연도를 바탕으로 값을 대체하기로 했다.

그래서 졸업연도 열을 연도별로 그룹화하고 연도별 age평균값을 구해 평균값을 NaN값에 대체하려한다.

(어느정도 각 컬럼에대한 속성을 이해해야한다는 생각이 들었다, 컬럼의 속성을 모르고 수치만으로 알순없을까?)

 

방법1. 

aggregate(data=data, age ~ gradyear, mean)

aggregate( data , 그룹화의 기준 ) , na.rm=TRUE가 기본설정되어있다.

 

방법2.

ave() 함수는 원하는 데이터를 그냥 출력하는게 아니라, NaN값이 원하는 (평균값)으로 대체돼서 나온다.

ave_age <- ave(data$age, data$gradyear, FUN = function(x) mean(x, na.rm=TRUE)

- ave를 이용해 바로 값을 대체하는게 아니라 조건에 따라 대체하고 싶다면 ifelse를 이용한다...

teens$age <- ifelse(is.na(teens$age), ave_age, teens$age)
summary(teens$age)

 


데이터에 대한 지식이 아주 약간이라도 있어야 각 열의 성질을 엮을 수 있다는 것을 느낄 수 있었다. 

 

 

 

 

728x90