웨비나 분석기
원시 웨비나 내보내기 데이터를 두 가지 종류의 답변으로 변환하는 도구입니다.
- 개별 웨비나 — 누가 왔는지, 얼마나 머물렀는지, 언제 떠났는지, 누구였는지, 무엇을 말했는지.
- 모든 웨비나 통합 — 참석률이 증가하고 있는지, 어떤 시간대와 형식이 효과적인지, 누가 계속 돌아오는지, 어떤 칭찬과 불만이 반복되는지.
이 스킬은 스택 중립적입니다. 데이터 계약, 검증 규칙, 계산 및 차트 의미론을 명시합니다. 원하는 웹 스택(Flask/Django/FastAPI + Postgres + 모든 차트 라이브러리, Streamlit, 노트북, BI 도구)에서 구현하세요. 이 지침이 추출된 참조 구현은 Flask + PostgreSQL + ApexCharts 앱입니다.
빌드하기 전에: 수집 대화
Zoom이라고 가정하지 마세요. YouTube라고 가정하지 마세요. 이 도구의 가장 큰 실패 모드는 하나의 플랫폼 내보내기 형식을 하드코딩하는 것입니다. 사용자는 Teams, GoToWebinar, Livestorm, Demio, Webex, Hopin, Riverside, StreamYard, Crowdcast, BigMarker 또는 맞춤형 스택에서 웨비나를 실행할 수 있으며, Vimeo, Wistia, 자체 CDN에서 다시보기를 호스팅하거나 아예 하지 않을 수도 있습니다.
코드를 작성하기 전에 다음 순서를 실행하세요:
1단계 — 어떤 플랫폼을 사용하는지 묻기
짧은 객관식 질문으로 물어보세요:
- 라이브 웨비나를 어떤 플랫폼에서 진행하시나요? (Zoom Webinars / Zoom Meetings / Microsoft Teams / GoToWebinar / Livestorm / Demio / Webex / Hopin / BigMarker / Crowdcast / 기타)
- 웨비나 후 설문조사는 어디에 있나요? (웨비나 플랫폼 내장 / Typeform / Google Forms / SurveyMonkey / Hubspot / 없음)
- 다시보기는 어디에 있나요? (YouTube / Vimeo / Wistia / 자체 호스팅 / 게이트 랜딩 페이지 / 없음)
- 등록 데이터와 참석 데이터가 분리되어 있나요? (결합된 하나의 내보내기 / 두 개의 분리된 내보내기 / 등록만 / 참석만)
2단계 — 무엇이든 설계하기 전에 실제 내보내기 파일 하나 요청하기
명확히 말하세요: "각 소스(참석자, 설문조사, 다시보기)에서 개인 데이터가 이미 제거된 실제 내보내기 파일을 하나 업로드해 주세요. 추측하지 않고 실제 컬럼 헤더를 읽고, 귀하의 데이터가 대시보드의 어느 부분을 지원할 수 있는지 알려드리겠습니다."
이것을 고집하세요. 실제 파일 하나가 모든 가정을 제거합니다. 사용자가 실제 데이터를 공유할 수 없는 경우, 헤더 행과 완전히 조작된 2~3개의 행을 붙여넣도록 요청하세요.
3단계 — 업로드된 파일에 개인정보 보호 게이트 실행하기
개인정보 보호 게이트 를 참조하세요. 파일에 정리되지 않은 개인 데이터가 포함된 경우 거부하세요. 깨끗한 파일이 제공될 때까지 매핑으로 진행하지 마세요.
4단계 — 사용자의 컬럼을 표준 스키마에 매핑하기
사용자에게 명시적인 매핑 테이블(사용자 컬럼 → 표준 필드 → 활성화되는 기능)을 보여주고, 누락된 내용을 명시하세요. 필드 요구 사항 및 references/platform-exports.md를 참조하세요.
5단계 — 사용자가 얻을 수 있는 차트 알려주기
빌드하기 전에 기능 가용성 보고서를 출력하세요:
✅ 사용 가능한 데이터
시청 시간 분포, 동시 시청자 타임라인, 이탈 감지,
참석 퍼널, 전월 대비 성장, 신규 vs 재방문.
⚠️ 부분적으로 사용 가능
인구 통계 — 국가는 있지만 직함이 없으므로 직급
도넛 차트는 숨겨집니다.
❌ 사용 불가
다시보기 분석 — 다시보기 내보내기 파일 없음. 다시보기 탭은
추가할 때까지 숨겨집니다 (또는 CSV 템플릿을 통해 수동으로
수치를 입력할 수 있습니다).
입력 데이터가 존재하지 않는 차트는 절대 빌드하지 마세요. 전체 패널을 숨기고 어떤 데이터가 활성화할 수 있는지 한 줄로 설명하세요.
개인정보 보호 게이트 (필수)
모든 업로드 파일은 파싱 전, 저장 전, 분석 전에 정리 확인을 거칩니다. 개인 데이터가 발견되면 전체 파일을 거부하고, 위반 컬럼과 행 번호를 명시한 후 정리 방법을 설명하세요. 부분적으로 가져오지 마세요. 자동으로 조용히 익명화하지 마세요.
개인 데이터로 간주되는 항목
| 카테고리 | 탐지 |
|---|---|
| 이메일 주소 | 모든 셀에서 [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\. [A-Za-z]{2,} |
| 전화번호 | (?:\+?\d[\s\-().]{0,2}){7,15} (숫자 7자리 이상, 순수 타임스탬프/ID 제외) |
| 우편 주소 | 거리 유형 키워드(`street |
| 우편번호 / ZIP | \b\d{5}(-\d{4})?\b 또는 [A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2} (컬럼 이름이 위치를 암시하는 경우) |
| IP 주소 | IPv4/IPv6 리터럴 |
| 정부 / 결제 ID | \b\d{3}-\d{2}-\d{4}\b (SSN 형태), Luhn 검사를 통과하는 \b(?:\d[ -]*?){13,16}\b |
| 의심스러운 컬럼 이름 | 헤더가 `email |
규칙
- 헤더부터 스캔합니다. 이름이 의심스러운 목록과 일치하는 컬럼은 샘플 셀이 비어 있어 보여도 플래그가 지정됩니다. 오늘 비어 있는 컬럼은 내일 채워질 수 있습니다.
- 모든 행의 모든 셀을 스캔합니다. 샘플이 아닙니다. 파일이 작고(수천 행) 전체 스캔이 저렴하며 샘플 스캔은 잘못된 확신을 줍니다.
- 자유 텍스트 설문 답변도 스캔합니다. 사람들은 피드백 상자에 "[email protected]으로 이메일 보내주세요"라고 입력합니다. 이것이 가장 흔히 놓치는 누출입니다.
- 첫 번째 발견된 카테고리에서 거부하지만, 모두 보고합니다. 스캔을 완료하고 모든 문제를 한 번에 제시하여 사용자가 파일을 한 번에 수정할 수 있도록 합니다.
- 거부된 파일을 디스크나 데이터베이스에 절대 쓰지 마세요. 메모리에 보관하고, 거부하고, 폐기합니다.
- 위반 값 없이 거부를 기록합니다. 컬럼 이름과 행 번호만 기록하고, 탐지된 이메일/전화번호 자체는 절대 기록하지 않습니다.
허용되는 식별자 (거부되지 않음)
- 안정적인 가명화된 개인 ID — 파일 간에 일관된 해시, UUID 또는 순차적 정수. 교차 웨비나 분석을 위해 필수입니다 (아래 참조).
- 국가/지역 이름, 조직 이름, 직함, 직급.
- 타임스탬프, 기간, 웨비나 ID, 주제 문자열.
거부 메시지 템플릿
❌ 업로드 거부 — attendees_march.csv에서 개인 데이터가 탐지되었습니다
컬럼 "Email" → 412개의 이메일 주소 (2–413행)
컬럼 "Contact Number" → 88개의 전화번호 (2, 5, 9, … 행)
컬럼 "What can we improve?" → 자유 텍스트 내 3개의 이메일 주소
(47, 112, 288행)
아무것도 가져오지 않았으며 파일은 폐기되었습니다.
수정 방법:
1. Email 컬럼을 안정적인 가명화된 ID로 교체하세요 — 예:
소문자로 변환된 이메일의 SHA-256 해시를 16자로 자릅니다.
모든 파일에 동일한 해싱 방법을 사용하여 동일한 사람이
웨비나 간에 인식 가능하도록 합니다.
2. Contact Number 컬럼을 완전히 삭제하세요 — 절대 사용되지 않습니다.
3. 자유 텍스트 답변 내의 이메일 주소를 편집하고, 나머지
댓글은 유지하세요.
정리된 후 다시 업로드하세요. 참조용 정리 스크립트는
references/anonymisation.md를 참조하세요.
안정적인 가명화된 ID가 필수적인 이유
이 도구 가치의 절반은 교차 웨비나 분석에 있습니다: 신규 vs 재방문 참석자, 유지 코호트, 반복 등록자, 개인별 참석률. 이 모든 것은 사용자가 누구인지 알지 못하면서 파일 간에 동일한 사람을 인식해야 합니다. 수집 시 사용자에게 명시적으로 알리세요. 이메일을 빈 값이나 파일별 임의 값으로 정리하면 모든 교차 웨비나 차트가 조용히 의미 없게 됩니다.
권장: person_id = sha256(lower(strip(email)) + fixed_salt)[:16], salt는 데이터셋 외부에 저장합니다. references/anonymisation.md에는 즉시 사용 가능한 스크립트가 포함되어 있습니다.
필드 요구 사항
대시보드는 표준 스키마에서 실행됩니다. 사용자의 내보내기 컬럼이 매핑됩니다. 매핑이 채울 수 없는 것은 숨겨지는 기능입니다.
표준 엔터티: webinar (세션당 한 행)
| 필드 | 필수? | 유형 | 활성화 기능 | 일반적인 소스 컬럼 |
|---|---|---|---|---|
external_id | 필수 | 텍스트, 고유 | 모든 것 — 참석자/설문/다시보기 파일 전반의 조인 키 | 웨비나 ID, 미팅 ID, 이벤트 ID, 세션 ID |
topic | 필수 | 텍스트 | 모든 레이블링; 재방송의 캠페인 그룹화 | 주제, 제목, 이벤트 이름 |
start_time | 필수 | 타임스탬프 | 모든 시간 기반 차트; 전월 대비; 시간대; 동시성 타임라인 | 실제 시작 시간, 시작, 날짜 |
duration_minutes | 강력 권장 | 정수 | 동시성 타임라인 x축; 세션 시청률 | 실제 기간, 기간 |
num_registrants | 권장 | 정수 | 퍼널, 참석률 (행 수를 세서 파생 가능) | # 등록자, 등록됨 |
unique_viewers | 권장 | 정수 | 시간대 차트; 헤드라인 도달률 (파생 가능) | 고유 시청자, 참석자 |
max_concurrent | 선택 사항 | 정수 | 최대 청중 통계 | 최대 동시 시청 |
시간대 규칙: 저장된 타임스탬프가 UTC인지 고정 로컬 존인지 한 번 결정하고, 스키마 주석에 기록한 후 임시로 변환하지 마세요. 월 버킷팅은 이 필드에서 직접 읽어옵니다. 다른 시간대의 청중을 위해 현지 자정 직후에 실행되는 세션을 위한 수동 월 재정의 메커니즘을 제공하세요 (월 재정의 참조).
표준 엔터티: attendee_session (참가당 사람당 한 행)
중단 후 재접속하는 사람은 여러 행을 생성합니다. 수집 시 중복을 제거하지 마세요. 분석 시 의도적으로 중복을 제거하세요.
| 필드 | 필수? | 유형 | 활성화 기능 | 일반적인 소스 컬럼 |
|---|---|---|---|---|
webinar_id | 필수 | FK | 모든 것 | — |
person_id | 필수 (가명화) | 텍스트 | 신규 vs 재방문, 유지, 반복 등록자, 개인별 중복 제거 | 해시된 이메일, 참석자 ID |
attended | 필수 | 부울 | 참석/불참 분할, 퍼널, 참석률 | 참석 여부 (예/아니오) |
is_registrant | 권장 | 부울 | 불참 코호트; 퍼널 | 등록 시간이 있는 경우 파생됨 |
join_time | 권장 | 타임스탬프 | 동시성 타임라인, 이탈 감지 | 참여 시간 |
leave_time | 권장 | 타임스탬프 | 동시성 타임라인, 이탈 감지 | 떠난 시간 |
minutes | 권장 | 정수 | 시청 시간 히스토그램, 평균 시청 시간 | 세션 시간 (분) |
country / region | 선택 사항 | 텍스트 | 지역 도넛, 지역별 시간 분석 | 국가/지역 |
organization | 선택 사항 | 텍스트 | 계정 수준 보기 | 조직, 회사 |
job_title | 선택 사항 | 텍스트 | 직급 도넛 (파생됨) | 직함, 제목, 역할 |
source_name | 선택 사항 | 텍스트 | 획득 채널 도넛 | 소스 이름, UTM 소스, 리퍼러 |
registration_time | 선택 사항 | 타임스탬프 | 가입 곡선 분석 | 등록 시간 |
custom_answers | 선택 사항 | JSON | 등록 질문당 하나의 도넛 | 인식되지 않는 모든 컬럼 |
인식되지 않는 컬럼 규칙: 위의 알려진 필드 중 하나가 아닌 참석자 파일의 모든 컬럼은 등록 설문 질문으로 처리되어 custom_answers에 {질문: 답변}으로 저장됩니다. 각 질문은 자동으로 자체 도넛 차트를 렌더링합니다. 이것이 이 도구가 한 번도 본 적 없는 플랫폼에서 작동하는 이유입니다.
파생 필드 — seniority: job_title을 키워드별로 버킷화합니다: C레벨 / 창업자 (ceo, cto, cfo, cmo, coo, chief, founder, owner, president), VP / 이사 (vp, vice president, head of, director), 매니저 / 리드 (manager, lead, principal), 시니어 IC (senior, sr.), 주니어 (junior, jr., intern, associate, assistant), 그 외 개인 기여자. 작업 제목이 있는 행이 하나도 없으면 직급 차트를 완전히 숨깁니다.
표준 엔터티: feedback_response (설문 제출당 한 행)
| 필드 | 필수? | 유형 | 활성화 기능 | 일반적인 소스 컬럼 |
|---|---|---|---|---|
webinar_id | 필수 | FK | 피드백을 세션에 연결 | 미팅/웨비나 ID |
person_id | 선택 사항 (가명화) | 텍스트 | 피드백을 참석 행동에 연결 | 해시된 이메일 주소 |
submitted_at | 선택 사항 | 타임스탬프 | 순서, 최신성 | 제출 날짜 및 시간 |
score | 권장 | 정수 1–5 | 만족도 분포 + 평균 | "얼마나 유용했습니까…" |
liked_text | 권장 | 텍스트 | 칭찬 주제 클러스터링 | "무엇이 좋았습니까…" |
improve_text | 권장 | 텍스트 | 우려 사항 주제 클러스터링 | "개선할 점은 무엇입니까…" |
other_answers | 선택 사항 | JSON | 그 외 모든 것, 그대로 | 나머지 질문 컬럼 |
컬럼 탐지: 헤더에서 키워드 매칭(useful/rate/score, like, improve)으로 점수/좋았던 점/개선점 컬럼을 찾습니다. 대소문자 구분 없음, 첫 번째 일치가 우선입니다. 사용자에게 탐지된 매핑을 보여주고 수정하도록 허용하세요. 회사마다 설문 질문 표현이 다릅니다.
설문이 웨비나 플랫폼 외부에 있는 경우 (Typeform, Google Forms), 웨비나 ID를 전달하지 않습니다. 그런 다음 사용자에게 웨비나 ID를 전달하는 숨겨진 필드를 추가하거나 업로드 시 UI에서 대상 웨비나를 선택하도록 요구하세요.
표준 엔터티: replay_stats (웨비나당 한 행)
다시보기는 모든 데이터 중에서 가장 플랫폼에 따라 가변적입니다. 세 가지 수집 경로를 지원하며, 선호도 순서는 다음과 같습니다:
- API 커넥터 — 다시보기 호스트(YouTube Data/Analytics API, Vimeo, Wistia)에 연결 — 사용자가 있고 자격 증명을 부여하는 경우에만.
- 기본 분석 CSV 내보내기 — 다시보기 호스트에서 제공, 표준 필드에 매핑.
- 수동 템플릿 CSV — 항상 사용 가능, 항상 대체 수단. 각 지표를 설명하는 주석 블록과 예제 행이 있는 헤더 행이 포함된 다운로드 가능한 템플릿을 제공하세요.
| 필드 | 필수? | 유형 | 활성화 기능 |
|---|---|---|---|
webinar_id | 필수 | 조인 키 | 다시보기 관련 모든 것 |
video_id / video_url | 선택 사항 | 텍스트 | 호스팅된 비디오로 딥링크; API 동기화 |
views_day1 | 선택 사항 | 정수 | 초기 수요 차트 |
views_day7 | 선택 사항 | 정수 | 지속 수요 차트 |
total_view_hours | 선택 사항 | 숫자 | 총 다시보기 소비 차트 |
avg_view_duration_sec | 선택 사항 | 정수 | 다시보기 참여 차트 |
avg_view_percentage | 선택 사항 | 숫자 | 다시보기 유지 차트 |
likes, comments, shares, subscribers_gained | 선택 사항 | 정수 | 반응 통계 |
모든 다시보기 필드는 선택 사항입니다. 빈 값에는 NULL을 저장하고, 절대 0을 저장하지 마세요. 측정되지 않은 지표와 측정된 0은 다릅니다.
분석 규칙
이 섹션은 대시보드의 각 차트와 패널을 구동하는 계산을 설명합니다. 각 규칙은 한 가지 작업을 수행하며 맥락과 관련된 경우 구현 참고 사항을 포함합니다.
A. 수집 시 중복 제거
attendee_session 행은 웨비나당 사람당 한 행을 대상으로 하지만, 재접속으로 인해 여러 행이 존재할 수 있습니다. 수집을 방해하지 않고 수집 후 정리합니다.
| 규칙 | 메모 |
|---|---|
attended는 참가 시간(join_time)이 있거나 플랫폼이 '참석' 플래그를 설정하면 true입니다. | 플랫폼이 불참자를 포함하지 않는 경우, attended가 기본적으로 true라고 가정하고 minutes가 0이면 플래그를 재정의하지 마세요. |
수집 시 여러 행을 처리: 동일한 webinar_id와 person_id에 대해 minutes 필드가 있는 여러 행이 있는 경우, 합산하지 말고 최대치를 유지하세요 (minutes = MAX(m1, m2, ..., mn)). 재접속이 있다는 것은 원래 세션에 포함된 시간을 과대평가하는 것보다는 과소평가하는 것이 안전합니다. 다시보기에서는 여러 시청 세션을 합산할 수 있지만, 라이브 웨비나에서는 대부분의 사람이 한 번 참여합니다. | |
재접속자: join_time과 leave_time이 있는 행의 경우, 각 재접속을 감지할 수 있습니다. 현재 버전에서는 재접속을 별도로 표시하지 않지만, 각 행의 데이터를 그대로 유지하여 미래 분석을 위해 보존합니다. |
B. 개별 웨비나 패널
각 패널은 단일 웨비나에 있습니다. webinar_id는 항상 현재 웨비나로 설정됩니다.
| 패널 이름 | 유형 | 계산 |
|---|---|---|
| 헤드라인 통계 | 요약 카드 | 참석자 수 (고유 person_id, attended = true), 미참석 등록자 (attended = false AND is_registrant = true), 평균 minutes, 최대 동시 시청 (max_concurrent에서, 사용 가능한 경우), 기간 minutes (라이브 웨비나에만 해당). minutes가 NULL인 경우 "데이터 없음". |
| 시청 시간 분포 | 히스토그램 | x축: 1-5, 5-10, 10-20, 20-30, 30-45, 45-60, >60 (분). 각 구간의 person_id 수. minutes가 NULL인 경우 이 패널을 숨깁니다. |
| 동시 시청자 타임라인 | 시계열 선 그래프 | x축: 웨비나 기간(분). y축: 해당 분에 join_time <= t < leave_time인 person_id 수. 각 타임스탬프 분을 x축 눈금으로 사용합니다. join_time 또는 leave_time이 NULL인 경우 이 패널을 숨깁니다. |
| 이탈 감지 | 강조 표시된 사건 목록 | 각 person_id에 대해 leave_time < (마지막 행의 leave_time)인 경우 이탈로 표시. 전체 minutes를 시청한 사람이 이탈로 표시되지 않도록 하기 위해, 웨비나 종료 시간(start_time + duration_minutes) 5분 전 이후의 leave_time은 무시합니다. |
| 인구 통계 도넛 | 도넛 차트 | country/region, organization, seniority, source_name에 대해 각 키의 고유 person_id 수. seniority가 비어 있으면 숨깁니다. custom_answers의 각 질문에 대해 자체 도넛. |
| 설문 피드백 | 카드 요약 + 워드 클라우드 선호/개선 | 평균 score, score 분포 (1–5), liked_text의 가장 빈번한 용어 (n-gram), improve_text의 가장 빈번한 용어. |
C. 교차 웨비나 패널
이 패널은 모든 웨비나의 데이터를 집계합니다.
| 패널 이름 | 유형 | 계산 |
|---|---|---|
| 신규 vs 재방문 | 적층 막대 차트 | x축: 월. y축: 해당 월의 고유 person_id 수. person_id가 존재하는 가장 빠른 start_time의 월이 '신규'입니다. 해당 날짜 이전의 person_id는 '재방문'입니다. 주의: 데이터가 불완전한 첫 번째 달의 재방문은 절대 0입니다 (이전 데이터가 없으므로). 이전 데이터가 부족하기 때문에 첫 번째 달에만 적용된다는 면책 조항과 함께 표시합니다. |
| 월별 참석률 | 선 그래프 | x축: 월. y축: 각 월의 고유 person_id 수 (attended = true). 또한 등록자 수도 표시합니다 (사용 가능한 경우). |
| 재참석 코호트 | 히트맵 | x축: 웨비나 번호 (n번째 웨비나). y축: 이전 참석 횟수 (0, 1, 2, …). 셀 값: 현재 웨비나에서 이 참석 기록을 가진 person_id 수. |
| 최고 기여 웨비나 | 표 | 각 webinar_id에 대해: 참석자 수, 고유 시청자, 평균 minutes, score, views_day7. 참석자 수 기준 내림차순 정렬. 첫 10개 표시. |
D. 다시보기 패널
replay_stats 테이블에 하나 이상의 NULL이 아닌 행이 있는 경우에만 표시됩니다. 그렇지 않으면 다시보기 데이터가 필요하다는 안내 메시지와 함께 패널을 숨깁니다.
| 패널 이름 | 유형 | 계산 |
|---|---|---|
| 다시보기 조회수 타임라인 | 적층 막대 차트 | x축: 웨비나. y축: views_day1, views_day7. views_day1 기반 내림차순 정렬. |
| 다시보기 참여 | 산점도 | x축: avg_view_percentage. y축: avg_view_duration_sec. 각 점 = 웨비나. 추세선 (선형 회귀). |
| 반응 통계 | 요약 카드 | likes 합계, comments 합계, shares 합계. |
차트 및 색상 의미론
색상
사용자 정의 색상 팔레트를 사용하지 마세요. 운영 체제 선호도(예: 다크 모드)를 존중하는 기본 라이브러리 테마를 사용하세요. 아래 내용은 차트 요소 레이블 지정에 관한 것입니다.
레이블 지정 규칙
- Y축과 X축에는 항상 레이블을 지정하세요. 단위를 포함하세요 (예: "시청 시간 (분)", "참석자 수", "점수 (1-5)").
- 범례가 있습니다. 동일한 차트에 여러 계열이 있을 때만 범례를 표시하세요. 단일 계열 차트에서는 범례를 숨기세요.
- 툴팁은 모든 데이터 포인트에 대해 세 가지 값을 표시합니다: 레이블, 절대값, 전체 대비 백분율 (해당되는 경우). 예: "참석자: 412명 (전체의 34%)".
- 모든 도넛 차트는 레이블이 없는 경우 빈 공간을 "> (데이터 없음)"으로 표시합니다. 알 수 없는 값이나 누락된 값은 빈 슬라이스로 끝나지 않도록 도넛에서 제외하세요.
- 선 차트에는 모든 축 교차점에 점을 표시하고, 서로 다른 계열 간에 겹치는 경우 호버 시 강조합니다.
상호 작용
- 모든 차트는 호버 시 데이터 포인트를 강조합니다.
- 모든 차트는 클릭 시 기본 데이터 테이블로 드릴다운합니다. 웨비나 차트를 클릭하면 해당 웨비나에 대한 개별 패널 보기가 열립니다. 교차 웨비나 차트를 클릭하면 월 또는 웨비나별로 필터링됩니다.
- 드릴다운 테이블은 내보낼 수 있습니다 (CSV로, 또는 테이블과 동일한 형식으로 복사).
- 오버플로우: 차트가 화면에 맞지 않으면 스크롤 컨테이너를 표시하고 아래에 차트 크기 표시기를 추가하세요 (예: "… 32개 중 1-10개 월 표시").
오류 처리
데이터 오류
| 오류 유형 | 처리 방법 |
|---|---|
필수 필드 누락 (webinar_id, person_id, attended 없음) | 해당 파일의 수집을 거부하세요. "필수 필드 [필드]가 없습니다. 이를 포함한 내보내기 파일을 사용하거나 [필드]로 매핑할 수 없는 경우 해당 패널을 사용할 수 없습니다."라고 말하는 오류 메시지를 표시하세요. |
잘못된 데이터 유형 (예: minutes 열의 텍스트) | 해당 행을 건너뛰고 오류 로그에 기록하세요. 나머지 파일이 성공적으로 가져오도록 하세요. 오류 로그를 사용자에게 표시하세요: "2행에서 잘못된 유형의 minutes: '30분' — 숫자가 아닙니다. 행이 건너뛰어졌습니다." |
예상치 못한 NULL (예: minutes 필드가 전체 파일에 대해 NULL) | 해당 패널을 숨기고 "[패널]을 표시하려면 [필드] 데이터가 필요합니다"라고 표시하세요. 차트를 중단하지 마세요. |
| 개인정보 보호 게이트 위반 | 위 참조 — 전체 파일 거부 거부 메시지. |
인프라 오류
| 오류 유형 | 처리 방법 |
|---|---|
| 데이터베이스 연결 실패 | 대시보드 전체에 "저장소를 사용할 수 없습니다. 몇 분 후에 다시 시도하세요." 오류를 표시하세요. 부분적으로 로드하지 마세요. |
| 파일 읽기 실패 | "파일을 읽을 수 없습니다. 다시 업로드하세요." (파일이 손상된 경우). |
| 타임아웃 (큰 파일) | "파일이 예상보다 큽니다. 더 작은 파일로 분할하거나 샘플을 사용하세요." 50,000개의 attendee_session 행 제한을 설정하세요. |
경고
- "위험한 가정을 피하세요" — 플랫폼별 내보내기 형식을 하드코딩하지 마세요. 항상 수집 대화를 실행하세요.
- "개인정보를 수집하지 마세요" — 개인정보 보호 게이트는 선택 사항이 아닙니다. 이메일, 전화번호, 주소, IP, 정부 ID를 절대 저장하지 마세요. 안정적인 가명화된 ID를 사용하세요.
- "누락된 데이터로 차트를 표시하지 마세요" — 입력 데이터가 없으면 패널을 숨기거나 명확한 메시지를 표시하세요. 추측하여 차트를 표시하지 마세요.
- "사용자에게 알리세요" — "출처를 알 수 없는 데이터"라고 조용히 건너뛰지 마세요. 사용자에게 무슨 일이 일어났는지, 왜, 그리고 수정 방법을 정확히 알려주는 오류 메시지를 표시하세요.
참조
references/platform-exports.md— 알려진 웨비나 플랫폼 내보내기 형식 및 표준 스키마로의 매핑.references/anonymisation.md— 이메일을 안정적인 가명화된 ID로 정리하는 드롭인 스크립트.references/template.csv— 재생 통계 템플릿 CSV의 예references/implementation-guide.md— 선호하는 웹 스택에서 이 명세를 구현하기 위한 안내.