여정의 기록
데이터의 NaN값을 확인하고 어떻게 처리할지 생각해보자 (대체하기) 본문
좌표간의 거리를 구할수 있다. 유클리디아 거리 법 등 방법을 이용해서.
데이터를 처리하기 위해서는 제일 먼저
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)
데이터에 대한 지식이 아주 약간이라도 있어야 각 열의 성질을 엮을 수 있다는 것을 느낄 수 있었다.
'공부 > data 전처리, 분석' 카테고리의 다른 글
scipy.ndimage.shift 이미지 옮기기에 적용할 수 있는 데이터 증식 방법 (0) | 2023.01.05 |
---|---|
OrdinalEncoder, OneHotEncoder (0) | 2023.01.04 |
군집합과 분류의 차이? (0) | 2022.09.08 |
간단한 시각화 종류 기록 (0) | 2022.08.14 |