파이썬(Python) 판다스(Pandas) 라이브러리를 활용해 데이터를 불러오고 정렬하는 방법을 익혔다면, 본격적인 데이터 그룹화나 전처리에 앞서 데이터의 전반적인 분포와 특성을 파악해야 합니다. 이를 데이터 탐색(EDA, Exploratory Data Analysis) 단계라고 하며, 이 과정에서 데이터의 이상치(Outlier) 가능성이나 데이터 분포의 특성, 범주형 데이터의 빈도 분포를 빠르게 파악하는 것이 중요합니다.
판다스에서 데이터의 요약 통계량과 빈도수를 빠르게 제공하여 탐색 시간을 단축해 주는 대표적인 함수가 바로 describe()와 value_counts()입니다. 이 두 함수는 데이터의 정량적 특성을 요약해 보여주기 때문에 현업 실무 분석은 물론, 빅데이터분석기사(빅분기) 실기 시험에서 데이터 전처리 방향을 결정하는 데 큰 도움을 줍니다. 이번 글에서는 두 함수의 사용법과 주요 옵션, 그리고 비즈니스 가상 데이터를 활용한 실전 예제를 상세히 정리하겠습니다.
1. 수치형 데이터의 기술통계량 확인하기: describe() 함수
1.1. describe()의 기본 개념과 출력 정보
describe() 함수는 데이터프레임의 각 열에 대한 기술통계(Descriptive Statistics) 요약 정보를 출력합니다. 기본적으로 데이터프레임 내에 존재하는 수치형(Numerical) 컬럼들을 자동으로 선별하여 아래와 같은 대표값들을 반환합니다.
- count: 결측치(NaN)를 제외한 유효한 데이터의 개수
- mean / std: 산술 평균값과 표준편차
- min / max: 최솟값과 최댓값
- 25% / 50% / 75%: 데이터를 크기 순으로 나열했을 때 각각 25%, 50%(중앙값, Median), 75% 위치에 해당하는 사분위수(Percentile)
1.2. 비즈니스 예시로 보는 수치형 데이터 요약
가상의 쇼핑몰 고객 행동 데이터를 생성하여 describe() 함수를 적용해 보겠습니다.
import pandas as pd
# 가상 고객 행동 데이터 생성
customer_df = pd.DataFrame({
'고객ID': ['C_01', 'C_02', 'C_03', 'C_04', 'C_05'],
'가입채널': ['모바일', 'PC', '모바일', '모바일', 'PC'],
'방문횟수': [12, 3, 45, 8, 15],
'구매총액': [150000, 32000, 1200000, 89000, 210000]
})
# 수치형 변수 요약 통계량 확인
print(customer_df.describe())
[출력 결과]
방문횟수 구매총액
count 5.000000 5.000000
mean 16.600000 336200.000000
std 16.395121 489437.636477
min 3.000000 32000.000000
25% 8.000000 89000.000000
50% 12.000000 150000.000000
75% 15.000000 210000.000000
max 45.000000 1200000.000000
describe()의 출력 결과를 살펴보면 ‘구매총액’ 컬럼의 평균값은 약 33.6만 원이지만, 최댓값은 120만 원인 반면 75% 지점은 21만 원에 머물러 있음을 알 수 있습니다. 이는 상위 일부 고객이 전체 매출 지표를 견인하는 편향된 분포를 띠고 있으며, 120만 원 데이터가 극단적으로 큰 값일 가능성을 의심해 볼 수 있습니다.
1.3. 범주형(Categorical) 데이터 요약하기
describe()는 기본적으로 수치형 데이터만 다루지만, include 파라미터를 사용하면 문자열이나 범주형 변수의 요약 통계량도 확인할 수 있습니다.
# 범주형(object) 변수 요약 정보 확인
print(customer_df.describe(include='object'))
[출력 결과]
고객ID 가입채널
count 5 5
unique 5 2
top C_01 모바일
freq 1 3
- unique: 범주형 열에 존재하는 중복 없는 고유값(범주)의 개수
- top: 가장 빈번하게 등장하는 대표값(최빈값)
- freq: 최빈값이 등장하는 빈도수
2. 범주형 데이터의 빈도수 계산하기: value_counts() 함수
2.1. value_counts()의 정의와 주요 옵션
value_counts() 함수는 단일 컬럼(주로 Series 객체) 내의 고유값들이 각각 몇 번씩 등장하는지 그 빈도(Frequency)를 계산하여 내림차순으로 정렬된 시리즈를 반환합니다. 데이터의 쏠림 현상을 분석하거나 범주형 변수의 분포를 확인할 때 필수적으로 사용됩니다.
- normalize: 기본값은
False이며,True로 지정하면 단순 빈도수 대신 전체 데이터 중에서 각 범주가 차지하는 비율(상대 빈도)을 0과 1 사이의 소수로 반환합니다. - dropna: 기본값은
True이며 결측치(NaN)를 제외하고 빈도수를 계산합니다. 만약 결측치의 빈도까지 함께 집계하여 누락률을 점검하고 싶다면False로 지정해야 합니다.
2.2. 비즈니스 예시로 보는 value_counts 활용
앞서 정의한 customer_df에서 ‘가입채널’ 컬럼의 분포와 비율을 분석해 보겠습니다.
# 1. 가입채널별 단순 빈도수 집계
channel_counts = customer_df['가입채널'].value_counts()
print(channel_counts)
# 출력 결과:
# 모바일 3
# PC 2
# Name: 가입채널, dtype: int64
# 2. 가입채널별 비율 집계
channel_ratios = customer_df['가입채널'].value_counts(normalize=True)
print(channel_ratios)
# 출력 결과:
# 모바일 0.6
# PC 0.4
# Name: 가입채널, dtype: float64
이를 통해 전체 가입 고객 중 60%가 모바일 채널을 통해 유입되었음을 직관적으로 도출할 수 있으며, 향후 마케팅 리소스 배정 등의 비즈니스 의사결정에 기초 자료로 활용할 수 있습니다.
3. 실무 환경에서의 데이터 요약 및 예외 처리
3.1. 지수 표기법(Scientific Notation) 해결 방법
describe() 함수를 사용할 때 데이터의 수치가 너무 크거나 소수점 자리가 길어지면 1.200000e+06과 같은 지수 표기법으로 출력되어 숫자를 직관적으로 읽기 힘든 경우가 있습니다. 소수점 출력을 명시적으로 제한하고 싶다면 판다스의 출력 옵션을 아래와 같이 설정하는 편이 좋습니다.
# 소수점 둘째 자리까지만 출력하도록 설정 (원하는 포맷 지정)
pd.options.display.float_format = '{:.2f}'.format
# 설정 이후 다시 describe 실행 시 가독성 높은 숫자로 출력됨
print(customer_df.describe())
3.2. 연속형 데이터를 범주화하여 구간 빈도 구하기
value_counts()는 범주형 변수뿐만 아니라 수치형 연속 변수에도 활용할 수 있습니다. bins 파라미터를 지정하면 데이터의 범위를 균등한 구간으로 나누어 각 구간에 속한 데이터의 개수를 집계해 줍니다.
# 방문횟수 데이터를 3개의 균등 구간으로 나누어 빈도 집계
print(customer_df['방문횟수'].value_counts(bins=3))
4. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트
빅데이터분석기사 실기(작업형 제1유형 및 제2유형) 환경에서 제공되는 익숙하지 않은 원본 데이터를 분석할 때, describe()와 value_counts()는 모델 구축 방향을 결정하는 나침반 역할을 합니다.
4.1. 결측치 분포 및 이상치(Outlier) 신속 감지
데이터셋을 로드한 직후 df.describe()를 실행하면 각 컬럼의 count 값이 전체 행 개수보다 작은 컬럼은 결측치가 존재함을 의미합니다. 또한 50%(중앙값)와 mean(평균)의 차이가 너무 크거나, 75% 값에 비해 max 값이 비정상적으로 크다면 해당 변수에 극단적인 이상치(Outlier)가 존재할 가능성이 높다고 판단할 수 있습니다.
이 정보를 바탕으로 사분위수 범위(IQR, Interquartile Range) 기준 이상치 제거 알고리즘을 적용할지 여부를 선택합니다.
4.2. 불필요하거나 쏠림이 심한 피처(Feature) 제거
범주형 독립변수들에 대해 value_counts(normalize=True)를 수행했을 때, 특정 하나의 범주가 전체 데이터의 99% 이상을 차지하는 극단적인 데이터 쏠림 현상이 발견된다면 해당 피처는 머신러닝 분류 모델에 변별력을 제공하기 어렵습니다.
이러한 컬럼들은 불필요한 연산 자원을 소모하거나 모델의 과적합을 유발할 수 있으므로, 모델 학습 단계 전에 데이터프레임에서 제거(drop)하는 것이 합리적인 결정이 될 수 있습니다.
5. 요약 및 다음 화 안내
describe(): 수치형 데이터의 기술통계량(평균, 사분위수, 최댓값, 최솟값 등)을 요약하여 이상치 유무를 파악하게 돕고, 옵션 조정을 통해 범주형 데이터 요약도 가능합니다.value_counts(): 단일 컬럼 내 고유 범주의 빈도와 비율을 구하며,normalize옵션으로 점유율을 쉽게 도출할 수 있습니다.- 실무 및 시험 응용: 데이터 적재 직후 데이터의 구조와 분포를 빠르게 요약하여 결측치 처리 정책이나 불필요한 특징 변수를 걸러내는 기초로 삼습니다.
다음 [판다스 11화]에서는 데이터 탐색 과정에서 반드시 해결해야 하는 핵심 과제 중 하나인 결측치(NaN) 처리 완전 정복: fillna와 dropna 사용법에 대해 자세하게 학습해 보겠습니다. 데이터의 누락된 구멍을 합리적으로 메우고 정제하는 일련의 과정을 마스터해 봅시다.