데이터분석/Preprocessing

R에서의 NA처리 na.approx 주의와 NA채우는 꼼수

늘근이 2018. 4. 21. 22:18

NA.APPROX 같은경우, NA값을 대체해준다. ZOO패키지 안에 존재하는데 상당히 유용하지만, 문제는 시계열 데이터에만 해당된다는것이다.

만약, 시계열 데이터를 샘플링이나 테스트/트레인 과정에서 뒤섞는다면 NA.APPROX는 앞뒤 값을 고려해서 채워넣기 때문에 맞지 않는 값으로 채워넣는다. 

평균값으로 처리하거나 NA를 탈락시키는 편이 훨씬 나은데도 말이다.


예를들어 NA.APPROX를 통하면 

1  2  3  4 NA  8

1 2 3 5 6 8

로 채워지고,


또하나 명심해야 하는건 NA가 맨앞에 존재하면 NA를 날려먹는다. 

XGBOOST R구현체의 경우, 레이블 벡터와 훈련피처들을 따로 넣어야 하는 상황이 오는데, 아래와 같은 상황에서 레이블 벡터가 있으면 NA.APPROX가 

NA  2  3  4  5  8

2 3 4 5 8

맨앞을 날려먹기때문에, 중간에

The length of labels must equal to the number of rows

와 같은 치명적 에러가 떨어진다.

다만 위와같은 에러는 NA가 맨앞에 올때만 나타나므로 굉장히 드물게 나타나는데, NA가 많은 데이터셋의 경우는 시도때도 없이 터지기 때문에 모델을 몇천개이상을 만들어야 하는 경우 대부분의 경우는 잘돌다가 아침에 일어나보면 에러가 나서 멈춰있는 머리가 아픈 상황이 올수있다.


결과적으로 모델을 총 5000개를 10시간동안 돌리고, 간단한 실수로 인해 다시 10시간을 돌려야 되는 상황이 나오면 머리가 아플것이다. 

NA.RM = F 를 통해, 방지를 할수는있지만 결국에는 NA를 성공적으로 제어하지 못한다. 앞뒤에 붙어있는 NA값은 그대로 붙이있기 때문이다. 그래서 또다른 짓을 해주면 좋은데,

NA.APPROX(na.rm = F) -> NA.LOCF(na.rm = F) -> NA.LOCF(fromLast = T)


NA.LOCF 는 , Last Observed Carried Forward 방식으로, trailing 되는 마지막의 NA값들을 마지막 관측된 방식으로 채워준다. 여기에 fromLast옵션을 주면 뒤에서 관측된걸 앞으로 땡길수도 있다. Next Observed Carried Backward

참고로 TidyR의 NA.DROP이라는 것을 이용하면 특정한 컬럼의 NA가 있는경우 해당하는걸 다 떨군다.


aa <- c(NA, NA, 1,2, NA,6, NA ,NA, NA)

bb <- na.approx(aa, na.rm = F)

cc <- na.locf(bb, na.rm = F)

dd <- na.locf(cc, fromLast = T)

dd


위의경우, 앞에건 앞으로 땡기고, 뒤에건 뒤로 땡기고 나머지는 평균을 치고싶을때 쓸수있다.

결과는

1 1 1 2 4 6 6 6 6

좋지 아니한가 

좀더 완성된 예제로 dplyr 패키지를 이용해보면

ppp$temperature %>% na.approx(na.rm = F) %>% na.locf(na.rm = F) %>% na.locf(fromLast = T, na.rm = F)

이경우, 전부 데이터가 NA라면 굳이 날려먹지도 않고 가만히 놔둔다



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

Cannot call methods on a stopped SparkContext  (0) 2018.05.06
[링크] lag spark scala  (0) 2018.05.05
R eval parse 예  (0) 2018.04.13
결측치 제거를 위한 몇가지 팁  (0) 2017.08.13
%in% 연산자..  (0) 2017.08.10