방법론16분 읽기
Reble의 민주당 권리당원 합성패널 4,433명은 어떻게 만들어지고, 어떻게 선거를 예측하는가
152만 권리당원을 대표하는 4,433명의 가상 유권자에게 1만 5,000번 투표를 물었다. 패널이 어디서 왔는지, 무엇으로 반응하는지, 그리고 그 예측이 어떻게 채점되는지의 전부.
목차
현재 실제 후보의 이름과 시뮬레이션 전제는 현재(8/11)까지 선거결과를 전제로 했습니다.
이 Reble 시스템을 가장 쉽게 설명하면 다음과 같다.
실제 권리당원 152만여 명을 통계적으로 대표하도록 만든 4,433명의 가상 유권자에게, 누가 투표에 참여하고 누구를 선택할지를 1만 5,000번 반복해서 물어보는 선거 시뮬레이션 시스템이다.
여기서 중요한 점은 합성패널이 실존 인물을 복제한 것이 아니라는 것이다. 실제 사람의 개인정보를 모아 만든 명단이 아니라, 인구통계와 여론조사에서 관찰된 분포를 결합해 만든 통계적 시민 모델이다.
이 문서는 이 4,433명의 합성패널이 어디서 왔는지, 한 명의 합성패널이 어떤 정보로 구성되는지, 선거 상황에서 어떤 방식으로 반응하는지, 그리고 그 예측이 어떻게 검증되는지를 설명한다. 문서에 사용된 수치는 예시가 아니라 2026년 8월 11일 당시 시스템에서 실제로 산출된 값이다.
1. 출발점은 4,433명이 아니라 79만 4,000명이다
합성패널의 출발점은 통계청 인구총조사 마이크로데이터다.
먼저 통계청 자료를 이용해 대한민국 인구구조를 닮은 79만 4,000명의 가상 개인(기존 Reble의 한국 통계적 합성인구)을 만든다. 이들에게는 지역, 성별, 연령, 학력, 직업, 소득, 혼인 여부, 출신 지역 같은 인구통계적 속성이 들어간다.
하지만 인구총조사에는 "어느 정당을 지지하는가", "이념적으로 진보인가 보수인가", "투표에 얼마나 적극적인가" 같은 정치적 속성이 없다. 따라서 KOSSDA 학술조사에 포함된 1만 1,476명의 응답 데이터를 학습한 그래디언트 부스팅 모델을 이용해 각 가상 개인에게 정치적 성향을 예측해 부여한다.
다만 이 예측값을 그대로 사용하지는 않는다. 정치 상황은 시간이 지나면서 변하기 때문이다. 그래서 특정 시점에 발표된 실제 여론조사 결과와 가상 인구의 정당 지지율이 일치하도록 raking, 즉 반복 비례 조정을 한다.
이 과정을 거쳐 79만 4,000명 중에서 지역·성별·연령을 대표하는 약 1만 명의 쿼터 패널을 추출한다. 실제 산출된 패널은 1만 249명이었으며, 이 가운데 더불어민주당 지지층에 해당하는 4,433명을 전당대회 시뮬레이션의 기본 패널로 사용했다.
마지막으로 이 4,433명이 실제 권리당원 152만 7,261명의 지역·성별·연령 구조를 대표하도록 각 사람에게 서로 다른 가중치를 부여한다. 따라서 합성패널 한 명이 실제 권리당원 한 명을 의미하는 것은 아니다. 어떤 합성패널은 수백 명을 대표하고, 어떤 합성패널은 그보다 적은 사람을 대표한다.
정리하면 다음과 같은 흐름이다.
통계청 인구구조
↓
79만 4,000명의 합성인구 (Reble 합성모델)
↓
정치성향 예측 (KOSSDA 1만 1,476명 학습)
↓
최신 여론조사로 재보정 (raking)
↓
약 1만 명 쿼터 패널 (실산출 1만 249명)
↓
민주당 지지층 4,433명 추출
↓
권리당원 152만 7,261명의 구조로 재가중
2. 모든 데이터가 똑같이 신뢰되는 것은 아니다
이 Reble 시스템은 자신이 가진 정보를 모두 같은 수준으로 취급하지 않는다.
성별, 연령, 시군구, 학력, 직업, 소득, 혼인 여부처럼 인구총조사에서 직접 확인할 수 있는 정보는 A등급이다. 비교적 안정적으로 신뢰할 수 있는 데이터다.
지지정당은 2026년 7월 리얼미터 조사에 맞춰 다시 조정됐으며 B₁등급으로 분류된다. 실제 조사와의 평균 오차가 0.15%포인트로 작기 때문에 주력 정보로 사용한다.
이념 성향은 2026년 4월 갤럽 조사에 맞춰졌지만 오차가 상대적으로 크기 때문에 B₂등급이다. 화면에 표시하거나 전체 경향을 이해하는 데는 사용할 수 있지만, 반드시 맞춰야 하는 강제 조건으로 사용하지는 않는다.
정치 관심도와 투표 의향은 2024년 총선 데이터를 기반으로 하기 때문에 B₃등급이다. 시간이 지난 정보이므로 절대적인 투표율을 계산하는 데 사용하지 않고, "누가 상대적으로 더 투표에 적극적인가"라는 순서만 활용한다.
가중치, 권역 구분, 시뮬레이션 상태처럼 파이프라인에서 계산된 값은 C등급으로 별도 관리한다.
즉 이 시스템은 모든 정보를 사실처럼 단정하지 않고, 직접 측정된 정보, 최근 조사에 맞춘 정보, 오래된 정보, 계산으로 만들어진 정보를 구분해 사용한다.
3. 합성패널 한 명은 22개의 속성을 가진다
합성패널 한 명은 데이터베이스에서 22개의 속성을 가진 한 줄의 데이터로 존재한다.
여기에는 지역, 연령대, 성별, 이념 같은 화면 표시용 정보가 있고, 후보별 선택확률, 투표 참여 성향, 모집단 가중치처럼 실제 계산에 사용하는 정보가 있다.
하지만 전당대회 시뮬레이션이 핵심적으로 사용하는 것은 세 가지다.
첫째는 후보 선택확률 b다. 각 합성패널이 김민석·정청래·송영길 후보를 선택할 확률이다.
둘째는 투표 참여점수 z다. 해당 합성패널이 다른 사람보다 상대적으로 투표에 적극적인지 소극적인지를 나타낸다.
셋째는 가중치 w다. 이 합성패널이 실제 권리당원 모집단에서 몇 명을 대표하는지를 나타낸다.
나머지 속성은 이 결과가 왜 나왔는지를 추적하거나, 화면에서 지역·연령·성별별 결과를 보여주는 데 사용한다.
4. 가장 중요한 작업은 표본과 실제 선거인단의 차이를 바로잡는 것이다
원래 추출된 민주당 지지층 표본은 상대적으로 젊고 수도권에 많이 분포한다. 그러나 실제 권리당원 선거인단은 이와 다르다.
특히 실제 권리당원 중 호남의 비중은 약 33%에 이른다. 반면 원래 표본에서 호남은 약 17%에 불과했다. 따라서 호남에 속한 합성패널의 가중치를 평균적으로 약 1.94배 높이고, 과도하게 포함된 수도권 표본의 가중치는 낮춰야 한다.
이처럼 원래 표본과 실제 선거인단 구조가 반대 방향으로 나타나는 문제를 재가중으로 바로잡는다.
지역별 권리당원 수는 비교적 확실하게 공개돼 있기 때문에 강하게 맞춘다. 서울과 경기는 합쳐서 38.4%, 호남은 33.0%, 충청은 10.7%, 부산·울산·경남은 6.5%, 강원·대구·경북은 4.7%, 인천은 3.7%, 제주는 2.9%가 되도록 조정한다.
인천까지 포함한 전체 수도권은 약 64만 3,730명으로 전체의 42.1%를 대표한다. 호남은 약 50만 4,725명으로 33.0%, 충청은 약 16만 3,792명으로 10.7%를 대표한다. 전국 성별 구성은 남성 약 44.5%, 여성 약 55.5%로 계산됐다.
5. 공개되지 않은 연령구조는 하나의 정답으로 가정하지 않는다
권리당원의 지역별 숫자는 공개되어 있지만, 정확한 연령별 구성은 공개돼 있지 않다.
이 시스템은 이 빈칸을 임의의 숫자 하나로 채우지 않고 세 가지 시나리오를 동시에 운영한다.
시나리오 A는 민주당 지지층의 연령구조가 권리당원의 연령구조와 비슷하다고 가정한다. 세 시나리오 중 가장 젊은 구성이다.
시나리오 B는 실제 권리당원 응답자 499명이 포함된 조사에서 관측된 연령구조를 사용한다. 50대와 60대의 비중이 높아 가장 고령화된 시나리오다. 다만 무선 ARS 조사(ARS 여론조사 참조)라는 편향 가능성도 함께 기록한다.
시나리오 C는 연령별 민주당 지지율과 인구총조사 분포를 이용해 권리당원의 연령구조를 역산한 것이다. A보다 고령이고 B보다는 중간에 가까운 구성이다.
평소 화면에 보여주는 기본 결과는 A·B·C를 동일한 비중으로 섞은 값이다. 그리고 실제 개표 결과가 나오면 어떤 연령 시나리오가 현실을 더 잘 설명했는지를 계산해 시나리오의 가중치를 다시 조정한다.
즉 시스템이 미공개 정보를 억지로 맞혔다고 주장하는 것이 아니라, 가능한 세 가지 가설을 동시에 유지하고 실제 결과가 어느 가설을 지지하는지 사후에 판정하는 구조다.
6. 합성패널은 여섯 단계로 반응한다
시뮬레이션이 시작되면 합성패널 한 명 한 명은 여섯 개의 반응함수를 거친다.
쉽게 말하면 Reble 시스템은 각 합성패널에게 다음과 같은 질문을 던진다.
"투표에 참여할 것인가?"
"참여한다면 누구를 선택할 것인가?"
"이 사람의 속성만으로 설명되지 않는 지역적 차이는 무엇인가?"
"아직 개표되지 않은 지역의 결과는 어느 범위에 있을 것인가?"
"과반이 나오지 않으면 3위 표는 어디로 이동할 것인가?"
"특정 집단에 변화가 생기면 전체 결과는 얼마나 움직이는가?"
6-1. 첫 번째 함수: 누가 투표하러 나오는가
투표 참여확률은 기본적으로 연령대별 투표 의향과 지역별 투표율을 결합해 계산한다.
연령은 참여곡선의 모양을 결정한다. 예를 들어 2024년 총선 데이터에서는 60대의 투표 참여 성향이 가장 높고, 18∼29세의 성향이 가장 낮게 나타났다.
하지만 이 값은 오래된 B₃등급 데이터이기 때문에 절대적인 투표율로 사용하지 않는다. 단지 60대가 20대보다 상대적으로 더 적극적이라는 순서 정보만 사용한다.
실제 투표율의 수준은 지역별 절편이 결정한다. 이미 투표가 완료된 충청, 부산·울산·경남, 제주, 인천, 강원·대구·경북의 실측 투표율과 정확히 일치하도록 지역별 절편을 조정한다.
이 과정을 거치면 완료된 5개 권역의 투표율 재현 오차는 0.0000%포인트가 된다. 아직 투표하지 않은 지역은 예상 투표율을 먼저 추첨한 뒤 그 값에 맞는 지역 절편을 다시 계산한다.
6-2. 두 번째 함수: 투표한다면 누구를 선택하는가
각 합성패널은 처음부터 후보 선택확률을 가지고 있다. 이 확률은 KOSSDA 조사 데이터를 학습한 정치성향 모형에서 출발한다.
그러나 이것도 그대로 사용하지 않는다. 6월부터 8월까지 수집한 당심 여론조사 15건의 연령별·정당별 교차표에 맞춰 개인별 선택확률을 반복적으로 조정한다.
이때 관측된 표본이 많은 집단은 조사 결과를 강하게 반영하고, 표본이 적은 집단은 약하게 반영한다. 또한 한 번의 조정으로 개인 확률이 1.5배 이상 급격하게 변하지 못하도록 제한한다.
이를 감쇠 IPF라고 부른다.
여론조사에서 "아직 결정하지 않았다"고 답한 사람도 실제 투표지에서는 반드시 한 후보를 선택해야 한다. 그래서 유보층 확률은 제거하고 나머지 후보들에게 비례해 나눠준다.
마지막으로 전체 후보 지지율이 실제 당심 조사의 상단 결과와 일치하도록 맞춘다. 그 결과 당심 조사 재현 오차는 평균 2.9%포인트다. 정당별 앵커를 사용하지 않으면 오차가 6.1%포인트로 커지고 후보 순위까지 바뀔 수 있었다.
즉 개인의 원래 성향을 완전히 지워버리는 것이 아니라, 개인의 사전확률을 유지하면서 실제 여론조사가 관측한 방향으로 서서히 끌어당기는 방식이다(Reble 알고리즘).
6-3. 세 번째 함수: 인구구성으로 설명되지 않는 지역 차이를 반영한다
성별, 연령, 정치성향이 같은 사람이라도 지역에 따라 실제 투표 결과가 달라질 수 있다.
시스템은 먼저 합성패널의 인구구성만으로 각 지역의 후보 격차를 예측한다. 그리고 실제 개표 결과와 패널 예측의 차이를 계산한다. 이 차이가 지역 보정값 δ다.
결과적으로 패널의 인구구성은 지역 간 차이를 충분히 설명하지 못했다. 지역 격차의 원래 산포가 5.87%포인트였는데, 인구구성을 반영한 뒤에도 잔차가 5.40%포인트 남았다.
예를 들어 제주에서는 패널이 김민석 후보의 우위를 약 2.58%포인트로 예상했지만, 실제 결과는 12.75%포인트 우위였다. 약 10.17%포인트가 인구구성만으로 설명되지 않는 제주 고유의 지역 효과로 남았다.
이는 인구통계 변수만으로 설명되지 않는 지역 특수성이 존재함을 의미하며, 시스템은 이 설명력의 한계(잔차 5.40%포인트)를 유효한 불확실성 범위로 모델에 반영한다.
6-4. 네 번째 함수: 아직 공표되지 않은 지역은 하나의 숫자가 아니라 분포로 예측한다
호남과 서울·경기처럼 아직 투표 결과가 나오지 않은 지역은 "김민석이 몇 퍼센트포인트 앞선다"는 하나의 숫자로 존재하지 않는다.
대신 평균과 불확실성을 가진 확률분포로 존재한다.
호남 예측에는 합성패널이 계산한 결과와 여러 조사 신호가 함께 들어간다. 민주당·무당층 조사, 당원 조사, 지역 권리당원 조사 등 여덟 개 신호가 사용된다.
표본이 크고 신뢰도가 높은 조사는 더 큰 영향력을 갖고, 표본이 작고 오차가 큰 조사는 적은 영향력을 갖는다. 이를 분산의 역수로 가중하는 정밀도 결합이라고 한다.
그 결과 호남의 김민석−정청래 격차는 5장의 연령 시나리오마다 조금씩 다른 분포로 만들어졌다. 시나리오 A는 평균 +11.46%포인트, B는 +12.40%포인트, C는 +12.29%포인트이고, 표준편차는 셋 다 5.1∼5.4%포인트다. 세 시나리오를 같은 비중으로 섞어 몬테카를로를 1만 5,000번 돌리면 중앙값 +12.1%포인트, 90% 예측구간 +3.5∼+20.6%포인트가 된다. 8장에서 채점 대상으로 동결한 값이 바로 이 합친 분포다.
서울·경기는 세 시나리오 모두 −0.3%포인트 안팎으로 계산돼 사실상 동률을 중심으로 한 분포다. 합친 분포의 중앙값은 −0.34%포인트, 90% 예측구간은 −8.9∼+8.4%포인트다.
아무리 많은 조사 신호를 결합하더라도 불확실성을 지역 잔차인 5.40%포인트보다 지나치게 작게 만들지 않는다. 여러 조사를 모았다는 이유로 모형이 과도하게 자신감을 갖는 것을 막기 위한 장치다.
6-5. 다섯 번째 함수: 과반이 나오지 않으면 3위 표는 어디로 이동하는가
1차 투표에서 과반 득표자가 없을 경우, 3위 후보(현재 누적 실측 기준 송영길 후보)의 표가 1·2위 후보에게 이양되는 선호투표제 방식을 적용한다.
관련 조사 14건을 분석한 결과, 송영길 후보 지지층 중 김민석 후보에게 이동하는 비율은 약 57%에서 80% 사이로 관측됐다.
따라서 시뮬레이션은 매번 이 구간에서 하나의 값을 무작위로 뽑는다. 어떤 시뮬레이션에서는 60%가 김민석 후보에게 이동하고, 다른 시뮬레이션에서는 75%가 이동한다. 나머지는 정청래 후보에게 이동한다.
초기 설계에서는 45∼60%를 사용했지만, 추가 조사자료를 확보한 뒤 실제 증거 범위인 57∼80%로 수정했다.
이것은 모형이 처음 정한 숫자를 고집하지 않고, 새로운 증거가 들어오면 가정 자체를 변경하고 변경 사유까지 기록하는 방식을 보여준다.
6-6. 여섯 번째 함수: 특정 집단의 마음이 움직이면 결과가 얼마나 변하는가
민주당 당대표 시뮬레이션에서는 특정 지역·연령·성별 집단의 후보 선택확률을 변화시키는 개입 실험을 할 수 있다.
예를 들어 "호남 50대에게 정청래 후보의 설득 효과가 10포인트 발생했다"고 설정하면, 해당 조건에 맞는 합성패널들의 후보 선택확률이 변한다.
중요한 것은 개입을 적용하는 순서다. 먼저 실제 조사와 지역별 사전분포에 맞춰 기준선을 만든 다음, 그 위에 개입을 적용한다. 따라서 개입 결과는 새로운 절대 예측이 아니라 기준선에서 얼마나 변했는가로 해석해야 한다.
실제 모형에서 호남 50대에게 정청래 후보 +10포인트 개입을 적용했을 때 김민석 후보의 승리확률은 98.2%에서 95.2%로 낮아졌고, 정청래 후보 쪽으로 약 1만 1,153표가 이동하는 것으로 계산됐다.
다만 이것은 모형 안에서의 인과관계다. 현실에서 실제로 같은 설득 활동을 했을 때 반드시 그만큼 이동한다는 인과적 증거는 아니다.
7. 이 모든 불확실성을 1만 5,000번 반복한다
최종 결과는 한 번의 계산으로 나오지 않는다.
시스템은 매 시뮬레이션마다 호남의 후보 격차, 수도권의 후보 격차, 두 지역의 투표율, 국민여론조사의 모집단, 송영길 표의 이양률, 대의원 효과, 권리당원 연령 시나리오를 새로 추첨한다.
그다음 이미 확정된 20만 8,271표와 아직 남은 지역의 예상 득표, 대의원 결과를 합친다. 당원투표 70%와 국민여론조사 30%를 결합하고, 과반 미달이면 송영길 표의 이양을 적용한다.
이 과정을 총 1만 5,000번 반복하면 단일 숫자가 아니라 최종 격차의 분포가 만들어진다.
2026년 8월 11일 문서 기준으로 계산된 결과는 김민석 후보의 최종 승리확률 97.9%, 결선 또는 이양 절차가 발동할 확률 99.9%였다. 최종 격차의 중앙값은 김민석 후보 +5.7%포인트였고, 90% 예측구간은 +1.0%포인트에서 +10.4%포인트였다.
가장 큰 불확실성 요인은 국민여론조사가 어떤 모집단을 대상으로 실시되는지였다. 이 조건 하나가 결과를 약 ±4.5%포인트 움직일 수 있었다.
8. 그러나 97.9%라는 확률은 바로 공개하지 않는다
이 시스템의 중요한 특징은 결과를 계산하는 것보다 결과를 공개할 자격을 얻는 과정에 있다.
예측모형은 여러 개의 검증 게이트를 통과해야 한다.
G0a는 당심 여론조사를 제대로 재현하는지 확인한다. 기준은 평균 오차 3.0%포인트 이하와 최소 10개 조사 사용이다. 실제 결과는 15개 조사를 사용해 2.9%포인트의 오차를 기록했으므로 통과했다.
G0b는 지역·연령·성별 재가중이 목표값과 일치하는지 확인한다. 이 조건도 통과했다.
G0c는 이미 완료된 5개 권역의 실제 투표율을 정확하게 재현하는지 확인한다. 오차 0.0000%포인트로 통과했다.
G1은 웹 시뮬레이터의 자바스크립트 계산과 백엔드 파이썬 계산이 완전히 같은 결과를 내는지 확인한다. 300개 테스트 케이스에서 불일치가 한 건도 없어 통과했다.
G2 백테스트는 기준을 충족하지 못했다. 모형의 중앙값 오차가 6.52%포인트로, 단순 기준모형의 5.90%포인트보다 크게 나왔다. 실제 결과가 예측구간 안에 들어오는 비율은 4개 중 4개로 완벽했지만, 중앙값 정확도 기준을 넘지 못해 G2는 미충족 상태가 됐다.
마지막 G3는 8월 15일 호남 실제 개표 결과를 이용한 실전 채점이다.
사전에 정한 공개 원칙은 명확하다.
G0a부터 G1까지 모두 통과하고, G2 또는 G3 중 하나를 통과해야만 승리확률을 공개한다.
따라서 시스템 안에서는 김민석 후보의 승리확률이 97.9%로 계산됐지만, 과거 데이터를 이용한 자체 검증(G2)을 통과하지 못한 상태에서는 이 수치를 외부에 공개하지 않는다.
대신 실제 결과가 나오기 전에 호남 지역의 예측값을 미리 확정해 둔다. 김민석 후보가 정청래 후보보다 12.1%포인트 앞설 것으로 예측했고, 90% 예측구간은 +3.5∼+20.6%포인트다. 이후 실제 개표 결과와 이 예측을 비교해 모형의 성능을 검증(G3)하도록 설계했다.
9. 이 모델이 스스로 인정하는 한계
이 Reble 합성패널에는 실제 권리당원 여부를 나타내는 변수가 없다. 따라서 "민주당 지지층의 특성이 권리당원의 특성과 비슷하다"는 가정이 들어간다.
권리당원의 정확한 연령과 성별 구성도 공개되지 않았기 때문에 세 가지 시나리오로 처리한다.
국민여론조사의 조사기관과 모집단 역시 명확하지 않으며, 이것이 전체 예측에서 가장 큰 불확실성으로 남아 있다.
온라인 투표와 ARS 투표처럼 투표 채널에 따라 발생할 수 있는 차이도 관측되지 않았다.
여론조사 결과를 실제 투표 결과로 변환할 때 발생하는 오차는 실측 기준으로 약 4∼6%포인트다.
무엇보다 합성 패널은 실존 인물이 아니다. 통계적 분포를 보존하도록 만들어진 가상 개인이다. 개입 실험에서 나타나는 효과 역시 현실에서 입증된 인과가 아니라, 현재 모형 안에서 계산되는 변화다.
결론
Reble 합성패널 시스템은 단 하나의 정답을 확정하는 결정론적 예측 도구가 아니다. 관측된 데이터와 불확실성을 종합하여 확률적 가능성을 제시하는 데이터 과학 모델이다.
실제 인구구조와 여론조사 데이터를 이용해 4,433명의 가상 권리당원을 만들고, 각 합성패널에게 투표 참여확률과 후보 선택확률을 부여한 뒤, 지역 효과와 조사 오차, 투표율, 연령구조, 표 이양 같은 불확실성을 매번 다르게 추첨해 선거를 반복 실행하는 시스템이다.
그리고 그 결과를 단순히 "승리확률 97.9%"라고 보여주는 데서 끝나지 않는다.
어떤 데이터가 실측이고 어떤 데이터가 예측인지, 어떤 정보가 공개되지 않아 가정으로 남아 있는지, 모형이 어디까지 설명했고 어디에서 실패했는지, 실제 결과가 나오면 무엇을 기준으로 채점할 것인지를 모두 기록한다.
따라서 이 합성패널의 핵심은 정답을 단정하는 데 있지 않다.
관측된 사실과 가정, 개인별 확률과 지역별 불확실성을 하나의 계산 체계로 조립하고, 그 예측을 실제 개표 결과 앞에 미리 동결해 채점받도록 만드는 것.
어떤 조건이면 당선확률이 높아지는 합성패널로 시뮬레이션 하는 것.
그것이 이 4,433명의 권리당원 합성패널이 만들어진 이유다.