파이썬(Python) 판다스(Pandas) 라이브러리를 활용해 대용량 데이터를 다루다 보면 전체 데이터셋 중 일부를 무작위로 추출해야 하는 상황을 마주하게 됩니다. 모집단이 너무 커서 머신러닝 알고리즘의 학습 속도를 높이기 위해 일부 데이터를 샘플링하거나, 교차 검증을 위한 표본을 무작위로 추출하고, 데이터 분포의 치우침을 해결하기 위해 업샘플링(Upsampling) 혹은 다운샘플링(Downsampling)을 수행하는 작업 등이 대표적입니다.
판다스에서 이처럼 데이터를 임의로 추출하는 가장 효율적인 도구가 바로 sample() 함수입니다. 이번 글에서는 sample() 함수의 핵심 파라미터 구조와 실무 비즈니스 예시, 그리고 빅데이터분석기사(빅분기) 실기 시험에 필요한 필수 팁까지 체계적으로 살펴보겠습니다.
1. 데이터 추출의 기본: sample() 함수의 핵심 파라미터
sample() 함수는 데이터프레임이나 시리즈 객체에서 지정한 개수 또는 비율만큼 행(기본값) 또는 열을 무작위로 추출하여 반환합니다. 개발자의 목적에 맞춰 추출할 데이터의 규모와 방식을 세부적으로 제어할 수 있는 다양한 옵션을 제공합니다.
1.1. 주요 파라미터 구성 요약
- n: 추출할 행(또는 열)의 개수를 정수로 지정합니다.
frac과 동시에 사용할 수 없습니다. - frac: 추출할 데이터의 비율을 0과 1 사이의 소수로 지정합니다. (예:
frac=0.2는 전체 데이터의 20%를 무작위 추출) - replace: 복원 추출 여부를 결정하는 불리언(
True/False) 파라미터입니다. 기본값은False(비복원 추출)이며,True로 설정하면 한 번 뽑힌 행이 다음 추출 시 다시 선택될 수 있습니다. - weights: 데이터별로 서로 다른 추출 확률을 부여하기 위한 상대적 가중치를 지정합니다. 컬럼명이나 배열 형태로 전달할 수 있으며, 값이 클수록 선택될 가능성이 높아집니다.
- random_state: 난수 생성의 기준이 되는 시드(Seed) 번호입니다. 정수를 지정하면 동일한 입력 데이터에 대해 코드를 여러 번 실행해도 항상 동일한 샘플이 추출되도록 합니다.
- axis: 추출할 축을 결정합니다. 기본값은
0(행 추출)이며,1로 지정하면 열(컬럼)을 무작위로 선택합니다.
2. 비즈니스 시나리오로 배우는 실무 샘플링 활용법
현업에서 마케팅 프로모션을 진행하기 위해 전체 회원 중 일부를 무작위로 선별하는 가상의 예시를 통해 sample() 함수의 구동 방식을 알아보겠습니다.
import pandas as pd
# 가상의 회원 가입 및 구매 데이터 생성
user_df = pd.DataFrame({
'회원ID': ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10'],
'가입경로': ['검색', '광고', '검색', '추천', '광고', '추천', '검색', '광고', '검색', '추천'],
'구매금액': [50000, 120000, 35000, 89000, 250000, 45000, 150000, 78000, 92000, 110000]
})
2.1. 지정된 개수만큼 비복원 추출하기 (n)
전체 회원 중 프로모션 쿠폰을 발급할 3명의 회원을 임의로 선정하는 코드입니다. random_state를 부여하여 실행 결과의 일관성을 유지합니다.
# 전체에서 3개의 행을 무작위 추출
target_n = user_df.sample(n=3, random_state=42)
print(target_n)
2.2. 일정 비율만큼 추출하기 (frac)
전체 데이터 규모가 너무 커서 대략 20% 수준으로 표본 데이터를 정제하여 파일럿 분석을 진행하고자 할 때 사용합니다.
# 전체 데이터의 20%를 샘플링
target_frac = user_df.sample(frac=0.2, random_state=42)
2.3. 가중치 기반 샘플링 적용하기 (weights)
실무에서는 완벽한 무작위 추출보다 특정 조건의 기여도가 높은 표본을 더 자주 뽑아야 할 때가 있습니다. 예를 들어 ‘구매금액이 높은 우수 고객이 프로모션 대상자로 선정될 확률을 높이고 싶다’면 구매금액 컬럼을 가중치로 전달하면 됩니다.
# 구매금액이 클수록 추출될 확률이 높아지는 가중치 샘플링
weighted_sample = user_df.sample(n=3, weights='구매금액', random_state=42)
3. 샘플링 연산 후 인덱스 정돈 및 유의사항
sample() 함수를 실행하고 나면 추출된 행들은 원본 데이터프레임에서 가지고 있던 기존 인덱스 번호를 그대로 유지한 채 반환됩니다. 무작위로 뽑혔기 때문에 인덱스 순서가 [4, 1, 7]과 같이 뒤섞이게 됩니다.
이 상태로 다음 분석 단계에 진입하면 행 번호 기반 슬라이싱을 수행할 때 혼선이 생길 수 있으므로, 아래와 같이 인덱스를 초기화해 주는 과정이 안전합니다.
# 샘플링과 동시에 인덱스를 0부터 시작하는 순차 정수로 초기화
clean_sample = user_df.sample(n=3, random_state=42).reset_index(drop=True)
또한, 비복원 추출(replace=False) 상태에서 원본 데이터의 전체 행 개수보다 큰 값의 n을 입력하면 ValueError가 발생하므로, 샘플링 크기가 모집단 크기를 초과하지 않도록 사전에 shape 속성을 활용해 규모를 파악하는 습관이 좋습니다.
4. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트
빅데이터분석기사 실기 시험(특히 작업형 제1유형)에서는 무작위 샘플을 추출한 뒤 조건에 맞는 통계량을 계산하거나, 난수 생성 시드를 고정하여 동일한 결과를 재현하는 문제가 출제될 수 있습니다.
4.1. random_state 설정의 중요성
시험 요건에 “난수 고정 시드를 지정하시오”라는 문구가 포함되어 있다면 random_state=정수 옵션을 누락하지 않도록 각별히 유의해야 합니다. 난수 생성기는 고정값 없이 실행할 때마다 매번 다른 행을 추출하므로, 이 옵션이 빠지면 채점 환경에서 코드가 실행될 때마다 결과가 달라져 오답 처리가 될 수 있습니다.
4.2. 샘플링 기반 특정 조건의 통계량 연산
예를 들어 “주어진 데이터셋에서 가입경로가 ‘검색’인 회원들만 필터링한 후, 이 중 무작위로 2개의 샘플을 추출(시드 번호 42)하여 그들의 구매금액 평균을 구하시오”라는 문제가 출제된다면 다음과 같은 파이프라인을 구축할 수 있습니다.
# [시험장 실전 대응 예시]
# 1. 특정 조건 만족하는 데이터 필터링 (불리언 인덱싱)
filtered_df = user_df[user_df['가입경로'] == '검색']
# 2. 고정 시드를 지정하여 2개 샘플 추출
sampled_df = filtered_df.sample(n=2, random_state=42)
# 3. 최종 요구 통계량 연산
result = sampled_df['구매금액'].mean()
print(float(result))
이와 같이 무작위 샘플링 기술은 가설 검정을 위한 표본 구성이나 탐색적 데이터 분석(EDA) 과정에서 대표성 있는 표본을 구성하고 분석의 신뢰성을 높이는 기본 도구로 활용됩니다.
5. 요약 및 다음 화 안내
sample(n=개수): 원본 데이터에서 원하는 정수 개수만큼의 행을 무작위로 추출합니다.sample(frac=비율): 전체 행 수 대비 지정한 비율만큼의 데이터를 무작위로 추출합니다.random_state: 재현 가능성(Reproducibility)을 확보하기 위해 난수 생성 패턴을 고정하는 역할을 합니다.
다음 [판다스 24화]에서는 정제와 추출을 마친 정량 데이터를 시각적인 직관으로 전환하기 위한 분석 시각화의 첫걸음인 Pandas Plot과 Matplotlib로 데이터 시각화 시작하기에 대해 상세히 학습해 보겠습니다. 데이터의 분포를 눈으로 확인하는 핵심 기술을 함께 마스터해 봅시다.