여심위 수집부터 T+7 예측·채점·배포까지, 어떤 단계에서 무엇이 처리되고 어떤 스케줄로 도는지의 전체 지도 · 기준일 2026-08-11
합성패널 트랙(10k 쿼터 패널)은 ②의 CSV를 입력으로 EC2에서 별도 실행되어, 각 주제 페이지의 "합성패널" 탭에 나우캐스트를 공급한다.
사람 개입 없이 돌고, 품질 검사에 걸리면 스스로 반영을 거부한다(failed). 각 단계가 하는 일:
| 단계 | 하는 일 | 산출 · 지키는 가드 |
|---|---|---|
| crawl | 여심위 등록 목록 페이지 크롤 (신규 없으면 조기 종료) | polls 행 생성 (기관·기간·표본) |
| classify | 전국 정례조사만 선별, 지역·무관 조사 제외 | region 플래그단, '전국' 표기 자체를 불신 — 하류 SANITY가 수치로 재검(호남 조사가 전국으로 오등록된 실사례) |
| fetch_detail | 상세페이지에서 메타·첨부 확인, 결과표 없으면 등록 후 10일까지 재확인(엠바고 대응) | 첨부 목록10일 지나 도착한 PDF는 수동 부활 절차로 구제(7/29 4건 실증) |
| fetch_pdfs | 결과표 PDF 다운로드 | PDF 캐시 |
| parse | LLM으로 표 추출 (1차 haiku, 실패 시 sonnet 멀티모달 폴백) | 국정평가·정당지지·차기주자 수치QC: 합계 96~104% · 표본 300~5,000 · 전주 대비 8%p 점프 가드 → 위반 시 failed |
| 적재 | SQLite 원천 DB에 기록 | survey2 반영층·v2 일기예보가 공유 |
서버 DB의 신규분만 뽑아 사람 게이트를 거쳐 CSV 정본에 병합하고, 정적 HTML 6장을 다시 구워 배포한다. 전 과정이 명령 한 줄이며, 몇 번을 다시 돌려도 중복이 생기지 않는다(멱등 — 실측 검증됨).
| 단계 | 하는 일 | 게이트 (통과 못 하면 중단) |
|---|---|---|
| export | 이미 반영된 조사(reg_no)를 제외한 신규만 추출 — 신규 0건이면 "이미 최신"으로 종료 | 표본편향·지역오염 판정 폴 영구 제외 내장 |
| dry-run | 기관·후보 코드 매핑, 함정 규칙(기관별 문항 특성) 적용한 미리보기 | 사람 확인 · SANITY 상식선 검사(민주 30~55% 등 — 지역조사 오염 자동 경고) · 미지 기관/후보면 의도적 정지 |
| 병합+검증 | CSV 정본에 추가 후 서버 DB와 전수 재대조 | 행 단위 일치 · 중복 0 · 합계 96~104% — 하나라도 어긋나면 원복 |
| 빌드 | 시간감쇠 베이지안 나우캐스트 + T+7 예측(추세 외삽+랜덤워크) + 3중 자동보정(λ·수준편향·CI 배율) + 기관·방식 계층 보정 → HTML 6장 | 4주제 합계 QC 미통과 시 배포 중단 |
| 배포 | survey2에만 업로드 (7/5 동결 스냅샷 /survey는 비대상) | 로컬↔서버 해시 6/6 대조 |
| 트랙 | 하는 일 | 현재 상태 |
|---|---|---|
| 합성패널EC2 · 주 1회 수동 | 10,316명 쿼터 패널에 최신 조사를 IPF 앵커링 → 세그먼트 나우캐스트 (각 주제 페이지 "합성패널" 탭) | 7/29 갱신 (컷오프 7/25 · 타깃 8/1) · topline 게이트 통과, 세그먼트 T+7은 부가가치 기준 미달로 비표시 정책 유지 |
| 여론 일기예보reble.ai/v2 · 자동 | 같은 원천 DB로 ALR 칼만필터 T+7 예측·자동 채점 (본 서비스와 모델·페이지 별도) | 채점 179건+ · 주간 백테스트 가동 · 정밀분석(deep)은 7/3 이후 정지(백로그) |
"어느 스케줄러에 걸려 있는가"가 형식이다. 서버 상시 → 한시 예약(끝나면 스스로 삭제) → 세션 예약 → 사람 순으로 내려온다.
| 스케줄러 | cron 표기 | 사람 말로 | 하는 일 | 상태 |
|---|---|---|---|---|
| 서버 crontab | 40 9,22 * * * UTC | 매일 07:40 · 18:40 | 수집·파싱 풀 런 (저우선 nice 실행) | 상시 가동 |
| 서버 crontab | 10 12 * * 0 UTC | 일요일 21:10 | 위와 동일 + 주간 백테스트(롤링 검증) | 상시 가동 |
| 서버 crontab자율 반영 · 한시 | 7 1 1-3 8 * UTC | 8/1~8/3 오전 10:07 | 엠바고 폴 무인 반영(worker) — 검사(SANITY·매핑) 통과 시에만 적용→검증→빌드→배포→패널 갱신, 결과는 Labs '자동 반영 로그'에 자동 기록. 성공하면 예약 자기 삭제 | 대기 |
| 사람 | ./update_survey2.sh | 원할 때 한 줄 | survey2 갱신 전체(3장). 신규 없으면 "이미 최신" — 언제 돌려도 안전 | 상비 |
| 사람 | panel/run_weekly.py | 주 1회 권장 | 합성패널 갱신(실행 38초) → survey2 데이터 교체 | 수동 |
| 항목 | 내용 | 처리 경로 |
|---|---|---|
| 엠바고 2건 | 여론공정 7/26~27 · 조원 7/25~27(n=2,002) — 결과표 PDF 미게시 | 서버 크론이 게시 즉시 수집 → 8/1 예약이 자동 반영 (조원 건은 SANITY가 지역 오염 감시) |
| LLM 파서 오독 | 일부 기관 신형 결과표에서 표 식별 실패(여론조사꽃 당대표 표 오독 등) | 본 서비스 반영분은 PDF 원문 수동 교정 완료 — 서버 파서 수리는 백로그 |
| PDF 지연 구제 | 10일 재확인 윈도우를 넘겨 도착한 PDF의 자동 구제 미지원 | 수동 부활 절차 확립 — 파서 코드 수리는 백로그 |
| 패널 크로스탭 | 자동수집분(폴 39~)의 크로스탭이 패널 입력 형식으로 미병합 | 백로그 — 변환기 개발 시 패널 정밀도 개선 여지 |