메뉴 닫기

파이썬 pandas 누적 연산 완벽 가이드 cumsum cumprod cumcount cummax cummin diff pct_change

파이썬 pandas 누적 연산 완벽 가이드 cumsum cumprod cumcount cummax cummin diff pct_change

📌 데이터 집계·그룹 분석의 핵심, 누적과 변화율을 한 번에 정리합니다

실무 데이터는 하루치 숫자만 보아서는 결론이 잘 보이지 않습니다.
연속된 값의 흐름을 읽어야 트렌드와 이상치를 포착하고, 의사결정에 도움이 되는 신호를 끌어낼 수 있습니다.
pandas의 누적 함수와 변화율 계산 도구는 이런 흐름을 빠르게 보여주는 표준 도구입니다.
나만의 분석 템플릿에 안전하게 넣어 두면 숫자가 바뀌어도 같은 규칙으로 재사용할 수 있어 작업 시간이 눈에 띄게 줄어듭니다.
이 글은 초보자도 그대로 따라 할 수 있도록 개념, 동작 원리, 실습 포인트를 차근차근 안내합니다.

주제는 명확합니다.
파이썬 pandas에서 집계·그룹 분석 시 반드시 알아야 할 누적 관련 메서드인 cumsum, cumprod, cumcount, cummax, cummin과 시계열·패널 데이터에서 자주 쓰는 diff, pct_change를 한곳에 정리합니다.
각 함수의 정의와 반환 형태, 결측치 처리 방식, 그룹화와 결합하는 패턴, 실수하기 쉬운 옵션을 실제 사례 중심으로 정리해 재현 가능한 분석 흐름을 만드는 데 초점을 맞춥니다.
불필요한 이론을 늘어놓기보다 자주 마주치는 문제를 정확히 해결하도록 돕는 안내서가 되도록 구성했습니다.



🔗 누적 연산의 개념과 사용 시점

누적 연산은 시계열이나 순차 데이터에서 이전까지의 결과를 현재 시점에 반영해 흐름을 만든다는 점이 핵심입니다.
한 줄짜리 합계가 아니라, 인덱스가 증가함에 따라 값이 점진적으로 쌓이거나 변화하는 모습을 그대로 수치화합니다.
pandas에서는 cumsum, cumprod, cumcount, cummax, cummin처럼 누적을 만드는 함수와, 변화량을 계산하는 diff, 증감률을 구하는 pct_change가 표준 도구로 자리 잡고 있습니다.
이 도구들은 집계그룹 분석에서 반복적으로 쓰이며, 벡터화된 방식으로 매우 빠르게 동작합니다.

누적 연산이 필요한 대표 상황을 간단히 정리하면 다음과 같습니다.
일 매출이 쌓여 월 누적 매출을 보고 싶을 때, 주가가 기간 동안 얼마나 증가 또는 하락했는지 흐름을 보고 싶을 때, 특정 조건을 만족한 건수 카운트가 시점별로 어떻게 누적되는지 알고 싶을 때가 이에 해당합니다.
또한 KPI 달성률을 추적하거나, 생산 공정의 최대·최소 경신 여부를 찾는 데에도 누적 극값이 유용합니다.

📌 누적과 변화량을 구분하는 기준

누적 함수는 현재값과 과거까지의 집계 흐름을 만듭니다.
예를 들어 cumsum은 누적합, cumprod는 누적곱, cummax/cummin은 시점별 최고·최저 추적, cumcount는 순서를 나타내는 인덱스 역할을 합니다.
반면 diff는 이전 시점과의 차이, pct_change증감률을 계산해 변화의 속도를 보여줍니다.
따라서 목표가 “얼마나 쌓였는가”라면 누적, “얼마나 달라졌는가”라면 변화량·증감률을 선택합니다.

CODE BLOCK
import pandas as pd

s = pd.Series([5, 3, 4, 2, 1])

# 누적 계열
s_cum_sum  = s.cumsum()     # 5, 8, 12, 14, 15
s_cum_prod = s.cumprod()    # 5, 15, 60, 120, 120
s_cum_max  = s.cummax()     # 5, 5, 5, 5, 5
s_cum_min  = s.cummin()     # 5, 3, 3, 2, 1

# 변화 계열
s_diff_1   = s.diff(periods=1)      # NaN, -2, 1, -2, -1
s_pct_1    = s.pct_change(periods=1)  # NaN, -0.4, 0.333..., -0.5, -0.5

📌 정렬과 인덱스가 결과에 미치는 영향

누적과 변화량은 데이터의 순서에 민감합니다.
날짜 오름차순인지 내림차순인지에 따라 결과가 달라질 수 있으므로, 연산 전 정렬 상태를 먼저 확인합니다.
또한 시계열 인덱스를 사용한다면 빈 날짜가 존재할 때 보간이나 재색인 여부에 따라 diffpct_change의 해석이 달라집니다.
의도하지 않은 누락이나 중복이 있으면 결과가 왜곡될 수 있으므로, 인덱스 고유성, 정렬 방향, 중복 라벨 처리 여부를 명확히 해두는 것이 좋습니다.

💡 TIP: 날짜형 컬럼이 따로 있고 RangeIndex를 쓰는 경우라도, 연산 직전에 sort_values로 명시적으로 정렬해 두면 실수를 줄일 수 있습니다.

📌 결측치와 0, 그리고 해석상의 주의점

결측치(NA)는 누적과 변화량에서 서로 다르게 작용합니다.
누적 함수들은 보통 결측을 건너뛰거나 그대로 남겨두는 옵션을 제공합니다.
변화량 함수인 diffpct_change는 기준값이 결측이거나 0일 때 해석이 달라질 수 있습니다.
특히 pct_change에서 이전 값이 0이면 무한대 또는 정의되지 않은 값이 나올 수 있으므로, 0 분모를 사전에 치환하거나 구간을 제외하는 전처리가 필요합니다.
또한 이벤트성 급등·급락이 있는 컬럼은 winsorize 등으로 이상치를 다듬은 뒤 해석하면 의사결정에 더 유용합니다.

  • 🛠️연산 전 정렬 방향을 확인했는가
  • ⚙️결측치 처리 정책(유지, 삭제, 대체)을 명시했는가
  • 📈목표가 누적인지 변화량·증감률인지 구분했는가
  • 🧪0 분모, 음수 값, 이상치가 결과 해석에 미치는 영향을 점검했는가
함수 핵심 목적
cumsum, cumprod, cummax, cummin, cumcount 누적 흐름과 극값 및 순번 생성
diff, pct_change 시점 간 변화량과 증감률 계산

⚠️ 주의: 주가·환율처럼 비율 해석이 중요한 데이터는 pct_change가 분석 목적과 단위에 맞는지 먼저 점검하세요.
로그 수익률처럼 다른 정의를 쓰는 지표와 혼용하면 해석이 흔들릴 수 있습니다.

🧮 cumsum과 cumprod로 누적합·누적곱 계산

데이터 분석에서 가장 직관적으로 사용되는 누적 연산은 cumsumcumprod입니다.
cumsum은 행 단위로 값들을 더해가며 누적합을 반환합니다.
예를 들어 하루 매출이 기록된 시리즈가 있다면, 누적합은 해당 월의 누적 매출을 바로 구할 수 있게 합니다.
cumprod는 데이터를 곱해가며 누적곱을 반환하는데, 이는 복리 계산이나 성장률 누적을 추적할 때 매우 유용합니다.

특히 금융 데이터 분석에서는 수익률을 (1 + 일별 수익률) 형태로 변환한 뒤 cumprod를 적용하여 장기 투자 성과를 추적합니다.
이는 투자 기간 동안 실제로 자산이 얼마나 불어났는지를 계산하는 간단하면서도 강력한 방법입니다.

📌 cumsum 기본 예제

CODE BLOCK
import pandas as pd

sales = pd.Series([100, 200, 150, 300])
cumulative_sales = sales.cumsum()
print(cumulative_sales)

# 출력
# 0    100
# 1    300
# 2    450
# 3    750

위 예시는 일별 매출이 순서대로 누적되는 모습을 보여줍니다.
단순하지만, 실제로는 월간 매출 집계, 연간 매출 추적 등 다양한 실무 분석에 쓰일 수 있습니다.

📌 cumprod 기본 예제

CODE BLOCK
returns = pd.Series([0.05, -0.02, 0.03, 0.04])
growth = (1 + returns).cumprod()
print(growth)

# 출력
# 0    1.050000
# 1    1.029000
# 2    1.059870
# 3    1.102265

위 예시는 일별 수익률을 바탕으로 누적 투자 성과를 추적한 것입니다.
첫날 5% 수익이 발생하고, 둘째 날 2% 손실이 있었지만 이후 3%, 4% 상승하면서 결과적으로 10% 이상 자산이 불어난 것을 알 수 있습니다.
cumprod는 복리 효과를 간단하게 확인할 수 있는 매우 실용적인 함수입니다.

💎 핵심 포인트:
cumsum은 단순 누적합으로 직관적인 흐름을 보여주며, cumprod는 성장률이나 복리 계산에 적합합니다. 데이터 성격에 따라 올바른 함수를 선택하는 것이 중요합니다.



📊 cumcount cummax cummin으로 순번과 극값 추적

pandas에서는 단순한 합계나 곱셈뿐 아니라, 데이터 흐름 속에서 순번최댓값·최솟값을 추적하는 기능도 지원합니다.
대표적인 함수가 cumcount, cummax, cummin입니다.
이들은 데이터가 쌓일 때마다 시점별로 변화를 기록해줍니다.

📌 cumcount로 순번 계산하기

cumcount는 groupby와 함께 사용되어 그룹 내에서 각 행의 순서를 반환합니다.
즉, 특정 조건이나 그룹 단위로 몇 번째 등장했는지를 쉽게 파악할 수 있습니다.

CODE BLOCK
import pandas as pd

df = pd.DataFrame({
    "team": ["A", "A", "B", "A", "B", "B"],
    "score": [10, 20, 15, 30, 25, 40]
})

df["order_in_team"] = df.groupby("team").cumcount()
print(df)

# 출력
#   team  score  order_in_team
# 0    A     10              0
# 1    A     20              1
# 2    B     15              0
# 3    A     30              2
# 4    B     25              1
# 5    B     40              2

이 예시처럼 각 그룹 안에서 순차 번호를 부여할 수 있어, 이벤트의 발생 순서나 정렬된 순번이 필요할 때 자주 활용됩니다.

📌 cummax와 cummin으로 극값 추적하기

cummax는 시점까지의 누적 최댓값을, cummin은 누적 최솟값을 반환합니다.
이는 주가가 최고점을 경신했는지, 또는 특정 지표가 바닥을 찍었는지 확인하는 데 매우 유용합니다.

CODE BLOCK
s = pd.Series([3, 1, 4, 2, 5])

print(s.cummax())
# 출력: 3, 3, 4, 4, 5

print(s.cummin())
# 출력: 3, 1, 1, 1, 1

이처럼 누적 극값 함수는 데이터의 진행 과정에서 기록을 갱신하는 흐름을 직관적으로 보여줍니다.
특히 경기 성적, 최고 매출일, 최저 불량률 같은 비즈니스 지표 분석에 빠질 수 없는 기능입니다.

💎 핵심 포인트:
cumcount는 그룹 내 순서를 계산할 때, cummax와 cummin은 최고점·최저점 기록을 추적할 때 사용합니다. 데이터 흐름 속에서 이벤트를 구분하거나 극값을 찾을 때 필수적인 도구입니다.

diff와 pct_change로 변화량·증감률 계산

데이터 흐름을 분석할 때 단순히 쌓여온 값뿐 아니라, 얼마나 변했는가를 보는 것도 중요합니다.
이를 위한 대표적인 함수가 diffpct_change입니다.
diff는 이전 값과의 차이를 계산해 변화량을 보여주고, pct_change는 이전 값 대비 비율로 변화를 계산해줍니다.
시계열 분석, 주가 변동률 계산, KPI 증감률 추적 등에서 매우 자주 쓰이는 함수입니다.

📌 diff로 단순 변화량 확인

diff는 현재 값과 바로 이전 값의 차이를 계산합니다.
이전 값이 10이고 현재 값이 12라면 결과는 2가 됩니다.
periods 매개변수를 통해 몇 번째 이전 값과 비교할지도 설정할 수 있습니다.

CODE BLOCK
import pandas as pd

s = pd.Series([100, 105, 103, 110])

print(s.diff())       # 이전 값과의 차이
print(s.diff(periods=2))  # 2칸 전과의 차이

# 출력
# 0    NaN
# 1    5.0
# 2   -2.0
# 3    7.0

# 0    NaN
# 1    NaN
# 2    3.0
# 3    5.0

📌 pct_change로 증감률 계산

pct_change는 이전 값 대비 비율로 변화를 계산합니다.
예를 들어 100에서 105로 증가했다면 (105-100)/100 = 0.05, 즉 5% 증가로 표현됩니다.
periods 옵션을 사용해 2칸 전 대비 증감률도 확인할 수 있습니다.

CODE BLOCK
print(s.pct_change())       # 이전 값 대비 증감률
print(s.pct_change(periods=2))  # 2칸 전 대비 증감률

# 출력
# 0         NaN
# 1    0.050000
# 2   -0.019048
# 3    0.067961

# 0         NaN
# 1         NaN
# 2    0.030000
# 3    0.047619

pct_change는 비율로 변화를 해석할 수 있어 주가, 매출, 방문자 수 등 상대적 비교가 중요한 지표 분석에 적합합니다.

💡 TIP: diff는 절대적인 값의 차이를, pct_change는 상대적인 비율 차이를 보여줍니다. 데이터의 성격에 따라 적합한 함수를 선택하는 것이 중요합니다.

⚠️ 주의: 이전 값이 0일 경우 pct_change는 무한대 값이나 NaN을 반환할 수 있습니다. 분석 전에 0 값 처리 방식을 정하는 것이 필요합니다.



🧰 그룹화 groupby와 누적 함수 결합 패턴

pandas의 누적 함수들은 단일 시리즈나 데이터프레임에만 적용되는 것이 아닙니다.
실무에서는 groupby와 함께 사용하여 그룹별 누적합, 그룹별 순번, 그룹별 극값을 추적하는 경우가 많습니다.
예를 들어 월별, 지역별, 카테고리별 데이터를 각각 독립적으로 분석하면서 동시에 전체 흐름을 유지하고자 할 때 매우 강력합니다.

📌 그룹별 누적합과 누적곱

CODE BLOCK
import pandas as pd

df = pd.DataFrame({
    "team": ["A", "A", "B", "B", "A", "B"],
    "sales": [100, 200, 150, 300, 250, 100]
})

# 그룹별 누적합
df["team_cumsum"] = df.groupby("team")["sales"].cumsum()

# 그룹별 누적곱
df["team_cumprod"] = df.groupby("team")["sales"].cumprod()

print(df)

위 예시는 팀 A, 팀 B 각각에 대해 매출 누적합과 누적곱을 계산한 결과입니다.
전체 데이터를 섞지 않고 그룹 단위로 독립적인 누적 흐름을 관리할 수 있습니다.

📌 그룹별 순번, 극값, 변화량

CODE BLOCK
# 그룹별 순번
df["team_order"] = df.groupby("team").cumcount()

# 그룹별 최고, 최저
df["team_cummax"] = df.groupby("team")["sales"].cummax()
df["team_cummin"] = df.groupby("team")["sales"].cummin()

# 그룹별 변화량과 증감률
df["team_diff"] = df.groupby("team")["sales"].diff()
df["team_pct_change"] = df.groupby("team")["sales"].pct_change()

print(df)

groupby와 함께 사용할 경우, 단순히 전체 데이터 기준으로만 보는 것이 아니라 그룹 단위에서의 순번, 극값 갱신, 변화량까지도 동시에 추적할 수 있습니다.
이는 팀별 성과 분석, 제품별 성장률 비교, 지역별 매출 추세 등 다양한 상황에 직접적으로 활용됩니다.

💎 핵심 포인트:
groupby와 누적 함수를 결합하면 단일 흐름이 아닌 그룹 단위의 시계열 분석이 가능합니다. 이는 비즈니스 현장에서 데이터 기반 인사이트를 확보하는 핵심 패턴입니다.

자주 묻는 질문 FAQ

cumsum과 sum은 어떻게 다른가요?
sum은 전체 합계를 한 번에 반환하지만, cumsum은 각 시점까지의 누적합을 반환합니다. 즉, 시계열 흐름을 볼 때는 cumsum이 적합합니다.
cumcount와 rank 함수는 차이가 있나요?
cumcount는 그룹 내 등장 순서를 단순히 0부터 카운트하며, rank는 값의 크기 순서를 매깁니다. 따라서 목적에 맞게 선택해야 합니다.
cummax와 rolling max의 차이는 무엇인가요?
cummax는 시작점부터 현재까지의 최댓값을 추적하고, rolling max는 지정한 윈도우 크기 내에서만 최댓값을 계산합니다.
pct_change는 언제 주로 활용되나요?
pct_change는 주가 변동률, 매출 성장률, 방문자 증감률 등 상대적 비교가 필요한 데이터에서 주로 사용됩니다.
diff와 shift의 차이는 무엇인가요?
shift는 단순히 데이터를 밀어내어 이전 값을 가져오고, diff는 현재 값과 shift 값의 차이를 반환합니다.
누적합과 이동평균은 어떤 차이가 있나요?
누적합은 시점까지 계속 쌓이는 합을 보여주고, 이동평균은 일정 구간의 평균만을 계산합니다. 분석 목적에 따라 선택이 달라집니다.
groupby와 누적 함수를 함께 쓰면 성능에 문제가 없나요?
pandas의 groupby와 누적 함수는 벡터화되어 있어 일반적으로 빠르지만, 데이터가 수백만 건 이상일 경우 성능 최적화를 고려해야 합니다.
결측치가 있는 데이터에도 누적 함수를 적용할 수 있나요?
가능합니다. 다만 결측치는 그대로 남기거나 건너뛰도록 설정할 수 있습니다. 분석 목적에 따라 fillna로 전처리한 후 적용하는 것이 일반적입니다.

📌 pandas 누적 연산과 변화율 계산 한눈에 정리

pandas의 누적 연산과 변화율 함수는 데이터 흐름을 읽는 가장 기본적인 도구이자 동시에 강력한 무기입니다.
cumsum, cumprod, cumcount, cummax, cummin은 데이터를 쌓으며 흐름을 만들어 주고, diff와 pct_change는 시점 간의 차이와 증감률을 수치로 명확히 보여줍니다.
특히 groupby와 결합하면 집계 단위를 유지한 채로 그룹별 분석까지 가능해져, 실무 데이터 처리 효율을 크게 높일 수 있습니다.
결측치와 0 값 처리에만 주의한다면, 이 함수들은 금융, 제조, 웹 로그, 연구 데이터 등 어디서든 바로 활용할 수 있는 실전형 도구입니다.


🏷️ 관련 태그 : pandas누적합, pandas누적곱, pandas변화율, cumsum, cumprod, cumcount, cummax, cummin, diff, pct_change, 파이썬데이터분석