파이썬(Python) 판다스(Pandas) 라이브러리를 활용한 데이터 전처리 기초 문법을 익혔다면, 이제는 실제 비즈니스 환경에서 쓰이는 데이터를 바탕으로 종합적인 인사이트를 도출하는 실습을 진행할 차례입니다. 기업의 데이터 분석 업무나 경영 보고서 작성 시 가장 기본적이면서도 중요한 지표가 바로 ‘월별 매출(Monthly Revenue)’과 ‘전월 대비 성장률(MoM, Month-on-Month Growth Rate)’입니다.
이러한 연산은 대규모 시계열 트랜잭션 데이터를 요약하고, 기업의 성장 추세를 정량적인 수치로 증명하는 핵심 전처리 과정입니다. 또한 빅데이터분석기사(빅분기) 실기 시험의 작업형 제1유형이나 제2유형 파생변수 생성 단계에서도 시계열 흐름을 반영한 파생변수 생성이나 및 집계 문제로 연계되어 출제되기도 합니다. 이번 글에서는 가상의 로우(Raw) 데이터를 정제하여 월별 총매출과 성장률 지표를 계산하는 일련의 과정을 체계적으로 정리해 보겠습니다.
1. 실습용 가상 매출 데이터셋 구축
실습을 위해 주문 일자, 상품명, 판매량, 단가 정보를 포함하는 가상의 이커머스 매출 데이터프레임을 생성하겠습니다. 날짜가 정렬되지 않고, 금액 계산이 되어 있지 않은 전형적인 원본 데이터의 형태입니다.
import pandas as pd
import numpy as np
# 실습을 위한 가상 주문 데이터 생성
raw_data = {
'주문일자': ['2026-01-15', '2026-01-22', '2026-02-05', '2026-02-18', '2026-03-12', '2026-03-29', '2026-04-05'],
'상품명': ['노트북', '스마트폰', '태블릿', '노트북', '스마트폰', '태블릿', '노트북'],
'판매량': [10, 25, 15, 8, 30, 22, 12],
'단가': [1500000, 1000000, 600000, 1500000, 1000000, 600000, 1500000]
}
df = pd.DataFrame(raw_data)
print(df)
2. 1단계: 시계열 데이터 타입 변환 및 매출액 파생변수 생성
가장 먼저 수행해야 할 전처리는 문자열로 되어 있는 날짜를 판다스가 인식하는 날짜 객체로 변환하고, 판매량과 단가를 곱해 각 주문별 총 매출액을 산출하는 것입니다.
2.1. pd.to_datetime()을 통한 날짜 파싱
앞선 14화와 15화에서 학습한 것처럼, 문자열 형태의 ‘주문일자’를 시계열 연산이 가능한 상태로 만들기 위해 pd.to_datetime() 함수를 적용합니다.
# 1. 주문일자 컬럼의 타입을 datetime64로 변환
df['주문일자'] = pd.to_datetime(df['주문일자'])
# 2. 각 주문별 총 매출액 파생변수 생성
df['매출액'] = df['판매량'] * df['단가']
2.2. 월별 집계를 위한 ‘연월’ 정보 추출
원본 데이터에는 일자 단위로 기록되어 있으므로, 월 단위 그룹화를 수행하기 위해 날짜에서 ‘연-월’ 정보만 추출하는 파생변수를 추가합니다. .dt.to_period('M')를 사용하면 연도와 월만 깔끔하게 묶어 카테고리화할 수 있습니다.
# '연-월' 형태의 기간 객체 생성 (예: 2026-01)
df['연월'] = df['주문일자'].dt.to_period('M')
3. 2단계: groupby()를 활용한 월별 총매출 집계
‘연월’ 파생변수를 확보했다면, 17화에서 다룬 groupby() 함수를 사용하여 월별로 데이터를 분할하고 매출액의 합계를 구합니다.
# 연월 기준으로 매출액 합계 연산 및 평면 데이터프레임 구조로 변환
monthly_report = df.groupby('연월')['매출액'].sum().reset_index()
monthly_report.columns = ['연월', '총매출액']
print(monthly_report)
[출력 결과]
연월 총매출액
0 2026-01 40000000
1 2026-02 21000000
2 2026-03 43200000
3 2026-04 18000000
groupby와 .sum()의 결합을 통해 날짜순으로 묶인 월별 총매출액 정보가 요약 표 형태로 도출되었습니다.
4. 3단계: shift() 함수를 활용한 전월 매출 매칭
성장률(MoM)을 계산하는 공식은 (당월 매출 - 전월 매출) / 전월 매출 입니다. 이를 판다스 코드로 구현하려면 현재 행의 매출액 옆에 ‘바로 이전 행(전월)의 매출액’을 나란히 배치해야 계산이 수월해집니다. 이때 요긴하게 사용되는 함수가 바로 shift() 입니다.
4.1. shift() 함수의 작동 원리
shift(periods=1)는 시리즈나 데이터프레임의 데이터를 지정한 행 수만큼 아래 방향으로 한 행씩 이동시킵니다. 기본값은 1이며, 데이터를 한 칸씩 아래로 이동시켜 자연스럽게 ‘이전 달의 데이터’를 현재 행의 위치와 매칭할 수 있게 돕습니다.
# 한 행씩 아래로 밀어내어 '전월매출액' 컬럼 생성
monthly_report['전월매출액'] = monthly_report['총매출액'].shift(1)
print(monthly_report)
[출력 결과]
연월 총매출액 전월매출액
0 2026-01 40000000 NaN
1 2026-02 21000000 40000000.0
2 2026-03 43200000 21000000.0
3 2026-04 18000000 43200000.0
1월의 경우 비교할 이전 달의 데이터가 원본 데이터셋에 존재하지 않으므로 결측치(NaN)가 대입됩니다. 2월의 행에는 1월의 매출액인 40,000,000원이 ‘전월매출액’ 컬럼에 정상적으로 매칭된 것을 확인할 수 있습니다.
5. 4단계: 전월 대비 매출 성장률(MoM) 계산 및 포맷팅
이제 준비된 두 컬럼을 활용하여 성장률 지표를 계산하고, 가독성을 높이기 위해 소수점 자리를 정리하겠습니다.
# 1. 성장률 공식 대입 (당월 - 전월) / 전월
monthly_report['성장률'] = (monthly_report['총매출액'] - monthly_report['전월매출액']) / monthly_report['전월매출액']
# 2. 백분율(%) 형태로 표현하고 싶다면 아래와 같이 가공할 수 있습니다.
# (출력 전용 문자열로 바꾸는 것은 후속 수치 연산을 방해할 수 있으므로, 최종 보고 단계에서 권장합니다.)
monthly_report['성장률_표시'] = (monthly_report['성장률'] * 100).round(2).astype(str) + '%'
print(monthly_report[['연월', '총매출액', '전월매출액', '성장률_표시']])
[출력 결과]
연월 총매출액 전월매출액 성장률_표시
0 2026-01 40000000 NaN nan%
1 2026-02 21000000 40000000.0 -47.5%
2 2026-03 43200000 21000000.0 105.71%
3 2026-04 18000000 43200000.0 -58.33%
분석 결과를 통해 2월에는 매출이 47.5% 감소했으나, 3월에는 전월 대비 105.71% 성장하는 지그재그형 매출 추이를 보이고 있음을 정량적으로 진단할 수 있습니다. 1월의 성장률 지표는 결측치 연산의 영향으로 nan%로 처리되었습니다.
6. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트
빅데이터분석기사 실기 시험(특히 작업형 제1유형)에서는 시계열 데이터를 그룹화한 뒤 특정 시점 간의 차이값이나 변동률을 계산하라는 형태의 문제가 종종 출제됩니다.
6.1. shift() 연산 시의 결측치 처리 전략
shift()를 적용하면 반드시 첫 번째 행 혹은 마지막 행 부근에 결측치(NaN)가 발생하게 됩니다. 시험 문제에서 “평균 성장률을 구하시오”라거나 “성장률의 합계를 구하시오”라는 지시가 있을 때, 결측치를 무작정 지우기보다 판다스 내장 함수(mean(), sum())의 기본 특성인 ‘결측치 자동 제외 기능’을 인지하고 활용하는 것이 좋습니다.
# 결측치를 제외한 순수 성장률 데이터의 평균 계산
average_growth = monthly_report['성장률'].mean()
print(average_growth)
6.2. pct_change() 함수라는 대안 확보
판다스는 shift()를 이용한 수동 연산 외에도, 이전 행 대비 변동 비율을 곧바로 계산해 주는 pct_change()라는 유용한 내장 메서드도 제공합니다.
# pct_change()를 활용한 한 줄 성장률 계산 프로토콜
# 내부적으로 shift(1) 연산 구조를 적용하여 동일한 비율 값을 반환합니다.
monthly_report['성장률_간편'] = monthly_report['총매출액'].pct_change()
시험장 환경에서는 익숙한 방법을 선택하는 전략이 유용합니다. 복잡한 수식 처리를 판다스의 내장 연산 구조로 간단하게 구현하는 능력을 갖추는 것은 실전 실기 시험에서 실점 확률을 낮추고 안정적으로 점수를 확보하는 밑바탕이 됩니다.
7. 요약 및 다음 화 안내
dt.to_period('M'): 일별 날짜 정보를 연월 단위의 그룹 키로 변환하여 시계열 집계의 기반을 정립합니다.shift(1): 데이터를 아래로 한 칸 밀어내어 현재 행에 이전 시점의 값을 대응시킵니다.pct_change(): 전월 대비 변동 비율을 연산하는 내장 대안 함수로, 수식 작성 생략에 기여합니다.
다음 [판다스 26화]에서는 마케팅 및 영업 관리 직무에서 고객 관리 지표를 다룰 때 필수적인 고객 데이터 분석 실습: 우수 고객과 이탈 고객 찾기에 대해 상세히 학습해 보겠습니다. 고객 행동 데이터를 정제하고 세분화하는 실전 비즈니스 가공 기법을 함께 익혀봅시다.