R 벡터 통계 요약과 결측치(NA) 방어하기

데이터 분석 실무에 투입되면 여러분이 가장 먼저 마주하게 될 단위는 엑셀의 거대한 열(Column) 하나, 즉 일렬로 길게 늘어선 데이터들의 묶음인 1차원 벡터(Vector)입니다. 이 벡터 하나에 수백, 수만 명의 키나 매출수치 같은 데이터가 가득 차 있다면 가장 먼저 해야 할 일은 무엇일까요? 바로 데이터의 대략적인 개요를 파악하기 위한 기초 통계량(Descriptive Statistics)을 뽑아내는 것입니다.

정말 다행히도 R 통계 프로그램은 엑셀보다 훨씬 직관적이고 간단하게, 내장 함수 이름 하나만 변수에 툭 씌워 던지면 수억 개의 대용량 데이터라도 순식간에 합계나 평균, 편차를 구해줍니다. 오늘은 R의 필수 4대 벡터 통계 함수들과 함께 데이터 랭글링의 꽃, 결측치(NA)를 똑똑하게 방어하고 제거하는 방법까지 명확히 알아보겠습니다.

1. 필수 벡터 기본 통계 요약 함수 4총사

R에 기본 내장 베이스(base)이자, 통계 분석이라면 가장 숨쉬듯 자주 쓰이는 4가지 기본 통계 함수 세트입니다. 어떤 무지막지한 거대 벡터값이 들어와도 C언어 기반의 속도로 눈 깜짝할 새에 결과를 내뱉어줍니다.

a <- c(1, 2, 3, 4, 5)

# 1. 합계 다 더하기
sum(a)     
> [1] 15
# 2. 산술 평균 구하기
mean(a)    
> [1] 3
# 3. 이상치 방어용 대푯값: 중앙값 구하기
median(a)  
> [1] 3
# 4. 데이터가 얼마나 흩뿌려져 있는가? 표준편차 구하기
sd(a)      
> [1] 1.581139

엑셀 표에서 마우스 커서로 =AVERAGE(A2:A100)를 치며 스크롤을 힘들게 드래그하던 노가다에 비하면, 깔끔하게 변수 이름 하나만 괄호에 잡아넣는 것으로 프로그래밍적인 아름다운 처리가 가능합니다.

2. 강력한 불청객, 공백 결측치(NA)의 역습

실제 현업 데이터를 크롤링하거나 넘겨 받다 보면 고객이 입력을 안 해서 중간중간 뻥뻥 뚫려있는 빈칸을 무조건 마주하게 됩니다. R에서는 이 “원래 값이 무엇이었는지 일절 알 수 없이 비어있음”을 NA (Not Available) 로 대문자로 표현합니다.

그런데 이 NA는 앞서 배운 연산 통계 함수를 돌릴 때 어마어마한 전염성 파괴력을 가집니다.

a_with_na <- c(20, NA, 13, 24, 309)
mean(a_with_na)
> [1] NA

수학적으로 100 + 알 수 없는 값(NA)을 더하면 그 결과 역시 “여전히 알 수 없음”이 되어버리기 때문입니다. 그래서 만 개짜리 데이터 중 단 하나의 NA만 불순물로 끼어 있어도 합계나 평균 등 전체 통계 결괏값은 모조리 감염되어 NA로 붕괴됩니다.

3. NA를 우회하여 통계 산출하기 (na.rm = TRUE)

이럴 때를 대비해 당연하게도 R의 메인 계산 통계 함수들에는 “내부의 결측치가 보이면 그놈만 임시로 무시하고 알아서 뽑아 줘!” 라는 뜻의 결측치 제외 방어막 옵션이 강력히 탑재되어 있습니다. 바로 na.rm = TRUE (NA Remove의 약자) 파라미터 옵션입니다.

# 결측값을 제거하고 연산을 수행하라 옵션 ON
mean(a_with_na, na.rm = TRUE)
> [1] 91.5

이 옵션 하나만 켜주면 NA 발생 위치는 데이터에서 살짝 빈 공간(제외) 취급을 해버리고, 구출 가능한 나머지 살아있는 정상 숫자 파편들만 쏙쏙 더해서 온전한 평균(91.5)을 산출해 내어 줍니다. 매우 자주 쓰이니 필히 암기하세요.

4. 기본기 심화: 박스조차 아예 사라져버리는 NULL?

R의 자료구조상 비어 있다는 개념 트리 영역에는 NA 말고 NULL 이란 녀석도 엄연히 존재합니다. 이 둘의 차이를 명확히 아셔야 진정한 입문 파워 유저가 될 수 있습니다.

  • NA: 상자는 존재하는데 그 안에 들어있는 내용물이 없는 “빈 칸” 상태. 길이나 자리 차지는 분명히 1을 차지합니다.
  • NULL: 메모리 상에서 데이터 상자조차도 할당되지 않고 존재하지 않는 태초의 “무(無)의 상태”. 만나는 순간 존재 자체를 흔적도 없이 지워버립니다. 데이터 삭제에 활용됩니다.
# NA 테스트
NA_is_blank <- NA
c(1, NA_is_blank)
> [1]  1 NA
# NULL 테스트
NULL_is_not_blank <- NULL
c(1, NULL_is_not_blank)
> [1] 1

(NULL은 아예 벡터 공간 안에 들어올 자격조차 되지 않아 합쳐지지 않고 말소되어 1 혼자 남는 모습입니다)


데이터 엔지니어링 전처리의 8할은 NA와의 지루한 전쟁이라는 말이 있습니다. 오늘 배운 기본 통계 함수와 치트키인 na.rm 옵션을 손에 잘 익혀두시면 향후 더 복잡한 대용량 데이터 프레임(Data Frame)을 필터링하실 때 생명줄 역할을 해 줄 것입니다!


당신이 좋아할 만한 콘텐츠

by Google Adsense


관련 글 보기