Reble 전국 여론 T+7 예측 — 개발 문서METHODOLOGY

reble.ai/survey 가 어떻게 만들어졌고, 무엇을 계산하며, 어디까지 믿을 수 있는지에 대한 전체 기록 · 문서 기준일 2026-08-11

목차
  1. 이 서비스가 하는 일
  2. 데이터 — 수집과 정제
  3. 모델 1층: 나우캐스트 (베이지안 통합)
  4. 모델 2층: T+7 예측 (추세 외삽 + 확산)
  5. 주제별 모델 매핑
  6. 편향 보정 계층 — 조사방식 → 기관
  7. 롤링 T+7 검증 (walk-forward)
  8. 3중 자동 보정 루프
  9. 검증 성적 스냅샷
  10. 한계와 주의사항
  11. 운영 파이프라인과 버전 기록

1. 이 서비스가 하는 일

중앙선거여론조사심의위원회(여심위)에 등록·공표된 전국 정례조사 전수를 하나의 베이지안 모델로 통합해, ① 현재 시점의 잠재 지지율(나우캐스트)을 추정하고 ② 최근 추세를 반영해 데이터 기준일로부터 7일 후(T+7)의 지지율을 확률 분포로 예측합니다.

다루는 주제는 4가지입니다: 대통령 국정수행 평가 · 정당 지지도 · 차기 대선주자 선호도 · 민주당 당대표 선호도.

왜 "예측 대상일"이 열람일이 아니라 데이터 기준일에 고정되는가?
예측 대상일을 "오늘+7일"로 두면 열람하는 날마다 예측이 달라져 나중에 맞았는지 채점할 고정된 예측이 존재하지 않게 됩니다. 이 서비스는 대상일을 마지막 조사일 + 7일로 고정합니다. 예: 데이터가 7/2까지면 예측은 7/9. 이 예측은 하나의 기록으로 남고, 새 조사가 수집되는 순간 자동으로 채점 대상이 됩니다. 모든 페이지의 "T+7 검증" 탭이 이 채점의 누적 결과입니다.

2. 데이터 — 수집과 정제

원천: 여심위 등록 정례조사 PDF 원본을 파싱한 데이터셋 (2026-05-29 ~ 07-02 조사 종료일 기준 38건, 17개 기관). 기관은 품질 등급 A/B/C로 분류됩니다 (A: 한국갤럽·NBS·한국리서치 / B: 리얼미터·조원씨앤아이·KSOI / C: 그 외).

정제 과정에서 처리한 사항 (전수 기록)

이슈처리
후보 코드 불일치 — 오세훈이 osh/ojh, 강훈식이 ghs/khs, 추미애가 cma/chuma/chm으로 혼재, 일부는 한글 원문(장동혁·이진숙)빌드 시 코드 병합 테이블로 통일
갤럽 6/11 차기주자 조사가 자유응답(주관식) 방식 — 명단 제시 조사와 구조가 달라 모든 후보 수치가 절반 이하모델에서 제외, 원시 데이터 탭에 회색으로 표시
같은 조사에서 유보 항목 중복 집계 (모름 52% = 없음 39% + 응답거절 13%)세부 분해 제거, 유보 총량만 사용
여론조사꽃 4건이 PDF 폰트 손상으로 OCR 추출 — 값 신뢰도 낮음 (예: 6/6 긍정 69.3%는 시계열 최대 이상치)OCR 플래그 표시 + 기관 보정 패널에서 제외 옵션
리얼미터 일부 조사는 국정평가 topline이 없어 정당지지 크로스탭에서 역산역산 플래그 표시
기관 레지스트리에 리서치웰(research_well)과 리서치뷰(researchview)가 같은 한글명으로 등록원본 등록번호 대조 → 서로 다른 기관으로 확인, 분리 유지
유보 항목을 발표하지 않은 조사 (후보 합계 84.4% 등)잔여분(100−합계)을 유보로 귀속

3. 모델 1층: 나우캐스트 (베이지안 통합)

모든 조사를 동등하게 평균 내지 않고, 최근 조사일수록·표본이 클수록·품질 등급이 높을수록 더 무겁게 반영해 "지금 이 순간의 잠재 지지율"의 확률 분포(사후분포)를 만듭니다.

각 조사 i의 가중치: w_i = exp(−Δt_i / λ) × tier_i × n_i / 25 Δt_i = 데이터 기준일 − 조사일(일), λ = 시간감쇠(기본: 자동 선택, §8) tier = A:1.0 / B:0.85 / C:0.65 (기관 보정 ON일 때) 다항 주제(정당 등): Dirichlet 사후분포 α_c = α₀ + Σ_i w_i × (지지율_c,i / 100) (α₀ = 사전분포, 기본 2) 발표 합계가 100% 미달인 잔여분은 유보 항목의 α에 귀속 양자 구조(국정평가 긍정/부정/유보)도 3-카테고리 Dirichlet로 동일 처리
유효표본을 n/25로 축소하는 이유 — 발표 표본수(약 1,000명, 오차 ±3.1%p)를 그대로 쓰면 사후분포가 실제 조사 간 편차(같은 날에도 기관 간 5~12%p)보다 훨씬 좁아져 과신하게 됩니다. 기관효과·설계효과를 반영해 조사당 정보량을 1/25로 할인하며, 이 값은 조사 간 실측 분산과 정합하도록 정했습니다.

차기 대선주자만 다른 모델을 쓰는 이유

이 문항은 조사마다 제시된 후보 명단이 다릅니다 (13개 조사에서 후보별 관측 7~13회). 명단이 다른 조사를 하나의 Dirichlet에 그대로 누적하면 명단에 자주 빠진 후보가 체계적으로 과소평가됩니다. 그래서 후보별로 그 후보를 실제로 조사한 폴만 사용해 독립 Beta 사후분포를 만들고, 몬테카를로 추첨 때 후보들과 유보 버킷을 함께 뽑아 합이 100%가 되도록 정규화합니다. 관측이 적은 후보는 신뢰구간이 정직하게 넓어지고, 각 후보 옆에 "n/13폴" 커버리지 배지를 표시합니다. 표시 대상은 관측 5회 이상 9명이며 나머지는 "기타 후보"로 합산됩니다.

4. 모델 2층: T+7 예측 (추세 외삽 + 확산)

나우캐스트 위에 예측층을 쌓습니다. 몬테카를로 반복(기본 5,000회, 최대 50,000회)마다:

① 나우캐스트 추첨: p₀ ~ 사후분포 (Dirichlet 또는 Beta들+정규화) ② 추세(drift): 시간가중 회귀로 일당 변화율 β_c 추정, |β_c| ≤ 0.4%p/일 클램프 ③ T+h 예측: p_c(T+h) = p₀_c + β_c·h + bias_c + ε_c, ε_c ~ N(0, (σ_c·s)²·h) σ_c = 항목별 일간 변동성(이동평균 차분에서 추정) bias_c, s = 검증 기반 자동 보정 (§8) ④ 클램프 후 합=100% 재정규화 → 항목별 평균·95% CI·1위 확률 집계

h는 기본 7일(슬라이더로 0~14일 조정 가능)이고, 항목별 분산이 h에 비례해 커지므로 예측 부채꼴이 미래로 갈수록 벌어집니다. 1위 확률은 "몬테카를로 추첨 중 해당 항목이 1위인 비율"이며, 국정평가는 P(긍정 > 부정) 우세 확률로 표시합니다.

5. 주제별 모델 매핑

페이지문항조사 수모델카테고리특이사항
president.html대통령 국정수행353-cat Dirichlet긍정 / 부정 / 유보헤드라인 = P(긍정>부정) + 순지지
party.html정당 지지도387-cat Dirichlet민주 / 국힘 / 조국혁신 / 개혁신당 / 기타정당 / 무당층 / 유보"무당층 포함 ↔ 지지층만" 토글
next-leader.html차기 대선주자13후보별 독립 Beta + 정규화후보 9명 + 기타 + 유보커버리지 배지, 자유응답 1건 제외
dp-chair.html민주당 당대표144-cat Dirichlet정청래 / 김민석 / 송영길 / 유보·기타전당대회 시즌 한시 문항

6. 편향 보정 계층 — 조사방식 → 기관

같은 시점의 조사도 기관과 방식에 따라 체계적으로 다른 값을 냅니다. 이 격차를 계층적으로 분해해 이중 보정 없이 걷어냅니다 (기관 보정 토글 ON 시 적용, 기본 OFF).

각 조사의 잔차 r_i = 관측값 − (그 시점의 전체 이동평균, 자기 자신 제외) 1단계 조사방식 효과: mode_eff(방식) = shrunk_mean( r_i | 방식 ) 2단계 기관 효과: HE(기관) = shrunk_mean( r_i − mode_eff(방식_i) | 기관 ) shrunk_mean = 평균 × k/(k+3) (k = 관측 수 — 관측 적은 기관의 추정 폭주 방지) 적용: 관측값에서 (강도 × mode_eff) 와 (강도 × HE) 를 차감

이 분해가 실측에서 드러낸 사실 (문서 기준일 데이터):

각 페이지 House Effect 탭에서 항목별 기관 편향과 방식 효과 수치를 직접 볼 수 있습니다.

7. 롤링 T+7 검증 (walk-forward)

"이 모델이 실제로 7일 후를 맞혀 왔는가"를 페이지 안에서 상시 검증합니다. 원리는 단순합니다:

오리진 d = 첫 조사일부터 마지막 조사일까지 하루씩 이동 (최소 5개 조사 축적 후 시작) 각 d에서: d까지의 조사만 사용해 모델 적합 → d+7 예측 (평균 + 95% CI) 채점: d+7 ±1일 창의 실제 조사(표본 가중 평균)와 비교 지표: MAE(평균절대오차) · 95% CI 적중률(목표 95%) · 방향 적중률(실측 변화 ≥0.5%p 건만 판정) d+7이 데이터 밖인 오리진 = "열린 예측"(채점 대기) — 마지막이 곧 헤드라인 예측

사후분포의 평균·분산이 닫힌 형태로 계산되므로(Dirichlet 주변분포 = Beta) 몬테카를로 없이 오리진 전체를 즉시 계산합니다. 이 엔진은 Python 독립 재구현과 소수점 10자리까지 일치함을 확인했습니다.

각 페이지 "T+7 검증" 탭에서 ① 예측 궤적 vs 실측 차트 ② 항목별 스코어카드 ③ 구간별 상세 표 ("5/29~6/6 데이터 → 6/13 예측 63.7% vs 실측 48.9% = 편차 −14.7 ✗" 식의 행 단위 기록)를 제공합니다.

8. 3중 자동 보정 루프

검증 오차를 그냥 보여주는 데서 끝나지 않고, 오차에서 체계적 성분만 추출해 현재 예측을 보정합니다. 하루치 편차를 그대로 따라가면 조사 노이즈를 학습하게 되므로(과적합), 모든 루프에 shrinkage와 캡을 겁니다.

루프학습 대상방법안전장치
③ λ 자동 선택시간감쇠(기억 길이)λ ∈ {5,7,9,12,16,21} 각각으로 전 구간 walk-forward → 역사적 MAE 최소 λ를 페이지 기본값으로검증 표본 5건 미만이면 수동 기본값 유지
① 수준 편향지속적 과대/과소 예측항목별 평균 오차 ē_c × m/(m+5) 를 예측에 가산 (m = 채점 건수)±1.5%p 캡
② CI 배율신뢰구간의 정직성표준화 오차 |z|의 95분위 ÷ 1.96 을 부채꼴 폭에 곱함[0.7, 2.0] 범위 제한
실제로 무엇이 학습되었나 (문서 기준일): 급변했던 대통령 지지율은 짧은 기억(λ=5)이, 완만한 정당 지지도와 관측이 성긴 차기주자·당대표는 긴 기억(λ=21)이 역사적으로 가장 정확했습니다 — 주제별로 다른 λ가 자동 선택된 것이 이 구조의 첫 성과입니다. 또한 과거 95% CI의 실제 적중률이 54~88%에 그쳐 부채꼴이 1.46~2.0배 자동 확대되었습니다.

보정은 파라미터를 바꿀 때마다(λ 슬라이더, 기관 보정 토글 등) 현재 설정 기준으로 재도출되며, "자동 보정 상태" 카드에 적용값이 항상 공개됩니다.

9. 검증 성적 스냅샷 (빌드 2026-08-11 기준 — 실시간 값은 각 페이지 T+7 검증 탭)

주제기본 상태 (보정 적용)보정 해제 시h=13 CI 적중1위발표 기준
MAECI 적중MAECI 적중OFF → ON적중
대통령 국정수행
73폴 · λ*=5
2.0470.9913.6090.8390.71 → 0.980.679충족
정당 지지도
84폴 · λ*=16
1.1460.9651.5050.8680.77 → 0.8580.842충족
차기 대선주자
22폴 · λ*=21
3.1510.7163.060.6630.673 → 0.730.645참고
민주당 당대표
29폴 · λ*=16
3.3060.8153.5780.7040.717 → 0.7680.758참고

측정 방법 — 각 날짜를 오리진으로 잡아 그 시점까지의 데이터만으로 T+h를 예측하고, 대상일 ±1일의 실제 조사(표본 가중 평균)와 대조하는 walk-forward입니다. 표의 수치는 이 페이지들의 검증 탭과 같은 코드를 빌드 시점에 실행해 얻은 값입니다 (산출 2026-08-11 19:30).

읽는 법 — ① CI 적중이 0.95를 크게 넘는 것은 잘 맞혔다는 뜻이 아니라 구간이 넓다는 뜻입니다(보수적). ② 기관·조사방식 보정은 2026-08-10부터 기본 적용입니다. 위 성적이 그 근거입니다 — 보정을 끄면 오차가 커지고, 특히 h=13(8월 17일 민주당 전당대회까지의 지평)에서는 구간 자체가 무너집니다(대통령 0.73 → 보정 시 0.98). 각 페이지 상단 버튼으로 언제든 끄고 원자료 기준을 볼 수 있습니다. ③ 발표 기준은 대통령·정당에만 적용합니다(MAE≤3.0%p, CI≥0.80). 차기주자·당대표는 관측이 희소하고 국면 변동이 커 같은 잣대를 대면 왜곡이라 참고 지표로 둡니다. 미달 항목도 그대로 싣습니다.

10. 한계와 주의사항

11. 운영 파이프라인과 버전 기록

주간 갱신 사이클: 여심위 정례조사 수집·파싱 → 정제(코드 병합·플래그) → 빌드 스크립트 1회 실행 ├─ 직전 "열린 예측"(예: 7/2→7/9) 자동 채점 → 검증 성적·보정 루프에 편입 ├─ house/mode effect · σ 재계산 → 페이지에 정적 임베드 └─ 새 기준일+7 예측 게시 (정적 HTML 5장 업로드로 배포 완료)

페이지는 외부 API 없이 자기완결형 정적 HTML이며(차트 라이브러리 제외), 모든 시뮬레이션·검증·보정은 브라우저 안에서 실시간 계산됩니다.

버전 기록

날짜내용
2026-07-04v1 공개: 4개 주제 페이지 + 허브. 시간감쇠 베이지안 나우캐스트 + T+7 예측층 + 백테스트 재생 + 기관(tier·HE) 보정
2026-07-04조사방식(ARS/면접) 효과 보정 추가 — 방식→기관 계층 분해로 이중 보정 방지
2026-07-04예측 앵커를 데이터 기준일+7로 고정(채점 가능한 예측) · 롤링 T+7 검증 탭 · 3중 자동 보정 루프(λ 자동 선택 / 수준 편향 / CI 배율)
2026-07-04구간별 예측 vs 실측 상세 표 추가 (오리진 단위 편차 전수 공개)
2026-07-05본 개발 문서 공개
2026-07-05합성패널(10k 쿼터 패널) 나우캐스트 탭 추가 — 세그먼트 T+7은 부가가치 게이트 미통과로 보류
2026-07-15/survey2 공존 배포: 신규 13폴(~7/11) 반영, v2 자동수집 파이프라인 1차 병합. /survey 원본은 7/5 상태로 동결(트랙레코드 보존)
2026-07-2916폴 추가(~7/25, 총 67폴): PDF 뒤늦게 게시된 4폴 부활, 파서 오독 수동 교정(여론조사꽃 신형 결과표·리서치웰·갤럽), 지역조사 오등록 1건 차단. 당대표 수동 추출 3건
2026-07-29M7 실전 채점 1회차(7/15 예측 vs 7/18 실측): 95% CI 적중 5/5 · MAE 2.33%p — CI 배율 자동 보정이 실전 검증됨
2026-07-29운영 자동화: 여심위 수집 일 2회 자동화 + 원커맨드 갱신 스크립트(export→검증→빌드→배포) 도입, 재실행 안전(멱등) 검증
2026-07-29합성패널 주간 갱신 재가동(컷오프 7/25, 타깃 8/1) · 운영 현황 페이지(pipeline.html) 공개
2026-07-29당대표 로스터 5명 확장(고민정·김보미 분리 표기 — 조사기관 5인 보기 체제 반영) · 합성패널 탭에 쿼터 구성표 추가 · 패널 크로스탭 공급 재개
2026-07-29당대표 사퇴 시나리오 시뮬레이터 공개 — 7/23 컷오프(고민정·김보미 탈락) 기본 반영, 후보별 사퇴 시 표 이동을 실측 2순위 조사(미디어토마토 193차 교차표5·6) 기반 전이 행렬로 재추첨(전이율 불확실성 Dirichlet 전파)
2026-08-10상류 파서 근본 수정 — 결과표 PDF가 등록 며칠 뒤 올라오는 조사(여심위의 정상 절차)가 영구히 파싱되지 않던 버그를 고쳤습니다. 7·8월에 세 번 재발했고 그때마다 DB를 손으로 되돌렸을 뿐 원인은 남아 있었습니다. 이제 PDF가 확보되면 스스로 파싱 대기로 복귀합니다
2026-08-1015폴 추가 (67→82폴, 기준일 7/25→8/4) — 위 버그로 12일간 멈춰 있던 7/27~8/4 조사를 전부 반영했습니다
2026-08-10PDF 원문 전수 대조 — 파서 오류 11건 교정. 여론조사꽃 ARS·CATI는 당대표 문항(민주지지층 한정)을 정당지지도로 오독, 조원씨앤아이는 지역 소계 행(민주 72.0%)을 전국으로 오독, 리서치웰·한길리서치는 정당지지도 표 자체를 누락, 피앰아이는 진보당↔개혁신당 컬럼이 뒤바뀜. 다단 헤더는 표 격자와 지지정당 교차표의 표본수로 컬럼을 교차 확정했습니다
2026-08-10당대표 19→29폴 — 10개 조사에서 전체 표본 문항만 골라 수동 추출(하위표본 한정 표는 규칙대로 제외). 8/17 전당대회까지 예측이 가능해졌습니다. 민주당 당원 대상 실측(조원 7/27, n=499)도 확보 — 전체 성인에서는 정청래 우위인데 민주+무당층에서는 김민석이 앞서고 당원 표본에서는 41.9 대 41.5로 사실상 동률입니다. 모집단에 따라 결론이 갈리는 문항입니다
2026-08-10웹조사(WEB) 방식 분리 — 웹조사가 ARS로 잘못 기록돼 조사방식 보정이 왜곡되던 문제를 고쳤습니다. 미등록 기관·조사방식은 조용히 넘어가지 않고 반영을 중단시킵니다
2026-08-10예측 성적 자동 산출·공개 (§9) — 각 페이지의 검증 탭과 같은 코드를 빌드 시점에 실행해 MAE·95% CI 적중·1위 적중·Brier를 뽑아 문서에 박제합니다. 손으로 적은 수치가 굳어 있던 이전 방식을 대체했습니다
2026-08-10지평 확장 (h=13) — 8/17 전당대회까지의 지평에서도 성적을 재도록 백테스트를 확장했습니다. 보정 없이는 구간이 무너지고(대통령 0.73) 기관·방식 보정을 켜야 유지됩니다(0.98) — 장기 예측은 보정을 전제로 읽어야 한다는 뜻입니다
2026-08-10전면 공개 — 접속 코드를 없애고 링크 미리보기(OG 카드)를 추가했습니다. 카드의 숫자는 빌드 데이터에서 자동으로 구워집니다
2026-08-10상시 무인 갱신 — 하루 두 번(09:00·19:30) 자동 반영합니다. 이상 수치나 신규 기관이 나오면 반영을 멈추고 기록만 남깁니다
2026-08-10기관·조사방식 보정을 기본 적용으로 전환 — 지금까지는 꺼져 있어 방문자가 보는 예측이 성적이 나쁜 쪽이었습니다. 백테스트가 근거입니다: 대통령 MAE 3.48→2.02, 95% CI 적중 0.858→0.991. 8월 17일 지평(h=13)에서는 보정 없이 구간이 무너지므로(0.734→0.979) 장기 예측에는 사실상 필수입니다. 페이지 상단 버튼으로 언제든 꺼서 원자료 기준을 볼 수 있습니다
2026-08-10허브 카드와 주제 페이지 수치 통일 — 허브는 λ=10 고정·무보정으로 따로 계산해 왔고 페이지는 자동 선택된 λ와 보정을 썼습니다. 실측 결과 정당 지지도에서 허브 43.5% vs 페이지 45.5%로 2%p 어긋나 있었습니다. 이제 허브도 페이지가 실제로 내는 수치를 그대로 싣습니다
2026-08-10당대표: 모집단별 대조 공개 — 이 페이지의 예측은 전체 성인 여론입니다. 정작 당대표를 뽑는 사람은 당원·대의원이라, 같은 조사(조원씨앤아이 7/25~27) 안에서 층위를 나눠 물은 결과를 나란히 실었습니다. 전체 성인에서는 정청래(31.3 대 25.1)가, 민주당 지지층+무당층에서는 김민석(36.6 대 34.3)이 앞서고, 당원 표본에서는 41.9 대 41.5로 사실상 동률입니다. 전체 여론 예측을 전당대회 결과 예측으로 읽으면 안 됩니다