보스턴컨설팅그룹
경력근거: Apply data science methods and analytics to real-world business situations
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 BCG X AI 사이언티스트의 일을 'Apply data science methods and analytics to real-world business situations across a variety of industries to drive significant business impact' 로 적고, 자격요건에서 모델의 수학적 기반을 고객사 비즈니스 임팩트로 옮기는 능력과 복잡한 분석을 그림과 쉬운 설명으로 옮기는 능력을 따로 요구합니다. 고객사가 계약마다 바뀌는 자리라 세그먼트 체계와 합격 기준도 고객사마다 다르므로, 이 도구는 판정 규칙을 코드에 두고 기준값은 평가 계획표로 받습니다. 공고가 고객사 업종을 적지 않으므로 데모 업종은 주문량 예측이 흔한 생활용품 제조사 하나로 골랐습니다. 이 포트폴리오는 세그먼트별 오차 비교와 부트스트랩 구간 계산, 오차 단가 환산을 코드로 돌리는 기술을 보여줍니다. 생활용품 수요 예측의 업무 지식이나 고객사 재고 정책에 대한 전문성은 주장하지 않습니다.
주요업무 첫 줄이 'Own the full analytics value-chain end to end' 이고, 그 사슬을 과제 정의와 알고리즘 설계, 구현, 배포로 풀어 적었습니다. 모델을 만든 사람이 고객 보고 전에 그 모델이 기존 방식보다 나은지 세그먼트마다 다시 따지는 일은 이 사슬의 배포 직전 고리입니다.
자격요건에 'Deep understanding of modern machine learning techniques and their mathematical foundations' 가 있고 같은 줄이 이를 고객사 비즈니스 임팩트로 옮기는 능력을 함께 요구합니다. 건별 절대오차 차이의 부트스트랩 구간이 수학 쪽이고, 오차 1개당 비용으로 환산한 월 추정 효과가 임팩트 쪽입니다.
자격요건이 'distilling complex analyses into clear, impactful visualizations' 와 'explaining advanced data science concepts in an accessible way' 를 따로 적었고, 생성형 AI 와 LLM 경험도 요구합니다. 세그먼트 구간 그림과 Claude 가 쓰는 판정 설명 문단이 이 두 요구의 실물입니다.
고객사에 낼 수요 예측 모델의 홀드아웃 예측 파일과, 고객사 ERP 에서 내려받은 실제 주문 수량 파일, 세그먼트마다 최소 표본과 정답 누락 한도와 오차 1개당 비용을 적은 평가 계획표 세 가지를 받아 세그먼트별 판정을 터미널에 찍는 CLI 입니다. 데모 고객사는 생활용품을 온라인 정기배송과 대리점으로 파는 가상의 제조사 '고객사 A' 이고, 예측 대상은 고객 한 명의 다음 달 주문 수량입니다. 두 파일은 record_id 로 짝을 짓고, 실제 주문 파일에 없거나 실제값이 비어 있는 예측은 정답 누락으로 셉니다. 짝지어진 기록마다 모델 오차와 기존 방식(직전 3개월 평균) 오차의 차이를 구해 시드를 고정한 부트스트랩 2,000회로 95% 구간을 냅니다. BCG X AI 사이언티스트는 고객 보고 전마다 이 명령 한 줄로 세그먼트 열 개를 다시 판정하고, 판정별 구획과 마크다운 리포트를 컨설팅 팀에 넘깁니다.
고객사 과제에 낼 머신러닝 모델을 직접 만들고 평가하는 BCG X AI 사이언티스트 — 고객 보고 전마다 자기 터미널에서 홀드아웃 평가를 다시 돌리고, 결과 리포트를 컨설팅 팀에 넘긴다
성과 보고를 다시 하게 되는 까닭은 모델이 전반적으로 나빠서가 아닙니다. 전체 평균 오차가 줄어든 사이에 신규 가입 고객처럼 기존 방식보다 오차가 커진 세그먼트가 섞여 있고, 표본이 적거나 실제값이 덜 들어온 세그먼트의 숫자도 다른 세그먼트와 같은 무게로 보고서에 실리기 때문입니다. 세그먼트마다 짝지어진 건수와 정답 누락 비율부터 거르고 부트스트랩 구간으로 차이가 우연인지 따지면, 보고서에 실을 세그먼트와 뺄 세그먼트가 보고 전에 정해집니다.
AI 사이언티스트가 예측 파일과 실제 주문 파일, 평가 계획표를 넣고 명령 한 줄을 치면 세그먼트마다 다섯 판정 중 하나와 짝지어진 건수, 정답 누락 비율, 두 방식의 평균 절대오차, 95% 구간, 오차 단가로 환산한 월 추정 효과를 판정별 구획으로 찍고 같은 내용을 마크다운 리포트로 남기는 CLI 입니다. record_id 짝짓기와 시드 고정 부트스트랩, 다섯 판정의 우선순위 규칙이 이 주의 계산입니다. 예측 파일은 작성자가 합성 주문 데이터로 만든 것을 받는다고 두고, 모델을 직접 학습하는 일은 2주차로 미룹니다.
PyTorch 로 합성 주문 데이터에 수요 예측 모델을 학습해 예측 파일을 직접 만들고, 세그먼트별 95% 구간을 한 장의 구간 그림으로 리포트에 넣습니다. Claude 가 판정마다 컨설팅 팀이 읽을 설명 문단을 쓰고, 효과 방향을 알고 심어 둔 합성 세그먼트 40개로 판정이 심은 방향과 맞는지 세는 평가 러너를 만듭니다.
GitHub Actions 가 모델 코드가 바뀐 풀 리퀘스트마다 평가를 돌려 리포트를 코멘트로 남기고, 기존 방식보다 나쁨 판정이 새로 생기면 머지를 막습니다. 두 모델 버전의 판정을 견줘 나음에서 나쁨으로, 또는 그 반대로 뒤집힌 세그먼트를 따로 냅니다.
AI 사이언티스트가 `holdout-eval run --pred preds/client_a_v3.parquet --outcomes outcomes/2026Q3.csv --plan eval_plan.yaml --out report/` 를 치면 신규 가입 3개월 이내는 기존 방식보다 나쁨 구획에 평균 절대오차 12.80 대 10.90 과 95% 구간 [0.90, 2.90] 이 찍히고, B2B 대리점은 정답 누락이 많음 구획에 누락 비율 18.38% 와 계획 한도 5% 가 찍힙니다. 컨설턴트가 고객 보고서에 옮길 마크다운 리포트도 같은 실행에서 세그먼트 순서 그대로 나옵니다.
효과 방향을 알고 심어 둔 합성 세그먼트 40개에서 판정이 심은 방향과 맞는 세그먼트 수를 셉니다. 심은 효과의 크기를 세그먼트마다 달리 두었으므로, 이 수로 보여 줄 수 있는 것은 어느 크기부터 구간이 0 을 벗어나 판정이 방향을 잡는지입니다. 예측·실제값·효과를 모두 제가 만들었으니 고객사 모델의 성능과는 무관합니다.
실제값이 비어 있는 기록, 실제 주문이 0개인 기록, 실제 주문 파일에 짝이 없는 대리점 예측, 짝지어진 건수가 최소 표본과 똑같은 세그먼트, 누락 비율이 한도와 똑같은 세그먼트는 기대 판정을 붙인 고정 표본으로 남겨, 평가 계획표나 규칙을 바꿀 때마다 여섯 세그먼트 판정이 어긋나지 않는지 대조합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 숫자는 작성자가 만든 예측과 주문 데이터를 작성자가 채점한 결과이고, 모델이 고객사 재고와 결품을 실제로 줄였는지는 고객사의 실제 주문 기록과 보고 뒤 몇 달의 운영 결과가 있어야 측정됩니다. 고객사 파일을 받는 날 바꿀 것은 평가 계획표의 세 기준값과 파일 경로뿐이 되도록 CLI 를 짭니다.
합성 세그먼트 40개 가운데 판정 방향이 맞은 수는 제가 효과를 심고 제가 세어 본 값이라, 어떤 크기의 효과부터 판정이 방향을 잡는지를 보여 줄 뿐 모델 평가 도구의 정확도를 말하지 않습니다. 실제 고객사 파일을 받으면 판정보다 먼저 세그먼트별 정답 누락 비율부터 뽑아 컨설팅 팀과 봅니다.
실제값이 비어 있는 기록(HO-2608-013917), 실제 주문이 0개인 기록(HO-2608-004630), 실제 주문 파일에 짝이 없는 대리점 예측(HO-2608-016044·HO-2608-016101)을 샘플에 일부러 넣었습니다. 실제값이 빈 기록을 짝지어진 건으로 세면 휴면 후 복귀의 누락 비율이 6.19% 가 아니라 0% 로 잡히므로, 규칙을 고칠 때마다 이 기록이 누락으로 세어지는지와 0개인 기록이 누락으로 잘못 세어지지 않는지부터 봅니다.
기존 방식을 직전 3개월 평균으로 두었는데, 신규 가입 3개월 이내 고객은 3개월 치 주문 이력이 없어 가입 뒤 주문만으로 평균을 냅니다. 이 세그먼트의 기존 방식보다 나쁨 판정은 비교 대상이 다른 세그먼트와 다르게 계산된 결과라, 리포트에 그 계산 방식을 판정 옆에 적고 고객사가 실제로 쓰는 신규 고객 발주 기준을 받으면 그것으로 바꿉니다.
세그먼트 열 개에 95% 구간을 따로 씌우면 효과가 없는 세그먼트도 그중 하나쯤은 우연히 0 을 벗어날 수 있습니다(여러 번 비교하면 우연한 유의가 섞이는 다중 비교 문제). 2주차 리포트에는 본페로니 보정(구간 수준을 비교 횟수로 나눠 엄격하게 잡는 방법)을 켠 판정을 옆 칸에 함께 둡니다.
오차 1개당 비용은 과대 예측의 재고 비용과 과소 예측의 결품 손실을 한 값으로 합친 합성 가정입니다. 실제 도입에서는 두 방향의 단가가 다르므로 고객사 재무 담당이 쓰는 값으로 바꾸고, 절대오차 대신 방향별 가중 오차로 계산식을 바꿔야 합니다.
고객사 실제 주문 파일은 반출이 막힌 경우가 많습니다. 판정 계산은 고객사 환경 안에서 돌리고, 설명 문단 생성에는 세그먼트 이름과 집계 수치만 넘기며, 외부 모델 호출이 허락되지 않으면 설명 문단 기능은 끄고 판정만 씁니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
평가용으로 떼어 둔 2026년 8월 한 달의 예측 파일입니다. 기록마다 고객 세그먼트와 대상 월, 새 모델의 주문 수량 예측, 기존 방식(직전 3개월 평균)의 예측을 한 줄에 둡니다. 인라인 표본은 파일 구조를 보이는 발췌이고 전체 파일은 18,420건입니다. 대리점 세그먼트에는 실제 주문 파일에 짝이 없는 예측이 섞여 있고, 평가 계획표에 없는 세그먼트 이름(법인 특판)이 적힌 줄도 하나 있습니다.
| record_id | segment | target_month | model_pred | baseline_pred |
|---|---|---|---|---|
| HO-2608-001204 | 정기배송 구독 | 2026-08 | 18.2 | 21 |
| HO-2608-001377 | 정기배송 구독 | 2026-08 | 6.1 | 9.3 |
| HO-2608-004512 | 기존 고객 1~3년 | 2026-08 | 11.4 | 12.7 |
| HO-2608-004630 | 기존 고객 1~3년 | 2026-08 | 0.8 | 2.3 |
| HO-2608-007015 | 기존 고객 3년 이상 | 2026-08 | 24.6 | 24.1 |
아래 JSON Schema 를 그대로 만족하는 예측 줄을 모두 18,420개가 되도록 더 만들어 주세요. record_id 는 'HO-2608-' 뒤에 여섯 자리 번호로 쓰고, target_month 는 모두 '2026-08' 입니다. segment 는 신규 가입 3개월 이내, 가입 3개월~1년, 기존 고객 1~3년, 기존 고객 3년 이상, 휴면 후 복귀, 정기배송 구독, 대량 구매 개인, B2B 대리점, B2B 온라인몰 입점사, 기업 복지몰 열 가지만 씁니다. 개인 고객 세그먼트의 예측은 0~80개, 대리점과 입점사는 100~900개 범위로 둡니다. 쉬운 데이터만 만들지 말고 다음을 섞으세요: 정기배송 구독과 기존 고객 1~3년에서는 model_pred 가 baseline_pred 보다 실제값에 가깝게, 신규 가입 3개월 이내에서는 더 멀게 두고, 기존 고객 3년 이상은 두 예측이 거의 같게 둡니다. 세그먼트별 건수는 정기배송 구독 4,050건, 기존 고객 1~3년 3,310건, 기존 고객 3년 이상 2,880건, 신규 가입 3개월 이내 1,064건, 휴면 후 복귀 226건, B2B 대리점 408건으로 맞추고 나머지 네 세그먼트가 6,479건을 나눠 갖습니다. 평가 계획표에 없는 segment 이름 '법인 특판' 을 적은 줄도 3건 넣습니다. 예측값이 0.5 이하로 작은 기록을 세그먼트마다 몇 건 넣습니다. 판정 결과는 넣지 마세요. 형식 깨뜨리기 시도로 target_month 를 '2026/08' 로 적은 줄과 model_pred 를 문자열로 적은 줄을 따로 5건 만들어 로더가 걸러내는지 보게 합니다.
{"type":"object","properties":{"record_id":{"type":"string"},"segment":{"type":"string"},"target_month":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}$"},"model_pred":{"type":"number","minimum":0},"baseline_pred":{"type":"number","minimum":0}},"required":["record_id","segment","target_month","model_pred","baseline_pred"]}{"type":"object","properties":{"record_id":{"type":"string"},"segment":{"type":"string"},"target_month":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}$"},"model_pred":{"type":"number","minimum":0},"baseline_pred":{"type":"number","minimum":0}},"required":["record_id","segment","target_month","model_pred","baseline_pred"]}고객사 ERP 에서 내려받은 2026년 8월 실제 주문 수량입니다. 기록마다 record_id 와 실제 주문 수량, 주문이 확정된 날짜를 둡니다. 반품 정산이 끝나지 않은 기록은 실제값과 확정일이 비어 있고, 그 달에 아무것도 주문하지 않은 고객은 실제값이 0 으로 적혀 있습니다. 대리점 주문은 월말 마감 뒤 전표가 따로 들어와 일부 기록이 이 파일에 없습니다.
| record_id | actual_value | closed_on |
|---|---|---|
| HO-2608-001204 | 18 | 2026-09-02 |
| HO-2608-001377 | 6 | 2026-09-02 |
| HO-2608-004512 | 10 | 2026-09-03 |
| HO-2608-004630 | 0 | 2026-09-03 |
| HO-2608-007015 | 25 | 2026-09-02 |
아래 JSON Schema 를 그대로 만족하는 실제 주문 줄을 예측 파일의 record_id 에 맞춰 더 만들어 주세요. closed_on 은 '2026-09-01' 부터 '2026-09-12' 사이 날짜로 씁니다. 쉬운 데이터만 만들지 말고 다음을 섞으세요: B2B 대리점 예측 408건 가운데 75건은 이 파일에 아예 넣지 않고, 휴면 후 복귀 226건 가운데 14건은 actual_value 와 closed_on 을 null 로 둡니다. 정기배송 구독은 90건, 기존 고객 1~3년은 63건, 기존 고객 3년 이상은 46건, 신규 가입 3개월 이내는 44건을 빼거나 null 로 둡니다. 나머지 네 세그먼트는 빼거나 null 로 두는 비율이 그 세그먼트의 평가 계획표 한도보다 낮게 둡니다. 개인 고객 기록의 5% 쯤은 actual_value 를 0 으로 둡니다. 판정 결과는 넣지 마세요. 형식 깨뜨리기 시도로 actual_value 를 '12개' 처럼 단위를 붙인 문자열로 적은 줄을 따로 5건 만들어 로더가 걸러내는지 보게 합니다.
{"type":"object","properties":{"record_id":{"type":"string"},"actual_value":{"type":["number","null"],"minimum":0},"closed_on":{"type":["string","null"]}},"required":["record_id","actual_value","closed_on"]}{"type":"object","properties":{"record_id":{"type":"string"},"actual_value":{"type":["number","null"],"minimum":0},"closed_on":{"type":["string","null"]}},"required":["record_id","actual_value","closed_on"]}AI 사이언티스트가 컨설팅 팀과 보고 전에 합의해 둔 평가 계획표입니다. 세그먼트마다 판정에 필요한 최소 짝지어진 건수, 허용하는 정답 누락 비율 상한, 주문 수량 오차 1개당 비용(원)을 적습니다. 오차 단가는 재고 비용과 결품 손실을 한 값으로 합친 합성 가정입니다. 이 표는 기준으로 받는 설정이고 이 도구가 만들지 않습니다.
| segment | min_samples | max_missing_rate | error_unit_cost |
|---|---|---|---|
| 신규 가입 3개월 이내 | 500 | 0.05 | 2,100 |
| 가입 3개월~1년 | 500 | 0.05 | 1,900 |
| 기존 고객 1~3년 | 800 | 0.05 | 1,600 |
| 기존 고객 3년 이상 | 800 | 0.05 | 1,600 |
| 휴면 후 복귀 | 500 | 0.08 | 2,100 |
아래 JSON Schema 를 그대로 만족하는 평가 계획 줄을 다른 가상 고객사용으로 20개 더 만들어 주세요. 세그먼트 이름은 그 고객사의 고객 구분을 한국어로 쓰고, min_samples 는 200~1,000, max_missing_rate 는 0.02~0.1, error_unit_cost 는 300~5,000원 사이로 둡니다. 표본이 원래 적은 세그먼트는 min_samples 를 낮추고 누락 한도를 넓게 잡습니다. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"segment":{"type":"string"},"min_samples":{"type":"integer","minimum":1},"max_missing_rate":{"type":"number","minimum":0,"maximum":1},"error_unit_cost":{"type":"integer","minimum":0}},"required":["segment","min_samples","max_missing_rate","error_unit_cost"]}{"type":"object","properties":{"segment":{"type":"string"},"min_samples":{"type":"integer","minimum":1},"max_missing_rate":{"type":"number","minimum":0,"maximum":1},"error_unit_cost":{"type":"integer","minimum":0}},"required":["segment","min_samples","max_missing_rate","error_unit_cost"]}| Python | record_id 짝짓기, 세그먼트별 건수 집계, 부트스트랩 구간 계산, 판정 규칙, CLI 와 마크다운 리포트를 맡습니다. |
| pandas | parquet 예측 파일과 csv 실제 주문 파일을 읽어 record_id 로 잇고, 세그먼트별 절대오차 차이 열을 만듭니다. |
| PyTorch | 2주차에 합성 주문 데이터로 고객별 다음 달 주문 수량을 예측하는 작은 모델을 학습해, 평가할 예측 파일을 직접 만듭니다. |
| LangChain | 판정 줄의 수치를 이름표 자리에 넣는 프롬프트와 세 문장 구조의 출력 형식을 묶고, 수치 대조 가드를 한 체인에 둡니다. |
| Generative AI · LLM (Claude) | 판정마다 부트스트랩 구간을 모르는 컨설턴트가 읽을 설명 문단을 씁니다. 판정 자체에는 관여하지 않습니다. |
| 시각화 (matplotlib) | 세그먼트 열 개의 평균 절대오차 차이와 95% 구간을 한 장의 구간 그림으로 그려 리포트 첫머리에 둡니다. |
| 부트스트랩 통계 | 짝지어진 기록을 세그먼트 안에서 복원 추출해 절대오차 차이 평균의 95% 구간을 구하고, 그 구간이 0 을 포함하는지로 세 판정을 정합니다. |
| Git · GitHub Actions | 3주차에 모델 변경 풀 리퀘스트마다 평가를 돌리고 리포트를 코멘트로 남겨, 여러 사람이 같은 저장소에서 모델을 고칠 때 판정 이력을 남깁니다. |
✗ fail → 시드마다 판정이 뒤집히는 세그먼트가 있으면 구간 끝이 0 에 붙어 있는 것이라, 재표본 횟수를 10,000회로 늘리고 그래도 뒤집히면 그 세그먼트를 차이가 오차 범위 안으로 둡니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 2주차 모델 학습과 구간 그림, 설명 문단, 평가 러너로 넘어갑니다.
✗ fail → 효과가 작은 세그먼트에서만 어긋나면 표본 크기 문제라 평가 계획표의 최소 표본을 올리고, 큰 효과에서도 어긋나면 짝짓기나 부호 규칙부터 다시 봅니다.
✓ pass → 3주차 GitHub Actions 연동과 버전 간 판정 비교로 넘어갑니다.
세그먼트별 개선 판정입니다. 평가 계획표의 세그먼트 하나마다 새 모델이 기존 방식보다 주문 수량 오차를 줄였는지 다섯 판정 중 하나를 적습니다. 판정과 함께 예측 건수, 짝지어진 건수, 정답 누락 비율, 두 평균 절대오차와 그 차이, 95% 구간, 월 추정 효과, 판정 사유를 보여주는 기록 번호를 한 줄에 실어 터미널의 판정별 구획과 마크다운 리포트가 그대로 읽습니다.
{"type":"object","properties":{"segment":{"type":"string"},"verdict":{"type":"string","enum":["기존 방식보다 나음","차이가 오차 범위 안","기존 방식보다 나쁨","평가 표본 부족","정답 누락이 많음"]},"predicted_count":{"type":"integer","minimum":0,"description":"holdout_predictions 에서 이 segment 인 기록 수입니다"},"matched_count":{"type":"integer","minimum":0,"description":"그 기록 가운데 record_id 가 holdout_outcomes 에 있고 actual_value 가 null 이 아닌 기록 수입니다. actual_value 가 0 인 기록은 짝지어진 건으로 셉니다"},"missing_rate":{"type":"number","minimum":0,"maximum":1,"description":"predicted_count 에서 matched_count 를 뺀 수를 predicted_count 로 나눠 소수 넷째 자리로 반올림한 비율입니다"},"model_mae":{"type":["number","null"],"description":"짝지어진 기록의 |model_pred - actual_value| 평균을 소수 둘째 자리로 반올림한 값입니다. 판정이 정답 누락이 많음·평가 표본 부족이면 null 입니다"},"baseline_mae":{"type":["number","null"],"description":"짝지어진 기록의 |baseline_pred - actual_value| 평균을 소수 둘째 자리로 반올림한 값입니다. model_mae 가 null 이면 null 입니다"},"mae_change":{"type":["number","null"],"description":"model_mae 에서 baseline_mae 를 뺀 값입니다. 음수면 모델 오차가 작습니다. 어느 한쪽이 null 이면 null 입니다"},"ci_low":{"type":["number","null"],"description":"런타임 측정값입니다. 짝지어진 기록의 건별 절대오차 차이를 시드 2026 으로 2,000회 복원 추출한 평균의 2.5 백분위수입니다"},"ci_high":{"type":["number","null"],"description":"런타임 측정값입니다. 같은 재표본 평균의 97.5 백분위수입니다"},"est_monthly_effect_krw":{"type":["integer","null"],"description":"(baseline_mae - model_mae) x matched_count x eval_plan.error_unit_cost 를 원 단위로 반올림한 합성 기준 추정입니다. 음수면 손해입니다. 판정이 기존 방식보다 나음·나쁨일 때만 채웁니다"},"example_record_ids":{"type":"array","items":{"type":"string"},"description":"판정 사유를 보여주는 이 segment 의 기록 번호입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["holdout_predictions","holdout_outcomes","eval_plan"]},"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","min","max",null]},"value":{}},"required":["table","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["segment","verdict","predicted_count","matched_count","missing_rate","example_record_ids","evidence","summary"]}[
{
"segment": "정기배송 구독",
"verdict": "기존 방식보다 나음",
"predicted_count": 4050,
"matched_count": 3960,
"missing_rate": 0.0222,
"model_mae": 5.84,
"baseline_mae": 7.12,
"mae_change": -1.28,
"ci_low": -1.41,
"ci_high": -1.15,
"est_monthly_effect_krw": 9377280,
"example_record_ids": [
"HO-2608-001204",
"HO-2608-001377"
],
"evidence": [
{
"table": "holdout_predictions",
"field": "record_id",
"agg": "count",
"value": 4050
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": "count",
"value": 3960
},
{
"table": "eval_plan",
"field": "max_missing_rate",
"agg": null,
"value": 0.03
},
{
"table": "eval_plan",
"field": "min_samples",
"agg": null,
"value": 600
},
{
"table": "eval_plan",
"field": "error_unit_cost",
"agg": null,
"value": 1850
}
],
"summary": "정기배송 구독 고객 3,960명에서 모델 오차가 한 명당 평균 1.28개 작고, 구간 전체가 0 아래라 우연으로 보기 어렵습니다.",
"hedge": "월 추정 효과 937만 원은 오차 1개당 1,850원이라는 합성 단가로 환산한 값이라, 고객사 재무 담당의 단가로 바꾸기 전에는 보고서에 금액을 싣지 않습니다."
},
{
"segment": "기존 고객 1~3년",
"verdict": "기존 방식보다 나음",
"predicted_count": 3310,
"matched_count": 3247,
"missing_rate": 0.019,
"model_mae": 9.12,
"baseline_mae": 10.05,
"mae_change": -0.93,
"ci_low": -1.08,
"ci_high": -0.79,
"est_monthly_effect_krw": 4831536,
"example_record_ids": [
"HO-2608-004512",
"HO-2608-004630"
],
"evidence": [
{
"table": "holdout_predictions",
"field": "record_id",
"agg": "count",
"value": 3310
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": "count",
"value": 3247
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": null,
"value": 0
},
{
"table": "eval_plan",
"field": "min_samples",
"agg": null,
"value": 800
},
{
"table": "eval_plan",
"field": "error_unit_cost",
"agg": null,
"value": 1600
}
],
"summary": "기존 고객 1~3년에서 모델 오차가 한 명당 평균 0.93개 작고 구간이 0 아래에 있습니다. 8월에 아무것도 주문하지 않은 HO-2608-004630 도 실제값 0 으로 짝지어 계산에 넣었습니다.",
"hedge": null
},
{
"segment": "기존 고객 3년 이상",
"verdict": "차이가 오차 범위 안",
"predicted_count": 2880,
"matched_count": 2834,
"missing_rate": 0.016,
"model_mae": 7.41,
"baseline_mae": 7.58,
"mae_change": -0.17,
"ci_low": -0.52,
"ci_high": 0.18,
"est_monthly_effect_krw": null,
"example_record_ids": [
"HO-2608-007015",
"HO-2608-007188"
],
"evidence": [
{
"table": "holdout_predictions",
"field": "record_id",
"agg": "count",
"value": 2880
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": "count",
"value": 2834
},
{
"table": "eval_plan",
"field": "min_samples",
"agg": null,
"value": 800
}
],
"summary": "기존 고객 3년 이상에서 모델 오차가 평균 0.17개 작지만 구간이 0 을 넘나들어, 기존 방식과 차이가 있다고 말할 수 없습니다.",
"hedge": "오래된 고객은 직전 3개월 평균만으로도 잘 맞는 세그먼트일 수 있어, 보고서에는 개선이 아니라 유지로 적습니다."
},
{
"segment": "신규 가입 3개월 이내",
"verdict": "기존 방식보다 나쁨",
"predicted_count": 1064,
"matched_count": 1020,
"missing_rate": 0.0414,
"model_mae": 12.8,
"baseline_mae": 10.9,
"mae_change": 1.9,
"ci_low": 0.9,
"ci_high": 2.9,
"est_monthly_effect_krw": -4069800,
"example_record_ids": [
"HO-2608-010233",
"HO-2608-010251"
],
"evidence": [
{
"table": "holdout_predictions",
"field": "record_id",
"agg": "count",
"value": 1064
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": "count",
"value": 1020
},
{
"table": "holdout_predictions",
"field": "model_pred",
"agg": null,
"value": 14
},
{
"table": "holdout_predictions",
"field": "baseline_pred",
"agg": null,
"value": 8.5
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": null,
"value": 7
},
{
"table": "eval_plan",
"field": "error_unit_cost",
"agg": null,
"value": 2100
}
],
"summary": "신규 가입 3개월 이내에서 모델 오차가 한 명당 평균 1.90개 커졌고 구간 [0.90, 2.90] 이 0 위에 있습니다. HO-2608-010233 처럼 모델이 첫 주문량을 크게 잡는 기록이 많습니다.",
"hedge": "합성 단가 기준으로 월 407만 원 손해로 환산되므로, 이 세그먼트는 기존 방식을 유지하고 모델 적용 대상에서 빼는 안을 보고서에 함께 올립니다."
},
{
"segment": "휴면 후 복귀",
"verdict": "평가 표본 부족",
"predicted_count": 226,
"matched_count": 212,
"missing_rate": 0.0619,
"model_mae": null,
"baseline_mae": null,
"mae_change": null,
"ci_low": null,
"ci_high": null,
"est_monthly_effect_krw": null,
"example_record_ids": [
"HO-2608-013902",
"HO-2608-013917"
],
"evidence": [
{
"table": "holdout_predictions",
"field": "record_id",
"agg": "count",
"value": 226
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": "count",
"value": 212
},
{
"table": "holdout_outcomes",
"field": "record_id",
"agg": null,
"value": "HO-2608-013917"
},
{
"table": "eval_plan",
"field": "max_missing_rate",
"agg": null,
"value": 0.08
},
{
"table": "eval_plan",
"field": "min_samples",
"agg": null,
"value": 500
}
],
"summary": "휴면 후 복귀는 짝지어진 기록이 212건으로 계획 최소 500건에 못 미쳐 판정하지 않았습니다. 반품 정산 전이라 실제값이 비어 있는 HO-2608-013917 은 누락으로 셌습니다.",
"hedge": "누락 비율 6.19% 는 한도 8% 안이라 표본 수가 판정을 막은 사유입니다. 두세 달을 모아 다시 돌리면 판정할 수 있습니다."
},
{
"segment": "B2B 대리점",
"verdict": "정답 누락이 많음",
"predicted_count": 408,
"matched_count": 333,
"missing_rate": 0.1838,
"model_mae": null,
"baseline_mae": null,
"mae_change": null,
"ci_low": null,
"ci_high": null,
"est_monthly_effect_krw": null,
"example_record_ids": [
"HO-2608-016044",
"HO-2608-016101",
"HO-2608-016120"
],
"evidence": [
{
"table": "holdout_predictions",
"field": "record_id",
"agg": "count",
"value": 408
},
{
"table": "holdout_outcomes",
"field": "actual_value",
"agg": "count",
"value": 333
},
{
"table": "holdout_predictions",
"field": "record_id",
"agg": null,
"value": "HO-2608-016044"
},
{
"table": "holdout_predictions",
"field": "record_id",
"agg": null,
"value": "HO-2608-016101"
},
{
"table": "eval_plan",
"field": "max_missing_rate",
"agg": null,
"value": 0.05
}
],
"summary": "B2B 대리점 예측 408건 가운데 75건이 실제 주문 파일에 없어 누락 비율이 18.38% 로 계획 한도 5% 를 넘었습니다. 짝지어진 333건은 최소 표본 200건을 넘지만 판정하지 않았습니다.",
"hedge": "대리점 주문은 월말 마감 뒤 전표가 따로 들어오는 경우가 많아, 고객사 데이터 담당에게 9월 둘째 주 이후 전표를 다시 받아 돌립니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 중 하나인지 확인합니다. 2. segment·verdict·predicted_count·matched_count·missing_rate·example_record_ids·evidence·summary 가 모두 채워졌는지 확인합니다. 2-1. 판정 줄은 평가 계획표의 segment 와 예측 파일의 segment 가 글자 단위로 같은 것만 만듭니다. 예측 파일에만 있는 segment 와 계획표에는 있는데 예측이 0건인 segment 는 다섯 판정 어디에도 넣지 않고 「계획표와 맞지 않는 세그먼트」 목록에 이름과 예측 건수를 따로 찍습니다. HO-2608-017803 의 법인 특판이 이 목록으로 갑니다. 판정 줄의 predicted_count 는 늘 1 이상이라 누락 비율의 분모가 0 이 되지 않습니다. 3. missing_rate 가 predicted_count 에서 matched_count 를 뺀 수를 predicted_count 로 나눠 소수 넷째 자리로 반올림한 값과 같은지 다시 계산합니다. B2B 대리점은 408 에서 333 을 빼 75 이고, 408 로 나눠 0.1838 입니다. 4. mae_change 가 model_mae 에서 baseline_mae 를 뺀 값과 같은지 다시 계산합니다. 어느 한쪽이 null 이면 null 인지 봅니다. 5. est_monthly_effect_krw 가 baseline_mae 에서 model_mae 를 뺀 값에 matched_count 와 그 segment 의 eval_plan.error_unit_cost 를 곱해 원 단위로 반올림한 값과 같은지 다시 계산합니다. 정기배송 구독은 1.28 × 3,960 × 1,850 으로 9,377,280 입니다. 6. missing_rate 가 0 이상 1 이하인지, matched_count 가 predicted_count 이하인지, ci_low 가 ci_high 이하인지 범위를 봅니다. 7. actual_value 가 null 인 기록은 matched_count 에서 빠지고 actual_value 가 0 인 기록은 들어가는지 봅니다. HO-2608-013917 은 빠지고 HO-2608-004630 은 들어갑니다. 8. missing_rate 가 그 segment 의 eval_plan.max_missing_rate 보다 크면 verdict 는 정답 누락이 많음입니다. 같거나 작으면 이 판정에 걸리지 않습니다. B2B 대리점이 걸리고, 휴면 후 복귀는 0.0619 가 한도 0.08 이하라 걸리지 않습니다. 9. 8 에 걸리지 않은 segment 의 matched_count 가 eval_plan.min_samples 보다 작으면 verdict 는 평가 표본 부족입니다. 휴면 후 복귀가 212 대 500 으로 걸리고, 정기배송 구독은 3,960 이 600 이상이라 걸리지 않습니다. 10. 8·9 에 걸리지 않고 ci_high 가 0 보다 작으면 verdict 는 기존 방식보다 나음입니다. 정기배송 구독과 기존 고객 1~3년이 그렇습니다. 11. 8·9 에 걸리지 않고 ci_low 가 0 보다 크면 verdict 는 기존 방식보다 나쁨입니다. 신규 가입 3개월 이내가 그렇습니다. 12. 8·9 에 걸리지 않고 ci_low 가 0 이하이면서 ci_high 가 0 이상이면 verdict 는 차이가 오차 범위 안입니다. 기존 고객 3년 이상이 그렇습니다. 13. verdict 가 정답 누락이 많음·평가 표본 부족이면 model_mae·baseline_mae·mae_change·ci_low·ci_high·est_monthly_effect_krw 가 모두 null 입니다. verdict 가 차이가 오차 범위 안이면 est_monthly_effect_krw 는 null 입니다. 14. example_record_ids 의 기록이 holdout_predictions 에 실재하고 그 segment 가 판정의 segment 와 같은지 대조합니다. 15. evidence 의 field 가 세 데이터셋에 실재하는 컬럼인지 대조합니다. 16. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 줄의 값과 같은지 확인합니다. 17. summary 와 hedge 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 1. ci_low·ci_high 는 재표본에서 나오는 런타임 측정값이라 위 재계산에 넣지 않습니다. 러너가 같은 시드 2026 으로 다시 돌려 같은 값이 나오는지 봅니다. 2. model_mae·baseline_mae 를 전체 예측 파일과 실제 주문 파일에서 다시 계산해 판정 줄과 같은지 봅니다. 3. 효과 방향을 알고 심어 둔 합성 세그먼트 40개에서 판정 방향이 심은 방향과 맞는 수를 셉니다. [수동 검증 · 사람이 봅니다] 1. 정답 누락이 많은 세그먼트의 원인이 전표 마감 시점인지 고객사 데이터 담당과 확인합니다. 2. 오차 단가를 고객사 재무 담당이 쓰는 값으로 바꿀지 컨설팅 팀과 정합니다.