모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 이탈 위험과 우선순위를 표로 보여 주기만 하던 대시보드를 걷어내고, 자동 채점 결과를 실패 유형별로 묶어 튜터가 건마다 판정을 골라야 수강생의 결과와 다음 회차가 열리는 판정 화면으로 다시 썼습니다.최신 판 보기 →
경력팀스파르타

수강생 학습 데이터에서 이탈·막힘을 짚고 튜터 개입 우선순위를 매기는 도구

팀스파르타 공고에서 뽑은 세 가지 시그널.

팀스파르타는 코딩 부트캠프의 수강 운영 데이터를 가진 곳이라, 수강생 이탈·막힘을 짚어 튜터 우선순위를 매기는 이 도구는 팀스파르타의 실제 수강 데이터가 있어야 우선순위를 검증한다.

01

대규모 튜터 운영

'튜터 대규모 모집, 프로덕트엔지니어링'. 튜터 개입 우선순위가 학습 운영의 핵심.

튜터풀스택프로덕트엔지니어링
02

PO/PM 운영

'PO(프로덕트오너), PM'. 이탈·막힘 점검이 학습 성과 운영의 토대.

PO(프로덕트오너)솔루션PM
03

백엔드 운영

'백엔드/서버개발'. 학습 데이터 파이프라인+점검이 1주 단위.

백엔드솔루션서버개발

포트폴리오 요약

수강생 학습·과제 데이터를 받아 이탈 위험과 막힌 지점을 규칙으로 짚고, 튜터 개입 우선순위를 근거와 함께 매기는 1주 포트폴리오.

고객 정의

팀스파르타 PE. 수강생 이탈을 튜터가 일일이 보던 일을, 자동 점검 + 개입 우선순위 도구로 옮기고 싶은 사람.

고민 지점

학습에 진도·과제를 붙이면, 도구가 (a) 이탈·막힘을 규칙으로 짚고 (b) 튜터 개입 우선순위를 근거와 함께 매길 수 있다.

주차별 일정

1주차여기까지로 완성

이탈·막힘 점검 + 튜터 우선순위

학습·과제 데이터를 받아 이탈·막힘을 짚고 튜터 개입 우선순위를 근거와 함께 내는 동작하는 도구.

  1. 1일 · 학습 진도·과제 스키마 설계 + 이탈·막힘·우선순위 규칙 정의
  2. 2-3일 · 학습 데이터 ingest(Python) + 이탈·막힘 규칙 + Zod 검증
  3. 4일 · 튜터 개입 우선순위 + 막힌 지점 근거 인용
  4. 5일 · 학습 대시보드(React)이탈 위험·막힘·우선순위 한 화면
  5. 6일 · 일부러 만든 결측·경계·미등록 수강생 30종으로 점검이 안 깨지는지 확인 + 5% 사람 확인
  6. 7일 · 7일치 시연 영상 + 직접 만든 정답과 비교한 기준선여기까지가 1주차 완성품
2주차선택 성장

예측 검증

이탈 위험 신호를 다음 주 실제 이탈과 맞춰 적중률을 재고, 오탐을 보여주는 대시보드.

  1. 8-9일 · 이탈 위험 신호를 다음 주 실제 이탈과 맞춰 적중률 + 오탐 측정
  2. 10-11일 · 코스 난이도 보정 + 우선순위 가중치 튜닝
3주차선택 성장

자동 개입 알림

우선순위 높은 수강생을 튜터에게 자동 알림하고 추적하는 단계.

  1. 12-14일 · 우선순위 높은 수강생 튜터 자동 알림 + 추적
  2. 15일 · 자동 알림 시연 + 3주 통합 영상

데모 · 측정 지표

01

학습 데이터를 넣으면 이탈·막힘과 튜터 우선순위가 근거와 함께 나오는 걸 시연한다

02

이탈·막힘 규칙 판정이 정답과 일치하는 비율 100%

측정: 결정적 재계산, 표본: 수강생 200건

03

일부러 만든 결측·경계·미등록 수강생 30종을 넣어도 점검이 멈추지 않고 처리되는 걸 시연한다

정직 경계선

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

위 수치는 더미데이터 자가채점이며, 실제 이탈 예측 정확도는 팀스파르타 실데이터 + 실 검수자가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.

미리 알아둬야 할 것들

이건 고객·실데이터 없이 혼자 만든 포트폴리오라 모든 수치는 합성 데이터 자가채점이다. 면접에서 '데모 동작 + 실검증 준비 상태'로 솔직히 설명하는 게 오히려 신뢰를 준다

정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다

상관≠인과: 활동 저하가 곧 이탈은 아니므로 '위험 신호'로만 표시한다

실제 도입 시 달라지는 것: 실 학습 패턴·코스가 더미와 다르므로 이탈 규칙을 실데이터로 맞춰야 한다(도입 단계 과제)

더미 데이터

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

learning_progressTABLE· 12 rows

수강생 학습·과제를 묶어 이탈·막힘 점검 입력으로 쓴다

② learning_progress.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
student_idname_rawstudent_keycourseprogresslast_activeassignments_done
ST900홍OO(영문)—웹개발———
ST901수강생0st0데이터02026-04-010
ST902완주생st2앱12026-05-2310
ST903미등록수강생—웹개발0.52026-05-10—
ST000수강생0st0웹개발0.12026-05-220
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
z.object({ student_id: z.string(), name_raw: z.string(), student_key: z.string().nullable(), course: z.string(), progress: z.number().nullable(), last_active: z.string().nullable(), assignments_done: z.number().nullable() }). 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: progress/last_active/assignments null(미활동), progress 0/1 극단, 오래된 last_active(이탈), student_key null 미등록, name_raw 국문/영문 병기. 형식 깨뜨리기 시도 3건도 별도로.
schema (3 층의 단일 출처)
z.object({ student_id: z.string(), name_raw: z.string(), student_key: z.string().nullable(), course: z.string(), progress: z.number().nullable(), last_active: z.string().nullable(), assignments_done: z.number().nullable() })

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

기술 스택 매핑
Python학습 데이터 ingest + 이탈 규칙 + eval(공고 스택 미명시 → 도메인 기반 추론)
TypeScript대시보드 렌더 + Zod 검증
React학습 운영 대시보드
Node.js점검 API
PostgreSQL학습 단일 진실원
LLM막힌 지점 분석 + 우선순위 설명
LLM 선택
model
규칙 기반 이탈·막힘 점검 + Claude Sonnet(우선순위 설명)
prompt
few-shot 3 + 활동 근거 인용 강제 + 우선순위 schema 강제 + 단정 가드
rationale
이탈·막힘은 활동/과제 규칙, 우선순위 설명만 LLM.
결정 게이트
1주차 끝1주차 완성품이 자동으로 도는가. 여기까지가 그 자체로 제출 가능한 완성품.

✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(예측 검증)로.

2주차 끝예측 검증 결과가 나오는가.

✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(자동 개입 알림)로.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 학습 ingest + 이탈·막힘 규칙 엔진
  • 튜터 우선순위 점수 + 근거 부착
  • Zod 스키마 강제 검증
  • 학습 대시보드(React)
  • 5% 인간 spot-check 샘플러
domain (교체 대상)
  • 학습 진도·과제 스키마
  • 코스별 난이도 기준
  • 수강생 표기 정규화
출력 스키마 · tutor_output

이탈·막힘 + 튜터 우선순위

schema (JSON Schema)
z.object({ student_id: z.string(), risk: z.enum(['low','high','review']), stuck_at: z.string().nullable(), priority: z.number(), evidence: z.array(z.object({ field: z.string(), value: z.number() })) })
모범 출력 (2)
[
  {
    "student_id": "ST901",
    "risk": "high",
    "stuck_at": "2주차 과제",
    "priority": 1,
    "evidence": [
      {
        "field": "progress",
        "value": 0
      }
    ]
  },
  {
    "student_id": "ST900",
    "risk": "review",
    "stuck_at": null,
    "priority": 3,
    "evidence": []
  }
]
검증 노트 (자동 vs 수동)

risk 규칙·evidence 정합성은 자동 검증, priority/stuck_at 타당성은 튜터/judge 검증.