'흩어진 사내 데이터 및 외부(자사몰, 오픈마켓 등) 고객 데이터 수집, 정제 및 적재' 와 '매일 실무에 활용되는 실용적인 데이터 시각화 환경' 이라는 공고 문장이 이 콘솔의 두 층(적재·브리프)을 그대로 정의합니다. CEO 직속으로 자동화 툴이 즉각 현업에 적용된다는 문화라, 신입이 1주 완결품으로 기여를 증명하는 이 구성이 포지션의 성장 로드맵(기본 자동화부터 AI 솔루션까지)과 맞습니다. 이 포트폴리오가 입증하는 것은 Python 데이터 파이프라인·BI 구성·LLM 요약 자동화이며, 화장품 커머스 운영 전문성은 주장하지 않습니다. KPI 정의는 더미 기준이고 실무 지표는 현업과 함께 정해야 한다고 면접에서 밝힙니다.
공고가 자사몰·오픈마켓 등 흩어진 고객 데이터의 수집·정제·적재를 첫 업무로 명시합니다. 채널별 CSV 를 표준 테이블로 정규화하는 이 콘솔의 적재 계층이 그 업무의 실물입니다.
공고가 단순 조회를 넘어 매일 실무에 활용되는 대시보드와 리포트를 요구합니다. 매일 아침 자동 생성되는 브리프와 KPI 화면이 그 요구에 맞춘 출력입니다.
공고가 데이터 취합·가공 같은 반복 업무를 발굴해 자동화하는 Workflow Agent 화를 업무로 둡니다. 사람이 매일 하던 취합·요약을 스케줄 실행으로 바꾼 이 구조가 같은 방향입니다.
자사몰과 오픈마켓 채널별 판매 CSV(더미)를 표준 스키마로 정제·적재하고, 매일 아침 KPI 집계와 이상 신호(급증·급감·결측 채널)를 계산해 대시보드와 브리프 문서를 만들어주는 사내 콘솔입니다. 모든 KPI 수치는 pandas·SQL 재계산으로 검증되는 규칙 산출이고, LLM 은 그 수치만 근거로 브리프 코멘트 문장을 씁니다.
매일 아침 채널별 판매 엑셀을 내려받아 붙여넣고 어제 매출 요약을 만들어 보고하던 화장품 회사 운영 담당자입니다. 취합은 시스템이 하고, 자기는 급감한 채널이나 재고 신호 같은 볼 일 있는 숫자부터 확인하고 싶은 사람입니다.
채널별 표기가 흔들리는 판매 데이터라도 정규화 규칙과 결측 표시를 강제하면, 매일 아침 브리프를 사람 손 없이 만들면서도 수치 신뢰(재계산 일치)를 유지할 수 있습니다.
채널 3곳의 판매 CSV 더미를 표준 테이블로 정제·적재하고, KPI 집계·이상 신호 계산·LLM 브리프 생성까지 스케줄 실행 한 번으로 도는 완결품입니다. 대시보드는 Metabase 로 구성해 바로 열어봅니다.
브리프 30건의 모든 KPI 가 SQL 재계산과 100% 일치하는지 채점한 리포트와, 결측 채널·표기 흔들림·반품 음수 같은 하드 케이스 20종 처리 결과가 남은 상태입니다.
어제 자사몰 매출 왜 줄었냐 같은 자연어 질문에 집계 결과와 근거 수치로 답하는 질의 흐름이 붙어, 브리프 수신에서 셀프서비스 조회까지 넓어진 상태입니다.
채널별 CSV 를 넣고 스케줄 실행 한 번으로 대시보드 갱신과 아침 브리프 생성까지 도는 흐름을 시연합니다(채널 3곳·30일치 더미 기준).
브리프에 등장하는 모든 수치가 SQL 재계산과 100% 일치함을 자동 채점으로 보여줍니다(표본: 브리프 30건, 코멘트 문장별 근거 수치 검증 포함).
채널 파일 누락·상품명 표기 흔들림·반품 음수·판매 0 같은 하드 케이스 20종에서도 파이프라인이 깨지지 않고 결측은 결측으로 표시됩니다.
위 수치는 데이터와 정답을 작성자가 만든 더미 자가채점이라 성능 증명이 아닙니다. 실제 유용성은 스킨이데아의 실제 채널 데이터와 경영진 피드백이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직하게 설명합니다.
정답을 내가 만들었으니 잘 맞는 게 당연해지는 함정이 있어, 채널 파일 누락일·같은 상품의 다른 표기·반품 음수·0 판매를 더미에 일부러 섞습니다.
실제 오픈마켓 데이터는 채널별 정산 주기와 컬럼 변경이 잦아 수집 커넥터 유지보수가 별도 과제입니다. 이는 도입 단계 과제로 분리합니다.
이 포트폴리오는 데이터 파이프라인·BI·LLM 요약 자동화를 입증할 뿐, 화장품 커머스 운영 전문성은 주장하지 않습니다. KPI 와 이상 신호 임계치는 현업과 함께 다시 정해야 한다고 면접에서 밝힙니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
채널별 일별 판매 원장입니다. 정규화·집계·이상 신호의 입력이며 표기 흔들림과 결측을 일부러 담았습니다.
| row_id | sale_date | channel_raw | channel_std | product_raw | sku | qty | unit_price | amount |
|---|---|---|---|---|---|---|---|---|
| S-0001 | 2026-06-01 | 자사몰 | 자사몰 | 수분크림 50ml | SK-001 | 42 | 28,000 | 1,176,000 |
| S-0002 | 2026-06-01 | smartstore | 스마트스토어 | 수분 크림 50ML | SK-001 | 31 | 26,600 | 824,600 |
| S-0003 | 2026-06-01 | 쿠팡 | 쿠팡 | 시카 세럼 30ml | SK-002 | 55 | 32,000 | 1,760,000 |
| S-0004 | 2026-06-02 | coupang | 쿠팡 | 시카세럼 30ml | SK-002 | -3 | 32,000 | -96,000 |
| S-0005 | 2026-06-02 | 자사몰 | 자사몰 | 선크림 SPF50 | SK-003 | 0 | 24,000 | 0 |
다음 JSON Schema 를 그대로 만족하는 채널 판매 행을 60개 더 만들어 주세요(30일치): {"type":"object","properties":{"row_id":{"type":"string"},"sale_date":{"type":"string"},"channel_raw":{"type":"string"},"channel_std":{"type":["string","null"],"enum":["자사몰","스마트스토어","쿠팡",null]},"product_raw":{"type":"string"},"sku":{"type":["string","null"]},"qty":{"type":"integer"},"unit_price":{"type":["integer","null"]},"amount":{"type":["integer","null"]}},"required":["row_id","sale_date","channel_raw","product_raw","qty"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) channel_raw 표기 흔들림(자사몰/own_mall, 쿠팡/coupang, 스마트스토어/smartstore/스마트 스토어)과 매핑 불가 신규 채널(channel_std null) 3건, (2) 같은 상품의 product_raw 표기 흔들림(공백·대소문자·붙여쓰기) 5건 이상, (3) 반품 음수 qty 3건과 qty 0·일 매출 10배 급증 경계값 2건, (4) unit_price·amount 가 null 인 정산 미확정 행 4건, (5) 마스터에 없는 신규 상품(sku null) 2건, (6) 특정 날짜 하루는 특정 채널 데이터가 통째로 빠져 있을 것(결측일 탐지용).{"type":"object","properties":{"row_id":{"type":"string"},"sale_date":{"type":"string"},"channel_raw":{"type":"string"},"channel_std":{"type":["string","null"],"enum":["자사몰","스마트스토어","쿠팡",null]},"product_raw":{"type":"string"},"sku":{"type":["string","null"]},"qty":{"type":"integer"},"unit_price":{"type":["integer","null"]},"amount":{"type":["integer","null"]}},"required":["row_id","sale_date","channel_raw","product_raw","qty"]}상품 마스터입니다. 표기 정규화와 sku 매핑의 기준이며 여기 없는 상품은 미매핑으로 분리됩니다.
| sku | name_std | aliases | category | list_price |
|---|---|---|---|---|
| SK-001 | 수분크림 50ml | ["수분 크림 50ML","수분크림50ml"] | 스킨케어 | 28,000 |
| SK-002 | 시카 세럼 30ml | ["시카세럼 30ml"] | 스킨케어 | 32,000 |
| SK-003 | 선크림 SPF50 | ["선크림 SPF50+"] | 선케어 | 24,000 |
| SK-004 | 클렌징폼 150ml | ["클렌징 폼 150ml"] | 클렌징 | 18,000 |
| SK-005 | 토너 200ml | [] | 스킨케어 | 21,000 |
다음 JSON Schema 를 그대로 만족하는 상품 마스터 행을 15개 더 만들어 주세요: {"type":"object","properties":{"sku":{"type":"string"},"name_std":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"category":{"type":"string","enum":["스킨케어","선케어","클렌징"]},"list_price":{"type":["integer","null"]}},"required":["sku","name_std","aliases","category"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 공백·대소문자·용량 표기만 다른 별칭 3건 이상, (2) aliases 빈 배열 3건, (3) list_price null(가격 미정) 2건, (4) 판매 더미에 등장하는 신규 상품(신제품 앰플)은 마스터에 넣지 말 것(미매핑 탐지용).{"type":"object","properties":{"sku":{"type":"string"},"name_std":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"category":{"type":"string","enum":["스킨케어","선케어","클렌징"]},"list_price":{"type":["integer","null"]}},"required":["sku","name_std","aliases","category"]}| Python | pandas 로 채널별 CSV 정제·정규화·KPI 집계 파이프라인을 만듭니다. 공고의 pandas·openpyxl 요건 그대로입니다 |
| LLM | 집계된 수치만 근거로 브리프 코멘트를 씁니다. 수치 자체는 규칙 계산이라 LLM 이 숫자를 만들지 않습니다 |
| OpenAI | 브리프 문구의 대안 표현을 만들어 어투 비교에 씁니다. 공고의 활용 API 목록에 있는 도구입니다 |
| Claude | 주 브리프 생성 모델로 쓰고, 개발도 Claude Code 로 진행해 공고의 코딩 에이전트 활용 요건을 그대로 보입니다 |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 재계산 채점과 하드 케이스 리포트로 넘어갑니다.
✓ pass → 자연어 질의 흐름을 붙여 셀프서비스 조회로 확장합니다.
매일 아침 생성되는 경영진 브리프입니다. 모든 코멘트 문장이 집계 결과의 어느 수치를 근거로 했는지 추적됩니다.
{"type":"object","properties":{"brief_date":{"type":"string"},"kpis":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"number"},"vs_prev_pct":{"type":["number","null"]}},"required":["name","value"]}},"highlights":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"evidence":{"type":"object","properties":{"metric":{"type":"string"},"value":{"type":"number"}},"required":["metric","value"]}},"required":["text","evidence"]}},"data_gaps":{"type":"array","items":{"type":"string"}},"hedge":{"type":"string"}},"required":["brief_date","kpis","highlights","data_gaps","hedge"]}[
{
"brief_date": "2026-06-04",
"kpis": [
{
"name": "총매출",
"value": 11012000,
"vs_prev_pct": 42.1
},
{
"name": "주문수",
"value": 392,
"vs_prev_pct": 18.5
},
{
"name": "반품수량",
"value": 0,
"vs_prev_pct": null
}
],
"highlights": [
{
"text": "자사몰 수분크림 판매가 전일보다 크게 늘어 총매출 상승을 이끌었습니다.",
"evidence": {
"metric": "자사몰_SK-001_qty",
"value": 380
}
},
{
"text": "네이버로 표기된 미매핑 채널 매출이 잡혀 채널 매핑 확인이 필요합니다.",
"evidence": {
"metric": "unmapped_channel_amount",
"value": 372000
}
}
],
"data_gaps": [],
"hedge": "합성 더미 데이터 기준 브리프이며 실제 영업 성과가 아닙니다."
},
{
"brief_date": "2026-06-02",
"kpis": [
{
"name": "총매출",
"value": 728600,
"vs_prev_pct": -80.6
},
{
"name": "주문수",
"value": 15,
"vs_prev_pct": -88
},
{
"name": "반품수량",
"value": 3,
"vs_prev_pct": null
}
],
"highlights": [
{
"text": "쿠팡 시카세럼 반품 3건이 발생해 금액이 차감됐습니다.",
"evidence": {
"metric": "쿠팡_SK-002_qty",
"value": -3
}
},
{
"text": "클렌징폼은 정산 미확정으로 금액 없이 수량만 집계됐습니다.",
"evidence": {
"metric": "SK-004_amount_null_rows",
"value": 1
}
}
],
"data_gaps": [
"스마트스토어 단가·금액 미확정 1행"
],
"hedge": "합성 더미 데이터 기준 브리프이며 실제 영업 성과가 아닙니다."
},
{
"brief_date": "2026-06-06",
"kpis": [
{
"name": "총매출",
"value": 1122400,
"vs_prev_pct": null
},
{
"name": "주문수",
"value": 53,
"vs_prev_pct": null
}
],
"highlights": [
{
"text": "쿠팡 채널 파일이 도착하지 않아 이날 집계에서 빠졌습니다. 전일 대비 비교는 결측으로 표시합니다.",
"evidence": {
"metric": "missing_channel_files",
"value": 1
}
}
],
"data_gaps": [
"쿠팡 2026-06-06 파일 미수신"
],
"hedge": "결측 채널이 있어 부분 집계임을 브리프에 그대로 노출했습니다. 합성 더미 기준입니다."
}
][자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식 깨진 브리프 발송 차단). 2. kpis 의 모든 value·vs_prev_pct 가 SQL 재계산 결과와 100% 일치하는지 확인합니다(수치는 LLM 이 아니라 집계 규칙이 결정). 3. highlights 의 evidence.metric·value 가 집계 결과에 실재하는지 확인합니다(집계에 없는 수치 언급 차단). 4. 결측 채널·미확정 금액이 있는 날 data_gaps 가 비어 있지 않은지 확인합니다(부분 집계 은폐 차단). [수동 검증 · 사람이 표본 확인] 1. 코멘트 문장이 근거 수치 범위를 넘어 원인 단정(마케팅 효과 등)을 하지 않는지 브리프 10건을 표본 검토합니다. 2. 이상 신호 임계치(급증·급감 기준)가 현업 감각과 맞는지 확인합니다.