[판다스 10화] describe와 value_counts로 데이터 탐색하기 | Python Pandas | 빅분기, 빅데이터분석기사 실기

파이썬(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 사용법에 대해 자세하게 학습해 보겠습니다. 데이터의 누락된 구멍을 합리적으로 메우고 정제하는 일련의 과정을 마스터해 봅시다.

댓글 남기기