무료 자료 · 로그인·가입 없음
AI 에이전트에게 유튜브 채널 분석을 맡긴 방법, 그대로
영상에서 보여 준 채널 분석 단계, 댓글 분류 프롬프트, 구간별 이탈 계산법, 실패 기록, 비교 양식을 한곳에 모았습니다. 스크립트와 양식은 아래 파일에서 바로 받을 수 있습니다.
이 자료로 할 수 있는 것
내 채널의 최근 영상과 댓글을 에이전트에게 맡겨 읽게 하고, 무엇이 통했고 시청자가 실제로 무슨 말을 했으며 다음 영상에서 무엇을 바꿀지 정하는 데 쓰는 절차입니다. 같은 방법을 다른 채널에 적용할 때는 공개 데이터만 씁니다.
영상에서 말한 실행 항목은 다섯 가지입니다.
- 댓글은 표본이 아니라 전부 분류하고, 불만 댓글은 원문 그대로 한곳에 모읍니다.
- 유지율은 평균 대신 해설·원본·시연 구간별 분당 하락으로 나눠 보고, 첫 1분은 따로 봅니다.
- 엔딩 화면 클릭률이 0%라면 요소가 실제로 들어갔는지부터 업로드 설정에서 확인합니다.
- 참고 채널은 말투가 아니라 첫 30초, 본문 단위, 자료 배포, 마무리, Shorts 연결 다섯 곳을 같은 표로 비교합니다.
- Shorts는 시리즈별 조회 1만 회당 구독으로 비교해 남길 시리즈를 고릅니다.
에이전트는 처음부터 끝까지 읽기만 합니다. 이 절차에는 답글, 설정 변경, 업로드가 없습니다.
영상의 예제별 프롬프트
영상에서 테스트마다 보여 준 프롬프트입니다. 채널 핸들만 바꿔서 붙여 넣으세요.
테스트 1 · 데이터 수집
내 유튜브 채널 @채널핸들의 최근 롱폼 40편과 Shorts 60편 목록을 만들어 줘. 영상마다 공개 메타데이터·댓글·자동 자막을 yt-dlp로 쿠키 없이 한 편씩 받아 줘. 봇 확인에 막힌 영상은 우회하지 말고 '미확보'로 남겨. 답글·설정 변경·업로드는 하지 마.
테스트 2 · 댓글 분류
첨부한 댓글 덤프의 모든 줄을 빠짐없이 분류해 줘. 표본으로 고르지 마. 칭찬·토론·질문·비판 등으로 나누고, 불만이 조금이라도 있으면 neg=true로 표시해. 불만 댓글은 원문 그대로 한곳에 모아 줘. 채널 주인 답글은 세지 마.
테스트 3 · 구간별 이탈
이 영상의 유지율 곡선(csv)과 구간표(해설·원본·시연)를 줄게. 첫 1분을 빼고 구간 종류별로 분당 하락(%p/분)을 계산해 줘. 결과는 원인이 아니라 상관관계로만 써 줘.
테스트 4 · 참고 채널 비교
참고 채널 @채널핸들을 공개 데이터만으로 분석해 줘. 말투 말고 첫 30초, 본문 단위, 자료 배포, 마무리, Shorts→롱폼 연결 다섯 곳을 내 채널과 같은 표로 비교해 줘. 내 채널에 가져올 것과 가져오지 않을 것을 나눠 줘.
분석 단계
아래에서 R은 분석 폴더 하나입니다(예: channel-review-20261012/). 스크립트는 인자 없이 실행하면 사용법을 출력합니다. 필요한 것은 Python 3와 yt-dlp입니다.
-
영상 목록 만들기
최근 롱폼과 Shorts를 고릅니다. 롱폼·Shorts 구분은 채널의 Shorts 탭 목록으로 정합니다. 길이(3분)로 나누면 짧은 일반 영상이 Shorts로 잘못 들어갑니다.
bash list_channel.sh <채널핸들> R 40 60
-
공개 데이터 받기
영상마다 공개 댓글 수를 먼저 기록한 뒤 메타데이터, 댓글, 자동 자막을 받습니다. 직렬로, 쿠키 없이 받습니다. 한 영상이 봇 확인에 막히면 미확보로 남기고 넘어갑니다.
bash fetch_videos.sh R python3 inventory.py R
-
Studio 지표 읽기 (본인 채널만)
로그인된 브라우저 에이전트가 있다면 읽기만 맡깁니다. 영상 하나씩 개요·도달범위·참여도 탭을 열어 화면의 글과 숫자를 파일로 저장하게 하고, 이미 읽은 영상은 건너뛰게 합니다. 숫자 없이 화면 틀만 뜨거나 오류 화면이면 저장하지 않고 대기 시간을 늘려 다시 읽습니다. 요청 한도 오류가 나면 작업자 몇 개를 목록의 앞·뒤·가운데에서 출발시키는 방식이 통했습니다.
브라우저 에이전트가 없다면 YouTube Studio 분석의 고급 모드에서 기간과 영상별 표(조회수, 노출 클릭률, 평균 시청 지속 시간, 구독자 증감, 트래픽 소스)를 CSV로 내보내 같은 폴더에 둡니다.
어느 쪽이든 답글·설정 변경·업로드는 하지 않습니다. 화면에 없거나 읽지 못한 지표는 0이나 추정치가 아니라 “미확보”로 둡니다.
-
유지율 곡선 옮기기 (롱폼)
참여도 탭의 시청자 유지율 곡선을
raw/retention/<영상ID>.csv(seconds,percent, 10초 간격 정도)로 옮깁니다. 같은 화면의 “N%의 시청자가 약 0:30 지점에서도…” 문구도 함께 적어 둡니다. 곡선이 맞게 옮겨졌는지 이 값으로 확인합니다.python3 parse_retention.py R 2026-10-12
-
자막과 대본 맞추기
자동 자막을 시각이 붙은 텍스트로 바꿉니다. 직접 쓴 대본이나 편집 기록이 있으면 그것을 우선합니다. 자동 자막을 인용할 때는 “자동자막 기준”이라고 적습니다.
python3 transcripts.py R --since 20260901
-
댓글 전부 분류하기
표본을 뽑지 않습니다. 덤프를 몇 부분으로 나눠 에이전트(또는 서브에이전트 여러 개)에게 분류 프롬프트와 함께 맡기고, 결과를 합칩니다. 합치기 스크립트는 코드가 하나라도 빠지면 실패합니다.
python3 comment_dumps.py R --parts 3 # 각 부분을 분류 → analysis/coded-core-part1.jsonl … python3 merge_comments.py R
-
범위를 정확히 말하기
“수집한 댓글 N개(공개 댓글 수 M개 중), 채널 주인 답글을 뺀 시청자 댓글 K개를 모두 읽고 분류”처럼 적습니다. 영상별 공개 댓글 수를 기록하지 않았다면 “전체 댓글”이라고 하지 않습니다. 받지 못한 영상은 목록에서 지우지 않고 미확보로 남깁니다.
-
진단하기
롱폼: 첫 30초 안에 무엇을 약속했고 실제로 무엇을 보여 줬는지, 구간별 이탈, 근거 없는 1인칭 의견, 챕터마다 시청자가 해 볼 한 가지, 마무리와 엔딩 화면, 제목과 썸네일이 본문과 맞는지.
Shorts: 영상마다 시리즈를 정하고, 시리즈별로 조회 중앙값과 조회 1만 회당 구독을 비교해 남길 시리즈를 고릅니다.
-
참고 채널과 비교하기
참고 채널은 공개 데이터만 씁니다. 말투가 아니라 첫 30초, 본문 단위, 자료 배포, 마무리, Shorts 연결 다섯 곳을 같은 표로 비교합니다.
-
보고서로 정리하기
숫자마다 출처와 확인 시각을 붙이고, 관찰(잰 것), 판단(추론), 제안(아직 안 정한 것), 채택(내가 정한 것)을 나눠 씁니다. 바꿀 것마다 어떤 지표를 언제 다시 볼지 검증 계획을 붙입니다.
댓글 분류 프롬프트와 코드표
덤프의 한 줄이 댓글 하나이고, 줄마다 댓글 ID(cid=…)가 붙어 있어 분류 결과를 정확히 다시 붙일 수 있습니다. 아래 프롬프트를 덤프와 함께 그대로 붙여 넣습니다.
아래는 내 유튜브 채널의 댓글 덤프입니다. 한 줄이 댓글 하나이고, 맨 앞의 cid=… 가 댓글 ID입니다.
"↳"로 시작하는 줄은 바로 위 댓글의 답글이고, OWNER 표시가 붙은 줄은 채널 주인의 답글입니다.
규칙
1. 모든 줄을 읽고 모든 cid에 코드를 하나씩 붙입니다. 건너뛰거나 표본으로 고르지 않습니다.
2. 말투가 아니라 뜻으로 분류합니다. "굳이?"는 비판입니다.
3. OWNER 줄은 반드시 cat "owner"로 둡니다. 시청자 수와 부정 댓글 수에는 넣지 않습니다.
4. 비판·불만·실망이 조금이라도 들어 있으면 neg를 true로 둡니다(중립적인 댓글 안에 섞여 있어도 마찬가지).
5. 빠진 정보를 드러내는 질문(프롬프트가 어디 있나요? 어떤 도구인가요?)은 question으로 두고 태그를 붙입니다.
6. 댓글 작성자에게 답글을 쓰지 않습니다. 나에게 묻는 댓글은 note에 "확인 필요"라고만 적습니다.
출력: 댓글 하나당 JSON 한 줄(JSONL). 다른 설명은 쓰지 않습니다.
{"cid": "<cid>", "cat": "<분류>", "tags": ["<태그>", ...], "neg": true|false, "note": "<한 줄 근거>"}
cat 값: praise, discussion, question, request, criticism, misunderstanding,
personal_story, giveaway_entry, off_topic, spam_promo, other, owner
| cat | 기준 | 예시 |
|---|---|---|
praise 칭찬 | 영상·채널·사람에 대한 긍정 반응이 중심 | “설명 순서가 깔끔해서 끝까지 봤어요” |
discussion 토론·의견 | 내용에 대한 자기 생각, 반론, 덧붙임 | “저는 이 단계는 사람이 직접 보는 게 맞다고 봐요” |
question 질문 | 무엇인가를 묻는 댓글. 빠진 정보를 드러내면 태그를 붙임 | “말씀하신 템플릿은 어디서 받을 수 있나요?” |
request 요청 | 다음 영상·자료·기능을 해 달라는 요구 | “다음엔 실제 화면으로 처음부터 보여 주세요” |
criticism 비판 | 영상·도구·채널에 대한 불만, 실망, 지적 | “제목이랑 내용이 좀 다른 것 같아요” |
misunderstanding 오해 | 영상 내용을 잘못 이해한 것이 드러남 | “그럼 이건 유료 버전에서만 되는 거죠?” |
personal_story 경험담 | 자기 상황·경험 이야기 | “저도 혼자 채널 분석하다가 지쳐서 그만뒀어요” |
giveaway_entry 이벤트 참여 | 이벤트·키워드 댓글 참여 | “참여합니다!” |
off_topic 무관 | 영상과 관계없는 내용 | “배경 음악 제목이 궁금해요” |
spam_promo 스팸·홍보 | 링크 홍보, 자동 생성 스팸 | “제 채널에도 놀러 오세요 ~” |
other 기타 | 어디에도 맞지 않음 | 이모지 하나 |
owner 주인 답글 | 채널 주인의 답글. 읽되 시청자 수와 부정 수에서 뺌 | OWNER 줄 전부 |
부정(neg) 판정 기준
- 비판·불만·실망이 조금이라도 있으면
true. 칭찬 속에 섞인 지적(“좋은데 소리가 작아요”)도 포함합니다. - 대상이 영상이 아니어도(도구, 채널, 업로드 주기) 불만이면
true입니다. - 말투가 아니라 뜻으로 판단합니다. “굳이?”는 비판입니다.
- 비율은 채널 주인 답글을 뺀 시청자 댓글을 분모로 하고, 부정 댓글은 주제별로 묶어 원문 그대로 한곳에 모읍니다.
유지율은 평균 대신 구간별 분당 하락으로
평균 시청 지속 시간 하나로는 어느 부분에서 시청자가 나갔는지 알 수 없습니다. 영상을 해설·원본·시연처럼 성격이 다른 구간으로 나누고, 구간마다 1분에 몇 %p가 빠졌는지 계산해 비교합니다.
- 대본이나 자막 시각으로 구간 경계를 정해
segments.json을 씁니다. 시각은 게시된 영상 기준 초입니다. - 구간마다
하락(%p) = 시작 시점 유지율 − 끝 시점 유지율,분당 하락 = 하락 ÷ 구간 길이(분)을 구합니다. - 같은 종류의 구간끼리 하락과 길이를 더해 종류별 분당 하락을 냅니다.
[
{"start": 0, "end": 102, "kind": "narration", "label": "도입", "source": "script.txt:L1-L12"},
{"start": 102, "end": 194, "kind": "source", "label": "원본 클립 1"},
{"start": 194, "end": 240, "kind": "narration", "label": "해설 2"}
]
python3 align_retention.py R <영상ID> segments.json
주의 세 가지
- 첫 1분은 빼고 계산합니다. 모든 영상은 시작 직후 가장 빨리 빠지므로, 영상을 여는 구간 종류가 불리해집니다. 스크립트는 기본으로 첫 60초를 제외합니다.
- 상관관계로만 해석합니다. 해설 구간이 더 빨리 빠졌다는 것은 해설이 원인이라는 증명이 아닙니다. 영상 앞부분은 원래 이탈이 크고, 곡선의 점 간격(약 10초) 때문에 구간 경계가 몇 초 어긋날 수 있습니다.
- 34분 이상 영상은 곡선 앞부분을 Studio 문구와 대조합니다. 첫 실행에서 33분 이하 영상은 0:30 값이 Studio 문구와 5%p 안에서 맞았지만, 34분 이상 영상은 8.7~21.3%p 어긋났습니다. 차이가 5%p를 넘으면 스크립트가 계산을 거부하고, 이른 구간 유지율은 Studio 문구를 인용합니다.
실패 기록과 대응
첫 실행에서 실제로 부딪힌 문제와 지금 스크립트·절차에 들어간 대응입니다.
요청 제한(429)과 봇 확인 → 직렬·저속 수집
수백 개를 병렬로 요청하자 HTTP 429와 봇 확인이 났습니다. 직렬로 영상 사이에 2초씩 쉬니 100편 중 99편을 받았습니다. 남은 1편은 봇 확인에 막혔고, 쿠키나 로그인으로 우회하지 않고 미확보로 남겼습니다.
숫자 없이 화면 틀만 뜬 캡처 → 저장 거부 후 다시 읽기
Studio 화면이 메뉴와 “오류가 발생했습니다”만 보이거나 비어 있는 경우가 100건 중 2건 있었습니다. 이런 결과는 저장하지 않고 실패로 기록한 뒤, 대기 시간을 11초로 늘려 다시 읽었습니다. 잘못된 파일은 고치지 않고 따로 옮겨 둡니다.
게시 이후 누적값 비교 → 같은 나이로 비교
Studio의 “게시 이후” 값은 읽은 시점까지의 누적입니다. 게시 2일 된 영상과 6일 된 영상의 구독·조회를 그대로 비교할 수 없습니다. 비교 옆에 이 사실을 적거나, 같은 게시 후 기간(예: 첫 7일)에 다시 잽니다.
3분 기준 Shorts 분류 → Shorts 탭 목록 사용
1분 남짓한 16:9 일반 영상 두 편이 길이 기준으로 Shorts에 들어갔습니다. 형식은 채널의 Shorts 탭 목록으로 정하고, 길이는 목록이 없을 때만 씁니다.
엔딩 화면 클릭률 0% → 요소가 있었는지부터 확인
엔딩 화면 클릭률 0.0%만으로는 요소가 없었는지, 있었는데 누르지 않았는지 구분되지 않습니다. 해석하기 전에 업로드 설정에서 엔딩 화면 요소가 실제로 들어갔는지 확인합니다.
댓글 수가 수집 개수로 덮어써짐 → 공개 댓글 수 먼저 기록
yt-dlp는 댓글을 받은 뒤 메타데이터의 댓글 수를 받은 개수로 바꿉니다. 그래서 “공개 댓글 수 = 수집 개수”가 항상 성립해 누락을 잡을 수 없었습니다. 지금은 댓글을 받기 전에 공개 댓글 수를 따로 기록합니다. “1.3K”처럼 반올림된 표시도 정확한 값으로 쓰지 않습니다.
참고 채널 비교 체크리스트
말투가 아니라 구조를 비교합니다. 참고 채널은 공개 데이터만 쓰고, 내 채널의 Studio 지표를 같은 줄에 놓지 않습니다.
| 칸 | 무엇을 적나 | 참고 채널 | 내 채널 |
|---|---|---|---|
| 첫 30초 | 무엇을 몇 개 해 봤고 무엇을 가져가는지 30초 안에 말하는가 | ||
| 본문 단위 | 본문이 어떤 단위로 나뉘는가. 단위마다 시간·사용량·판정이 붙는가 | ||
| 자료 배포 | 전용 자료가 있는가. 설명란 첫 줄인가, 고정 댓글인가. 가입을 요구하는가 | ||
| 마무리 | 요약 → 처음이면 할 것 하나 → 자료 위치 같은 고정 순서가 있는가 | ||
| Shorts 연결 | 같은 주제의 Shorts가 롱폼으로 이어지는가 |
칸마다 관찰(본 것, 출처 URL, 확인 날짜)과 판단(내 채널에 맞는지)을 나눠 적고, 가져오지 않을 것도 따로 적습니다. 관찰은 처방이 아닙니다.
테스트 카드 양식
에이전트에게 맡긴 일을 테스트 하나씩 카드로 남깁니다.
| 칸 | 적을 것 |
|---|---|
| 조건 | 무엇을 맡겼나, 범위(영상 수·기간), 쓴 도구, 하지 않은 것 |
| 시간 | 요청부터 결과까지. 실시간으로 쟀는지, 기록을 나중에 집계했는지 함께 적음 |
| 사용량 | 모델 호출 수, 토큰, 서브에이전트 수, 비용. 기록하지 않은 값은 “기록 안 함” |
| 판정 | 아래 세 단계 중 하나와 한 줄 근거 |
| 판정 | 기준 |
|---|---|
| 그대로 씀 | 실행 중 사람이 다시 지시하지 않았고, 결과를 고치지 않고 썼다 |
| 고쳐서 씀 | 사람이 다시 지시했거나 결과를 고쳐서 썼다 |
| 맡기면 안 됨 | 결과를 쓸 수 없었다 |
정확도를 따로 재지 않았다면 판정 옆에 “검증 전”이라고 적습니다. 인상은 인상이라고 적고, 측정한 일치율처럼 쓰지 않습니다.
관찰 · 2026-10-12 수집
영상에서 말한 이 채널의 수치
영상 내레이션에서 이미 말한 값만 옮겼습니다. 수집 시점은 2026년 10월 12일입니다.
| 항목 | 값 | 단서 |
|---|---|---|
| 분석 영상 | 100편 선정, 99편 확보(롱폼 39 · Shorts 60) | 1편은 요청 제한·봇 확인으로 미확보 |
| 수집 댓글 | 1,407개(채널 주인 답글 130개 포함) | 영상별 공개 댓글 수를 기록하지 않아 전체인지는 확인하지 못함. 미확보 1편의 약 32개는 빠짐 |
| 분류한 시청자 댓글 | 1,277개 · 칭찬 375 · 토론·의견 256 · 질문 243 · 비판 119 | 분류 정확도는 측정하지 않음(검증 전) |
| 불만 댓글 | 227개 | 영상·도구·채널에 대한 불만 전체 |
| 해설편 구간별 이탈 | 해설 3.3%p/분 · 원본 1.75%p/분(약 1.9배) | 첫 1분 제외, 상관관계 |
| 엔딩 화면 클릭률 | 10월 롱폼 4편 중 3편 0.0% · 채널 평균 1.4% | 요소 유무는 Studio 화면만으로 구분 안 됨 |
| 트래픽 | 10월 롱폼 4편: 홈·구독 피드 88~94% · 추천 동영상 1.4~2.9% | |
| Shorts 조회 1만 회당 구독 | 모션그래픽 메이킹 19.0 · 모델 비교·실험 8.0 · 일하는 방식 6.4 · 뉴스 3.3 | 게시 이후 누적값이라 게시일 차이가 섞임 |
| 유지율 곡선 대조 | 33분 이하 26편 5%p 안 · 34분 이상 11편 8.7~21.3%p 차이 | 롱폼 37편 기준 |
본인 채널 분석용, 직렬·저속, 로그인 우회 금지
본인 채널 분석용입니다. 공개 데이터 스크립트는 yt-dlp로 공개된 정보만 받습니다. 자동 수집에는 YouTube 약관상 애매한 부분이 있으니 본인 채널이나 참고용 소량 분석에만 쓰고, 받은 데이터를 다시 배포하지 않습니다.
직렬·저속으로 받습니다. 한 번에 하나씩, 영상 사이에 쉬면서 받습니다. 병렬로 몰아 요청하면 요청 제한과 봇 확인이 납니다.
로그인으로 우회하지 않습니다. 봇 확인이나 요청 제한에 막힌 영상은 쿠키나 로그인으로 뚫지 않고 미확보로 남깁니다.
댓글 원본은 내 컴퓨터에만 둡니다. 댓글 덤프에는 작성자 이름이 들어 있습니다. 공개 자료로 옮길 때는 작성자 이름 없이 짧게만 인용합니다.
파일
양식과 프롬프트
- comment-coding.md — 댓글 분류 프롬프트, 코드표, 부정 판정 기준
- reference-channel-checklist.md — 참고 채널 비교 다섯 칸 양식
- test-card-template.md — 테스트 카드와 판정 기준
스크립트 (Python 3 · yt-dlp)
- list_channel.sh — 최근 롱폼·Shorts 목록
- fetch_videos.sh — 공개 댓글 수, 메타데이터, 댓글, 자막(직렬) · fetch_params.py가 수집 설정을 기록
- inventory.py — 영상 목록과 전체 댓글 파일
- comment_dumps.py — 분류용 댓글 덤프
- merge_comments.py — 분류 결과 합치기와 누락 검사
- transcripts.py · vtt2txt.py — 자동 자막을 시각 붙은 텍스트로
- parse_retention.py — 유지율 곡선 정리와 0:30 대조
- align_retention.py — 구간별 분당 하락 계산