후보자정보를 가져와서 다양한 비교분석 작업을 수행한다.
“성남시 분당구 을”을 선구구를 대상으로 후보자 정보를 추출한다.
[1] "C"
candidate_url <- "http://info.nec.go.kr/electioninfo/electionInfo_report.xhtml?electionId=0020200415&requestURI=%2FWEB-INF%2Fjsp%2Felectioninfo%2F0020200415%2Fcp%2Fcpri03.jsp&topMenuId=CP&secondMenuId=CPRI03&menuId=CPRI03&statementId=CPRI03_%232&electionCode=2&cityCode=4100&sggCityCode=2410702&proportionalRepresentationCode=0&townCode=-1&dateCode=0&x=31&y=9"
candidate_html <- read_html(candidate_url)
candidate_dat <- candidate_html %>%
html_node('table') %>%
html_table(fill = TRUE)
Sys.setlocale("LC_ALL", "Korean")
[1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
candidate_df <- candidate_dat %>%
janitor::clean_names() %>%
slice(2:n()) %>%
names
candidate_df <- candidate_dat %>%
janitor::clean_names() %>%
slice(2:n()) %>%
set_names(c("선거구명", "사진", "기호", "정당명", "성명", "성별",
"생년월일_연령", "주소", "직업", "학력", "경력", "재산",
"병역", "납부액", "체납액", "현체납액",
"전과", "입후보횟수")) %>%
separate(생년월일_연령, into=c("생년월일", "연령"), sep="\\(") %>%
mutate(`연령` = parse_number(`연령`),
재산 = parse_number(재산),
납부액 = parse_number(납부액),
체납액 = parse_number(체납액),
현체납액 = parse_number(현체납액),
전과 = str_remove(전과, "건"),
입후보횟수 = parse_number(입후보횟수)) %>%
mutate(전과 = ifelse(전과 == "없음", 0, 전과) %>% as.integer) %>%
mutate(병역 = case_when(str_detect(병역, "마친사람") ~ "병필",
str_detect(병역, "아니한") ~ "미필",
str_detect(병역, "비대상") ~ "여성"))
candidate_df %>%
select(정당명, 성명, 성별, 연령, 재산, 직업, 병역) %>%
DT::datatable()
“성남시 분당구 을”을 선구구를 대상으로 후보자 정보를 추출한 후 테스트를 통해 다음 단계로 넘어가기 위해서 함수를 제작한다. 즉, 특정 지역구정보를 넣게 되면 후보자 정보를 추출하게 되는 것이다. 중앙선거관리위원회, 선거통계시스템, 후보자 명부 시스템 분석결과 cityCode
, sggCityCode
두개가 중요한 매개변수가 된다. 예를 들어, 서울특별시 종로구의 경우 cityCode
, sggCityCode
가 각각 다음과 같다.
cityCode
: 1100sggCityCode
: 2110101get_candidate_info <- function(cityCode, sgg_CityCode) {
Sys.setlocale("LC_ALL", "C")
candidate_url <- glue::glue("http://info.nec.go.kr/electioninfo/electionInfo_report.xhtml?electionId=0020200415&requestURI=%2FWEB-INF%2Fjsp%2Felectioninfo%2F0020200415%2Fcp%2Fcpri03.jsp&topMenuId=CP&secondMenuId=CPRI03&menuId=CPRI03&statementId=CPRI03_%232&electionCode=2&cityCode={cityCode}&sggCityCode={sgg_CityCode}&proportionalRepresentationCode=0&townCode=-1&dateCode=0&x=31&y=9")
candidate_html <- read_html(candidate_url)
candidate_dat <- candidate_html %>%
html_node('table') %>%
html_table(fill = TRUE)
Sys.setlocale("LC_ALL", "Korean")
candidate_df <- candidate_dat %>%
janitor::clean_names() %>%
slice(2:n()) %>%
names
candidate_df <- candidate_dat %>%
janitor::clean_names() %>%
slice(2:n()) %>%
set_names(c("선거구명", "사진", "기호", "정당명", "성명", "성별",
"생년월일_연령", "주소", "직업", "학력", "경력", "재산",
"병역", "납부액", "체납액", "현체납액",
"전과", "입후보횟수")) %>%
separate(생년월일_연령, into=c("생년월일", "연령"), sep="\\(") %>%
mutate(`연령` = parse_number(`연령`),
재산 = parse_number(재산),
납부액 = parse_number(납부액),
체납액 = parse_number(체납액),
현체납액 = parse_number(현체납액),
전과 = str_remove(전과, "건"),
입후보횟수 = parse_number(입후보횟수)) %>%
mutate(전과 = ifelse(전과 == "없음", 0, 전과) %>% as.integer) %>%
mutate(병역 = case_when(str_detect(병역, "마친사람") ~ "병필",
str_detect(병역, "아니한") ~ "미필",
str_detect(병역, "비대상") ~ "여성"))
return(candidate_df)
}
get_candidate_info(1100, 2110101) %>%
tbl_df
# A tibble: 12 x 19
선거구명 사진 기호 정당명 성명 성별 생년월일 연령 주소 직업 학력
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <chr> <chr> <chr>
1 종로구 "" 1 더불어민주~ 이낙연(~ 남 1952.12~ 67 서울특별~ 정당인~ 서울대학~
2 종로구 "" 2 미래통합당~ 황교안(~ 남 1957.04~ 63 서울특별~ 미래통합~ 성균관대~
3 종로구 "" 7 우리공화당~ 한민호(~ 남 1962.01~ 58 서울특별~ 정당인~ 성균관대~
4 종로구 "" 8 민중당 오인환(~ 남 1973.01~ 47 서울특별~ 정당인~ 경희대학~
5 종로구 "" 9 가자!평화~ 이정희(~ 여 1964.10~ 55 서울특별~ 가자평화~ 고려대학~
6 종로구 "" 10 공화당 신동욱(~ 남 1968.01~ 52 서울특별~ 정당인~ 서울벤처~
7 종로구 "" 11 국가혁명배~ 박준영(~ 남 1937.02~ 83 서울특별~ 국제정치~ 서울대학~
8 종로구 "" 12 국민새정당~ 백병찬(~ 남 1956.04~ 64 서울특별~ 국민새정~ 미기재~
9 종로구 "" 13 기독자유통~ 양세화(~ 여 1982.02~ 38 경기도 ~ 정당인~ 강원관광~
10 종로구 "" 14 민중민주당~ 박소현(~ 여 1991.02~ 29 인천광역~ 정당인~ 고려대학~
11 종로구 "" 15 한나라당~ 김형석(~ 남 1966.04~ 53 서울특별~ 방송통신~ 한국방송~
12 종로구 "" 16 무소속 김용덕(~ 남 1951.01~ 69 전라북도~ 농업 군장대학~
# ... with 8 more variables: 경력 <chr>, 재산 <dbl>, 병역 <chr>, 납부액 <dbl>,
# 체납액 <dbl>, 현체납액 <dbl>, 전과 <int>, 입후보횟수 <dbl>
cityCode
, sggCityCode
cityCode
, sggCityCode
코드를 찾아야 나머지 분석작업을 자동화시킬 수 있다.
## 시도코드
cityCode <- tribble(~"cityCode", ~"cityName",
"1100", "서울특별시",
"2600", "부산광역시",
"2700", "대구광역시",
"2800", "인천광역시",
"2900", "광주광역시",
"3000", "대전광역시",
"3100", "울산광역시",
"5100", "세종특별자치시",
"4100", "경기도",
"4200", "강원도",
"4300", "충청북도",
"4400", "충청남도",
"4500", "전라북도",
"4600", "전라남도",
"4700", "경상북도",
"4800", "경상남도",
"4900", "제주특별자치도")
## 시군구코드
### 서울특별시
sgg_서울 <- tribble(~"sggCityCode", ~"sggCityName",
"2110101", "종로구",
"2110402", "중구성동구갑",
"2110201", "중구성동구을",
"2110301", "용산구",
"2110501", "광진구갑",
"2110502", "광진구을",
"2110601", "동대문구갑",
"2110602", "동대문구을",
"2110701", "중랑구갑",
"2110702", "중랑구을",
"2110801", "성북구갑",
"2110802", "성북구을",
"2110901", "강북구갑",
"2110902", "강북구을",
"2111001", "도봉구갑",
"2111002", "도봉구을",
"2111101", "노원구갑",
"2111102", "노원구을",
"2111103", "노원구병",
"2111201", "은평구갑",
"2111202", "은평구을",
"2111301", "서대문구갑",
"2111302", "서대문구을",
"2111401", "마포구갑",
"2111402", "마포구을",
"2111501", "양천구갑",
"2111502", "양천구을",
"2111601", "강서구갑",
"2111602", "강서구을",
"2111603", "강서구병",
"2111701", "구로구갑",
"2111702", "구로구을",
"2111801", "금천구",
"2111901", "영등포구갑",
"2111902", "영등포구을",
"2112001", "동작구갑",
"2112002", "동작구을",
"2112101", "관악구갑",
"2112102", "관악구을",
"2112201", "서초구갑",
"2112202", "서초구을",
"2112301", "강남구갑",
"2112302", "강남구을",
"2112303", "강남구병",
"2112401", "송파구갑",
"2112402", "송파구을",
"2112403", "송파구병",
"2112501", "강동구갑",
"2112502", "강동구을")
### 부산광역시
sgg_부산 <- tribble(~"sggCityCode", ~"sggCityName",
"2260401", "중구영도구",
"2260201", "서구동구",
"2260501", "부산진구갑",
"2260502", "부산진구을",
"2260601", "동래구",
"2260701", "남구갑",
"2260702", "남구을",
"2260801", "북구강서구갑",
"2261301", "북구강서구을",
"2260902", "해운대구갑",
"2260903", "해운대구을",
"2261101", "사하구갑",
"2261102", "사하구을",
"2261201", "금정구",
"2261401", "연제구",
"2261501", "수영구",
"2261601", "사상구",
"2261002", "기장군")
### 대구광역시
sgg_대구 <- tribble(~"sggCityCode", ~"sggCityName",
"2270101", "중구남구",
"2270201", "동구갑",
"2270202", "동구을",
"2270301", "서구",
"2270501", "북구갑",
"2270502", "북구을",
"2270601", "수성구갑",
"2270602", "수성구을",
"2270701", "달서구갑",
"2270702", "달서구을",
"2270703", "달서구병",
"2270801", "달성군")
### 인천광역시
sgg_인천 <- tribble(~"sggCityCode", ~"sggCityName",
"2280101", "중구강화군옹진군",
"2280301", "동구미추홀구갑",
"2280302", "동구미추홀구을",
"2280402", "연수구갑",
"2280403", "연수구을",
"2280501", "남동구갑",
"2280502", "남동구을",
"2280601", "부평구갑",
"2280602", "부평구을",
"2280701", "계양구갑",
"2280702", "계양구을",
"2280802", "서구갑",
"2280803", "서구을")
### 광주광역시
sgg_광주 <- tribble(~"sggCityCode", ~"sggCityName",
"2290302", "동구남구갑",
"2290101", "동구남구을",
"2290201", "서구갑",
"2290202", "서구을",
"2290401", "북구갑",
"2290402", "북구을",
"2290501", "광산구갑",
"2290502", "광산구을")
### 대전광역시
sgg_대전 <- tribble(~"sggCityCode", ~"sggCityName",
"2300101", "동구",
"2300201", "중구",
"2300301", "서구갑",
"2300302", "서구을",
"2300402", "유성구갑",
"2300403", "유성구을",
"2300501", "대덕구")
### 울산광역시
sgg_울산 <- tribble(~"sggCityCode", ~"sggCityName",
"2310101", "중구",
"2310201", "남구갑",
"2310202", "남구을",
"2310301", "동구",
"2310401", "북구",
"2310501", "울주군")
### 세종특별자치시
sgg_세종 <- tribble(~"sggCityCode", ~"sggCityName",
"2510101", "세종특별자치시갑",
"2510102", "세종특별자치시을")
### 경기도
sgg_경기 <- tribble(~"sggCityCode", ~"sggCityName",
"2410101", "수원시갑",
"2410201", "수원시을",
"2410301", "수원시병",
"2410401", "수원시정",
"2410202", "수원시무",
"2410501", "성남시수정구",
"2410601", "성남시중원구",
"2410701", "성남시분당구갑",
"2410702", "성남시분당구을",
"2410801", "의정부시갑",
"2410802", "의정부시을",
"2410901", "안양시만안구",
"2411001", "안양시동안구갑",
"2411002", "안양시동안구을",
"2411101", "부천시갑",
"2411102", "부천시을",
"2411201", "부천시병",
"2411301", "부천시정",
"2411401", "광명시갑",
"2411402", "광명시을",
"2411501", "평택시갑",
"2411502", "평택시을",
"2411701", "동두천시연천군",
"2411801", "안산시상록구갑",
"2411802", "안산시상록구을",
"2411901", "안산시단원구갑",
"2411902", "안산시단원구을",
"2412001", "고양시갑",
"2412002", "고양시을",
"2412101", "고양시병",
"2412201", "고양시정",
"2412301", "의왕시과천시",
"2412501", "구리시",
"2412601", "남양주시갑",
"2412602", "남양주시을",
"2412603", "남양주시병",
"2412701", "오산시",
"2412901", "시흥시갑",
"2412902", "시흥시을",
"2413002", "군포시",
"2413101", "하남시",
"2413501", "용인시갑",
"2413701", "용인시을",
"2413602", "용인시병",
"2413702", "용인시정",
"2413202", "파주시갑",
"2413203", "파주시을",
"2413401", "이천시",
"2413801", "안성시",
"2413902", "김포시갑",
"2413903", "김포시을",
"2412801", "화성시갑",
"2412802", "화성시을",
"2412803", "화성시병",
"2414002", "광주시갑",
"2414003", "광주시을",
"2411602", "양주시",
"2414102", "포천시가평군",
"2413301", "여주시양평군")
### 강원도
sgg_강원 <- tribble(~"sggCityCode", ~"sggCityName",
"2420101", "춘천시철원군화천군양구군갑",
"2420102", "춘천시철원군화천군양구군을",
"2420202", "원주시갑",
"2420203", "원주시을",
"2420301", "강릉시",
"2420401", "동해시태백시삼척시정선군",
"2420801", "속초시인제군고성군양양군",
"2421402", "홍천군횡성군영월군평창군")
### 충청북도
sgg_충북 <- tribble(~"sggCityCode", ~"sggCityName",
"2430101", "청주시상당구",
"2430201", "청주시서원구",
"2430202", "청주시흥덕구",
"2430601", "청주시청원구",
"2430301", "충주시",
"2430401", "제천시단양군",
"2430701", "보은군옥천군영동군괴산군",
"2431002", "증평군진천군음성군")
### 충청남도
sgg_충남 <- tribble(~"sggCityCode", ~"sggCityName",
"2440101", "천안시갑",
"2440102", "천안시을",
"2440103", "천안시병",
"2440202", "공주시부여군청양군",
"2440301", "보령시서천군",
"2440402", "아산시갑",
"2440403", "아산시을",
"2440501", "서산시태안군",
"2440901", "논산시계룡시금산군",
"2441601", "당진시",
"2441301", "홍성군예산군")
### 전라북도
sgg_전북 <- tribble(~"sggCityCode", ~"sggCityName",
"2450101", "전주시갑",
"2450102", "전주시을",
"2450201", "전주시병",
"2450301", "군산시",
"2450501", "익산시갑",
"2450502", "익산시을",
"2450701", "정읍시고창군",
"2450801", "남원시임실군순창군",
"2450902", "김제시부안군",
"2451001", "완주군진안군무주군장수군")
### 전라남도
sgg_전남 <- tribble(~"sggCityCode", ~"sggCityName",
"2460101", "목포시",
"2460201", "여수시갑",
"2460202", "여수시을",
"2460403", "순천시광양시곡성군구례군갑",
"2460702", "순천시광양시곡성군구례군을",
"2460601", "나주시화순군",
"2462202", "담양군함평군영광군장성군",
"2461201", "고흥군보성군장흥군강진군",
"2461801", "해남군완도군진도군",
"2462101", "영암군무안군신안군")
### 경상북도
sgg_경북 <- tribble(~"sggCityCode", ~"sggCityName",
"2470101", "포항시북구",
"2470201", "포항시남구울릉군",
"2470401", "경주시",
"2470501", "김천시",
"2470601", "안동시예천군",
"2470701", "구미시갑",
"2470702", "구미시을",
"2470802", "영주시영양군봉화군울진군",
"2470901", "영천시청도군",
"2471002", "상주시문경시",
"2471302", "경산시",
"2471902", "군위군의성군청송군영덕군",
"2471701", "고령군성주군칠곡군")
### 경상남도
sgg_경남 <- tribble(~"sggCityCode", ~"sggCityName",
"2480101", "창원시의창구",
"2480102", "창원시성산구",
"2480201", "창원시마산합포구",
"2480202", "창원시마산회원구",
"2480401", "창원시진해구",
"2480301", "진주시갑",
"2480302", "진주시을",
"2480501", "통영시고성군",
"2480702", "사천시남해군하동군",
"2480801", "김해시갑",
"2480802", "김해시을",
"2480901", "밀양시의령군함안군창녕군",
"2481001", "거제시",
"2481402", "양산시갑",
"2481403", "양산시을",
"2481901", "산청군함양군거창군합천군")
### 제주
sgg_제주 <- tribble(~"sggCityCode", ~"sggCityName",
"2490101", "제주시갑",
"2490102", "제주시을",
"2490201", "서귀포시")
# 결합 ----------------------
sgg_강원 <- sgg_강원 %>%
mutate(cityCode = "4200")
sgg_경기 <- sgg_경기 %>%
mutate(cityCode = "4100")
sgg_경남 <- sgg_경남 %>%
mutate(cityCode = "4800")
sgg_경북 <- sgg_경북 %>%
mutate(cityCode = "4700")
sgg_광주 <- sgg_광주 %>%
mutate(cityCode = "2900")
sgg_대구 <- sgg_대구 %>%
mutate(cityCode = "2700")
sgg_대전 <- sgg_대전 %>%
mutate(cityCode = "3000")
sgg_부산 <- sgg_부산 %>%
mutate(cityCode = "2600")
sgg_서울 <- sgg_서울 %>%
mutate(cityCode = "1100")
sgg_세종 <- sgg_세종 %>%
mutate(cityCode = "5100")
sgg_울산 <- sgg_울산 %>%
mutate(cityCode = "3100")
sgg_인천 <- sgg_인천 %>%
mutate(cityCode = "2800")
sgg_전남 <- sgg_전남 %>%
mutate(cityCode = "4600")
sgg_전북 <- sgg_전북 %>%
mutate(cityCode = "4500")
sgg_제주 <- sgg_제주 %>%
mutate(cityCode = "4900")
sgg_충남 <- sgg_충남 %>%
mutate(cityCode = "4400")
sgg_충북 <- sgg_충북 %>%
mutate(cityCode = "4300")
sggCityCode <- bind_rows(sgg_강원,sgg_경기,sgg_경남,sgg_경북,sgg_광주,sgg_대구,sgg_대전,
sgg_부산,sgg_서울,sgg_세종,sgg_울산,sgg_인천,sgg_전남,sgg_전북,
sgg_제주,sgg_충남,sgg_충북)
full_code <- inner_join(cityCode, sggCityCode)
full_code
# A tibble: 253 x 4
cityCode cityName sggCityCode sggCityName
<chr> <chr> <chr> <chr>
1 1100 서울특별시 2110101 종로구
2 1100 서울특별시 2110402 중구성동구갑
3 1100 서울특별시 2110201 중구성동구을
4 1100 서울특별시 2110301 용산구
5 1100 서울특별시 2110501 광진구갑
6 1100 서울특별시 2110502 광진구을
7 1100 서울특별시 2110601 동대문구갑
8 1100 서울특별시 2110602 동대문구을
9 1100 서울특별시 2110701 중랑구갑
10 1100 서울특별시 2110702 중랑구을
# ... with 243 more rows
서울특별시 종로구를 대상으로 cityCode
로 1100, sggCityCode
로 2110101을 get_candidate_info()
함수에 전달하여 제대로 데이터를 가져오는지 테스트한다.
이제 마지막 단계로 전체 시도에 대해서 선거구별로 모든 데이터를 가져온다.
# Original map2 function code
# candidate_df <- map2_df(full_code$cityCode, full_code$sggCityCode, get_candidate_info)
# try-catch login included map2 code
safely_get_candidate_info <- safely(get_candidate_info, otherwise = NA_real_)
candidate_list <- map2(full_code$cityCode, full_code$sggCityCode, safely_get_candidate_info)
## DRY RUN CODE !!!
# for(i in 1:nrow(cityCode)) {
# for(j in 1:nrow(sggCityCode)) {
# cat("시도:", cityCode$cityCode[i], "\n")
# cat("시군구:", sggCityCode$sggCityCode[j], "\n")
# }
# cat("===========================\n")
# }
# NO TRY-CATCH FOR LOOP
# candidate_list <- list()
# index <- 1
#
# for(i in 1:nrow(cityCode)) {
# for(j in 1:nrow(sggCityCode)) {
# cat("시도:", cityCode$cityCode[i], "\n")
# cat("시군구:", sggCityCode$sggCityCode[j], "\n")
# candidate_list[index] <- get_candidate_info(i, j)
# index <- index + 1
# }
# cat("===========================\n")
# Sys.sleep(runif(1, 0, 3))
# }
candidate_list %>%
write_rds("data/candidate_list.rds")
전체 시도에 대해서 선거구별로 수집한 데이터를 살펴보고 정제한다.
candidate_list <- read_rds("data/candidate_list.rds")
candidate_df <- map_df(candidate_list, "result")
candidate_df %>%
filter(정당명 == "더불어민주당") %>%
mutate(시도명 = str_extract(주소, ".*?(?=\\s)")) %>%
count(시도명, 선거구명)
# A tibble: 253 x 3
시도명 선거구명 n
<chr> <chr> <int>
1 강원도 강릉시 1
2 강원도 동해시태백시삼척시정선군 1
3 강원도 속초시인제군고성군양양군 1
4 강원도 원주시갑 1
5 강원도 원주시을 1
6 강원도 춘천시철원군화천군양구군갑 1
7 강원도 춘천시철원군화천군양구군을 1
8 강원도 홍천군횡성군영월군평창군 1
9 경기도 고양시갑 1
10 경기도 고양시병 1
# ... with 243 more rows
## 크롤링 선거구
### 서울특별시:49
precinct_서울 <- full_code %>%
filter(cityName == "서울특별시")
서울_list <- map2(precinct_서울$cityCode, precinct_서울$sggCityCode, safely_get_candidate_info)
서울_df <- map_df(서울_list, "result")
### 경기도:59
precinct_경기 <- full_code %>%
filter(cityName == "경기도")
경기_list <- map2(precinct_경기$cityCode, precinct_경기$sggCityCode, safely_get_candidate_info)
경기_df <- map_df(경기_list, "result")
### 부산:18
precinct_부산 <- full_code %>%
filter(cityName == "부산광역시")
부산_list <- map2(precinct_부산$cityCode, precinct_부산$sggCityCode, safely_get_candidate_info)
부산_df <- map_df(부산_list, "result")
### 경남:18
precinct_경남 <- full_code %>%
filter(cityName == "경상남도")
경남_list <- map2(precinct_경남$cityCode, precinct_경남$sggCityCode, safely_get_candidate_info)
경남_df <- map_df(경남_list, "result")
### 경북:13
precinct_경북 <- full_code %>%
filter(cityName == "경상북도")
경북_list <- map2(precinct_경북$cityCode, precinct_경북$sggCityCode, safely_get_candidate_info)
경북_df <- map_df(경북_list, "result")
### 인천:13
precinct_인천 <- full_code %>%
filter(cityName == "인천광역시")
인천_list <- map2(precinct_인천$cityCode, precinct_인천$sggCityCode, safely_get_candidate_info)
인천_df <- map_df(인천_list, "result")
### 대구:12
precinct_대구 <- full_code %>%
filter(cityName == "대구광역시")
대구_list <- map2(precinct_대구$cityCode, precinct_대구$sggCityCode, safely_get_candidate_info)
대구_df <- map_df(대구_list, "result")
### 충남:11
precinct_충남 <- full_code %>%
filter(cityName == "충청남도")
충남_list <- map2(precinct_충남$cityCode, precinct_충남$sggCityCode, safely_get_candidate_info)
충남_df <- map_df(충남_list, "result")
### 전남:10
precinct_전남 <- full_code %>%
filter(cityName == "전라남도")
전남_list <- map2(precinct_전남$cityCode, precinct_전남$sggCityCode, safely_get_candidate_info)
전남_df <- map_df(전남_list, "result")
### 전북:10
precinct_전북 <- full_code %>%
filter(cityName == "전라북도")
전북_list <- map2(precinct_전북$cityCode, precinct_전북$sggCityCode, safely_get_candidate_info)
전북_df <- map_df(전북_list, "result")
### 강원도:8
precinct_강원 <- full_code %>%
filter(cityName == "강원도")
강원_list <- map2(precinct_강원$cityCode, precinct_강원$sggCityCode, safely_get_candidate_info)
강원_df <- map_df(강원_list, "result")
### 광주:8
precinct_광주 <- full_code %>%
filter(cityName == "광주광역시")
광주_list <- map2(precinct_광주$cityCode, precinct_광주$sggCityCode, safely_get_candidate_info)
광주_df <- map_df(광주_list, "result")
### 충북:8
precinct_충북 <- full_code %>%
filter(cityName == "충청북도")
충북_list <- map2(precinct_충북$cityCode, precinct_충북$sggCityCode, safely_get_candidate_info)
충북_df <- map_df(충북_list, "result")
### 대전:7
precinct_대전 <- full_code %>%
filter(cityName == "대전광역시")
대전_list <- map2(precinct_대전$cityCode, precinct_대전$sggCityCode, safely_get_candidate_info)
대전_df <- map_df(대전_list, "result")
### 울산:6
precinct_울산 <- full_code %>%
filter(cityName == "울산광역시")
울산_list <- map2(precinct_울산$cityCode, precinct_울산$sggCityCode, safely_get_candidate_info)
울산_df <- map_df(울산_list, "result")
### 제주:3
precinct_제주 <- full_code %>%
filter(cityName == "제주특별자치도")
제주_list <- map2(precinct_제주$cityCode, precinct_제주$sggCityCode, safely_get_candidate_info)
제주_df <- map_df(제주_list, "result")
### 세종:2
precinct_세종 <- full_code %>%
filter(cityName == "세종특별자치시")
세종_list <- map2(precinct_세종$cityCode, precinct_세종$sggCityCode, safely_get_candidate_info)
세종_df <- map_df(세종_list, "result")
## 원본 데이터
candidate_253_df <- bind_rows(강원_df, 경기_df, 경남_df, 경북_df, 광주_df, 대구_df,
대전_df, 부산_df, 서울_df, 세종_df, 울산_df, 인천_df,
전남_df, 전북_df, 제주_df, 충남_df, 충북_df) %>% tbl_df
candidate_253_df %>%
mutate(시도명 = str_extract(주소, "[가-힣].*?(?=\\s)")) %>%
filter(정당명 == "더불어민주당") %>%
count(시도명, 선거구명)
candidate_253_df %>%
write_rds("data/candidate_253_df.rds")
## 원본 데이터 + 시도명
강원_df <- 강원_df %>% mutate(시도명="강원도") %>% tbl_df %>% select(시도명, everything())
경기_df <- 경기_df %>% mutate(시도명="경기도") %>% tbl_df %>% select(시도명, everything())
경남_df <- 경남_df %>% mutate(시도명="경상남도") %>% tbl_df %>% select(시도명, everything())
경북_df <- 경북_df %>% mutate(시도명="경상북도") %>% tbl_df %>% select(시도명, everything())
광주_df <- 광주_df %>% mutate(시도명="광주광역시") %>% tbl_df %>% select(시도명, everything())
대구_df <- 대구_df %>% mutate(시도명="대구광역시") %>% tbl_df %>% select(시도명, everything())
대전_df <- 대전_df %>% mutate(시도명="대전광역시") %>% tbl_df %>% select(시도명, everything())
부산_df <- 부산_df %>% mutate(시도명="부산광역시") %>% tbl_df %>% select(시도명, everything())
서울_df <- 서울_df %>% mutate(시도명="서울특별시") %>% tbl_df %>% select(시도명, everything())
세종_df <- 세종_df %>% mutate(시도명="세종특별자치시") %>% tbl_df %>% select(시도명, everything())
울산_df <- 울산_df %>% mutate(시도명="울산광역시") %>% tbl_df %>% select(시도명, everything())
인천_df <- 인천_df %>% mutate(시도명="인천광역시") %>% tbl_df %>% select(시도명, everything())
전남_df <- 전남_df %>% mutate(시도명="전라남도") %>% tbl_df %>% select(시도명, everything())
전북_df <- 전북_df %>% mutate(시도명="전라북도") %>% tbl_df %>% select(시도명, everything())
제주_df <- 제주_df %>% mutate(시도명="제주특별자치도") %>% tbl_df %>% select(시도명, everything())
충남_df <- 충남_df %>% mutate(시도명="충청남도") %>% tbl_df %>% select(시도명, everything())
충북_df <- 충북_df %>% mutate(시도명="충청북도") %>% tbl_df %>% select(시도명, everything())
candidate_253_df <- bind_rows(강원_df, 경기_df, 경남_df, 경북_df, 광주_df, 대구_df,
대전_df, 부산_df, 서울_df, 세종_df, 울산_df, 인천_df,
전남_df, 전북_df, 제주_df, 충남_df, 충북_df) %>% tbl_df
candidate_253_df %>%
count(시도명, 선거구명)
candidate_253_df %>%
write_rds("data/candidate_253_df.rds")
총 253개 선거구 중에서 미공천된 주요 정당별 미공천된 곳이 얼마인지 확인해보자.
candidate_253_df <- read_rds("data/candidate_253_df.rds")
party_precinct_df <- candidate_253_df %>%
filter(정당명 %in% c("더불어민주당", "미래통합당", "정의당", "민생당")) %>%
count(정당명, 시도명, 선거구명) %>%
spread(정당명, n, fill=0)
party_precinct_df %>%
gather(정당, 후보자, -시도명, -선거구명) %>%
group_by(정당) %>%
summarise(후보자수 = sum(후보자)) %>%
mutate(미공천 = 253 - 후보자수,
공천율 = round(후보자수/253 *100,1)) %>%
knitr::kable()
정당 | 후보자수 | 미공천 | 공천율 |
---|---|---|---|
더불어민주당 | 253 | 0 | 100.0 |
미래통합당 | 237 | 16 | 93.7 |
민생당 | 58 | 195 | 22.9 |
정의당 | 77 | 176 | 30.4 |
정당별로 총 253개 선거구 중에서 공천된 곳을 시각화 해보자. 미래통합당은 전라도 지역에 공천이 되지 않은 것으로 파악된다.
## 선거구 253 지도
library(sf)
precinct_sf <- st_read("data/shapefile/2020_21_elec_253_simple.json") %>%
separate(SGG_2, into=c("시도명", "선거구명"), remove=FALSE) %>%
rmapshaper::ms_simplify(keep=0.1)
Reading layer `2020_21_elec_253_simple' from data source `C:\docs\election\data\shapefile\2020_21_elec_253_simple.json' using driver `GeoJSON'
Simple feature collection with 253 features and 4 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: 124.6098 ymin: 33.16123 xmax: 130.9175 ymax: 38.61369
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
precinct_sf <- precinct_sf %>%
left_join(candidate_253_df) %>%
filter(정당명 %in% c("더불어민주당", "미래통합당", "정의당", "민생당")) %>%
mutate(정당명 = factor(정당명, levels=c("더불어민주당", "미래통합당", "정의당", "민생당")))
precinct_sf %>%
ggplot(aes(fill=정당명)) +
geom_sf(aes(fill = 정당명)) +
scale_fill_manual(values=c("blue", "pink", "yellow", "green")) +
facet_wrap(~정당명, scales="fixed") +
theme_classic() +
theme(legend.position = "none")