의왕시의회 의원 박현호

의왕에서, 시의원을 하고 있습니다.

정보 모음/의정활동

회귀분석을 활용한 2024년 총선 데이터 분석(경기도)

박현호의원 2024. 4. 13. 06:47

아직 바쁠 여러분께

 

후보자들과 정당은 선거가 끝나도 아직 바쁘다.

 

선거 회계를 마감해야 하고, 개표결과를 보고 지난 선거활동을 회고해야 한다.

 

도당에서는 양식을 나눠주며, 지난 선거와 결과를 비교하여 득표결과를 모은다.

 

당협(또는 지역위)에서는 이러이러한 이유에서 결과가 이렇게 나왔다고 보고서를 작성하여 도당에 올려보낸다.

 

 

득표율엔 변수가 너무 많아

 

하지만 득표율엔 변수가 너무 많다. 소위 바람이라고 하는 정당지지율은 시시각각 변한다. 선거 이슈, 유력 정치인의 말 한마디로 널뛰기 한다.

 

후보자의 역량 또한 변한다. 지난 선거때 나온 후보자가 그대로 나온다 하더라도, 그 후보자가 성장했을지 아니면 지역에서 평판이 안좋아졌을지 또한 평가하기 어렵다.

 

각 선거구의 후보자끼리 비교하자니 너무 각양각색이라 비교하기 어렵다. 비교 기준을 만들기도 어렵다.

 

이 선거 결과, 바람(정당 지지율) 때문일까? 후보자(후보자의 개인기) 때문일까?


난 이 질문에 대한 해답을 나름대로 찾고싶었다.

 

내가 아는 짧은 지식을 바탕으로 머리를 굴려보니, 선형회귀의 도움을 받으면 좋겠다는 생각이 들었다.

 

 

방법론과 한계

 

방법은 다음과 같다.

1. 지역구 득표율과 비례대표 정당 득표율을 선형회귀한다.
  - 비례대표 정당 득표율에 따라, 지역구 득표율이 얼마나 나올지 예측하는 선이 나온다.
 ex) 비례대표 득표율이 40%니, 지역구 득표율 n%이 나올 것이다

2. 해당 결과와 실제 지역구 득표 결과를 비교한다.

 

받았어야할 점수와 실제로 받은 점수를 비교하면, 각 후보자들이 정말 열심히 했는데 결과가 안 좋았는지( 개인 득표율 > 비례 득표율) 아니면 정당 덕을 많이 봤는지(정당 득표율 > 개인 득표율)을 짐작할 수 있다.

 

한계는 다음과 같다.

 

1. 경기도만 분석했다.

2. 지역구 후보자가 둘 이상인 지역이 있다. 특히 쟁쟁한 제3의 후보자가 있는 지역도 있다.

3. 비례대표 정당은 다양하다. 특히, 조국혁신당의 출현으로 민주당 비례 표가 갈라졌다.

4. 당연하게도, 후보자의 영향으로 지지 정당을 바꾸는 경우도 많다.

-  이 분석에서는 지역구 득표를 종속변수로, 비례대표 득표를 독립변수로 뒀다.

 

시간과 에너지의 한계로, 더불어민주당과 국민의힘 두 정당의 지역구 후보자에 대하여만 분석했다.

 

조국혁신당과 더불어민주연합의 득표율을 합산하여, "합계 민주당 득표율"로 계산했다.(조국혁신당 투표자는 "지민비조"를 지킨다고 가정)

 

데이터의 수집과 정제

 

중앙선거관리위원회 선거통계시스템에 있는 개표단위별 개표결과 및 개표진행상황(사실상 개표결과)를 활용했다.

 

문제는 지역구 개표 결과는 지역구대로 나와있지만, 비례대표 개표결과는 기초자치단체 및 구(일반구) 기준으로 나와있다는 것이다.

 

하나의 기초자치단체가 선관위 내에서는 두 자치단체로 쪼개진 경우도 있었다.(화성시)

 

국회의원 선거구를 기준으로, 비례대표 개표결과를 읍면동별로 일일히 추려내야 했다.

 

5시간 걸렸다.

 

그 결과 아래와 같은 table을 생성했다.

local minju people minjusum_birye people_birye
고양시갑   45.3 35.34 50.99 33.09
고양시병   54.06 45.93 52.09 35.16
고양시을   61.24 37.33 55.03 31.32
고양시정   54.89 45.1 53.51 34.29
광명시갑   58.73 41.26 53.79 34.2
광명시을   59.56 40.43 55.66 31.69
광주시갑   56.33 43.66 54.66 34.65
광주시을   55.06 44.93 53.85 35.09

 

 

데이터 분석

 

scikit learn 의 LineaRegression 을 활용하여 단순선형회귀를 돌렸다.

import pandas as pd
from sklearn.linear_model import LinearRegression

# read data
df = pd.read_csv("./whole_data.csv")

lr = LinearRegression(fit_intercept=True)
X = df[['people_birye']]
Y = df['people']
lr.fit(X.values.reshape(-1,1), Y)

 

from sklearn.metrics import r2_score

# R² 계산
r2 = r2_score(Y, lr.predict(X.values.reshape(-1,1)))
print("R²:", r2)

 

국민의힘 data에 대한 R² 값은 0.786 정도가 나왔다. 만족할만한 설명도다.(모델이 현실의 78%가량을 설명함)

민주당 data의 R² 값은 0.582 수준이다. 별로 좋게는 안 나왔다.

 

 

import matplotlib.pyplot as plt 

#한글폰트 설정
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False


plt.plot(X, Y, 'o')
plt.plot(X, lr.predict(X.values.reshape(-1,1)))
plt.title("국민의힘")
plt.xlabel("비례득표율")
plt.ylabel("지역구득표율")
plt.show()

 

pyplot으로 그려보면  아래와 같다. 

 

 

 

 

 

분석 결과

 

 

 

 

2024 경기도 총선 결과 분석 (2024. 4. 13. 의왕시의회 의원 박현호).pdf
0.09MB

 

 

비록 낙선해서 빛은 못봤을지 모르지만, 정말 누가 그 파도 속에서 끝까지 선전했는지 보였다.

 

아무리 그 지역이 어려운 곳이었더라도 알고 도전해서 최선을 다한 사람들의 결과가 보였다.

 

졌지만 잘싸웠다고 몇분께는 따로 연락드려야겠다.

 

 

반응형