TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 데이터 분석>

[파이썬] 19대 대선 결과 분석 -2

by 기록자_Recordian 2024. 5. 1.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

이전 분석 내용
 

[파이썬] 19대 대선 결과 분석 -1

시작에 앞서해당 내용은 -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.데이터 획득 준비하기 (Selenium, Beautiful Soup) 본

puppy-foot-it.tistory.com


Beaufiful Soup 으로 필요한 수치 획득하기

 

먼저 BeautifulSoup Import를 하고

from bs4 import BeautifulSoup

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

 

원하는 수치가 위치하는 곳의 태그를 알기 위해 개발자도구를 이용

확인결과 td 태그에서 alignR class 를 확인하면 된다는 것 파악

개발자도구
조회조건은 시도:'전체'

 

하단의 코드를 이용하여 '서울특별시'의 투표수와 당시 후보(문재인, 홍준표, 안철수)의 득표수 획득

tmp = soup.find_all('td', 'alignR')
tmp[2:5]

 

19대 대선 주요 후보 서울특별시 득표수
19대 대선 주요 후보 서울시 득표수

 


19대 대선 개표 결과 데이터 획득하기

 

해당 부분은 교재 집필 당시 사이트와 현재 사이트가 달라졌기 때문에, 교재 내용과 동일한 진행이 어려워서 생략


각 후보의 득표율과 지역 ID 정리하기

 

저자가 교재에서 작성한 csv 파일을 다운로드 받는다 (data 폴더에 저장)

05. election_result.csv
0.01MB

 

다운로드 받은 파일을 불러온다

election_result = pd.read_csv('../data/05. election_result.csv', encoding='utf-8', index_col=0)
election_result.head()

 

투표 결과

 

광역시도 이름 정리

sido_candi = election_result['광역시도']
sido_candi = [name[:2] if name[:2] in ['서울','부산','대구','광주','인천','대전','울산']
              else '' for name in sido_candi]

 

함수 하나를 정의 

'중구', '남구'와 같은 두 글자 이름은 그대로 보내고,

'중랑구', '서초구', '의왕시' 와 같은 입력은 '중랑', '서초', '의왕' 처럼 줄이기 위함

def cut_char_sigu(name):
    return name if len(name)==2 else name[:-1]

변수 정의

 

광역시가 아닌데 행정구를 가지고 있는 '수원' 등의 도시에 대해 '수원 권선' 등과 같이 정리하기 위한 코드 작성

import re

sigun_candi = ['']*len(election_result)

for n in election_result.index:
    each = election_result['시군'][n]
    if each[:2] in ['수원','성남','안양','안산','고양','용인','청주','천안','전주','포항','창원']:
        sigun_candi[n] = re.split('시', each)[0]+' '+cut_char_sigu(re.split('시', each)[1])
    else:
        sigun_candi[n] = cut_char_sigu(each)

sigun_candi

도시명 정리

 

광역시도 이름이 저장된 변수 sido_candi와 sigun_candi를 합치는데, 여기서 sido_candi 변수에서 공란이 있으면 첫 글자가 띄어쓰기 될 수 있어서 첫 글자가 공백인 경우에 대응하도록 코드를 작성. '세종시'는 예외로 처리

ID_candi = [sido_candi[n]+' '+sigun_candi[n] for n in range(0,len(sigun_candi))]

ID_candi = [name[1:] if name[0]==' ' else name for name in ID_candi]
ID_candi = [name[:2] if name[:2]=='세종' else name for name in ID_candi]

ID_candi

시군구 합치는 코드

 

이렇게 만든 ID_candi 변수를 election_result에 합침

election_result['ID'] = ID_candi
election_result.head()

ID 결합

각 후보의 득표율 계산

 

각 후보의 득표수에서 투표자수를 나눠서 득표율을 계산

election_result[['rate_moon','rate_hong','rate_ahn']] = \
            election_result[['moon','hong','ahn']].div(election_result['pop'], axis=0)
election_result[['rate_moon','rate_hong','rate_ahn']] *= 100
election_result.head()

각 후보의 득표율

 

안철수 후보가 높은 비율로 득표한 지역을 확인하면

election_result.sort_values(['rate_ahn'], ascending=[False]).head(10)

 

안철수후보 득표율 순위

 

다음 시간에는 이전에 진행했던 draw_Korea 파일(csv)을 불러와서 전국지도를 그리고 대선득표율을 시각화하는 작업을 진행


다음글

[파이썬] 19대 대선 결과 분석 -3

728x90
반응형