모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 산출물을 매일 아침 브리프 대시보드에서 확인 질문지 파일을 내는 CLI로 바꾸고, 자사 지표를 보는 시점 대신 재무·영업 두 부서에서 받은 추출본을 대조해 되묻는 시점으로 다시 썼습니다.최신 판 보기 →
인턴·신입스킨이데아 · [글로벌 스킨케아 브랜드/메디필] Internal FDE(신입)

자사몰·오픈마켓 판매 데이터를 모아 매일 아침 경영진 브리프와 대시보드를 만들어주는 사내 데이터 콘솔

스킨이데아 공고에서 뽑은 세 가지 시그널.

'흩어진 사내 데이터 및 외부(자사몰, 오픈마켓 등) 고객 데이터 수집, 정제 및 적재' 와 '매일 실무에 활용되는 실용적인 데이터 시각화 환경' 이라는 공고 문장이 이 콘솔의 두 층(적재·브리프)을 그대로 정의합니다. CEO 직속으로 자동화 툴이 즉각 현업에 적용된다는 문화라, 신입이 1주 완결품으로 기여를 증명하는 이 구성이 포지션의 성장 로드맵(기본 자동화부터 AI 솔루션까지)과 맞습니다. 이 포트폴리오가 입증하는 것은 Python 데이터 파이프라인·BI 구성·LLM 요약 자동화이며, 화장품 커머스 운영 전문성은 주장하지 않습니다. KPI 정의는 더미 기준이고 실무 지표는 현업과 함께 정해야 한다고 면접에서 밝힙니다.

01

데이터 수집·파이프라인이 첫 번째 업무

공고가 자사몰·오픈마켓 등 흩어진 고객 데이터의 수집·정제·적재를 첫 업무로 명시합니다. 채널별 CSV 를 표준 테이블로 정규화하는 이 콘솔의 적재 계층이 그 업무의 실물입니다.

데이터 수집파이프라인자사몰오픈마켓
02

매일 쓰는 실용 BI 를 요구

공고가 단순 조회를 넘어 매일 실무에 활용되는 대시보드와 리포트를 요구합니다. 매일 아침 자동 생성되는 브리프와 KPI 화면이 그 요구에 맞춘 출력입니다.

BI대시보드리포트의사결정
03

반복 업무의 Agent 화

공고가 데이터 취합·가공 같은 반복 업무를 발굴해 자동화하는 Workflow Agent 화를 업무로 둡니다. 사람이 매일 하던 취합·요약을 스케줄 실행으로 바꾼 이 구조가 같은 방향입니다.

WorkflowAgent자동화반복 업무

포트폴리오 요약

자사몰과 오픈마켓 채널별 판매 CSV(더미)를 표준 스키마로 정제·적재하고, 매일 아침 KPI 집계와 이상 신호(급증·급감·결측 채널)를 계산해 대시보드와 브리프 문서를 만들어주는 사내 콘솔입니다. 모든 KPI 수치는 pandas·SQL 재계산으로 검증되는 규칙 산출이고, LLM 은 그 수치만 근거로 브리프 코멘트 문장을 씁니다.

고객 정의

매일 아침 채널별 판매 엑셀을 내려받아 붙여넣고 어제 매출 요약을 만들어 보고하던 화장품 회사 운영 담당자입니다. 취합은 시스템이 하고, 자기는 급감한 채널이나 재고 신호 같은 볼 일 있는 숫자부터 확인하고 싶은 사람입니다.

고민 지점

채널별 표기가 흔들리는 판매 데이터라도 정규화 규칙과 결측 표시를 강제하면, 매일 아침 브리프를 사람 손 없이 만들면서도 수치 신뢰(재계산 일치)를 유지할 수 있습니다.

주차별 일정

1주차여기까지로 완성

아침마다 대시보드와 브리프가 자동으로 나온다

채널 3곳의 판매 CSV 더미를 표준 테이블로 정제·적재하고, KPI 집계·이상 신호 계산·LLM 브리프 생성까지 스케줄 실행 한 번으로 도는 완결품입니다. 대시보드는 Metabase 로 구성해 바로 열어봅니다.

  1. 1일 · 채널 3곳의 판매 CSV 더미(표기 흔들림·결측 포함)와 표준 스키마를 확정합니다
  2. 2-3일 · pandas 정규화·적재 파이프라인과 SQL 집계 뷰를 만듭니다
  3. 4-5일 · KPI·이상 신호 계산과 Claude 브리프 생성에 근거 수치 검증을 연결합니다
  4. 6-7일 · Metabase 대시보드를 구성하고 스케줄 실행으로 아침 브리프 자동화를 완결합니다
2주차선택 성장

수치가 전부 맞는지 재계산으로 채점한다

브리프 30건의 모든 KPI 가 SQL 재계산과 100% 일치하는지 채점한 리포트와, 결측 채널·표기 흔들림·반품 음수 같은 하드 케이스 20종 처리 결과가 남은 상태입니다.

  1. 8-10일 · 브리프 30건 재계산 채점과 하드 케이스 20종 리포트를 만듭니다
  2. 11-12일 · 실패 알림과 적재 이력 화면을 붙여 운영 감을 더합니다
3주차선택 성장

질문하면 답하는 사내 데이터 창구로 넓힌다

어제 자사몰 매출 왜 줄었냐 같은 자연어 질문에 집계 결과와 근거 수치로 답하는 질의 흐름이 붙어, 브리프 수신에서 셀프서비스 조회까지 넓어진 상태입니다.

  1. 15-18일 · 자연어 질문에 집계 근거로 답하는 질의 흐름을 붙입니다

데모 · 측정 지표

01

채널별 CSV 를 넣고 스케줄 실행 한 번으로 대시보드 갱신과 아침 브리프 생성까지 도는 흐름을 시연합니다(채널 3곳·30일치 더미 기준).

02

브리프에 등장하는 모든 수치가 SQL 재계산과 100% 일치함을 자동 채점으로 보여줍니다(표본: 브리프 30건, 코멘트 문장별 근거 수치 검증 포함).

03

채널 파일 누락·상품명 표기 흔들림·반품 음수·판매 0 같은 하드 케이스 20종에서도 파이프라인이 깨지지 않고 결측은 결측으로 표시됩니다.

정직 경계선

진짜 성능 검증은 여기서 멈춥니다

위 수치는 데이터와 정답을 작성자가 만든 더미 자가채점이라 성능 증명이 아닙니다. 실제 유용성은 스킨이데아의 실제 채널 데이터와 경영진 피드백이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.

미리 알아둬야 할 것들

수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직하게 설명합니다.

정답을 내가 만들었으니 잘 맞는 게 당연해지는 함정이 있어, 채널 파일 누락일·같은 상품의 다른 표기·반품 음수·0 판매를 더미에 일부러 섞습니다.

실제 오픈마켓 데이터는 채널별 정산 주기와 컬럼 변경이 잦아 수집 커넥터 유지보수가 별도 과제입니다. 이는 도입 단계 과제로 분리합니다.

이 포트폴리오는 데이터 파이프라인·BI·LLM 요약 자동화를 입증할 뿐, 화장품 커머스 운영 전문성은 주장하지 않습니다. KPI 와 이상 신호 임계치는 현업과 함께 다시 정해야 한다고 면접에서 밝힙니다.

더미 데이터

① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.

channel_salesTABLE· 12 rows

채널별 일별 판매 원장입니다. 정규화·집계·이상 신호의 입력이며 표기 흔들림과 결측을 일부러 담았습니다.

② channel_sales.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
row_idsale_datechannel_rawchannel_stdproduct_rawskuqtyunit_priceamount
S-00012026-06-01자사몰자사몰수분크림 50mlSK-0014228,0001,176,000
S-00022026-06-01smartstore스마트스토어수분 크림 50MLSK-0013126,600824,600
S-00032026-06-01쿠팡쿠팡시카 세럼 30mlSK-0025532,0001,760,000
S-00042026-06-02coupang쿠팡시카세럼 30mlSK-002-332,000-96,000
S-00052026-06-02자사몰자사몰선크림 SPF50SK-003024,0000
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
다음 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) 특정 날짜 하루는 특정 채널 데이터가 통째로 빠져 있을 것(결측일 탐지용).
schema (3 층의 단일 출처)
{"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"]}
product_masterTABLE· 10 rows

상품 마스터입니다. 표기 정규화와 sku 매핑의 기준이며 여기 없는 상품은 미매핑으로 분리됩니다.

② product_master.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 10)
skuname_stdaliasescategorylist_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
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
다음 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) 판매 더미에 등장하는 신규 상품(신제품 앰플)은 마스터에 넣지 말 것(미매핑 탐지용).
schema (3 층의 단일 출처)
{"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"]}

기술 상세 · 아키텍처·운영·출력 스키마

기술 스택 매핑
Pythonpandas 로 채널별 CSV 정제·정규화·KPI 집계 파이프라인을 만듭니다. 공고의 pandas·openpyxl 요건 그대로입니다
LLM집계된 수치만 근거로 브리프 코멘트를 씁니다. 수치 자체는 규칙 계산이라 LLM 이 숫자를 만들지 않습니다
OpenAI브리프 문구의 대안 표현을 만들어 어투 비교에 씁니다. 공고의 활용 API 목록에 있는 도구입니다
Claude주 브리프 생성 모델로 쓰고, 개발도 Claude Code 로 진행해 공고의 코딩 에이전트 활용 요건을 그대로 보입니다
LLM 선택
model
Claude Sonnet (브리프 코멘트 생성) + OpenAI GPT (표현 대안 비교)
prompt
입력을 KPI 집계 JSON 으로 한정하고 브리프 JSON Schema 를 강제합니다. 코멘트 문장마다 근거 수치 필드를 달게 하고, 집계에 없는 수치를 언급하면 해당 문장만 재생성합니다.
rationale
수치는 pandas·SQL 이 이미 계산하므로 RAG 도 수치 추론도 필요 없습니다. LLM 은 숫자를 읽기 좋은 문장으로 바꾸는 역할에 묶어, 신입 범위에서 신뢰 가능한 자동화를 만듭니다.
결정 게이트
1주차 끝스케줄 실행 한 번으로 적재부터 대시보드·브리프까지 나오는지, 결측 채널이 있는 날도 깨지지 않는지 확인합니다.

✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 재계산 채점과 하드 케이스 리포트로 넘어갑니다.

2주차 끝브리프 30건 전수의 KPI 재계산 일치와 하드 케이스 20종 처리 리포트를 확인합니다.

✓ pass → 자연어 질의 흐름을 붙여 셀프서비스 조회로 확장합니다.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 채널별 원본을 표준 스키마로 바꾸는 정규화 파이프라인 골격
  • KPI 재계산 일치를 확인하는 결정론 채점 스크립트
  • 집계 JSON 만 근거로 쓰는 LLM 브리프 생성기와 근거 수치 검증기
  • 스케줄 실행·실패 알림 러너
  • Metabase 대시보드 구성 템플릿
domain (교체 대상)
  • channel enum(자사몰·스마트스토어·쿠팡 등)과 채널별 원본 컬럼 매핑은 도메인별로 갈아끼웁니다
  • KPI 정의(매출·주문수·반품률)와 이상 신호 임계치
  • 운영 담당자 페르소나와 브리프 어투
출력 스키마 · daily_brief

매일 아침 생성되는 경영진 브리프입니다. 모든 코멘트 문장이 집계 결과의 어느 수치를 근거로 했는지 추적됩니다.

schema (JSON Schema)
{"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"]}
모범 출력 (3)
[
  {
    "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": "결측 채널이 있어 부분 집계임을 브리프에 그대로 노출했습니다. 합성 더미 기준입니다."
  }
]
검증 노트 (자동 vs 수동)

[자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식 깨진 브리프 발송 차단). 2. kpis 의 모든 value·vs_prev_pct 가 SQL 재계산 결과와 100% 일치하는지 확인합니다(수치는 LLM 이 아니라 집계 규칙이 결정). 3. highlights 의 evidence.metric·value 가 집계 결과에 실재하는지 확인합니다(집계에 없는 수치 언급 차단). 4. 결측 채널·미확정 금액이 있는 날 data_gaps 가 비어 있지 않은지 확인합니다(부분 집계 은폐 차단). [수동 검증 · 사람이 표본 확인] 1. 코멘트 문장이 근거 수치 범위를 넘어 원인 단정(마케팅 효과 등)을 하지 않는지 브리프 10건을 표본 검토합니다. 2. 이상 신호 임계치(급증·급감 기준)가 현업 감각과 맞는지 확인합니다.