R) 전처리 - 객체 및 변수 명명하기

R) 전처리 - 객체 및 변수 명명하기

R기반 데이터분석시 객체 및 변수명을 일관성 있게 짓는 법을 알아보도록 한다.

개요

R로 데이터를 분석하다 보면 점점 다뤄야 하는 객체와 변수가 많아진다. 이 때 일관성 있는 명명규칙을 준수하지 않는다면 코드의 가독성이 저하되고 유지보수하기 어려워진다는 단점이 있다. 그래서 데이터의 특성, 객체의 종류 등 특정 기준을 세워서 이름을 짓는 것이 좋다.

표기법

객체 또는 변수명을 표기할 때 단어 하나로 표현할 수 있지만, 두 개 이상의 단어로 이루어진 합성어라면 띄어쓰기를 해야한다. 하지만 변수명이나 객체명에 띄어쓰기를 쓸 수 없기 때문에 다양한 표기법이 등장하였다.

카멜 표기법(Camel Case)

낙타
여기서 카멜은 낙타를 뜻한다. 낙타의 등에 혹이 있는데 객체 또는 변수명을 표기할 때 대문자와 소문자를 사용하는 행태가 이 혹을 닮았다 해서 붙여진 이름이다. 예시는 다음과 같다.

1
camelCase

첫 글자는 소문자로 시작하며 이어서 오는 첫 글자는 대문자로 작성한다.

파스칼 표기법(Pascal Case)

파스칼
파스칼 표기법의 예시는 다음과 같다.

1
PascalCase

카멜 표기법과 비슷하지만 첫 글자도 대문자로 시작하며 이어서 오는 첫 글자 역시 대문자로 작성한다.

스네이크 표기법(Snake Case)

뺴애애앰
스네이크 표기법은 카멜과 파스칼 표기법에 비해 상대적으로 글자의 숫자가 많다. 즉 길게 늘어진다고 생각해도 무방하다. 예시는 다음과 같다.

1
snake_case

각 단어간 연결을 “_”로 이어주는 것이 스네이크 표기법의 핵심이다. 변수명과 객체명이 길어진다는 단점이 있으나 가독성 때문에 본인은 이 방법을 선호한다.

데이터 특성에 따른 명명

너무 긴 변수명은 자동완성의 도움을 받아 편리하게 작성할 수 있더라도 불필요하게 코드가 길어지는 등 소소한 불편함을 야기할 수 있다. 그래서 특정 의미를 변수명에 명시하려고 하는 경우 축약어를 사용하는 경우가 많으며 관련 내용을 다음에서 다루고자 한다.

도메인

금융, 마케팅 등 도메인을 기준으로도 정할 수 있겠다.

● 상품: prod
● 부서/부처: dept
● 매출: rev
● 송금/변환: trans
● 인구: pop
● 교육: edu

각각의 도메인에는 CTR, CPP 등 특정 지표를 2~4글자로 줄여쓰는 경우가 많기 때문에 해당 용어를 활용하여 변수 및 객체명을 명명하는 것을 추천한다.

단위

경우에 따라 비슷한 자료의 단위를 명시해야 할 수 있다. 단위는 그 자체로 굉장히 중요한 정보이지만, 데이터의 출처 또는 도메인에 비하면 부차적인 정보이기 때문에 본인은 이 특징을 각 객체의 접미사에 주로 명시하며 다음과 같다.

● 개수: cnt, ea
● 단위: unit
● 시간 - 요일: wday
● 시간 - 주말: wend
● 시간 - 시간: H, hr
● 시간 - 분: M, min
● 시간 - 초: S, sec

상기 목록 이외에도 kg, km 와 같이 길이, 무게 등 수많은 단위 표기가 있지만 보통 물리/수학 분야에서 줄여서 많이 사용하기 때문에 생략하도록 하겠다.

연산

평균, 분산 등 다양한 통계량 또한 명명규칙이 될 수 있으며 본인은 이 특징을 각 객체의 접미사에 주로 명시하며 다음과 같다.

● 합계: sum
● 최대: max
● 최소: min
● 평균: mean, avg
● 분산: var
● 표준편차: sd, std
● 왜도: skew
● 첨도: kurt
● 분포: dist
● 요약: agg
● 빈도: freq
● 비율: prop, ratio
● 확률: prob
● 모집단: pop
● 개수/수량: cnt, amt

이진(binary) 변수

명목형 변수를 OHE(One-Hot Encoding)처리를 하거나 특정 값 기준으로 기존 데이터를 이진으로 분류할 때 다음과 같이 “is” 또는 “flag”를 접두사 또는 접미사로 변수명에 붙여 사용할 수 있다.

1
2
df[, "is_wend"] = ifelse(test = df$wday >= 6, yes = 1, no = 0)
df[, "out_flag"] = ifelse(test = df$wday >= 6, yes = 1, no = 0)

이진 분류를 할 때 되도록이면 상기와 같이 1과 0으로 표기하는 것이 좋다. 그런데 가끔 보기좋게 한답시고 Y/N 으로 표기하는데 이는 해당 변수가 문자 속성으로 되기 때문에 비율 계산이나 추가 통계량 계산에서 코드 작성과 연산 부분에서 비효율적이다.

객체 유형에 따른 명명

대표적인 R 객체는 1차원 벡터, 메트릭스, 데이터프레임, 리스트가 있는데 본인은 이 특징을 각 객체의 접두사로 사용하며 다음과 같다.

● 1차원 벡터: vec
● 메트릭스: mat
● 데이터프레임: df
● 리스트: list, ls

객체 필터링에 따른 명명

그리고 특정 객체에서 필터링하여 일부를 뽑아낸 객체는 접미사로 해당 내용을 명시한다.
● 일반적인 필터링 결과: sub

1
df_stat_sub = df_stat[2:6, ]

특정 변수의 값을 기반으로 필터링 할 경우 변수명과 값을 차례대로 접미사로 명시한다.
● 특정 변수 및 값 기준: 변수명_값

1
df_season_1 = df[df$season == 1, ]

표기 순서

우선 앞의 표기법을 따른다고 해도 어떤 단어를 어디에 배치해야 할까? 보통 데이터의 도메인, 출처 또는 객체의 속성과 관련된 단어를 접두사로 배치한다. 이는 코드 작성 스타일에 따라 달라질 수 있는데 아무래도 데이터의 도메인과 출처가 중요하긴 하지만 코드를 작성하는 입장에서는 객체명의 경우 벡터 또는 데이터프레임을 구분하는 접미사를 붙이는 것도 방법이다. 하지만 변수명의 경우 수량, 비율 등 접미사에 해당 내용을 명시하는 경우가 많기 때문에 숫자나 문자 등 이런 속성을 굳이 변수명의 접두사로 붙일 필요는 없다.

기타

R은 객체명 또는 변수명 지정시 숫자나 특수문자로 시작할 수 없다는 특징이 있다. 그렇기 때문에 시간의 경우 다음과 같이 표기할 수 있다.

1
2
3
4
colnamees(df)[(1:24) + 5] = paste0("H_", sprintf(fmt = "%02d", 1:20))
## [1] "year" "month" "wday" "value" "type" "H_01" "H_02" "H_03" "H_04" "H_05" "H_06" "H_07" "H_08"
## [14] "H_09" "H_10" "H_11" "H_12" "H_13" "H_14" "H_15" "H_16" "H_17" "H_18" "H_19" "H_20" "H_21"
## [27] "H_22" "H_23" "H_24"

여기서 sprintf() 함수를 사용하였는데 이는 1의 자리에서 10의 자리로 넘어갈 때에도 자연스레 정렬도 되고 길이를 통일하기 위해서이다. 응용해서 파일명 지정에도 사용할 수 있다.

주의점

종종 영어가 어렵다고 한글을 음차(音借) 하는 경우가 있는데 되도록이면 해당 단어의 영어 원문으로 작성하는 것을 추천한다. 예를 들어 매출을 “maechul”, 택시를 “taeksi” 로 적어놓는 엄청난 작명을 볼 수 있는데(심지어 정부 과제 산출물에서도 이런 황당한 경우가 종종 있다.) 이는 사람마다 표준 음차 규칙을 지켜가면서 명명하는 경우가 드물기 때문에 향후 문제가 생길 가능성이 높다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×