탈잉
경력근거: DB 설계부터 API 구현, 프론트엔드 연동, 배포까지 주도합니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
탈잉은 '배움은 곧 변화'라는 미션 아래 기획자 없이 엔지니어가 문제를 직접 정의하고 DB 설계부터 배포까지 주도하는 팀입니다(공고: 'PM은 해결해야 할 문제만 가져옵니다'). 완주율 낮은 강의의 이탈 회차와 개선 실험을 잇는 이 사슬은 탈잉의 수강·시청·환불 로그가 있어야 의미가 있고, 다른 회사 데이터로는 이 강의별 이탈 지도를 그대로 만들 수 없습니다. 다만 이 포트폴리오는 NestJS·React·React Native 풀스택과 RDB 설계/최적화로 이탈 분석 제품을 End-to-End 로 구현하는 기술을 보여주며, 교육 콘텐츠 설계나 학습과학 도메인 전문성을 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
탈잉의 미션은 강의 판매가 아니라 고객의 삶을 바꾸는 것이고, 성과를 매출·전환율 같은 숫자로 보여줍니다. 완주율 낮은 강의의 이탈 회차를 짚고 개선 실험이 실제로 완주율을 올렸는지 확인하는 사슬이 그 '숫자로 증명'과 정확히 맞물립니다.
PM 은 문제만 가져오고 엔지니어가 DB 설계부터 API 구현, 프론트엔드 연동, 배포까지 직접 주도합니다. 이 도구는 로그 스키마 설계부터 진단 API, 대시보드까지 한 사람이 E2E 로 만드는 형태라 그 업무 방식을 그대로 재현합니다.
웹·앱·서버를 소수 정예로 장악하려 스택을 통일했고 RDB 설계/최적화를 직접 봅니다. 진단 API(NestJS)·대시보드(React/Next.js)·운영자 모바일 뷰(React Native)·집계 쿼리 최적화(PostgreSQL)가 이 요구를 골조로 떠받칩니다.
수강 이력·강의별 시청 로그·환불 기록에 강의 카테고리·가격대·기수 정보를 붙여 한 화면에서 봅니다. 완주율이 낮은 강의가 몇 회차에서 이탈하는지 이탈 지도를 그리고, LLM 이 이탈 원인 Top3 와 다음 개선 실험 3건을 근거와 함께 제안합니다. 1주차만으로 강의 하나를 넣으면 이탈 지도와 실험안이 바로 나오는 완성품이고, 진단이 운영자 판단과 맞는지 확인(2주차)과 제안한 실험이 실제로 완주율을 올렸는지 다음 기수로 검증(3주차)으로 키웁니다. 근거는 채용공고 정렬이고, 데이터는 작성자가 만든 더미입니다.
탈잉 PE 입니다. 기획자가 없어 이탈 원인을 직접 로그를 뒤져 찾고, 개선안이 실제로 완주율·전환을 올렸는지 매번 손으로 확인하던 상황을 끝내고, 진단과 실험 제안을 한 콘솔에서 받고 싶은 사람입니다.
수강 이력·시청 로그·강의 마스터를 한 스키마로 묶으면, LLM 이 (a) 완주율 낮은 강의의 이탈 회차 Top3 와 원인을, (b) 다음 개선 실험 3건을 예상 완주율 개선폭과 함께 제안하고, (c) 다음 기수 실측 완주율로 그 실험이 맞았는지 확인합니다.
강의 하나의 수강·시청 로그를 넣으면 회차별 이탈 지도를 그리고, 이탈 원인 Top3 와 개선 실험 3건을 LLM 이 근거와 함께 제안해 대시보드로 보여주는 동작하는 도구입니다. 로그는 이벤트 테이블로 이미 적재돼 있다고 가정하고 시작합니다.
교육 운영자 페르소나 2명이 이탈 진단이 타당한지 라벨링해 일치도를 보여주고, 개선 실험 제안에 예상 완주율 개선폭과 확신도를 붙이며, 운영자용 모바일 요약 뷰까지 붙는 대시보드입니다.
지난 실험의 예상 개선폭을 다음 기수 실측 완주율과 맞춰보고, 확신도를 실제 개선 확률로 보정하며, 이탈 커브 집계 쿼리를 인덱스·실행계획으로 최적화한 단계입니다.
완주율 낮은 강의 하나와 이탈 시나리오 10개를 넣으면, 이탈 회차 Top3 와 개선 실험 3건이 몇 초 안에 나오는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(계측 누락·미등록 강의·표기 흔들림·경계값)을 넣어도 출력 형식(JSON 스키마)이 한 번도 안 깨지고 형식 검증을 자동 통과합니다
내가 만든 정답 30개 중 이탈 원인 Top3 가 일치한 게 24개(80%)입니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 이탈 원인 적중률·완주율 개선폭은 탈잉 실 수강·시청 로그와 실 운영자 검수가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다
이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 '성능 증명'이 아닙니다. 면접에서 솔직히 '데모 조건 동작 + 실검증 준비 상태'로 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 일부러 헷갈리는 결측·악성·경계 케이스를 더미에 섞어, 쉬운 문제만 푸는 게 아님을 보여줘야 합니다
'이 회차 때문에 이탈했다'는 상관일 뿐 인과가 아닐 수 있습니다. 단정 표현을 강제로 누그러뜨리고 별도 LLM 검사로 우회 표현까지 거릅니다
강의명·카테고리 표기가 제각각입니다. 이름 유사도와 카테고리 필터로 같은 강의로 묶고, 못 묶은 건 추측하지 않고 '미매핑'으로 알립니다
실제 도입 시 달라지는 것을 명시합니다. 실 수강 로그 분포는 더미와 다르므로 기준폭·보정값을 다시 맞춰야 하고, 운영자 검수도 실제 인력으로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
강의별 회차 시청 행동과 진도·환불 로그. 이탈 지도와 진단 LLM 이 가장 먼저 질의하는 테이블입니다. 운영 현실대로 결측(시청비율 계측 누락)·미등록 강의(course_id 미매핑)·경계값(진도 0/100)·환불 이벤트를 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| date | user_id | course_id | lecture_no | event | watch_ratio | progress_pct | completed |
|---|---|---|---|---|---|---|---|
| 2026-04-06 | u_1001 | c_data_intro | 1 | complete | 0.98 | 8.3 | false |
| 2026-04-06 | u_1001 | c_data_intro | 4 | drop | 0.22 | 33 | false |
| 2026-04-06 | u_1002 | c_data_intro | 4 | pause | — | 33 | false |
| 2026-04-07 | u_1002 | c_data_intro | 4 | refund | 0.18 | 33 | false |
| 2026-04-07 | u_1003 | c_data_intro | 12 | complete | 1 | 100 | true |
아래 JSON Schema 에 맞는 한국 온라인 강의 수강 행동 로그 14일치 JSON 배열로 생성. 강의 3~4개(데이터·디자인·마케팅), 회차별 시청·이탈·환불 이벤트 분포 포함.
{"type":"object","properties":{"date":{"type":"string"},"user_id":{"type":"string"},"course_id":{"type":["string","null"]},"lecture_no":{"type":"integer"},"event":{"type":"string","enum":["play","complete","pause","drop","refund"]},"watch_ratio":{"type":["number","null"]},"progress_pct":{"type":"number"},"completed":{"type":"boolean"}},"required":["date","user_id","course_id","lecture_no","event","progress_pct","completed"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라(쉬운 문제만 푸는 함정 회피): (1) watch_ratio 가 null 인 계측 누락 행 각 1~2건, (2) course_master 에 없는 미등록 course_id(예: c_unknown_ai) 1~2건(미매핑 신규 강의), (3) 경계값 progress_pct 0.0(1강 즉시 이탈)과 100.0(완주) 각 1건 + watch_ratio 0.0/1.0 극단, (4) 특정 회차(예: 실습 4강)에 drop·refund 가 몰리는 이탈 급증 패턴 심기, (5) 같은 회차를 pause 후 다음 날 refund 로 잇는 사용자 1명. JSON 배열만.{"type":"object","properties":{"date":{"type":"string"},"user_id":{"type":"string"},"course_id":{"type":["string","null"]},"lecture_no":{"type":"integer"},"event":{"type":"string","enum":["play","complete","pause","drop","refund"]},"watch_ratio":{"type":["number","null"]},"progress_pct":{"type":"number"},"completed":{"type":"boolean"}},"required":["date","user_id","course_id","lecture_no","event","progress_pct","completed"]}강의 표준 ID + 별칭(같은 강의가 '데이터 분석 입문/데분 입문/파이썬 데이터분석'으로 들어옴) + 카테고리·총 회차·가격대. 이탈 진단이 별칭 차이로 분산되는 문제를 해소하고, 가격대·카테고리 상관 분석의 분모가 됩니다.
| course_id | canonical_title | aliases | category | instructor | total_lectures | price_krw |
|---|---|---|---|---|---|---|
| c_data_intro | 데이터 분석 입문 | ["데분 입문","파이썬 데이터분석"] | dev | 김데이터 | 12 | 189,000 |
| c_ux_basic | UX 디자인 기초 | ["UX 입문","유엑스 기초"] | design | 이디자인 | 10 | 149,000 |
| c_marketing_ad | 퍼포먼스 마케팅 실전 | ["퍼마 실전","광고 최적화"] | marketing | 박마케팅 | 8 | 219,000 |
| c_eng_speaking | 비즈니스 영어 스피킹 | ["비영 스피킹"] | language | 최영어 | 16 | 99,000 |
| c_stock_basic | 주식 투자 기초 | ["주식 입문","재테크 첫걸음"] | finance | 정투자 | 14 | 129,000 |
아래 JSON Schema 에 맞는 한국 온라인 강의 course_master 40행 JSON 배열로 생성. 같은 강의가 별칭 1~3개를 가지도록.
{"type":"object","properties":{"course_id":{"type":"string"},"canonical_title":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"category":{"type":"string","enum":["dev","design","marketing","language","finance","hobby"]},"instructor":{"type":"string"},"total_lectures":{"type":"integer"},"price_krw":{"type":["integer","null"]}},"required":["course_id","canonical_title","aliases","category","instructor","total_lectures"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 의도적 혼입: (1) price_krw 가 null 인 가격 미입력 행 1~2건, (2) price_krw 0(무료 공개 강의) 1건, (3) 같은 canonical_title 을 가리키는 서로 다른 별칭 표기(정규화 필요) 다수, (4) total_lectures 가 4 이하로 짧은 강의와 20 이상 긴 강의 각 1건. category 분포는 자연스럽게. JSON 배열만.{"type":"object","properties":{"course_id":{"type":"string"},"canonical_title":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"category":{"type":"string","enum":["dev","design","marketing","language","finance","hobby"]},"instructor":{"type":"string"},"total_lectures":{"type":"integer"},"price_krw":{"type":["integer","null"]}},"required":["course_id","canonical_title","aliases","category","instructor","total_lectures"]}| TypeScript | 웹·앱·서버 전 계층 언어 통일. 진단 API·대시보드·모바일 뷰를 하나의 타입 정의로 공유합니다 |
| NestJS | 이탈 분석 API 서버(`POST /diagnose`. course_id·기간 입력 → output_schema 반환) + 로그 집계 배치 워커 |
| React | 이탈 지도 대시보드(회차별 이탈 커브 + 원인 카드 + 실험 제안 카드) 렌더링 |
| Next.js | 대시보드 서버 렌더링과 라우팅, 진단 결과 공유 링크 |
| React Native | 운영자·강사용 모바일 요약 뷰(강의별 이탈 경보 + 이번 주 실험 제안) |
| Node.js | ingest 파이프라인(수강·시청 로그 CSV/JSON → PostgreSQL upsert) |
| PostgreSQL | enrollments / lecture_events / course_master 단일 진실원 + 이탈 커브 뷰(`v_course_funnel`) + 집계 쿼리 인덱스·실행계획 최적화 |
| Claude Code | AI 보조 코딩과 1차 코드 리뷰. 반복 구현을 맡기고 이탈 분석 로직 설계에 집중합니다 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우고 싶으면 2주차(진단이 운영자 판단과 맞는지 확인)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(실험이 실제로 완주율을 올렸는지 다음 기수로 검증)로 진행합니다.
1) 회차별 이탈 지도 + 이탈 원인 Top3(해석·근거 지표·완곡 표현), 2) 다음 개선 실험 3건 + 예상 완주율 개선폭 + 확신도, 3) 다음 기수 실측 완주율로 실험이 맞았는지 검증. 진단 → 실험 제안 → 확인 한 주기를 한 스키마에 담습니다.
{"type":"object","properties":{"period":{"type":"string"},"course_id":{"type":"string"},"dropoff_map":{"type":"array","minItems":1,"items":{"type":"object","properties":{"lecture_no":{"type":"integer"},"retained_pct":{"type":"number"},"drop_delta_pct":{"type":"number"}},"required":["lecture_no","retained_pct","drop_delta_pct"]}},"diagnoses":{"type":"array","minItems":3,"maxItems":3,"items":{"type":"object","properties":{"diagnosis_id":{"type":"string"},"headline":{"type":"string","minLength":10},"interpretation":{"type":"string","minLength":20},"evidence_metrics":{"type":"array","minItems":1,"items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":["number","string"]}},"required":["name","value"]}},"hedge":{"type":["string","null"],"minLength":8}},"required":["diagnosis_id","headline","interpretation","evidence_metrics"]}},"experiments":{"type":"array","minItems":3,"maxItems":3,"items":{"type":"object","properties":{"experiment_id":{"type":"string"},"target_lecture_no":{"type":"integer"},"action":{"type":"string","minLength":20},"predicted_completion_delta_pp":{"type":"number"},"confidence":{"type":"string","enum":["low","mid","high"]},"confidence_prob":{"type":"number"}},"required":["experiment_id","target_lecture_no","action","predicted_completion_delta_pp","confidence","confidence_prob"]}},"verification":{"type":["object","null"],"properties":{"prior_period":{"type":"string"},"hit_rate":{"type":"number"},"brier_score":{"type":"number"},"hits":{"type":"array","items":{"type":"object","properties":{"experiment_id":{"type":"string"},"predicted_pp":{"type":"number"},"actual_pp":{"type":"number"},"hit":{"type":"boolean"},"confidence_prob":{"type":"number"}},"required":["experiment_id","predicted_pp","actual_pp","hit"]}}}}},"required":["period","course_id","dropoff_map","diagnoses","experiments"]}[
{
"input_ref": "2026-04-13 강의 c_data_intro (1주차 첫 진단. 아직 이전 실험이 없어 verification 은 null)",
"output": {
"period": "2026-04-06 ~ 2026-04-12",
"course_id": "c_data_intro",
"dropoff_map": [
{
"lecture_no": 1,
"retained_pct": 100,
"drop_delta_pct": 0
},
{
"lecture_no": 2,
"retained_pct": 92,
"drop_delta_pct": 8
},
{
"lecture_no": 3,
"retained_pct": 85,
"drop_delta_pct": 7
},
{
"lecture_no": 4,
"retained_pct": 58,
"drop_delta_pct": 27
},
{
"lecture_no": 5,
"retained_pct": 52,
"drop_delta_pct": 6
}
],
"diagnoses": [
{
"diagnosis_id": "dg_c_data_intro_01",
"headline": "이탈 급증 회차: 4강 파이썬 환경설정 실습",
"interpretation": "4강에서 잔존율이 85%에서 58%로 27%p 급감했습니다. 직전 회차 대비 이탈 증가폭이 약 4배이고, drop·refund 이벤트가 4강에 몰려 있습니다.",
"evidence_metrics": [
{
"name": "drop_delta_pct",
"value": 27
},
{
"name": "lecture_no",
"value": 4
}
],
"hedge": "표본이 강의 1개입니다. 실습 회차 일반화는 다른 강의로 후속 검증이 필요합니다."
},
{
"diagnosis_id": "dg_c_data_intro_02",
"headline": "환불 요청이 4강 직후 집중",
"interpretation": "환불 이벤트의 다수가 4강 시청 직후 발생했습니다. 시청비율도 0.2 안팎으로 낮아 실습 진입 장벽과 동행하는 패턴으로 보입니다.",
"evidence_metrics": [
{
"name": "refund_lecture_mode",
"value": 4
},
{
"name": "avg_watch_ratio_at_drop",
"value": 0.2
}
],
"hedge": "환불 사유 텍스트는 이 더미에 없어 원인 단정은 어렵습니다."
},
{
"diagnosis_id": "dg_c_data_intro_03",
"headline": "가격대 높은 dev 강의에서 초반 이탈 큼 (상관 관찰)",
"interpretation": "가격 18만원대 dev 강의의 4강 이탈이 저가 강의보다 큰 편으로 관찰됩니다. 기대치 대비 실습 난이도 격차 가능성이 있습니다.",
"evidence_metrics": [
{
"name": "price_krw",
"value": 189000
},
{
"name": "category",
"value": "dev"
}
],
"hedge": "가격·카테고리 표본이 적어 인과로 단정하기 어렵습니다."
}
],
"experiments": [
{
"experiment_id": "ex_c_data_intro_01",
"target_lecture_no": 4,
"action": "환경설정 과정을 사전 준비 영상으로 분리하고 4강은 실습 위주로 재편해 진입 장벽을 낮춥니다.",
"predicted_completion_delta_pp": 9,
"confidence": "mid",
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_data_intro_02",
"target_lecture_no": 4,
"action": "4강 시작 전에 자동 환경 점검 스크립트와 체크리스트를 제공해 설치 실패로 인한 이탈을 줄입니다.",
"predicted_completion_delta_pp": 6,
"confidence": "mid",
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_data_intro_03",
"target_lecture_no": 1,
"action": "1강에 완주 로드맵과 4강 실습 난이도 안내를 추가해 기대치를 미리 맞춥니다.",
"predicted_completion_delta_pp": 4,
"confidence": "low",
"confidence_prob": 0.4
}
],
"verification": null
}
},
{
"input_ref": "2026-04-20 강의 c_data_intro (2주차. verification 은 지난주 실험의 다음 기수 결과)",
"output": {
"period": "2026-04-13 ~ 2026-04-19",
"course_id": "c_data_intro",
"dropoff_map": [
{
"lecture_no": 4,
"retained_pct": 71,
"drop_delta_pct": 12
},
{
"lecture_no": 8,
"retained_pct": 60,
"drop_delta_pct": 11
}
],
"diagnoses": [
{
"diagnosis_id": "dg_c_data_intro_04",
"headline": "4강 이탈은 완화, 8강으로 병목 이동",
"interpretation": "사전 준비 영상 분리 후 4강 이탈 증가폭이 27%p에서 12%p로 줄었습니다. 대신 8강 심화 실습에서 새 병목이 관찰됩니다.",
"evidence_metrics": [
{
"name": "drop_delta_pct_lec4",
"value": 12
},
{
"name": "drop_delta_pct_lec8",
"value": 11
}
],
"hedge": "한 기수 결과입니다. 계절·유입 경로 변수는 통제하지 못했습니다."
},
{
"diagnosis_id": "dg_c_data_intro_05",
"headline": "환불 시점이 4강에서 8강으로 이동",
"interpretation": "환불 이벤트의 최빈 회차가 8강으로 옮겨졌습니다. 병목 회차가 바뀐 것과 일관됩니다.",
"evidence_metrics": [
{
"name": "refund_lecture_mode",
"value": 8
}
],
"hedge": "환불 건수 자체가 적어 최빈값 해석에 주의가 필요합니다."
},
{
"diagnosis_id": "dg_c_data_intro_06",
"headline": "8강 시청비율이 낮은 구간 존재 (상관 관찰)",
"interpretation": "8강 평균 시청비율이 0.4대로 낮아 실습 난이도 급상승과 동행하는 것으로 관찰됩니다.",
"evidence_metrics": [
{
"name": "avg_watch_ratio_lec8",
"value": 0.42
}
],
"hedge": "관찰 표본이 적어 A/B 회차 교차 검증을 권합니다."
}
],
"experiments": [
{
"experiment_id": "ex_c_data_intro_04",
"target_lecture_no": 8,
"action": "8강 심화 실습을 두 개의 짧은 회차로 쪼개고 중간 체크포인트를 넣어 난이도 급상승을 완화합니다.",
"predicted_completion_delta_pp": 7,
"confidence": "mid",
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_data_intro_05",
"target_lecture_no": 8,
"action": "8강 앞에 복습 요약과 예상 소요시간 안내를 넣어 이탈 직전 이탈을 막습니다.",
"predicted_completion_delta_pp": 5,
"confidence": "mid",
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_data_intro_06",
"target_lecture_no": 4,
"action": "4강 자동 환경 점검 스크립트를 유지하며 실패 로그를 수집해 다음 개선 근거로 축적합니다.",
"predicted_completion_delta_pp": 3,
"confidence": "low",
"confidence_prob": 0.4
}
],
"verification": {
"prior_period": "2026-04-06 ~ 2026-04-12 실험",
"hit_rate": 0.67,
"brier_score": 0.18,
"hits": [
{
"experiment_id": "ex_c_data_intro_01",
"predicted_pp": 9,
"actual_pp": 11,
"hit": true,
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_data_intro_02",
"predicted_pp": 6,
"actual_pp": 5,
"hit": true,
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_data_intro_03",
"predicted_pp": 4,
"actual_pp": 0.5,
"hit": false,
"confidence_prob": 0.4
}
]
}
}
},
{
"input_ref": "2026-04-20 강의 c_ux_basic (다른 강의. 6강 이탈 진단 + 지난 실험 검증)",
"output": {
"period": "2026-04-13 ~ 2026-04-19",
"course_id": "c_ux_basic",
"dropoff_map": [
{
"lecture_no": 5,
"retained_pct": 78,
"drop_delta_pct": 9
},
{
"lecture_no": 6,
"retained_pct": 55,
"drop_delta_pct": 23
}
],
"diagnoses": [
{
"diagnosis_id": "dg_c_ux_basic_01",
"headline": "이탈 급증 회차: 6강 실무 과제",
"interpretation": "6강에서 잔존율이 78%에서 55%로 23%p 급감했습니다. 과제 제출형 회차에서 이탈이 몰리는 패턴입니다.",
"evidence_metrics": [
{
"name": "drop_delta_pct",
"value": 23
},
{
"name": "lecture_no",
"value": 6
}
],
"hedge": "과제형 회차 표본이 이 강의 하나뿐이라 일반화는 후속 검증이 필요합니다."
},
{
"diagnosis_id": "dg_c_ux_basic_02",
"headline": "6강 시청비율 결측 구간 존재",
"interpretation": "6강에 watch_ratio 결측 행이 섞여 있어, 이탈 직전 시청 완료 여부를 일부 사용자에서 확인하지 못했습니다.",
"evidence_metrics": [
{
"name": "missing_watch_ratio_rows",
"value": 2
}
],
"hedge": "결측 구간은 추정 없이 별도로 표시하고 판단에서 제외했습니다."
},
{
"diagnosis_id": "dg_c_ux_basic_03",
"headline": "design 카테고리 과제 회차 공통 병목 (상관 관찰)",
"interpretation": "design 카테고리 강의에서 실무 과제 회차 이탈이 큰 편으로 관찰됩니다. 과제 부담과 동행할 가능성이 있습니다.",
"evidence_metrics": [
{
"name": "category",
"value": "design"
}
],
"hedge": "카테고리 표본이 적어 인과로 단정하기 어렵습니다."
}
],
"experiments": [
{
"experiment_id": "ex_c_ux_basic_01",
"target_lecture_no": 6,
"action": "6강 실무 과제를 단계별 템플릿으로 쪼개고 예시 결과물을 제공해 착수 장벽을 낮춥니다.",
"predicted_completion_delta_pp": 8,
"confidence": "mid",
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_ux_basic_02",
"target_lecture_no": 6,
"action": "6강 과제 마감 없는 자율 제출로 바꾸고 완료 시 다음 회차 잠금 해제 방식으로 흐름을 유지합니다.",
"predicted_completion_delta_pp": 5,
"confidence": "mid",
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_ux_basic_03",
"target_lecture_no": 5,
"action": "5강 끝에 6강 과제 미리보기를 넣어 준비 시간을 확보하게 합니다.",
"predicted_completion_delta_pp": 3,
"confidence": "low",
"confidence_prob": 0.4
}
],
"verification": {
"prior_period": "2026-04-06 ~ 2026-04-12 실험",
"hit_rate": 0.5,
"brier_score": 0.24,
"hits": [
{
"experiment_id": "ex_c_ux_basic_prev_01",
"predicted_pp": 7,
"actual_pp": 6,
"hit": true,
"confidence_prob": 0.6
},
{
"experiment_id": "ex_c_ux_basic_prev_02",
"predicted_pp": 6,
"actual_pp": 1.5,
"hit": false,
"confidence_prob": 0.6
}
]
}
}
}
][자동 검증] 1) JSON 스키마 parse 통과(형식·타입·enum·minItems/maxItems·minLength). 2) evidence_metrics.name 이 입력 스키마(lecture_events·course_master)의 실제 지표 이름과 일치하는지 대조. 3) 단정 표현 토큰 검출 + LLM-as-judge 로 상관을 인과로 부풀리는 문구('때문에·에 기인' 우회 포함) 차단. 4) verification.brier_score(예측 확신도가 실제와 얼마나 맞았는지 0~1 점수, 낮을수록 정확) 자동 계산. 사이클 1 은 reporting, 사이클 2+ 는 KPI 로 격상. [수동 검증] 1) 교육 운영자 페르소나 2명 비동기 라벨 → bootstrap Cohen's κ(두 평가자 답이 우연 이상으로 일치하는 정도, 0~1) 하한 ≥ 0.6. 2) judge 결과의 5% 를 사람이 직접 점검. 3) verification 은 다음 기수 실측 완주율을 자동 조인해 채웁니다.
포트폴리오가 “무엇을 만들지”라면, 시나리오 테스트는 “현장에서 어떻게 판단·소통할지” 입니다. 실제 이 채용공고 맥락의 대본을 읽고 무엇을 물어야 할지 직접 써봅니다.