GrepBoard/매뉴얼
84 편 ·

CTR·CPA·ROAS 전체 값을 합계 기준으로 받기

·고침 ·claude-sonnet-5-5 · 2026-10-20 실행 (ChatGPT 는 실행하지 않음)·6 단계

캠페인별 CSV 로 AI 에게 주간 요약을 맡길 때, 전체 CTR·CPA·ROAS 를 합계로 계산하게 하고 합계 값까지 표로 받아 스프레드시트와 대조하는 방법입니다.

캠페인 5개의 CTR 이 7.50 · 1.50 · 0.20 · 1.20 · 0.30 % 인데 보고서의 「전체 CTR」이 2.14% 라면 단순 평균이 들어간 것입니다. 노출 수가 42,000 인 캠페인과 1,250,000 인 캠페인을 같은 비중으로 섞은 값이라 실제와 멀어집니다. 전체 비율은 분자의 합을 분모의 합으로 나눠야 합니다.

[1] 시험 자료를 만듭니다. 가상 캠페인 5개의 2주 합계이고, 금액 단위는 원입니다.

ads.csv
campaign,impressions,clicks,cost,conversions,revenue브랜드검색,42000,3150,1260000,210,8400000일반검색,380000,5700,4560000,190,9120000디스플레이,1250000,2500,2250000,50,2750000리타게팅,160000,1920,1152000,96,5760000영상,600000,1800,1500000,18,900000

[2] 먼저 짧게 시킵니다. 지표 이름만 주고 계산 방식은 말하지 않았습니다. 실행은 claude -p --model claude-sonnet-5-5 --max-turns 1 --tools "" --setting-sources "" --strict-mcp-config < prompt.txt 입니다.

text
아래 캠페인별 성과 CSV 로 주간 요약을 써 줘. 전체 CTR, CPA, ROAS 를 꼭 넣어 줘. {CSV 붙여 넣기}

두 번 돌린 결과의 「전체」 값은 둘 다 맞았습니다. CTR 0.62% · CPA 약 19,011원 · ROAS 251%. 이 모델에서는 단순 평균 함정에 빠지지 않았습니다. 다만 요청하지 않은 숫자가 많이 따라옵니다.

  • 요청하지 않은 지표가 붙었습니다. 첫 번째는 광고비 비중 열이, 두 번째는 「CPC 약 712원, 전환율 3.74%」 한 줄이 따라왔습니다.
  • 표에 없는 비중이 문장으로 나옵니다. 「광고비의 22.5%로 매출의 52.6%」, 「광고비의 35%를 쓰고 매출은 13.6%」 같은 것입니다. 이번 값은 맞았지만 표에 없는 숫자라 대조할 자리가 없습니다.
  • ROAS 를 251% 로 적었습니다. 표기를 지정하지 않으면 보고서마다 2.51 과 251% 가 섞일 수 있습니다.

맞는 숫자를 내더라도 검산할 재료가 결과마다 다르게 나옵니다. 모델이 바뀌거나 CSV 가 커져 틀린 값이 나와도 알아채기 어렵습니다.

[3] 계산 방식과 출력 형식을 정해 줍니다. GPT 계열 안내서가 말하는 「필요한 논리를 명시적으로 주기」(OpenAI Prompt engineering)를 그대로 적용한 것입니다. 공식을 주고, 쓴 합계를 표 밑에 적게 하고, 단순 평균과 나란히 비교하게 합니다.

text
<data> 안의 CSV 는 광고 캠페인 5개의 2주 합계입니다. 열: 노출(impressions), 클릭(clicks), 광고비(cost, 원), 전환(conversions), 전환매출(revenue, 원). 규칙:- 전체 지표는 캠페인 지표의 평균이 아니라 합계로 계산합니다. 전체 CTR = 클릭 합 ÷ 노출 합, 전체 CPA = 광고비 합 ÷ 전환 합, 전체 ROAS = 전환매출 합 ÷ 광고비 합.- 먼저 표 1: 캠페인별 CTR(%), CPA(원), ROAS 와 마지막 줄 「전체」. 전체 줄 아래에 사용한 합계 5개(노출·클릭·광고비·전환·매출)를 따로 적습니다.- 표 2: 전체 CTR·CPA·ROAS 를 「합계로 계산한 값」과 「캠페인 값의 단순 평균」 두 가지로 적고 차이를 한 칸에 씁니다.- 마지막에 요약 문장 3개 이내. 표에 없는 숫자는 쓰지 않습니다.- CTR 은 소수 둘째 자리, ROAS 는 소수 둘째 자리, CPA 는 원 단위 반올림. <data>{CSV 붙여 넣기}</data>

「표에 없는 숫자는 쓰지 않습니다」 한 줄이 비중·CPC 가 따라붙는 것을 막습니다. 두 번 모두 표 2개와 요약 3줄이 전부였습니다.

[4] 결과입니다(첫 번째 실행). 표 2 는 합계 값 0.62 · 19,011 · 2.51 과 단순 평균 2.14 · 34,067 · 3.10 을 나란히 보였고, 요약은 3줄이었습니다. 두 번째도 같은 값이었습니다.

output
| 캠페인 | CTR(%) | CPA(원) | ROAS ||---|---|---|---|| 브랜드검색 | 7.50 | 6,000 | 6.67 || 일반검색 | 1.50 | 24,000 | 2.00 || 디스플레이 | 0.20 | 45,000 | 1.22 || 리타게팅 | 1.20 | 12,000 | 5.00 || 영상 | 0.30 | 83,333 | 0.60 || **전체** | **0.62** | **19,011** | **2.51** | 전체 줄에 사용한 합계:- 노출 2,432,000- 클릭 15,070- 광고비 10,722,000원- 전환 564- 전환매출 26,930,000원

[5] 스프레드시트로 대조합니다. CSV 를 시트에 붙이면 A 열이 캠페인, B~F 열이 노출·클릭·광고비·전환·매출입니다. 7행에 합계 수식을 둡니다.

수식
CTR   =SUM(C2:C6)/SUM(B2:B6)CPA   =SUM(D2:D6)/SUM(E2:E6)ROAS  =SUM(F2:F6)/SUM(D2:D6)

0.62% · 19,011 · 2.51 이 나와야 합니다. 각 행 CTR(=C2/B2)의 AVERAGE 는 2.14% 로, 표 2 의 단순 평균 열과 같습니다.

[6] 매주 쓴다면 「전체」 줄 대조는 스크립트로 합니다. 「전체」가 든 줄을 찾아 CSV 합계로 다시 계산한 값과 견줍니다.

check.py
#!/usr/bin/env python3"""usage: check.py ads.csv out.txt"""import csv, re, sysr = list(csv.DictReader(open(sys.argv[1], encoding="utf-8")))s = lambda k: sum(float(x[k]) for x in r)want = {"CTR": s("clicks")/s("impressions")*100, "CPA": s("cost")/s("conversions"), "ROAS": s("revenue")/s("cost")}row = next(l for l in open(sys.argv[2], encoding="utf-8") if "|" in l and re.search("전체|Overall", l))got = [float(c.strip(" *").replace(",", "")) for c in row.strip().strip("|").split("|")[1:4]]bad = 0for (k, w), g in zip(want.items(), got):    ok = abs(g - w) <= (0.5 if w > 1000 else 0.005)    bad += not ok    print("OK  " if ok else "DIFF", k, g, f"{w:,.4f}")sys.exit(bad > 0)
console
$ python3 -I check.py ads.csv out.fixed.ko.1.txt; echo "exit $?"OK   CTR 0.62 0.6197OK   CPA 19011.0 19,010.6383OK   ROAS 2.51 2.5117exit 0

두 번째 실행도 통과했습니다. 실패 출력은 첫 번째 결과의 「전체」 줄을 손으로 단순 평균 값(2.14 · 34067 · 3.10)으로 바꾼 파일입니다(모델이 만든 오류가 아닙니다).

console
$ python3 -I check.py ads.csv out-bad.ko.txt; echo "exit $?"DIFF CTR 2.14 0.6197DIFF CPA 34067.0 19,010.6383DIFF ROAS 3.1 2.5117exit 1

빗나가는 곳도 있었습니다. 숫자는 맞았지만 단순 평균이 높게 나오는 이유 문장이 흔들립니다. 두 번째 한국어 결과의 요약은 「CTR과 ROAS는 높게, CPA는 높게 왜곡합니다」라고 써서 지표마다 이유가 같은 것처럼 뭉갰습니다. 영어 두 번은 요약이 「3문장 이내」 규칙을 넘어 4문장이었습니다. 이유 문장과 분량은 스크립트가 검사하지 못하니 사람이 읽습니다.

CSV 가 수천 행이면 합계 자체가 틀릴 수 있으니 시트에서 캠페인별로 먼저 합쳐 넣습니다. 광고비가 큰 보고서는 5단계 수식 대조를 건너뛰지 않습니다. 같은 대조 방법이 AI 가 말한 평균·비율을 CSV 로 다시 계산해 대조하기 에도 있습니다.

#ad-report#ctr#roas#spreadsheet