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

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

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


개요

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

표기법

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

카멜 표기법(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" ] = np.where(df["wday"] >= 6, 1, 0)
df["out_flag"] = np.where(df["wday"] >= 6, 1, 0)

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

객체 유형에 따른 명명

대표적인 Python 객체의 유형에 따라 해당 객체명의 축약어를 각 객체의 접두사로 사용하는데 다음과 같다.

● 리스트: list, ls
● 딕셔너리: dict
● 시리즈: ser
● 데이터프레임: df

객체 필터링에 따른 명명

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

1
df_stat_sub = df_stat.iloc[2:6, ]

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

1
df_season_1 = df.loc[df["season"] == 1, ]

표기 순서

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

기타

Python 객체와 Pandas 라이브러리의 변수명은 여러 특수문자를 허용하는 등 상대적으로 자유도가 높다. 하지만 되도록이면 특수문자나 숫자가 아닌 문자로 시작하고 변수명 또한 타 언어 또는 프로그램과의 호환을 위해 되도록이면 문자로 시작하는 것이 좋다. 예를 들어 다음과 같이 변수명이 숫자인 데이터프레임 객체 “df”가 있다고 하자.

1
2
3
4
df = pd.DataFrame({1: [1, 2],
2: [3, 4],
11: [100, 200]})
df
1 2 11
0 1 3 100
1 2 4 200

.str 접근자의 .zfill() 메서드를 활용하여 변수명을 다음과 같이 바꿀 수 있다.

1
2
df.columns = "H_" + df.columns.astype("str").str.zfill(2)
df
H_01 H_02 H_11
0 1 3 100
1 2 4 200

여기서는 단순히 “H_”를 붙이는 것이 아니라 .str 접근자의 .zfill() 메서드를 사용하여 각 변수의 길이를 맞춰 주었기 때문에 향후 코드 작성 및 관리가 용이하다.

주의점

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

Your browser is out-of-date!

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

×