파이썬(Python) 판다스(Pandas) 라이브러리를 활용하여 시계열 데이터나 순차적으로 적재되는 트랜잭션 데이터를 분석할 때, 단순한 행 단위의 연산을 넘어 시간의 흐름이나 데이터의 누적 추이를 반영해야 하는 경우가 많습니다. 예를 들어 비즈니스 실무에서 “일별 누적 매출액 흐름 추적”, “최근 7일간의 매출 이동평균(Rolling Average) 계산”, 또는 “영업점별 실적 순위 산출” 등이 대표적인 사례입니다.
이러한 연산은 데이터의 흐름과 선후 관계를 파악하는 요약 지표로서 활용도가 높으며, 빅데이터분석기사(빅분기) 실기 시험에서도 작업형 제1유형의 기출 및 단골 응용 패턴으로 자주 등장합니다. 이번 글에서는 판다스의 핵심 시계열 및 순차 연산 기능인 cumsum(), rolling(), rank() 함수의 개념과 주요 파라미터, 그리고 실전 비즈니스 가상 데이터를 활용한 예제를 체계적으로 정리하겠습니다.
1. 시간 흐름에 따른 데이터의 축적: cumsum() 함수
cumsum()은 Cumulative Sum(누적합)의 약어로, 데이터프레임이나 시리즈의 첫 번째 행부터 현재 행까지의 누적합을 계산하여 반환합니다.
1.1. 누적합 연산의 기본 사용법
시계열 데이터에서 날짜가 지나감에 따라 매출이나 가입자 수가 어떻게 누적되어 늘어나는지 파악할 때 유용하게 쓰입니다.
import pandas as pd
# 가상의 일별 매출 데이터 생성
daily_sales = pd.DataFrame({
'날짜': ['2026-07-10', '2026-07-11', '2026-07-12', '2026-07-13', '2026-07-14'],
'당일매출': [100, 150, 80, 200, 120]
})
# 당일매출 컬럼을 바탕으로 일별 누적매출 파생변수 생성
daily_sales['누적매출'] = daily_sales['당일매출'].cumsum()
print(daily_sales)
[출력 결과]
날짜 당일매출 누적매출
0 2026-07-10 100 100
1 2026-07-11 150 250
2 2026-07-12 80 330
3 2026-07-13 200 530
4 2026-07-14 120 650
cumsum()은 누적곱을 구하는 cumprod(), 누적 최댓값과 최솟값을 구하는 cummax(), cummin()과 함께 판다스의 대표적인 누적 연산자 그룹에 속합니다. 정렬 상태가 결과에 직접적인 영향을 주므로, 시계열 데이터를 다룰 때는 사전에 날짜순으로 정렬(sort_values)한 뒤 적용하는 흐름이 안정적입니다.
2. 노이즈를 제거하고 트렌드를 보는 이동평균: rolling() 함수
rolling() 함수는 데이터프레임에서 일정 크기의 ‘윈도우(Window, 구간)’를 설정하고, 이 윈도우가 데이터의 순서를 따라 한 행씩 이동하면서 지정한 통계량(평균, 합계 등)을 계산하도록 돕는 도구입니다. 주식 시장의 이동평균선이나 일별 매출의 단기 변동성(노이즈)을 줄이고 장기적 추세를 파악할 때 사용됩니다.
2.1. rolling()의 핵심 파라미터 구조
- window: 연산에 포함할 연속된 행의 개수(구간 크기)를 정수로 지정합니다.
- min_periods: 윈도우 크기만큼의 데이터가 채워지지 않았을 때, 연산을 수행하기 위한 최소한의 유효 데이터 개수를 설정합니다. 지정하지 않으면 윈도우 크기보다 데이터가 부족한 초기 행들은 결측치(
NaN)로 처리됩니다.
2.2. 비즈니스 예시로 이해하는 3일 이동평균 계산
앞서 정의한 daily_sales 데이터프레임을 바탕으로 최근 3일간의 매출 이동평균을 구해보겠습니다.
# window=3으로 설정하여 3일 매출 이동평균 계산
daily_sales['3일이동평균'] = daily_sales['당일매출'].rolling(window=3).mean()
print(daily_sales)
[출력 결과]
날짜 당일매출 누적매출 3일이동평균
0 2026-07-10 100 100 NaN
1 2026-07-11 150 250 NaN
2 2026-07-12 80 330 110.000000
3 2026-07-13 200 530 143.333333
4 2026-07-14 120 650 133.333333
인덱스 0번과 1번 행은 3일 치 데이터가 누적되지 않았으므로 기본 설정상 NaN이 반환됩니다. 인덱스 2번 행에 도달해서야 비로소 0번, 1번, 2번 행의 평균값인 (100 + 150 + 80) / 3 = 110이 정상적으로 계산됩니다. 만약 초기 데이터 부족 구간에서도 연산을 수행하고 싶다면 rolling(window=3, min_periods=1).mean()과 같이 최소 기준을 낮추어 조율할 수 있습니다.
3. 데이터 간의 서열 매기기: rank() 함수
rank() 함수는 9화에서 기초 사용법을 살펴본 바와 같이, 각 데이터 값들의 크기를 비교하여 순위를 부여하는 함수입니다. 시계열 지표 가공 시 누적합이나 이동평균 변수를 생성한 후, 최종적인 순위 분석 단계에서 유기적으로 결합됩니다.
3.1. rank()의 핵심 옵션 복습
- ascending:
True(기본값)는 오름차순(작은 값이 1위),False는 내림차순(큰 값이 1위) 순위를 부여합니다. - method: 동순위(값이 같은 데이터)가 발생했을 때 처리 방식을 지정합니다. 주로 스포츠식 순위인
'min'이나 동순위를 건너뛰지 않는'dense'방식이 실무와 시험에서 자주 사용됩니다.
# 일별 당일매출 기준 내림차순 순위 산출 (가장 매출이 높은 날이 1위)
daily_sales['매출순위'] = daily_sales['당일매출'].rank(ascending=False, method='min')
4. 그룹별 독립적 계산을 위한 groupby()와의 연계
실무 데이터셋은 대개 여러 지점이나 상품 카테고리의 데이터가 하나의 테이블에 혼재되어 있습니다. 이때 전체 행을 기준으로 누적합이나 이동평균을 구하면 서로 다른 지점의 데이터가 뒤섞여 논리적 오류가 발생합니다. 각 그룹 내에서 독립적으로 순차 연산을 수행하려면 groupby()와 결합해야 합니다.
# 여러 지점이 섞인 가상 데이터 생성
multi_store = pd.DataFrame({
'지점': ['A점', 'A점', 'A점', 'B점', 'B점', 'B점'],
'당일매출': [100, 150, 200, 80, 90, 85]
})
# 지점별로 그룹을 분리한 후, 각 그룹 내부에서 누적합 연산 수행
multi_store['지점별누적매출'] = multi_store.groupby('지점')['당일매출'].cumsum()
이와 같이 groupby()와 순차 함수들을 연계하면 데이터의 독립적인 통계 흐름을 깨뜨리지 않으면서 정교한 파생변수 컬럼을 확보할 수 있습니다.
5. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트
빅데이터분석기사 실기 시험(작업형 제1유형)에서는 누적 연산이나 윈도우 함수를 적용한 후 특정 조건으로 필터링하는 복합형 문항이 출제됩니다.
5.1. 이동평균 및 누적합 기반 조건부 통계량 도출
예를 들어 “주어진 시계열 데이터셋에서 5일 이동평균 매출액을 계산한 후, 이동평균 값이 원본 당일매출보다 큰 날짜들의 당일매출 총합을 구하시오”라는 요건이 나온다면 다음과 같이 대응할 수 있습니다.
# [시험장 실전 대응 프로토콜]
# 1. 5일 이동평균 파생변수 생성 (min_periods 파라미터 조율 확인)
df['MA5'] = df['Sales'].rolling(window=5).mean()
# 2. 이동평균이 당일매출보다 큰 조건으로 불리언 인덱싱 필터링
# 결측치(NaN)는 비교 연산 시 자동으로 False 처리되므로 안전하게 필터링됩니다.
target_df = df[df['MA5'] > df['Sales']]
# 3. 조건에 맞는 행들의 당일매출 합계 연산 및 출력
result = target_df['Sales'].sum()
print(int(result))
시계열 가공 단계에서 발생하는 초기 행의 결측치(NaN)는 분석 목적에 따라 삭제(dropna)하거나 연산에서 제외해야 할 수 있으므로, 문제에서 제시한 조건을 세부적으로 파악한 후 최종 요약 값을 도출하는 연습이 요구됩니다.
6. 요약 및 다음 화 안내
cumsum():첫 번째 행부터 현재 행까지의 누적합을 계산합니다.rolling(): 일정한 윈도우 구간을 설정하여 이동평균 등을 구하며, 데이터의 단기 변동성을 완화하여 거시적 추세를 읽어내는 데 기여합니다.rank(): 지정한 정렬 방향과 동순위 처리 기준(method)에 맞춰 행 데이터 간의 서열 지표를 연산합니다.
다음 [판다스 22화]에서는 특정 조건에 맞춰 데이터를 구간별로 분류하고 범주화하는 강력한 내장 제어 도구인 np.where, cut, qcut으로 조건별 데이터 분류하기에 대해 상세히 학습해 보겠습니다. 전처리의 유연성을 더해주는 조건 분기 기술을 함께 마스터해 봅시다.