여론조사 분석 파이프라인 — 운영 현황OPERATIONS

여심위 수집부터 T+7 예측·채점·배포까지, 어떤 단계에서 무엇이 처리되고 어떤 스케줄로 도는지의 전체 지도 · 기준일 2026-08-11

여심위 크롤 누적
894
전국 130 · 파싱 103
본 서비스 반영
85폴
시계열 989행 · ~7/25
현재 예측 타깃
8/1
데이터 기준일+7 고정
실전 채점(M7)
5/5
95% CI 적중 · MAE 2.33
합성패널
7/29
10,316명 · 타깃 8/1
파이프라인 에러
0
최근 런 전 단계 정상

1. 전체 흐름 — 한 장 요약

[여심위 NESDC 공개 목록·PDF] │ ① 수집·파싱층 (서버 · 완전 자동 · 매일 07:40/18:40) │ crawl → classify(전국 선별) → fetch_detail(엠바고 10일 재확인) │ → fetch_pdfs → LLM 파싱(haiku→sonnet 폴백) → QC(합계·표본·점프) ▼ [SQLite 원천 DB]──────────────┐ │ │ ④ 병행: reble.ai/v2 일기예보 │ ② 정제·분석·배포층 │ (ALR 칼만 · 자체 예측·채점) │ (로컬 정본 · 원커맨드) │ │ export(신규만) → dry-run 게이트(SANITY) → 병합+전수대조 │ → 빌드(베이지안 나우캐스트 + T+7 + 3중 자동보정) → 배포+sha ▼ ▼ [reble.ai/survey2 · 정적 HTML] [reble.ai/v2] │ │ ③ 검증·기록층: 타깃일 실측 도착 → 자동 채점(M7) → 오차가 ▼ λ·편향·CI 보정에 재주입되는 자가 교정 루프 [다음 예측이 더 정확해짐]

합성패널 트랙(10k 쿼터 패널)은 ②의 CSV를 입력으로 EC2에서 별도 실행되어, 각 주제 페이지의 "합성패널" 탭에 나우캐스트를 공급한다.

2. 수집·파싱층 — 서버, 완전 자동

사람 개입 없이 돌고, 품질 검사에 걸리면 스스로 반영을 거부한다(failed). 각 단계가 하는 일:

단계하는 일산출 · 지키는 가드
crawl여심위 등록 목록 페이지 크롤 (신규 없으면 조기 종료)polls 행 생성 (기관·기간·표본)
classify전국 정례조사만 선별, 지역·무관 조사 제외region 플래그단, '전국' 표기 자체를 불신 — 하류 SANITY가 수치로 재검(호남 조사가 전국으로 오등록된 실사례)
fetch_detail상세페이지에서 메타·첨부 확인, 결과표 없으면 등록 후 10일까지 재확인(엠바고 대응)첨부 목록10일 지나 도착한 PDF는 수동 부활 절차로 구제(7/29 4건 실증)
fetch_pdfs결과표 PDF 다운로드PDF 캐시
parseLLM으로 표 추출 (1차 haiku, 실패 시 sonnet 멀티모달 폴백)국정평가·정당지지·차기주자 수치QC: 합계 96~104% · 표본 300~5,000 · 전주 대비 8%p 점프 가드 → 위반 시 failed
적재SQLite 원천 DB에 기록survey2 반영층·v2 일기예보가 공유

3. 정제·분석·배포층 — 로컬 정본, 원커맨드

서버 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 대조
파싱이 틀릴 수 있다는 전제가 설계 기준이다. LLM 추출 오류(예: 당대표 표를 정당지지도로 오독)는 PDF 원문 전체행 근거의 수동 교정(MANUAL_FIX)으로만 고치고, 모든 판정 근거는 파싱 로그에 남긴다.

4. 합성패널 · 병행 트랙

트랙하는 일현재 상태
합성패널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 이후 정지(백로그)

5. 검증·기록 — 예측이 채점 가능해야 파이프라인이다

6. 스케줄링 — 4개 레이어

"어느 스케줄러에 걸려 있는가"가 형식이다. 서버 상시 → 한시 예약(끝나면 스스로 삭제) → 세션 예약 → 사람 순으로 내려온다.

스케줄러cron 표기사람 말로하는 일상태
서버 crontab40 9,22 * * * UTC매일 07:40 · 18:40수집·파싱 풀 런 (저우선 nice 실행)상시 가동
서버 crontab10 12 * * 0 UTC일요일 21:10위와 동일 + 주간 백테스트(롤링 검증)상시 가동
서버 crontab자율 반영 · 한시7 1 1-3 8 * UTC8/1~8/3 오전 10:07엠바고 폴 무인 반영(worker) — 검사(SANITY·매핑) 통과 시에만 적용→검증→빌드→배포→패널 갱신, 결과는 Labs '자동 반영 로그'에 자동 기록. 성공하면 예약 자기 삭제대기
사람./update_survey2.sh원할 때 한 줄survey2 갱신 전체(3장). 신규 없으면 "이미 최신" — 언제 돌려도 안전상비
사람panel/run_weekly.py주 1회 권장합성패널 갱신(실행 38초) → survey2 데이터 교체수동

7. 대기 중 · 백로그

항목내용처리 경로
엠바고 2건여론공정 7/26~27 · 조원 7/25~27(n=2,002) — 결과표 PDF 미게시서버 크론이 게시 즉시 수집 → 8/1 예약이 자동 반영 (조원 건은 SANITY가 지역 오염 감시)
LLM 파서 오독일부 기관 신형 결과표에서 표 식별 실패(여론조사꽃 당대표 표 오독 등)본 서비스 반영분은 PDF 원문 수동 교정 완료 — 서버 파서 수리는 백로그
PDF 지연 구제10일 재확인 윈도우를 넘겨 도착한 PDF의 자동 구제 미지원수동 부활 절차 확립 — 파서 코드 수리는 백로그
패널 크로스탭자동수집분(폴 39~)의 크로스탭이 패널 입력 형식으로 미병합백로그 — 변환기 개발 시 패널 정밀도 개선 여지
이 페이지는 빌드 시점의 운영 스냅샷이다. 수치·스케줄이 바뀌면 다음 빌드에서 갱신된다.