GIGR
경력근거: AI 기반으로 광고 콘텐츠를 자동 생성함과 동시에, 빠른 실험을 통한 효과적인 광고 창출
※ 실제 산출물이 아닌 AI 예측 시안입니다.
기거는 대표 서비스 플레이애드를 AI 기반으로 광고 콘텐츠를 자동 생성하면서 빠른 실험으로 효과적인 광고를 찾는 엔진으로 소개하고, 마케터가 크리에이티브 제작부터 캠페인 실행, 성과 분석, 다음 액션 추천, 빠른 반복 개선을 한 고리로 오가는 경험을 제품 경쟁력으로 듭니다. 사람이 소재를 몇 개씩 만드는 회사라면 장면·문구 단위 판정이 필요 없지만, 생성 엔진이 같은 장면과 문구를 엮어 수십 개씩 내보내는 회사에서는 어떤 요소를 다음 생성에 남길지가 곧 다음 액션 추천의 입력이 됩니다. 회사 브리프가 밝힌 주 고객이 모바일 게임사의 UA 마케터라서 설치를 판정의 축으로 골랐습니다. 다만 소재마다 장면·문구 조합이 기록으로 남는다는 것은 공고와 브리프에 없는 가정입니다. 공고와 브리프가 밝힌 것은 크리에이티브 제작, 성과 분석, 다음 액션과 다음 소재 추천까지라서, 이 포트폴리오는 지원자의 생성 스크립트가 같은 모양의 조합 기록을 남기게 하고 그 기록 위에서 판정을 돌립니다. 이 포트폴리오는 생성 기록과 일별 집계를 묶어 요소별 성과를 계산하고 판정 문턱을 정확히 지키는 백엔드와 화면을 보여줍니다. 모바일 게임 UA 운영이나 광고 네트워크 입찰 전문성은 주장하지 않습니다.
공고는 플레이애드를 광고 콘텐츠를 자동으로 만들면서 빠른 실험으로 효과적인 광고를 찾는 엔진으로 소개합니다. 생성 엔진이 소재를 많이 내보낼수록 어느 장면과 문구가 먹혔는지 가려 다음 생성에 넘기는 일이 제품 안에 생깁니다.
공고가 그리는 마케터의 흐름은 크리에이티브 제작, 캠페인 실행, 성과 분석, 다음 액션 추천, 빠른 반복 개선이 한 고리로 도는 모습입니다. 장면·문구 판정은 성과 분석의 결과를 다음 소재 추천이 받아 쓸 수 있는 단위로 바꾸는 자리에 놓입니다.
프론트엔드와 백엔드를 나누지 않고 Frontend, Backend, Agent, Infra, Analytics 를 넘나든다고 적었고, 우대사항에 이벤트 기반 아키텍처 경험을 둡니다. 생성 기록과 집계 수신부터 판정 화면까지 한 사람이 만드는 이 포트폴리오의 범위가 그 역할과 같습니다.
UA 마케터가 캠페인을 고르면 이 화면은 그 캠페인 소재에 쓰인 장면과 문구를 하나씩 떼어, 그 요소가 설치를 늘렸는지 줄였는지를 판정합니다. 요소마다 그 요소를 쓴 소재들의 IPM(노출 1,000회당 설치 수)을 같은 캠페인에서 그 요소를 안 쓴 소재들의 IPM 과 견주고, 쓴 쪽 노출이 50,000 에 못 미치면 판정을 미룹니다. 쓴 소재의 90% 이상이 같은 상대 요소와 묶여 있으면 둘 중 어느 쪽이 차이를 만들었는지 나눌 수 없어 따로 표시합니다. 마케터와 크리에이티브 디자이너는 다음 소재 묶음을 만들기 전에 이 판정을 같이 보고 남길 장면과 뺄 문구를 정합니다.
Playad 로 모바일 게임 광고를 돌리는 UA 마케터. 매주 다음 소재 묶음을 만들기 전에 지난 실험에서 설치를 늘린 장면·문구와 뺄 것을 이 화면에서 확인하고, 크리에이티브 디자이너와 같은 화면을 보며 다음 소재의 방향을 정한다
UA 마케터가 매일 보는 성과표는 소재 단위라서, 소재 하나에 섞인 장면과 문구 중 어느 쪽이 설치를 끌어올렸는지는 표에 나오지 않습니다. 성과가 나빴던 소재의 문구가 다음 묶음에서 다른 장면에 실려 다시 나가는 일이 여기서 생깁니다. 같은 캠페인 안에서 요소를 쓴 소재와 안 쓴 소재의 IPM 을 견주고, 노출이 모자라거나 늘 같은 짝으로만 쓰인 요소는 판정을 보류해 두면, 마케터는 남길 장면과 뺄 문구를 수치를 보고 고릅니다.
지원자의 생성 스크립트가 장면 템플릿과 문구를 엮어 소재를 만들 때마다 creatives 에 조합을 남기고, 실험 시뮬레이터가 요소별로 심어 둔 참 효과에서 소재별 하루 노출·설치를 뽑아 creative_daily_stats 로 내보냅니다. UA 마케터는 캠페인을 골라 장면과 문구가 다섯 판정으로 나뉜 화면을 보고, 요소를 펼쳐 쓴 소재와 안 쓴 소재의 노출·설치 합계를 읽습니다. 두 표 모두 스크립트 출력이라 사람이 숫자를 적어 넣는 자리가 없고, 화면은 Vercel 에 올립니다.
시뮬레이터로 캠페인 8개를 새로 돌려 요소 40개에 참 효과(1.5배·0.6배·효과 없음)와 노출량, 짝 구성을 심고, 판정이 심은 값을 되찾았는지 요소별로 되찾기 시험 탭에 남깁니다. 판정이 빗나간 요소마다 노출이 50,000 근처였는지, 짝 비율이 90% 근처였는지, 배수가 문턱 근처였는지를 같은 줄에 띄워 어느 문턱이 흔들렸는지 디자이너와 같이 봅니다.
광고 네트워크의 하루 집계와 늦게 도착한 설치를 이벤트로 받아 그 캠페인 판정만 다시 계산하고, 같은 소재·같은 날 집계가 다시 오면 덮어씁니다. 설치가 비어 있던 날이 채워질 때 판정이 바뀐 요소는 집계 수신 기록 탭에 남습니다. 다음 소재 묶음을 만들 때는 Claude Sonnet 4.5 가 계속 쓸 장면에 붙일 문구 후보를 쓰고, 디자이너가 그중에서 고릅니다.
UA 마케터가 드래곤 레이드 Android 캠페인(CMP-2610-AOS)을 고르면 계속 쓸 요소 묶음 맨 위에 장면 S-03(IPM 10.09, 안 쓴 소재 7.31 의 1.38배)이 올라오고, 뺄 요소 묶음에는 노출이 정확히 50,000 이라 판정이 선 문구 C-11(0.40배)이 들어갑니다.
디자이너가 문구 C-04 를 펼치면 이 문구를 쓴 소재 10개 중 9개가 장면 S-02 와 묶여(90%) 따로 판단 못 함에 서 있고, S-02 아닌 장면과 쓰인 소재는 CR-0410 하나뿐입니다. 같은 화면에서 S-02 는 11개 중 9개(81.8%)라 판정이 서고 평균과 차이 없음으로 나옵니다.
설치가 아직 비어 있는 날(CR-0415 의 10월 7일, 노출 22,600)은 노출까지 합에서 빠져 S-05 가 21,300 으로 노출 부족에 서고, 설치 0건인 새 소재(CR-0414)는 C-11 의 합에 그대로 들어가며, 생성 기록에 없는 소재(CR-0390)의 집계는 어느 요소의 합에도 들어가지 않고 목록 위 회색 줄에 남습니다.
되찾기 시험을 돌리면 참 효과를 심은 요소 40개마다 심은 값과 판정, 그때의 노출·배수·짝 비율이 한 줄씩 남아 디자이너가 어느 문턱에서 빗나갔는지 읽습니다. 단, 효과와 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 시뮬레이터가 만든 더미데이터 자가채점이며, 장면·문구 판정이 다음 소재의 실제 설치를 늘리는지는 기거 Playad 의 실제 캠페인 집계와 소재 생성 기록이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. S-03 의 참 효과를 시뮬레이터에 높게 심은 사람이 저라서 1.38배는 그 설정을 판정이 되읽은 결과이고, 보스를 한 방에 쓰러뜨리는 장면이 실제 게임 이용자의 설치를 늘린다는 근거가 되지 못합니다. 이 수치가 말하는 것은 판정 코드가 심은 효과를 되읽는다는 데까지이고, 시뮬레이터 자리에 Playad 의 실제 일별 집계를 넣으면 같은 코드가 그대로 돕니다.
문턱에서 멀찍이 떨어진 요소만 있으면 '이상' 을 '초과' 로 잘못 써도 판정표가 똑같이 나옵니다. 노출이 정확히 50,000 인 C-11, 배수가 정확히 1.2 인 C-07, 짝 비율이 정확히 90% 인 C-04 는 부등호를 거꾸로 쓰면 각각 노출 부족·평균과 차이 없음·계속 쓸 요소로 뒤집히고, 설치가 빈 CR-0415 의 10월 7일 행을 노출은 두고 설치만 0 으로 읽으면 C-07 이 평균과 차이 없음으로 내려갑니다.
IPM 배수는 상관이지 원인이 아닙니다. S-02 는 11개 중 9개가 C-04 와 묶여 90% 문턱 바로 아래에서 판정이 섰고 그 IPM 의 대부분이 C-04 와 쓰인 소재에서 나왔습니다. 화면은 짝 비율을 판정 옆에 늘 띄워 마케터가 이 차이를 읽게 둡니다.
10월 6일에 시작한 소재와 7일에 시작한 소재를 한 합계로 견주므로 요일·시간대에 따른 IPM 흔들림이 배수에 섞입니다. 실제 도입에서는 같은 날짜 범위에 돈 소재끼리 견주는 선택지를 둘지 실제 캠페인 분포를 보고 정합니다.
소재마다 장면·문구 조합이 남는다는 전제는 공고와 회사 브리프에 없는 가정입니다. 공고와 브리프는 크리에이티브 제작, 성과 분석, 다음 액션·소재 추천까지만 밝히므로, Playad 의 실제 생성 기록이 레이어나 템플릿 파라미터 같은 다른 단위로 남는다면 요소 정의부터 다시 잡습니다.
캠페인의 모든 소재가 같은 장면을 쓰면 그 장면은 견줄 소재가 없어 배수가 서지 않고, 이 경우는 다섯 판정 어디에도 맞지 않습니다. 생성 스크립트가 캠페인마다 장면과 문구를 둘 이상 섞게 짜 두고, 그래도 생기면 그 요소를 판정 목록에서 빼고 이유를 목록 위에 띄웁니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
지원자의 생성 스크립트가 소재를 만들 때마다 남기는 조합 기록입니다. 소재 하나에 장면 하나와 문구 하나가 붙고, 판정은 이 표로 요소를 쓴 소재와 안 쓴 소재를 나눕니다. 전날 반응을 보고 S-02 와 C-04 조합을 형식만 바꿔 여러 개 뽑은 묶음이 있어, 짝 비율이 정확히 90% 인 문구와 81.8% 인 장면이 같이 생깁니다.
| creative_id | campaign_id | scene_id | scene_label | copy_id | copy_text | format | launched_on |
|---|---|---|---|---|---|---|---|
| CR-0401 | CMP-2610-AOS | S-02 | 전설 영웅 소환 연출 | C-04 | 지금 무료 소환 | playable | 2026-10-06 |
| CR-0402 | CMP-2610-AOS | S-02 | 전설 영웅 소환 연출 | C-04 | 지금 무료 소환 | video | 2026-10-07 |
| CR-0403 | CMP-2610-AOS | S-02 | 전설 영웅 소환 연출 | C-04 | 지금 무료 소환 | image | 2026-10-07 |
| CR-0404 | CMP-2610-AOS | S-02 | 전설 영웅 소환 연출 | C-04 | 지금 무료 소환 | playable | 2026-10-07 |
| CR-0405 | CMP-2610-AOS | S-02 | 전설 영웅 소환 연출 | C-04 | 지금 무료 소환 | video | 2026-10-07 |
아래 JSON Schema 에 맞는 소재 조합 행을 더 만들어 주세요. {"type":"object","properties":{"creative_id":{"type":"string"},"campaign_id":{"type":"string"},"scene_id":{"type":"string"},"scene_label":{"type":"string"},"copy_id":{"type":"string"},"copy_text":{"type":"string"},"format":{"type":"string","enum":["playable","video","image"]},"launched_on":{"type":"string","format":"date"}},"required":["creative_id","campaign_id","scene_id","scene_label","copy_id","copy_text","format","launched_on"]} 쉬운 데이터만 만들지 말 것 — 다음 경우를 의도적으로 섞으세요: (1) 한 문구를 쓴 소재 10개 중 9개가 같은 장면과 묶인 조합처럼 짝 비율이 정확히 90% 인 요소와 89% 근처인 요소, (2) 소재 하나에만 쓰인 장면, (3) 같은 장면·문구 조합을 형식(playable·video·image)만 바꿔 여러 개 만든 묶음, (4) campaign_id 가 다른 캠페인에 같은 scene_id 가 쓰인 행. 모든 행은 위 스키마를 통과해야 하고, 형식을 깨뜨리는 시도는 따로 3건만 표시해 두세요.{"type":"object","properties":{"creative_id":{"type":"string"},"campaign_id":{"type":"string"},"scene_id":{"type":"string"},"scene_label":{"type":"string"},"copy_id":{"type":"string"},"copy_text":{"type":"string"},"format":{"type":"string","enum":["playable","video","image"]},"launched_on":{"type":"string","format":"date"}},"required":["creative_id","campaign_id","scene_id","scene_label","copy_id","copy_text","format","launched_on"]}실험 시뮬레이터가 광고 네트워크 하루 집계 모양으로 내보내는 소재별 노출·설치입니다. 마지막 날 설치가 아직 도착하지 않아 비어 있는 행(CR-0415 의 10월 7일), 설치 0건인 새 소재, 생성 기록에 없는 소재(CR-0390)의 행이 섞여 있습니다.
| creative_id | date | impressions | installs |
|---|---|---|---|
| CR-0401 | 2026-10-06 | 14,600 | 124 |
| CR-0401 | 2026-10-07 | 15,900 | 130 |
| CR-0402 | 2026-10-07 | 11,300 | 95 |
| CR-0403 | 2026-10-07 | 10,800 | 87 |
| CR-0404 | 2026-10-07 | 12,100 | 102 |
아래 JSON Schema 에 맞는 소재별 하루 집계 행을 더 만들어 주세요. {"type":"object","properties":{"creative_id":{"type":"string"},"date":{"type":"string","format":"date"},"impressions":{"type":"integer","minimum":0},"installs":{"type":["integer","null"],"minimum":0}},"required":["creative_id","date","impressions","installs"]} 쉬운 데이터만 만들지 말 것 — 다음 경우를 의도적으로 섞으세요: (1) 가장 최근 날짜에 installs 가 null 인 행, (2) 노출이 수천 회인데 installs 가 0 인 새 소재, (3) creatives 에 없는 creative_id 의 행, (4) 한 요소의 노출 합이 정확히 50,000 이 되는 소재 묶음과 두 IPM 의 비가 정확히 1.2 가 되는 묶음. 모든 행은 위 스키마를 통과해야 하고, 형식을 깨뜨리는 시도는 따로 3건만 표시해 두세요.{"type":"object","properties":{"creative_id":{"type":"string"},"date":{"type":"string","format":"date"},"impressions":{"type":"integer","minimum":0},"installs":{"type":["integer","null"],"minimum":0}},"required":["creative_id","date","impressions","installs"]}| TypeScript | 판정 화면과 집계 수신 API 를 한 언어로 씁니다. |
| Frontend · Next.js | 마케터와 디자이너가 같이 보는 판정 화면입니다. 판정별 요소 묶음, 요소 펼침, 캠페인 선택을 둡니다. |
| Backend · NestJS | creatives 와 creative_daily_stats 를 받는 API 와 판정 계산을 맡습니다. 배수 문턱은 정수 교차곱으로 견줘 1.2배·0.8배 경계에서 소수 오차가 판정을 뒤집지 않게 합니다. |
| PostgreSQL | 두 표를 담고, 캠페인과 요소별로 쓴 쪽·안 쓴 쪽 노출·설치 합계를 SQL 로 냅니다. |
| Analytics · 실험 시뮬레이터(Python) | 요소마다 참 효과를 심어 소재별 하루 노출·설치를 뽑습니다. 설치 지연 도착과 설치 0건 소재, 생성 기록 밖 소재를 섞고, 2주차 되찾기 시험도 같은 시뮬레이터로 돌립니다. |
| Infra · Vercel | 1주차 화면과 API 를 배포합니다. |
| Event-driven · Redis Streams | 3주차에 집계 도착을 이벤트로 받아 영향받은 캠페인 판정만 다시 계산합니다. 같은 소재·같은 날 집계가 다시 오면 덮어써 한 번만 셉니다. |
| Agent · Claude Code | 스펙을 적어 구현을 맡기고, 정확히 50,000·1.2배·90% 경계 테스트로 결과를 되받아 어긋난 곳을 고칩니다. |
| Claude Sonnet 4.5 | 3주차에 다음 소재 묶음에 쓸 문구 후보를 씁니다. |
✗ fail → 경계 세 곳 중 하나라도 반대로 서면 '이상'·'미만' 부등호가 판정식과 같은 방향인지부터 봅니다. 배수와 짝 비율은 반올림한 표시값이 아니라 정수 교차곱과 분수로 견주는지도 함께 확인하고 화면은 그대로 둡니다.
✓ pass → 여기서 멈춰도 마케터가 다음 소재 회의에 들고 갈 판정표가 완성됩니다. 더 키우려면 심은 효과를 판정이 되찾는지 요소 40개로 재는 단계로 넘어갑니다.
✗ fail → 판정이 빗나간 요소가 노출 50,000 바로 위에 몰려 있으면 문턱을 올리기 전에 시뮬레이터의 설치 흩어짐을 실제 캠페인 수준으로 맞추고 다시 돌립니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 집계 도착을 이벤트로 받아 판정을 다시 내고, 다음 묶음 문구 후보를 받는 단계로 갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · element_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
평균과 차이 없음차이 없음다음 소재에도 쓸 요소계속 쓸 요소다음 소재에서 뺄 요소뺄 요소노출이 적어 아직 판단 못 함노출 부족늘 같은 짝과 쓰여 따로 판단 못 함늘 같은 짝장면·문구 성과 판정입니다. 캠페인 안의 장면이나 문구 하나가 다섯 판정 중 어디에 서는지와, 판정에 쓴 쓴 쪽·안 쓴 쪽 합계, IPM 배수, 짝 비율, 합에서 뺀 집계 행 수를 남기는 형식입니다. summary 는 판정 근거 수치를 담은 고정 문형이라 모델이 쓰지 않습니다.
{"type":"object","properties":{"campaign_id":{"type":"string"},"element_id":{"type":"string","description":"판정 대상 요소입니다. 장면이면 creatives.scene_id, 문구면 creatives.copy_id 값입니다."},"verdict":{"type":"string","enum":["평균과 차이 없음","다음 소재에도 쓸 요소","다음 소재에서 뺄 요소","노출이 적어 아직 판단 못 함","늘 같은 짝과 쓰여 따로 판단 못 함"]},"element_type":{"type":"string","enum":["장면","문구"]},"element_label":{"type":"string"},"creatives_with":{"type":"integer","minimum":1,"description":"같은 campaign_id 의 creatives 에서 그 요소를 쓴 creative_id 수입니다."},"impressions_with":{"type":"integer","minimum":0,"description":"그 요소를 쓴 소재의 creative_daily_stats.impressions 합입니다. installs 가 null 인 행은 노출까지 뺍니다."},"installs_with":{"type":"integer","minimum":0,"description":"같은 행들의 installs 합입니다."},"ipm_with":{"type":"number","minimum":0,"description":"installs_with ÷ impressions_with × 1,000 을 소수 둘째 자리로 반올림한 값입니다."},"impressions_without":{"type":"integer","minimum":0,"description":"같은 campaign_id 에서 그 요소를 안 쓴 소재의 impressions 합입니다. 뺄 행 규칙은 같습니다."},"installs_without":{"type":"integer","minimum":0},"ipm_without":{"type":"number","minimum":0},"ipm_ratio":{"type":"number","minimum":0,"description":"ipm_with ÷ ipm_without 을 소수 둘째 자리로 반올림한 표시값입니다. 1.2배·0.8배 문턱은 반올림 전에 installs_with × impressions_without × 10 과 installs_without × impressions_with × 12(또는 8)를 정수로 견줍니다."},"top_partner_id":{"type":"string","description":"그 요소를 쓴 소재에서 가장 자주 같이 쓰인 다른 축 요소입니다. 장면이면 문구, 문구면 장면이고, 횟수가 같으면 creative_id 가 가장 앞선 소재의 요소를 씁니다."},"top_partner_creatives":{"type":"integer","minimum":1},"pair_share":{"type":"number","minimum":0,"maximum":1,"description":"top_partner_creatives ÷ creatives_with 를 소수 셋째 자리로 반올림한 값입니다. 0.9 이상인지는 반올림 전 분수로 견줍니다."},"skipped_rows":{"type":"integer","minimum":0,"description":"그 요소를 쓴 소재의 집계 행 가운데 installs 가 null 이라 합에서 뺀 행 수입니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"scope":{"type":"string"},"field":{"type":"string"},"agg":{"type":"string","enum":["count","sum","avg","min","max"]},"value":{"type":["string","integer","number","null"]}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["campaign_id","element_id","verdict","element_type","element_label","creatives_with","impressions_with","installs_with","ipm_with","impressions_without","installs_without","ipm_without","ipm_ratio","top_partner_id","top_partner_creatives","pair_share","skipped_rows","evidence","summary","hedge"]}[
{
"campaign_id": "CMP-2610-AOS",
"element_id": "S-03",
"verdict": "다음 소재에도 쓸 요소",
"element_type": "장면",
"element_label": "보스를 한 방에 쓰러뜨림",
"creatives_with": 3,
"impressions_with": 107400,
"installs_with": 1084,
"ipm_with": 10.09,
"impressions_without": 162600,
"installs_without": 1188,
"ipm_without": 7.31,
"ipm_ratio": 1.38,
"top_partner_id": "C-04",
"top_partner_creatives": 1,
"pair_share": 0.333,
"skipped_rows": 0,
"evidence": [
{
"scope": "요소",
"field": "scene_id",
"value": "S-03"
},
{
"scope": "쓴 소재",
"field": "creative_id",
"agg": "count",
"value": 3
},
{
"scope": "쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 107400
},
{
"scope": "쓴 소재",
"field": "installs",
"agg": "sum",
"value": 1084
},
{
"scope": "안 쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 162600
},
{
"scope": "안 쓴 소재",
"field": "installs",
"agg": "sum",
"value": 1188
},
{
"scope": "짝",
"field": "copy_id",
"value": "C-04"
},
{
"scope": "짝",
"field": "creative_id",
"agg": "count",
"value": 1
},
{
"scope": "쓴 소재",
"field": "creative_id",
"value": "CR-0410"
}
],
"summary": "장면 S-03 을 쓴 소재 3개의 IPM 은 10.09 로 안 쓴 소재 7.31 의 1.38배이고 노출이 107,400 이라 다음 소재에도 쓸 요소입니다.",
"hedge": "합성 기준 판정입니다. S-03 소재 셋은 10월 6일에 시작해 7일에 시작한 소재보다 하루 더 돌았고, 요일 효과는 배수에서 걸러 내지 않았습니다."
},
{
"campaign_id": "CMP-2610-AOS",
"element_id": "C-11",
"verdict": "다음 소재에서 뺄 요소",
"element_type": "문구",
"element_label": "레벨 1부터 다시?",
"creatives_with": 3,
"impressions_with": 50000,
"installs_with": 188,
"ipm_with": 3.76,
"impressions_without": 220000,
"installs_without": 2084,
"ipm_without": 9.47,
"ipm_ratio": 0.4,
"top_partner_id": "S-03",
"top_partner_creatives": 1,
"pair_share": 0.333,
"skipped_rows": 0,
"evidence": [
{
"scope": "요소",
"field": "copy_id",
"value": "C-11"
},
{
"scope": "쓴 소재",
"field": "creative_id",
"agg": "count",
"value": 3
},
{
"scope": "쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 50000
},
{
"scope": "쓴 소재",
"field": "installs",
"agg": "sum",
"value": 188
},
{
"scope": "안 쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 220000
},
{
"scope": "안 쓴 소재",
"field": "installs",
"agg": "sum",
"value": 2084
},
{
"scope": "짝",
"field": "scene_id",
"value": "S-03"
},
{
"scope": "짝",
"field": "creative_id",
"agg": "count",
"value": 1
},
{
"scope": "쓴 소재",
"field": "creative_id",
"value": "CR-0414"
},
{
"scope": "쓴 소재",
"field": "installs",
"value": 0
}
],
"summary": "문구 C-11 을 쓴 소재의 노출 합계가 정확히 50,000 이라 판정이 서고, IPM 은 3.76 으로 안 쓴 소재 9.47 의 0.40배라 다음 소재에서 뺄 요소입니다.",
"hedge": "노출 3,100 에 설치 0건인 CR-0414 도 합에 들어 있습니다. 시작한 지 하루 된 소재라 실제로는 설치가 늦게 잡힐 수 있습니다."
},
{
"campaign_id": "CMP-2610-AOS",
"element_id": "C-07",
"verdict": "다음 소재에도 쓸 요소",
"element_type": "문구",
"element_label": "친구랑 같이 레이드 가자",
"creatives_with": 3,
"impressions_with": 70000,
"installs_with": 672,
"ipm_with": 9.6,
"impressions_without": 200000,
"installs_without": 1600,
"ipm_without": 8,
"ipm_ratio": 1.2,
"top_partner_id": "S-03",
"top_partner_creatives": 1,
"pair_share": 0.333,
"skipped_rows": 1,
"evidence": [
{
"scope": "요소",
"field": "copy_id",
"value": "C-07"
},
{
"scope": "쓴 소재",
"field": "creative_id",
"agg": "count",
"value": 3
},
{
"scope": "쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 70000
},
{
"scope": "쓴 소재",
"field": "installs",
"agg": "sum",
"value": 672
},
{
"scope": "안 쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 200000
},
{
"scope": "안 쓴 소재",
"field": "installs",
"agg": "sum",
"value": 1600
},
{
"scope": "짝",
"field": "scene_id",
"value": "S-03"
},
{
"scope": "짝",
"field": "creative_id",
"agg": "count",
"value": 1
},
{
"scope": "뺀 행",
"field": "creative_id",
"value": "CR-0415"
},
{
"scope": "뺀 행",
"field": "date",
"value": "2026-10-07"
},
{
"scope": "뺀 행",
"field": "installs",
"value": null
}
],
"summary": "문구 C-07 의 IPM 은 9.60 으로 안 쓴 소재 8.00 의 정확히 1.20배라 다음 소재에도 쓸 요소입니다.",
"hedge": "1.2배 문턱에 딱 걸린 판정이라 반올림 전 정수 교차곱(672 × 200,000 × 10 = 1,600 × 70,000 × 12)으로 견줬습니다. 10월 7일 CR-0415 집계는 설치가 비어 있어 노출 22,600 도 합에서 뺐고, 이 문구 IPM 의 대부분은 S-03 과 쓰인 CR-0411 에서 나왔습니다."
},
{
"campaign_id": "CMP-2610-AOS",
"element_id": "S-05",
"verdict": "노출이 적어 아직 판단 못 함",
"element_type": "장면",
"element_label": "길드원 서른 명 단체 전투",
"creatives_with": 2,
"impressions_with": 21300,
"installs_with": 90,
"ipm_with": 4.23,
"impressions_without": 248700,
"installs_without": 2182,
"ipm_without": 8.77,
"ipm_ratio": 0.48,
"top_partner_id": "C-11",
"top_partner_creatives": 1,
"pair_share": 0.5,
"skipped_rows": 1,
"evidence": [
{
"scope": "요소",
"field": "scene_id",
"value": "S-05"
},
{
"scope": "쓴 소재",
"field": "creative_id",
"agg": "count",
"value": 2
},
{
"scope": "쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 21300
},
{
"scope": "쓴 소재",
"field": "installs",
"agg": "sum",
"value": 90
},
{
"scope": "안 쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 248700
},
{
"scope": "안 쓴 소재",
"field": "installs",
"agg": "sum",
"value": 2182
},
{
"scope": "짝",
"field": "copy_id",
"value": "C-11"
},
{
"scope": "짝",
"field": "creative_id",
"agg": "count",
"value": 1
},
{
"scope": "뺀 행",
"field": "creative_id",
"value": "CR-0415"
},
{
"scope": "뺀 행",
"field": "impressions",
"value": 22600
},
{
"scope": "뺀 행",
"field": "installs",
"value": null
}
],
"summary": "장면 S-05 를 쓴 소재의 노출은 21,300 으로 기준 50,000 에 못 미쳐 아직 판단하지 않습니다.",
"hedge": "설치가 비어 있는 10월 7일 CR-0415 집계(노출 22,600)는 노출까지 합에서 뺐습니다. 설치가 도착해 그 행이 채워져도 노출은 43,900 이라 기준에 못 미칩니다."
},
{
"campaign_id": "CMP-2610-AOS",
"element_id": "C-04",
"verdict": "늘 같은 짝과 쓰여 따로 판단 못 함",
"element_type": "문구",
"element_label": "지금 무료 소환",
"creatives_with": 10,
"impressions_with": 150000,
"installs_with": 1412,
"ipm_with": 9.41,
"impressions_without": 120000,
"installs_without": 860,
"ipm_without": 7.17,
"ipm_ratio": 1.31,
"top_partner_id": "S-02",
"top_partner_creatives": 9,
"pair_share": 0.9,
"skipped_rows": 0,
"evidence": [
{
"scope": "요소",
"field": "copy_id",
"value": "C-04"
},
{
"scope": "쓴 소재",
"field": "creative_id",
"agg": "count",
"value": 10
},
{
"scope": "쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 150000
},
{
"scope": "쓴 소재",
"field": "installs",
"agg": "sum",
"value": 1412
},
{
"scope": "안 쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 120000
},
{
"scope": "안 쓴 소재",
"field": "installs",
"agg": "sum",
"value": 860
},
{
"scope": "짝",
"field": "scene_id",
"value": "S-02"
},
{
"scope": "짝",
"field": "creative_id",
"agg": "count",
"value": 9
},
{
"scope": "짝 밖",
"field": "creative_id",
"value": "CR-0410"
}
],
"summary": "문구 C-04 를 쓴 소재 10개 중 9개가 장면 S-02 와 쓰여(90%) 둘 중 어느 쪽이 IPM 을 만들었는지 나눌 수 없습니다.",
"hedge": "배수만 보면 1.31배라 계속 쓸 요소에 섰을 문구지만, 그 몫이 C-04 의 것인지 S-02 의 것인지 나눌 수 없습니다. S-02 아닌 장면과 쓰인 소재가 CR-0410 하나 있어 두 집합이 같지는 않아도 90% 문턱에 닿았습니다."
},
{
"campaign_id": "CMP-2610-AOS",
"element_id": "S-02",
"verdict": "평균과 차이 없음",
"element_type": "장면",
"element_label": "전설 영웅 소환 연출",
"creatives_with": 11,
"impressions_with": 141300,
"installs_with": 1098,
"ipm_with": 7.77,
"impressions_without": 128700,
"installs_without": 1174,
"ipm_without": 9.12,
"ipm_ratio": 0.85,
"top_partner_id": "C-04",
"top_partner_creatives": 9,
"pair_share": 0.818,
"skipped_rows": 0,
"evidence": [
{
"scope": "요소",
"field": "scene_id",
"value": "S-02"
},
{
"scope": "쓴 소재",
"field": "creative_id",
"agg": "count",
"value": 11
},
{
"scope": "쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 141300
},
{
"scope": "쓴 소재",
"field": "installs",
"agg": "sum",
"value": 1098
},
{
"scope": "안 쓴 소재",
"field": "impressions",
"agg": "sum",
"value": 128700
},
{
"scope": "안 쓴 소재",
"field": "installs",
"agg": "sum",
"value": 1174
},
{
"scope": "짝",
"field": "copy_id",
"value": "C-04"
},
{
"scope": "짝",
"field": "creative_id",
"agg": "count",
"value": 9
},
{
"scope": "쓴 소재",
"field": "creative_id",
"value": "CR-0413"
}
],
"summary": "장면 S-02 의 IPM 은 7.77 로 안 쓴 소재 9.12 의 0.85배라 평균과 차이가 없습니다.",
"hedge": "쓴 소재 11개 중 9개가 C-04 와 묶여(81.8%) 90% 에 못 미쳐 판정을 냈지만, 이 IPM 의 대부분은 C-04 와 쓰인 소재에서 나온 값입니다."
}
][자동 검증 · 코드가 두 표에서 다시 셉니다] 1. verdict 가 enum 다섯 값 중 하나인지 확인합니다. 2. evidence 의 field 가 creatives·creative_daily_stats 의 컬럼(creative_id·campaign_id·scene_id·copy_id·date·impressions·installs)에 실재하는 이름인지 대조합니다. 3. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 샘플 행의 값 그대로인지 대조합니다. CR-0415 의 10월 7일 installs 는 null 그대로 실립니다. 4. impressions_with·installs_with 를 같은 campaign_id 에서 그 요소를 쓴 creative_id 의 집계 행 합으로 다시 계산합니다. installs 가 null 인 행은 노출까지 빼고, creatives 에 없는 creative_id(CR-0390)의 행은 어느 쪽 합에도 넣지 않습니다. impressions_without·installs_without 도 안 쓴 소재로 같은 식을 다시 계산합니다. 5. ipm_with = installs_with ÷ impressions_with × 1,000, ipm_without 도 같은 식, ipm_ratio = 두 IPM 의 비를 다시 계산해 소수 둘째 자리까지 일치하는지 봅니다. 6. pair_share = top_partner_creatives ÷ creatives_with 를 creatives 에서 다시 세어 계산합니다. 7. pair_share 가 0.9 이상이면 verdict 는 늘 같은 짝과 쓰여 따로 판단 못 함입니다. 성립 사례는 C-04(10개 중 9개), 불성립 사례는 S-02(11개 중 9개, 0.818)입니다. 8. pair_share 가 0.9 미만이고 impressions_with 가 50,000 미만이면 verdict 는 노출이 적어 아직 판단 못 함입니다. 성립 사례는 S-05(21,300), 불성립 사례는 정확히 50,000 인 C-11 입니다. 9. 위 둘에 걸리지 않고 installs_with × impressions_without × 10 이 installs_without × impressions_with × 12 이상이면 verdict 는 다음 소재에도 쓸 요소입니다. 성립 사례는 정확히 1.20배인 C-07 과 1.38배인 S-03, 불성립 사례는 S-02 입니다. C-07 은 '1.2배 초과' 로 잘못 읽으면 평균과 차이 없음으로 뒤집혀 부등호 방향을 가릅니다. 10. 위 셋에 걸리지 않고 installs_with × impressions_without × 10 이 installs_without × impressions_with × 8 이하이면 verdict 는 다음 소재에서 뺄 요소이고, 두 문턱 어디에도 닿지 않으면 평균과 차이 없음입니다. 뺄 요소의 성립 사례는 C-11(0.40배), 불성립 사례는 평균과 차이 없음에 선 S-02(0.85배)입니다. 11. summary 가 존댓말 한 문장으로 끝나는지 확인합니다. [수동 검증 · 사람이 봅니다] 1. UA 마케터와 디자이너가 판정 묶음만 보고 다음 묶음에서 뺄 문구와 남길 장면을 고르는지, 회의 한 번으로 봅니다. 2. 짝 판정이 난 요소의 hedge 를 읽고 다음 묶음에서 어떤 조합을 새로 만들어야 짝이 풀리는지 사람이 정할 수 있는지 봅니다. [평가 러너 · 2주차] 1. 시뮬레이터로 캠페인 8개를 돌려 요소 40개에 참 효과(1.5배·0.6배·효과 없음)와 노출량, 짝 구성을 심고, 판정이 심은 값을 되찾은 요소 수를 셉니다. 2. 판정이 빗나간 요소는 노출 50,000·배수 1.2와 0.8·짝 비율 90% 중 어느 문턱 근처였는지를 같은 줄에 남깁니다.
근거: AI 기반으로 광고 콘텐츠를 자동 생성함과 동시에, 빠른 실험을 통한 효과적인 광고 창출