방법론10분 읽기
여론 추적 — 7일 뒤를 예측하고 스스로 채점하는 방법
여심위 정례조사 38건을 하나의 베이지안 분포로 합쳐 7일 뒤를 예측하고, 새 조사가 오면 자동으로 채점한다. 출범 시점 성적은 정당 MAE 1.7%p, 대통령 3.8%p.
목차
Reble.ai는 현실 세계를 반영하는 동적 사회 시뮬레이션 엔진이다. 그 엔진이 매주 공개 채점을 받는 자리가 하나 더 생겼다. 오늘부터 reble.ai에서 전국 여론의 7일 뒤를 확률 분포로 예측하고, 실제 조사가 나오는 순간 그 예측을 자동으로 채점하는 여론 추적(T+7 예측) 을 연다. 대통령 국정수행 평가, 정당 지지도, 차기 대선주자 선호도, 민주당 당대표 선호도 — 네 문항이다.
왜 지금인가. 여론조사는 매주 쏟아지지만 어느 것도 채점되지 않는다. 지난주 조사와 이번 주 조사가 3%p 다르면 그것이 여론의 변화인지 기관의 차이인지 방식의 차이인지 아무도 답하지 않는다. 조사를 전부 모아 하나의 분포로 읽고, 그 분포로 미래를 말하고, 미래가 오면 틀린 만큼을 기록하는 장치가 있어야 이 질문에 답할 수 있다.
이 글이 답하는 질문은 하나다. 공표된 여론조사만으로 7일 뒤를 예측하고, 그 예측을 스스로 채점하는 장치는 어떻게 만드는가. 읽고 나면 이 서비스가 숫자를 어떻게 합치고, 어떻게 앞으로 밀고, 어떤 잣대로 자기 점수를 매기는지 알게 된다.
追記 (2026-09-03) — 이 글은 서비스가 출범한 날짜(7월 4일)로 되돌려 실었다. 이후 두 달간의 기록을 짧게 남긴다. 주소는
/survey에서/survey2로 옮겨졌고(7/15), 8월 10일부터 접속 코드 없이 전면 공개되며 하루 두 번 무인 갱신된다. 통합 조사는 38건에서 112건(19개 기관) 이 됐다. 8월 28일 빌드 기준 성적(h=7, 보정 적용): 대통령 MAE 2.12%p·95% CI 적중 100%, 정당 1.08%p·98.3% — 두 문항 모두 사전 등록한 발표 기준(MAE ≤ 3.0%p, CI ≥ 80%)을 충족한다. 차기 주자(3.11%p·72.3%)와 당대표(3.31%p·81.5%)는 관측이 성기어 참고 지표로 둔다. 7월 15일 예측을 7월 18일 실측으로 채점한 첫 실전 회차는 CI 적중 5/5, MAE 2.33%p였다. 기관·조사방식 보정은 백테스트 근거(대통령 MAE 3.48→2.02)로 8월 10일부터 기본 적용이다. 수치와 절차의 전부는 개발 문서 §9에 빌드마다 자동으로 박제된다.
1. "지금"이 아니라 "7일 뒤"를 말하는 이유
일기예보는 매일 채점당한다. "내일 비 올 확률 70%"라고 말한 다음 날, 비가 왔는지 안 왔는지가 남는다. 그래서 기상청은 자기 예보의 적중률을 안다. 여론조사 보도는 그렇지 않다. "지지율 45%"는 조사가 끝난 시점의 스냅샷일 뿐, 무엇을 예측한 적이 없으니 틀릴 수도 없다. 채점받지 않는 숫자는 주장이지 예측이 아니다.
그래서 이 서비스는 예측 대상일을 데이터 기준일 + 7일에 고정한다. 열람하는 날마다 "오늘+7"로 밀리는 예측은 편리해 보이지만 나중에 맞았는지 확인할 고정된 기록이 남지 않는다. 데이터가 7월 2일까지면 예측은 7월 9일이고, 그 한 장은 새 조사가 들어오는 순간 자동으로 채점 대상이 된다. 모든 주제 페이지의 "T+7 검증" 탭이 이 채점의 누적 장부다.
2. 나우캐스트 — 38건을 하나의 분포로
출발점은 중앙선거여론조사심의위원회에 등록·공표된 전국 정례조사 전수다. 5월 29일부터 7월 2일까지 조사 종료일 기준 38건, 17개 기관의 결과표 PDF를 파싱해 하나의 데이터셋으로 만들었다. 이 과정에서 후보 코드가 기관마다 달라 병합 테이블로 통일했고(오세훈 osh/ojh, 강훈식 ghs/khs), 폰트가 손상된 PDF 4건은 OCR로 읽되 낮은 신뢰도 플래그를 달았으며, 발표 합계가 100%에 못 미치는 조사는 잔여분을 유보 항목으로 귀속했다. 정제 기록은 전부 개발 문서에 남겼다.
모든 조사를 똑같이 평균 내지 않는다. 최근 조사일수록, 표본이 클수록, 기관 등급이 높을수록 무겁게 반영해 "지금 이 순간의 잠재 지지율"의 사후분포를 만든다. 조사 i의 가중치는 다음과 같다.
w_i = exp(−Δt_i / λ) × tier_i × n_i / 25
Δt_i = 데이터 기준일 − 조사일 (일)
λ = 시간감쇠, 기억의 길이 (주제별 자동 선택 — 5절)
tier = 기관 등급 A 1.0 / B 0.85 / C 0.65 (기관 보정 ON일 때)
정당 지지도처럼 항목이 여럿인 문항은 Dirichlet 사후분포로 합친다. 항목 c의 파라미터 α_c = α₀ + Σ w_i × (지지율_c,i / 100)이고, 사전분포 α₀는 2다. 국정수행 평가(긍정/부정/유보)도 같은 3항목 Dirichlet로 다룬다.
표본을 n/25로 깎는 이유가 이 모델에서 가장 중요한 결정이다. 발표 표본 1,000명(오차 ±3.1%p)을 그대로 쓰면 사후분포가 실제 조사 간 편차보다 훨씬 좁아진다. 같은 날 나온 조사도 기관 간에 5~12%p가 벌어지는데, 모델이 ±1%p의 확신을 말하면 그것은 정직하지 않다. 기관효과와 설계효과를 반영해 조사 한 건의 정보량을 1/25로 할인했고, 이 값은 조사 간 실측 분산과 맞도록 정했다.
| 문항 | 조사 수 | 모델 | 항목 |
|---|---|---|---|
| 대통령 국정수행 평가 | 35 | 3-항목 Dirichlet | 긍정 / 부정 / 유보 |
| 정당 지지도 | 38 | 7-항목 Dirichlet | 민주 / 국힘 / 조국혁신 / 개혁신당 / 기타 / 무당층 / 유보 |
| 차기 대선주자 선호도 | 13 | 후보별 독립 Beta + 정규화 | 관측 5회 이상 9명 + 기타 + 유보 |
| 민주당 당대표 선호도 | 14 | 4-항목 Dirichlet | 정청래 / 김민석 / 송영길 / 유보·기타 |
차기 대선주자만 모델이 다르다. 이 문항은 조사마다 제시하는 후보 명단이 달라서, 하나의 Dirichlet에 그대로 누적하면 명단에 자주 빠진 후보가 체계적으로 과소평가된다. 후보마다 그 후보를 실제로 물은 조사만으로 독립 Beta 분포를 만들고, 추첨할 때 유보 버킷과 함께 뽑아 합이 100%가 되도록 정규화한다. 관측이 적은 후보는 구간이 정직하게 넓어지고, 각 후보 옆에 "n/13폴" 배지가 붙는다.
3. T+7 — 추세를 얹고 불확실성을 벌린다
나우캐스트 위에 예측층을 쌓는다. 몬테카를로 반복(기본 5,000회, 최대 5만 회)마다 네 단계를 밟는다.
① 나우캐스트 추첨 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)
④ 클램프 후 합=100% 재정규화 → 항목별 평균 · 95% CI · 1위 확률
σ_c는 항목별 일간 변동성으로 이동평균의 차분에서 추정하고, bias_c와 s는 검증에서 자동으로 얻는 보정값이다(5절). 분산이 h에 비례해 커지므로 예측 부채꼴은 미래로 갈수록 벌어진다. 기본 지평은 7일이고 슬라이더로 0~14일을 볼 수 있지만, 채점되는 기록은 7일 예측이다.
추세를 하루 0.4%p로 묶은 것은 의도적인 보수성이다. 최근 두 조사가 우연히 같은 방향이면 회귀선은 가파르게 서고, 그것을 7일 밀면 없는 흐름을 만들어 낸다. 1위 확률은 추첨 가운데 그 항목이 1위인 비율이며, 국정수행 평가는 P(긍정 > 부정)의 우세 확률로 표시한다.
4. 기관보다 큰 것은 조사 방식이었다
같은 시점의 조사도 기관과 방식에 따라 체계적으로 다른 값을 낸다. 이 격차를 걷어내되 이중으로 걷어내지 않도록 계층적으로 분해한다. 먼저 각 조사의 잔차 r_i를 그 시점의 전체 이동평균(자기 자신 제외)과의 차이로 정의하고, 그 잔차를 두 단계로 나눈다.
1단계 조사방식 효과 mode_eff(방식) = shrunk_mean( r_i | 방식 )
2단계 기관 효과 HE(기관) = shrunk_mean( r_i − mode_eff(방식_i) | 기관 )
shrunk_mean = 평균 × k / (k + 3) k = 관측 수 — 관측이 적은 기관의 추정 폭주를 막는다
이 분해가 데이터에서 드러낸 사실이 이 글에서 가장 실용적인 대목이다. 방식 효과가 기관 편향보다 크다. 전화면접(CATI)은 ARS 대비 국민의힘 −7.0%p, 무당층 +6.4%p, 대통령 긍정 +4.5%p였다. 방식을 차감하고 나면 NBS(+3.2 → +1.4)와 한국갤럽(+2.5 → +0.3)의 이른바 "기관 편향"은 대부분 사라진다 — 실체는 면접 방식의 효과였다. 여론조사꽃은 방식을 차감한 뒤에도 +2.4%p가 남아 진짜 기관 편향(또는 OCR 오류)으로 분류된다.
보정은 기본 OFF고, 각 페이지 상단 토글로 켠다. 원자료 기준의 분포와 보정 후 분포를 둘 다 볼 수 있어야 보정이 무엇을 바꿨는지 독자가 판단할 수 있기 때문이다. House Effect 탭에 항목별 기관 편향과 방식 효과 수치를 그대로 두었다.
5. 검증 계획 — 스스로 채점하고, 오차에서 배운다
예측 글의 규칙대로 채점 방식을 미리 적는다. 채점은 사람이 아니라 페이지가 한다.
- 오리진: 첫 조사일부터 마지막 조사일까지 하루씩 이동한다(조사 5건이 쌓인 뒤 시작).
- 예측: 각 오리진 d에서 d까지의 조사만으로 모델을 적합해 d+7의 평균과 95% CI를 낸다.
- 실측: d+7 ±1일 창의 실제 조사(표본 가중 평균)와 대조한다.
- 지표: MAE(평균절대오차), 95% CI 적중률(목표 95%), 방향 적중률(실측 변화가 0.5%p 이상인 건만 판정).
- 열린 예측: d+7이 데이터 밖인 오리진은 채점 대기이며, 그 마지막 하나가 페이지의 헤드라인 예측이다.
사후분포의 평균과 분산이 닫힌 형태로 나오므로(Dirichlet의 주변분포는 Beta) 몬테카를로 없이 오리진 전체를 즉시 계산한다. 이 엔진은 Python으로 독립 재구현해 소수점 10자리까지 일치함을 확인했다.
| 문항 | MAE | 95% CI 적중 | 선택된 λ | CI 배율 s |
|---|---|---|---|---|
| 대통령 국정수행 | 3.8%p | 83% | 5 | 1.69 |
| 정당 지지도 | 1.73%p | 88% | 21 | 1.46 |
| 차기 대선주자 | 2.72%p | 80% | 21 | 1.66 |
| 민주당 당대표 | 5.47%p | 54% | 21 | 2.0 (상한) |
검증 오차를 보여주는 데서 끝내지 않는다. 오차에서 체계적 성분만 추출해 현재 예측을 보정하는 루프가 셋 있다. 하루치 편차를 그대로 따라가면 조사 노이즈를 학습하게 되므로 모든 루프에 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% 구간의 실제 적중률이 54~88%에 그쳤기 때문에 부채꼴이 1.46~2.0배 자동으로 벌어졌다 — 모델이 자기 과신을 스스로 교정한 첫 기록이다.
보정값은 파라미터를 바꿀 때마다(λ 슬라이더, 기관 보정 토글) 현재 설정 기준으로 다시 도출되며, "자동 보정 상태" 카드에 적용값이 항상 공개된다. 채점 결과가 나쁘면 나쁜 대로 싣는다. 그것이 이 서비스가 여론조사 보도와 다른 단 하나의 지점이다.
마치며
여론 추적은 조사 38건을 하나의 분포로 읽고, 그 분포로 7일 뒤를 말하고, 7일 뒤가 오면 틀린 만큼을 적는 장치다. 방법은 전부 열어 두었다 — 가중치 식, 표본 할인, 방식→기관 분해, walk-forward 채점, 세 개의 보정 루프. 숫자가 맞는지는 이제부터 매주 페이지가 스스로 증명하거나 반증한다.
- 살아 있는 예측과 검증 탭: reble.ai/survey2
- 데이터 정제 기록부터 수식·성적 스냅샷까지: 개발 문서
- 같은 엔진을 선거에 적용한 기록: 시뮬레이션과 선거 결과 비교분석