개요 - 월 매출처럼 시간이 흐를수록 쌓이는 지표는 "누계(Cumulative)/전월대비(MoM)/전년동기(YoY)" 세 가지만 정리해도 보고 품질이 확 달라집니다. 이 글은 복잡한 차트 없이도 스프레드시트 수식만으로 세 지표를 안정적으로 계산하고, 최초 12개월 공란 처리, 0으로 나누기 방지 같은 실무 함정을 피하는 절차를 안내드립니다.
데이터 받기(바로 실습 가능)
- 기본 월별 데이터: 06_monthly_sales.csv
- 계산 열 포함본: 06_monthly_sales_enriched.csv
샘플 데이터 설명 — 어떤 컬럼이 있나요?
두 파일은 동일한 월 범위를 다루되, enriched에는 누계/MoM/YoY가 계산되어 있습니다. 표로 구조를 먼저 확인하시고, 필요하신 열만 선택하여 응용하시면 됩니다.
원본 - 06_monthly_sales.csv
컬럼 | 의미 | 예시 | 비고 |
---|---|---|---|
month |
월(문자) | 2024-07 |
YYYY-MM 형식 |
sales |
해당 월 매출 | 170000 |
정수(원) |
결과 포함본 - 06_monthly_sales_enriched.csv
컬럼 | 의미 | 예시 | 비고 |
---|---|---|---|
month |
월(문자) | 2025-03 |
YYYY-MM |
sales |
월 매출 | 215000 |
정수(원) |
cumulative_sales |
해당 월까지 누계 | 2,105,000 |
앞선 모든 월의 합 |
MoM |
전월 대비 증감률 | 0.048 |
소수(퍼센트 서식 권장) |
YoY |
전년 동월 대비 | 0.095 |
첫 12개월은 공란 |
계산의 뼈대부터 잡겠습니다
월은 반드시 시간순으로 정렬되어 있어야 합니다. 월 값이 텍스트라면 날짜로 변환해 정렬하고, 다시 TEXT(…,"yyyy-mm")
로 보여주셔도 좋습니다.
1) 누계(Cumulative)
- 간단 합산식(표 상단이 2행일 때):
=SUM($B$2:B2)
— B열이 sales 가정 - 동적 배열(Excel 365):
=SCAN(0, sales_range, LAMBDA(a,x, a+x))
- Sheets 대안:
=MMULT( (ROW(B2:B)-ROW(B2)+1>=TRANSPOSE(ROW(B2:B)-ROW(B2)+1))*1 , B2:B )
(범위는 실제 길이에 맞게 제한)
2) 전월대비(MoM)
- 기본식:
=(현재월_sales - 이전월_sales) / 이전월_sales
- 표 형태:
=IFERROR( ([@sales]-OFFSET([@sales],-1,0))/OFFSET([@sales],-1,0) , "" )
— 첫 행은 공란 처리 - 퍼센트로 보기: 셀 서식을 백분율로 지정하거나
=TEXT(셀,"0.0%")
3) 전년동기(YoY)
- 기본식:
=(현재월_sales - 12개월전_sales) / 12개월전_sales
- 표 형태:
=IFERROR( ([@sales]-OFFSET([@sales],-12,0))/OFFSET([@sales],-12,0) , "" )
— 첫 12행은 공란 - 월 완전성: 특정 월이 비어 있으면 왜곡됩니다. 빈 월은 0이 아니라 결측으로 다루고 별도 보강을 권장드립니다.
숫자가 틀리지 않도록 하는 작은 습관
- 정렬이 먼저 — 시계열은 반드시 오름차순으로 정렬해 주세요.
- 0 나누기 방지 — MoM/YoY 계산에는
IFERROR(…,"")
또는IF(분모=0,"",…)
를 결합해 주세요. - 퍼센트 서식 통일 — 수치는 소수, 표시만 %로. 혼용하면 합계·평균 해석이 흔들립니다.
- 행 삽입 내성 —
OFFSET
대신INDEX
를 쓰면 대량 데이터에서 더 가볍습니다. 예:INDEX(sales,ROW()-ROW(헤더)-12)
현장에서 바로 쓰는 문장화 레시피
숫자를 말로 바꾸면 보고가 쉬워집니다. 예: =TEXT(month,"yyyy-mm")&" 매출 "&TEXT(sales,"#,##0")&"원 ("&IF(MoM="", "전월 비교값 없음", IF(MoM>=0,"▲","▼")&TEXT(ABS(MoM),"0.0%"))&")"
퀵체크(복사해 쓰는 검증 스니펫)
-- 누계 무결성: 마지막 행 누계 = 전체 합
=LAST(cumulative_sales) = SUM(sales)
-- MoM 첫 행 공란 확인
=COUNTBLANK(INDEX(MoM,1))=1
-- YoY 공란 구간(1~12행) 확인
=COUNTBLANK(INDEX(YoY,SEQUENCE(12)))=12
-- 정렬 확인(오름차순)
=MIN( month_num - OFFSET(month_num,-1,0) ) > 0
-- month_num은 =DATEVALUE(month&"-01") 또는 연월 숫자
데이터가 커졌을 때의 운영 팁
수천 행 이상에서는 계산 열을 값으로 확정해 재계산을 줄이시고, 원본(입력)과 파생(계산) 시트를 분리해 단방향 참조로 유지하시면 성능 저하를 예방하실 수 있습니다. 또한 월별 결측을 자동 보강하려면 캘린더 테이블(연-월 목록)과 XLOOKUP
을 사용해 빈 월을 0 또는 공란 규칙에 따라 채우는 방법을 권장드립니다.
마무리 한 줄
누계/MoM/YoY는 단순한 합/차이의 반복이지만, 공란·정렬·서식만 제대로 관리하시면 어디서든 바로 통하는 시계열 리포트를 만드실 수 있습니다. 위의 샘플 CSV와 공식을 그대로 적용해 보시고, 여러분의 데이터 구조에 맞게 열 이름만 바꿔 연결해 보시길 권합니다.