권역별 당선인 의석수 변화

국회의원 당선인 API를 통해 권역별 의석수 변화를 시각화한다.

저자
소속

1 데이터

공공데이터포털 중앙선거관리위원회 당선인정보 API 를 통해 당선인 정보를 조회한다. (선거종류, 선거구명, 시도명, 구시군명, 기호, 정당, 성명, 성별, 연령, 경력, 득표수, 득표율 등을 조회)

1.1 국회의원 선거 코드

코드
library(tidyverse)
library(rvest)
library(gt)
library(gtExtras)
library(rvest)

# iconv(names(krvote::code_election), from = "EUC-KR", to = "UTF-8")

code_election <- krvote::code_election

names(code_election) <- c("선거코드", "선거명", "선거구분")

legislator_code <- code_election |> 
  dplyr::filter(str_detect(선거명, "국회의원")) |> 
  pull(선거코드) |> 
  unique()

legislator_code
#> [1] "20040415" "20080409" "20120411" "20160413" "20180613" "20190403" "20200415"
#> [8] "20220309"

1.2 당선인 API

1.2.1 대통령 당선인

코드
library(httr)
library(jsonlite)

# httr의 GET 함수로 데이터를 추출한다
response <- GET("http://apis.data.go.kr/9760000/WinnerInfoInqireService2/getWinnerInfoInqire",
                query = list(sgId = "20220309",
                              sgTypecode = "1",
                              sdName = "전국",
                              sggName = "대한민국",
                              pageNo = 1,
                              numOfRows = 10,
                              resultType = "json",
                              serviceKey = Sys.getenv('DATA_GO_DECODE_KEY')))

# 응답 상태와 내용을 확인한다
print(status_code(response))
#> [1] 200

response_list <- content(response, "text") |> 
  fromJSON()

response_tbl <- response_list$getWinnerInfoInqire$item

response_tbl
#>   num     sgId sgTypecode    huboid  sggName sdName wiwName giho gihoSangse
#> 1   1 20220309          1 100138362 대한민국   전국            2           
#>     jdName   name hanjaName gender birthday age                         addr
#> 1 국민의힘 윤석열    尹錫悅     남 19601218  61 서울특별시 서초구 서초중앙로
#>   jobId    job eduId                              edu              career1
#> 1    75 정치인   221 서울대학교 대학원 졸업(법학석사) (전) 제43대 검찰총장
#>                          career2    dugsu dugyul
#> 1 (전) 서울중앙지방검찰청 검사장 16394815  48.56

1.2.2 국회의원 당선인

코드

# httr의 GET 함수로 데이터를 추출한다
response <- GET("http://apis.data.go.kr/9760000/WinnerInfoInqireService2/getWinnerInfoInqire",
                query = list(sgId = legislator_code[8],
                              sgTypecode = "2",
                              sdName = "서울특별시",
                              sggName = "종로구",
                              pageNo = 1,
                              numOfRows = 10,
                              resultType = "json",
                              serviceKey = Sys.getenv('DATA_GO_DECODE_KEY')))

# 응답 상태와 내용을 확인한다
print(status_code(response))
#> [1] 200

response_list <- content(response, "text") |> 
  fromJSON()

response_tbl <- response_list$getWinnerInfoInqire$item

response_tbl
#>   num     sgId sgTypecode    huboid sggName     sdName wiwName giho gihoSangse
#> 1   1 20220309          2 100138535  종로구 서울특별시  종로구    2           
#>     jdName   name hanjaName gender birthday age                            addr
#> 1 국민의힘 최재형    崔在亨     남 19560902  65 서울특별시 양천구 목동중앙로7길
#>   jobId    job eduId                    edu      career1          career2 dugsu
#> 1    75 정당인    68 서울대학교 법학과 졸업 (전)감사원장 (전)사법연수원장 49637
#>   dugyul
#> 1  52.09

1.3 국회의원 선거구

선거종류코드(sgTypecode): (0) 대표선거명, (1)대통령,(2)국회의원,(3)시도지사,(4)구시군장,(5)시도의원,(6)구시군의회의원,(7)국회의원비례대표,(8)광역의원비례대표,(9)기초의원비례대표,(10)교육의원,(11)교육감

1.3.1 스크립트

코드

# httr의 GET 함수로 데이터를 추출한다
response <- GET("http://apis.data.go.kr/9760000/CommonCodeService/getCommonSggCodeList",
                query = list(sgId = legislator_code[7],
                              sgTypecode = "2",
                              numOfRows =  "1000",
                              resultType = "json",
                              serviceKey = Sys.getenv('DATA_GO_DECODE_KEY')))

# 응답 상태와 내용을 확인한다
print(status_code(response))
#> [1] 200

response_list <- content(response, "text") |> 
  fromJSON()

response_tbl <- response_list$getCommonSggCodeList$item

response_tbl
#>     num     sgId sgTypecode                    sggName         sdName
#> 1     1 20200415          2                     종로구     서울특별시
#> 2     2 20200415          2               중구성동구갑     서울특별시
#> 3     3 20200415          2               중구성동구을     서울특별시
#> 4     4 20200415          2                     용산구     서울특별시
#> 5     5 20200415          2                   광진구갑     서울특별시
#> 6     6 20200415          2                   광진구을     서울특별시
#> 7     7 20200415          2                 동대문구갑     서울특별시
#> 8     8 20200415          2                 동대문구을     서울특별시
#> 9     9 20200415          2                   중랑구갑     서울특별시
#> 10   10 20200415          2                   중랑구을     서울특별시
#> 11   11 20200415          2                   성북구갑     서울특별시
#> 12   12 20200415          2                   성북구을     서울특별시
#> 13   13 20200415          2                   강북구갑     서울특별시
#> 14   14 20200415          2                   강북구을     서울특별시
#> 15   15 20200415          2                   도봉구갑     서울특별시
#> 16   16 20200415          2                   도봉구을     서울특별시
#> 17   17 20200415          2                   노원구갑     서울특별시
#> 18   18 20200415          2                   노원구을     서울특별시
#> 19   19 20200415          2                   노원구병     서울특별시
#> 20   20 20200415          2                   은평구갑     서울특별시
#> 21   21 20200415          2                   은평구을     서울특별시
#> 22   22 20200415          2                 서대문구갑     서울특별시
#> 23   23 20200415          2                 서대문구을     서울특별시
#> 24   24 20200415          2                   마포구갑     서울특별시
#> 25   25 20200415          2                   마포구을     서울특별시
#> 26   26 20200415          2                   양천구갑     서울특별시
#> 27   27 20200415          2                   양천구을     서울특별시
#> 28   28 20200415          2                   강서구갑     서울특별시
#> 29   29 20200415          2                   강서구을     서울특별시
#> 30   30 20200415          2                   강서구병     서울특별시
#> 31   31 20200415          2                   구로구갑     서울특별시
#> 32   32 20200415          2                   구로구을     서울특별시
#> 33   33 20200415          2                     금천구     서울특별시
#> 34   34 20200415          2                 영등포구갑     서울특별시
#> 35   35 20200415          2                 영등포구을     서울특별시
#> 36   36 20200415          2                   동작구갑     서울특별시
#> 37   37 20200415          2                   동작구을     서울특별시
#> 38   38 20200415          2                   관악구갑     서울특별시
#> 39   39 20200415          2                   관악구을     서울특별시
#> 40   40 20200415          2                   서초구갑     서울특별시
#> 41   41 20200415          2                   서초구을     서울특별시
#> 42   42 20200415          2                   강남구갑     서울특별시
#> 43   43 20200415          2                   강남구을     서울특별시
#> 44   44 20200415          2                   강남구병     서울특별시
#> 45   45 20200415          2                   송파구갑     서울특별시
#> 46   46 20200415          2                   송파구을     서울특별시
#> 47   47 20200415          2                   송파구병     서울특별시
#> 48   48 20200415          2                   강동구갑     서울특별시
#> 49   49 20200415          2                   강동구을     서울특별시
#> 50   50 20200415          2                 중구영도구     부산광역시
#> 51   51 20200415          2                   서구동구     부산광역시
#> 52   52 20200415          2                 부산진구갑     부산광역시
#> 53   53 20200415          2                 부산진구을     부산광역시
#> 54   54 20200415          2                     동래구     부산광역시
#> 55   55 20200415          2                     남구갑     부산광역시
#> 56   56 20200415          2                     남구을     부산광역시
#> 57   57 20200415          2               북구강서구갑     부산광역시
#> 58   58 20200415          2               북구강서구을     부산광역시
#> 59   59 20200415          2                 해운대구갑     부산광역시
#> 60   60 20200415          2                 해운대구을     부산광역시
#> 61   61 20200415          2                   사하구갑     부산광역시
#> 62   62 20200415          2                   사하구을     부산광역시
#> 63   63 20200415          2                     금정구     부산광역시
#> 64   64 20200415          2                     연제구     부산광역시
#> 65   65 20200415          2                     수영구     부산광역시
#> 66   66 20200415          2                     사상구     부산광역시
#> 67   67 20200415          2                     기장군     부산광역시
#> 68   68 20200415          2                   중구남구     대구광역시
#> 69   69 20200415          2                     동구갑     대구광역시
#> 70   70 20200415          2                     동구을     대구광역시
#> 71   71 20200415          2                       서구     대구광역시
#> 72   72 20200415          2                     북구갑     대구광역시
#> 73   73 20200415          2                     북구을     대구광역시
#> 74   74 20200415          2                   수성구갑     대구광역시
#> 75   75 20200415          2                   수성구을     대구광역시
#> 76   76 20200415          2                   달서구갑     대구광역시
#> 77   77 20200415          2                   달서구을     대구광역시
#> 78   78 20200415          2                   달서구병     대구광역시
#> 79   79 20200415          2                     달성군     대구광역시
#> 80   80 20200415          2           중구강화군옹진군     인천광역시
#> 81   81 20200415          2             동구미추홀구갑     인천광역시
#> 82   82 20200415          2             동구미추홀구을     인천광역시
#> 83   83 20200415          2                   연수구갑     인천광역시
#> 84   84 20200415          2                   연수구을     인천광역시
#> 85   85 20200415          2                   남동구갑     인천광역시
#> 86   86 20200415          2                   남동구을     인천광역시
#> 87   87 20200415          2                   부평구갑     인천광역시
#> 88   88 20200415          2                   부평구을     인천광역시
#> 89   89 20200415          2                   계양구갑     인천광역시
#> 90   90 20200415          2                   계양구을     인천광역시
#> 91   91 20200415          2                     서구갑     인천광역시
#> 92   92 20200415          2                     서구을     인천광역시
#> 93   93 20200415          2                 동구남구갑     광주광역시
#> 94   94 20200415          2                 동구남구을     광주광역시
#> 95   95 20200415          2                     서구갑     광주광역시
#> 96   96 20200415          2                     서구을     광주광역시
#> 97   97 20200415          2                     북구갑     광주광역시
#> 98   98 20200415          2                     북구을     광주광역시
#> 99   99 20200415          2                   광산구갑     광주광역시
#> 100 100 20200415          2                   광산구을     광주광역시
#> 101 101 20200415          2                       동구     대전광역시
#> 102 102 20200415          2                       중구     대전광역시
#> 103 103 20200415          2                     서구갑     대전광역시
#> 104 104 20200415          2                     서구을     대전광역시
#> 105 105 20200415          2                   유성구갑     대전광역시
#> 106 106 20200415          2                   유성구을     대전광역시
#> 107 107 20200415          2                     대덕구     대전광역시
#> 108 108 20200415          2                       중구     울산광역시
#> 109 109 20200415          2                     남구갑     울산광역시
#> 110 110 20200415          2                     남구을     울산광역시
#> 111 111 20200415          2                       동구     울산광역시
#> 112 112 20200415          2                       북구     울산광역시
#> 113 113 20200415          2                     울주군     울산광역시
#> 114 114 20200415          2           세종특별자치시갑 세종특별자치시
#> 115 115 20200415          2           세종특별자치시을 세종특별자치시
#> 116 116 20200415          2                   수원시갑         경기도
#> 117 117 20200415          2                   수원시을         경기도
#> 118 118 20200415          2                   수원시병         경기도
#> 119 119 20200415          2                   수원시정         경기도
#> 120 120 20200415          2                   수원시무         경기도
#> 121 121 20200415          2               성남시수정구         경기도
#> 122 122 20200415          2               성남시중원구         경기도
#> 123 123 20200415          2             성남시분당구갑         경기도
#> 124 124 20200415          2             성남시분당구을         경기도
#> 125 125 20200415          2                 의정부시갑         경기도
#> 126 126 20200415          2                 의정부시을         경기도
#> 127 127 20200415          2               안양시만안구         경기도
#> 128 128 20200415          2             안양시동안구갑         경기도
#> 129 129 20200415          2             안양시동안구을         경기도
#> 130 130 20200415          2                   부천시갑         경기도
#> 131 131 20200415          2                   부천시을         경기도
#> 132 132 20200415          2                   부천시병         경기도
#> 133 133 20200415          2                   부천시정         경기도
#> 134 134 20200415          2                   광명시갑         경기도
#> 135 135 20200415          2                   광명시을         경기도
#> 136 136 20200415          2                   평택시갑         경기도
#> 137 137 20200415          2                   평택시을         경기도
#> 138 138 20200415          2             동두천시연천군         경기도
#> 139 139 20200415          2             안산시상록구갑         경기도
#> 140 140 20200415          2             안산시상록구을         경기도
#> 141 141 20200415          2             안산시단원구갑         경기도
#> 142 142 20200415          2             안산시단원구을         경기도
#> 143 143 20200415          2                   고양시갑         경기도
#> 144 144 20200415          2                   고양시을         경기도
#> 145 145 20200415          2                   고양시병         경기도
#> 146 146 20200415          2                   고양시정         경기도
#> 147 147 20200415          2               의왕시과천시         경기도
#> 148 148 20200415          2                     구리시         경기도
#> 149 149 20200415          2                 남양주시갑         경기도
#> 150 150 20200415          2                 남양주시을         경기도
#> 151 151 20200415          2                 남양주시병         경기도
#> 152 152 20200415          2                     오산시         경기도
#> 153 153 20200415          2                   시흥시갑         경기도
#> 154 154 20200415          2                   시흥시을         경기도
#> 155 155 20200415          2                     군포시         경기도
#> 156 156 20200415          2                     하남시         경기도
#> 157 157 20200415          2                   용인시갑         경기도
#> 158 158 20200415          2                   용인시을         경기도
#> 159 159 20200415          2                   용인시병         경기도
#> 160 160 20200415          2                   용인시정         경기도
#> 161 161 20200415          2                   파주시갑         경기도
#> 162 162 20200415          2                   파주시을         경기도
#> 163 163 20200415          2                     이천시         경기도
#> 164 164 20200415          2                     안성시         경기도
#> 165 165 20200415          2                   김포시갑         경기도
#> 166 166 20200415          2                   김포시을         경기도
#> 167 167 20200415          2                   화성시갑         경기도
#> 168 168 20200415          2                   화성시을         경기도
#> 169 169 20200415          2                   화성시병         경기도
#> 170 170 20200415          2                   광주시갑         경기도
#> 171 171 20200415          2                   광주시을         경기도
#> 172 172 20200415          2                     양주시         경기도
#> 173 173 20200415          2               포천시가평군         경기도
#> 174 174 20200415          2               여주시양평군         경기도
#> 175 175 20200415          2 춘천시철원군화천군양구군갑         강원도
#> 176 176 20200415          2 춘천시철원군화천군양구군을         강원도
#> 177 177 20200415          2                   원주시갑         강원도
#> 178 178 20200415          2                   원주시을         강원도
#> 179 179 20200415          2                     강릉시         강원도
#> 180 180 20200415          2   동해시태백시삼척시정선군         강원도
#> 181 181 20200415          2   속초시인제군고성군양양군         강원도
#> 182 182 20200415          2   홍천군횡성군영월군평창군         강원도
#> 183 183 20200415          2               청주시상당구       충청북도
#> 184 184 20200415          2               청주시서원구       충청북도
#> 185 185 20200415          2               청주시흥덕구       충청북도
#> 186 186 20200415          2               청주시청원구       충청북도
#> 187 187 20200415          2                     충주시       충청북도
#> 188 188 20200415          2               제천시단양군       충청북도
#> 189 189 20200415          2   보은군옥천군영동군괴산군       충청북도
#> 190 190 20200415          2         증평군진천군음성군       충청북도
#> 191 191 20200415          2                   천안시갑       충청남도
#> 192 192 20200415          2                   천안시을       충청남도
#> 193 193 20200415          2                   천안시병       충청남도
#> 194 194 20200415          2         공주시부여군청양군       충청남도
#> 195 195 20200415          2               보령시서천군       충청남도
#> 196 196 20200415          2                   아산시갑       충청남도
#> 197 197 20200415          2                   아산시을       충청남도
#> 198 198 20200415          2               서산시태안군       충청남도
#> 199 199 20200415          2         논산시계룡시금산군       충청남도
#> 200 200 20200415          2                     당진시       충청남도
#> 201 201 20200415          2               홍성군예산군       충청남도
#> 202 202 20200415          2                   전주시갑       전라북도
#> 203 203 20200415          2                   전주시을       전라북도
#> 204 204 20200415          2                   전주시병       전라북도
#> 205 205 20200415          2                     군산시       전라북도
#> 206 206 20200415          2                   익산시갑       전라북도
#> 207 207 20200415          2                   익산시을       전라북도
#> 208 208 20200415          2               정읍시고창군       전라북도
#> 209 209 20200415          2         남원시임실군순창군       전라북도
#> 210 210 20200415          2               김제시부안군       전라북도
#> 211 211 20200415          2   완주군진안군무주군장수군       전라북도
#> 212 212 20200415          2                     목포시       전라남도
#> 213 213 20200415          2                   여수시갑       전라남도
#> 214 214 20200415          2                   여수시을       전라남도
#> 215 215 20200415          2 순천시광양시곡성군구례군갑       전라남도
#> 216 216 20200415          2 순천시광양시곡성군구례군을       전라남도
#> 217 217 20200415          2               나주시화순군       전라남도
#> 218 218 20200415          2   담양군함평군영광군장성군       전라남도
#> 219 219 20200415          2   고흥군보성군장흥군강진군       전라남도
#> 220 220 20200415          2         해남군완도군진도군       전라남도
#> 221 221 20200415          2         영암군무안군신안군       전라남도
#> 222 222 20200415          2                 포항시북구       경상북도
#> 223 223 20200415          2           포항시남구울릉군       경상북도
#> 224 224 20200415          2                     경주시       경상북도
#> 225 225 20200415          2                     김천시       경상북도
#> 226 226 20200415          2               안동시예천군       경상북도
#> 227 227 20200415          2                   구미시갑       경상북도
#> 228 228 20200415          2                   구미시을       경상북도
#> 229 229 20200415          2   영주시영양군봉화군울진군       경상북도
#> 230 230 20200415          2               영천시청도군       경상북도
#> 231 231 20200415          2               상주시문경시       경상북도
#> 232 232 20200415          2                     경산시       경상북도
#> 233 233 20200415          2   군위군의성군청송군영덕군       경상북도
#> 234 234 20200415          2         고령군성주군칠곡군       경상북도
#> 235 235 20200415          2               창원시의창구       경상남도
#> 236 236 20200415          2               창원시성산구       경상남도
#> 237 237 20200415          2           창원시마산합포구       경상남도
#> 238 238 20200415          2           창원시마산회원구       경상남도
#> 239 239 20200415          2               창원시진해구       경상남도
#> 240 240 20200415          2                   진주시갑       경상남도
#> 241 241 20200415          2                   진주시을       경상남도
#> 242 242 20200415          2               통영시고성군       경상남도
#> 243 243 20200415          2         사천시남해군하동군       경상남도
#> 244 244 20200415          2                   김해시갑       경상남도
#> 245 245 20200415          2                   김해시을       경상남도
#> 246 246 20200415          2   밀양시의령군함안군창녕군       경상남도
#> 247 247 20200415          2                     거제시       경상남도
#> 248 248 20200415          2                   양산시갑       경상남도
#> 249 249 20200415          2                   양산시을       경상남도
#> 250 250 20200415          2   산청군함양군거창군합천군       경상남도
#> 251 251 20200415          2                   제주시갑 제주특별자치도
#> 252 252 20200415          2                   제주시을 제주특별자치도
#> 253 253 20200415          2                   서귀포시 제주특별자치도
#>              wiwName sggJungsu sOrder
#> 1             종로구         1      1
#> 2             성동구         1      2
#> 3               중구         1      3
#> 4             용산구         1      4
#> 5             광진구         1      5
#> 6             광진구         1      6
#> 7           동대문구         1      7
#> 8           동대문구         1      8
#> 9             중랑구         1      9
#> 10            중랑구         1     10
#> 11            성북구         1     11
#> 12            성북구         1     12
#> 13            강북구         1     13
#> 14            강북구         1     14
#> 15            도봉구         1     15
#> 16            도봉구         1     16
#> 17            노원구         1     17
#> 18            노원구         1     18
#> 19            노원구         1     19
#> 20            은평구         1     20
#> 21            은평구         1     21
#> 22          서대문구         1     22
#> 23          서대문구         1     23
#> 24            마포구         1     24
#> 25            마포구         1     25
#> 26            양천구         1     26
#> 27            양천구         1     27
#> 28            강서구         1     28
#> 29            강서구         1     29
#> 30            강서구         1     30
#> 31            구로구         1     31
#> 32            구로구         1     32
#> 33            금천구         1     33
#> 34          영등포구         1     34
#> 35          영등포구         1     35
#> 36            동작구         1     36
#> 37            동작구         1     37
#> 38            관악구         1     38
#> 39            관악구         1     39
#> 40            서초구         1     40
#> 41            서초구         1     41
#> 42            강남구         1     42
#> 43            강남구         1     43
#> 44            강남구         1     44
#> 45            송파구         1     45
#> 46            송파구         1     46
#> 47            송파구         1     47
#> 48            강동구         1     48
#> 49            강동구         1     49
#> 50            영도구         1     50
#> 51              서구         1     51
#> 52          부산진구         1     52
#> 53          부산진구         1     53
#> 54            동래구         1     54
#> 55              남구         1     55
#> 56              남구         1     56
#> 57              북구         1     57
#> 58            강서구         1     58
#> 59          해운대구         1     59
#> 60          해운대구         1     60
#> 61            사하구         1     61
#> 62            사하구         1     62
#> 63            금정구         1     63
#> 64            연제구         1     64
#> 65            수영구         1     65
#> 66            사상구         1     66
#> 67            기장군         1     67
#> 68              남구         1     68
#> 69              동구         1     69
#> 70              동구         1     70
#> 71              서구         1     71
#> 72              북구         1     72
#> 73              북구         1     73
#> 74            수성구         1     74
#> 75            수성구         1     75
#> 76            달서구         1     76
#> 77            달서구         1     77
#> 78            달서구         1     78
#> 79            달성군         1     79
#> 80              중구         1     80
#> 81          미추홀구         1     81
#> 82          미추홀구         1     82
#> 83            연수구         1     83
#> 84            연수구         1     84
#> 85            남동구         1     85
#> 86            남동구         1     86
#> 87            부평구         1     87
#> 88            부평구         1     88
#> 89            계양구         1     89
#> 90            계양구         1     90
#> 91              서구         1     91
#> 92              서구         1     92
#> 93              남구         1     93
#> 94              동구         1     94
#> 95              서구         1     95
#> 96              서구         1     96
#> 97              북구         1     97
#> 98              북구         1     98
#> 99            광산구         1     99
#> 100           광산구         1    100
#> 101             동구         1    101
#> 102             중구         1    102
#> 103             서구         1    103
#> 104             서구         1    104
#> 105           유성구         1    105
#> 106           유성구         1    106
#> 107           대덕구         1    107
#> 108             중구         1    108
#> 109             남구         1    109
#> 110             남구         1    110
#> 111             동구         1    111
#> 112             북구         1    112
#> 113           울주군         1    113
#> 114   세종특별자치시         1    114
#> 115   세종특별자치시         1    115
#> 116     수원시장안구         1    116
#> 117     수원시권선구         1    117
#> 118     수원시팔달구         1    118
#> 119     수원시영통구         1    119
#> 120     수원시권선구         1    120
#> 121     성남시수정구         1    121
#> 122     성남시중원구         1    122
#> 123     성남시분당구         1    123
#> 124     성남시분당구         1    124
#> 125         의정부시         1    125
#> 126         의정부시         1    126
#> 127     안양시만안구         1    127
#> 128     안양시동안구         1    128
#> 129     안양시동안구         1    129
#> 130           부천시         1    130
#> 131           부천시         1    131
#> 132           부천시         1    132
#> 133           부천시         1    133
#> 134           광명시         1    134
#> 135           광명시         1    135
#> 136           평택시         1    136
#> 137           평택시         1    137
#> 138         동두천시         1    138
#> 139     안산시상록구         1    139
#> 140     안산시상록구         1    140
#> 141     안산시단원구         1    141
#> 142     안산시단원구         1    142
#> 143     고양시덕양구         1    143
#> 144     고양시덕양구         1    144
#> 145   고양시일산동구         1    145
#> 146   고양시일산서구         1    146
#> 147           의왕시         1    147
#> 148           구리시         1    148
#> 149         남양주시         1    149
#> 150         남양주시         1    150
#> 151         남양주시         1    151
#> 152           오산시         1    152
#> 153           시흥시         1    153
#> 154           시흥시         1    154
#> 155           군포시         1    155
#> 156           하남시         1    156
#> 157     용인시처인구         1    157
#> 158     용인시기흥구         1    158
#> 159     용인시수지구         1    159
#> 160     용인시기흥구         1    160
#> 161           파주시         1    161
#> 162           파주시         1    162
#> 163           이천시         1    163
#> 164           안성시         1    164
#> 165           김포시         1    165
#> 166           김포시         1    166
#> 167           화성시         1    167
#> 168           화성시         1    168
#> 169           화성시         1    169
#> 170           광주시         1    170
#> 171           광주시         1    171
#> 172           양주시         1    172
#> 173           포천시         1    173
#> 174           여주시         1    174
#> 175           춘천시         1    175
#> 176           춘천시         1    176
#> 177           원주시         1    177
#> 178           원주시         1    178
#> 179           강릉시         1    179
#> 180           동해시         1    180
#> 181           속초시         1    181
#> 182           영월군         1    182
#> 183     청주시상당구         1    183
#> 184     청주시서원구         1    184
#> 185     청주시흥덕구         1    185
#> 186     청주시청원구         1    186
#> 187           충주시         1    187
#> 188           제천시         1    188
#> 189           영동군         1    189
#> 190           음성군         1    190
#> 191     천안시동남구         1    191
#> 192     천안시서북구         1    192
#> 193     천안시동남구         1    193
#> 194           공주시         1    194
#> 195           보령시         1    195
#> 196           아산시         1    196
#> 197           아산시         1    197
#> 198           서산시         1    198
#> 199           논산시         1    199
#> 200           당진시         1    200
#> 201           홍성군         1    201
#> 202     전주시완산구         1    202
#> 203     전주시완산구         1    203
#> 204     전주시덕진구         1    204
#> 205           군산시         1    205
#> 206           익산시         1    206
#> 207           익산시         1    207
#> 208           정읍시         1    208
#> 209           남원시         1    209
#> 210           김제시         1    210
#> 211           완주군         1    211
#> 212           목포시         1    212
#> 213           여수시         1    213
#> 214           여수시         1    214
#> 215           순천시         1    215
#> 216           광양시         1    216
#> 217           나주시         1    217
#> 218           영광군         1    218
#> 219           장흥군         1    219
#> 220           해남군         1    220
#> 221           무안군         1    221
#> 222       포항시북구         1    222
#> 223       포항시남구         1    223
#> 224           경주시         1    224
#> 225           김천시         1    225
#> 226           안동시         1    226
#> 227           구미시         1    227
#> 228           구미시         1    228
#> 229           영주시         1    229
#> 230           영천시         1    230
#> 231           상주시         1    231
#> 232           경산시         1    232
#> 233           의성군         1    233
#> 234           칠곡군         1    234
#> 235     창원시의창구         1    235
#> 236     창원시성산구         1    236
#> 237 창원시마산합포구         1    237
#> 238 창원시마산회원구         1    238
#> 239     창원시진해구         1    239
#> 240           진주시         1    240
#> 241           진주시         1    241
#> 242           통영시         1    242
#> 243           사천시         1    243
#> 244           김해시         1    244
#> 245           김해시         1    245
#> 246           밀양시         1    246
#> 247           거제시         1    247
#> 248           양산시         1    248
#> 249           양산시         1    249
#> 250           거창군         1    250
#> 251           제주시         1    251
#> 252           제주시         1    252
#> 253         서귀포시         1    253

1.3.2 함수

코드

legislator_raw <- code_election |> 
  dplyr::filter(str_detect(선거명, "국회의원"),
         선거구분 != "0") 

get_precinct <- function(legislator_cd = "20200415", 
                         sgTypecode = "2") {
  # httr의 GET 함수로 데이터를 추출한다
  response <- GET("http://apis.data.go.kr/9760000/CommonCodeService/getCommonSggCodeList",
                  query = list(sgId = legislator_cd,
                                sgTypecode = sgTypecode,
                                numOfRows =  "1000",
                                resultType = "json",
                                serviceKey = Sys.getenv('DATA_GO_DECODE_KEY')))
  
  # 응답 상태와 내용을 확인한다
  print(status_code(response))
  
  response_list <- content(response, "text") |> 
    fromJSON()
  
  response_tbl <- response_list$getCommonSggCodeList$item
  
  return(response_tbl |> as_tibble())
}

get_precinct("20220309")
#> [1] 200
#> # A tibble: 5 × 8
#>   num   sgId     sgTypecode sggName      sdName     wiwName     sggJungsu sOrder
#>   <chr> <chr>    <chr>      <chr>        <chr>      <chr>       <chr>     <chr> 
#> 1 1     20220309 2          종로구       서울특별시 종로구      1         1     
#> 2 2     20220309 2          서초구갑     서울특별시 서초구      1         40    
#> 3 3     20220309 2          중구남구     대구광역시 남구        1         68    
#> 4 4     20220309 2          안성시       경기도     안성시      1         164   
#> 5 5     20220309 2          청주시상당구 충청북도   청주시상당… 1         183

1.3.3 전체 선거구

코드

# 재보궐 제외
# legislator_tbl <- legislator_raw |> 
#   dplyr::filter(선거코드 %in% c("20040415", "20080409", "20120411", 
#                       "20160413", "20200415")) 

legislator_tbl <- legislator_raw |> 
  mutate(data = map2(선거코드, 선거구분, get_precinct))
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200
#> [1] 200

precinct_tbl <- legislator_tbl |> 
  unnest(data)

precinct_tbl
#> # A tibble: 1,264 × 11
#>    선거코드 선거명       선거구분 num   sgId   sgTypecode sggName sdName wiwName
#>    <chr>    <chr>        <chr>    <chr> <chr>  <chr>      <chr>   <chr>  <chr>  
#>  1 20040415 국회의원선거 2        1     20040… 2          종로구  서울…  종로구 
#>  2 20040415 국회의원선거 2        2     20040… 2          중구    서울…  중구(… 
#>  3 20040415 국회의원선거 2        3     20040… 2          용산구  서울…  용산구 
#>  4 20040415 국회의원선거 2        4     20040… 2          성동구… 서울…  성동구 
#>  5 20040415 국회의원선거 2        5     20040… 2          성동구… 서울…  성동구 
#>  6 20040415 국회의원선거 2        6     20040… 2          광진구… 서울…  광진구 
#>  7 20040415 국회의원선거 2        7     20040… 2          광진구… 서울…  광진구 
#>  8 20040415 국회의원선거 2        8     20040… 2          동대문… 서울…  동대문…
#>  9 20040415 국회의원선거 2        9     20040… 2          동대문… 서울…  동대문…
#> 10 20040415 국회의원선거 2        10    20040… 2          중랑구… 서울…  중랑구 
#> # ℹ 1,254 more rows
#> # ℹ 2 more variables: sggJungsu <chr>, sOrder <chr>

1.4 국회의원 당선인

1.4.1 함수

코드

get_elected <- function(sgId = "20200415", sgTypecode = "2",
                        sdName = "서울특별시",sggName = "종로구") {
  response <- GET("http://apis.data.go.kr/9760000/WinnerInfoInqireService2/getWinnerInfoInqire",
              query = list(sgId = sgId,
                           sgTypecode = sgTypecode,
                           sdName = sdName,
                           sggName = sggName,
                           numOfRows = 100,
                           resultType = "json",
                           serviceKey = Sys.getenv('DATA_GO_DECODE_KEY')))

  # 응답 상태와 내용을 확인한다
  cat(status_code(response), ": ", sgId, sgTypecode, sdName, sggName, "\n")
  
  response_list <- content(response, "text") |> 
    fromJSON()
  
  response_tbl <- response_list$getWinnerInfoInqire$item
  
  Sys.sleep(runif(1, 0,0.5))
  
  return(response_tbl |> as_tibble())
}

get_elected()
#> 200 :  20200415 2 서울특별시 종로구
#> # A tibble: 1 × 24
#>   num   sgId    sgTypecode huboid sggName sdName wiwName giho  gihoSangse jdName
#>   <chr> <chr>   <chr>      <chr>  <chr>   <chr>  <chr>   <chr> <chr>      <chr> 
#> 1 1     202004… 2          10013… 종로구  서울…  종로구  1     ""         더불… 
#> # ℹ 14 more variables: name <chr>, hanjaName <chr>, gender <chr>,
#> #   birthday <chr>, age <chr>, addr <chr>, jobId <chr>, job <chr>, eduId <chr>,
#> #   edu <chr>, career1 <chr>, career2 <chr>, dugsu <chr>, dugyul <chr>

1.4.2 전체 당선인

코드
# sido_code <- tribble(
# ~"시도코드", ~"시도명",
# "1100", "서울특별시",
# "2600", "부산광역시",
# "2700", "대구광역시",
# "2800", "인천광역시",
# "2900", "광주광역시",
# "3000", "대전광역시",
# "3100", "울산광역시",
# "5100", "세종특별자치시",
# "4100", "경기도",
# "4200", "강원도",
# "4300", "충청북도",
# "4400", "충청남도",
# "4500", "전라북도",
# "4600", "전라남도",
# "4700", "경상북도",
# "4800", "경상남도",
# "4900", "제주특별자치도")

elected_raw <- legislator_tbl |> 
  dplyr::filter(선거코드 == "20200415",
         선거구분 == "2") |> 
  unnest(data)  |> 
  select(sgId, sgTypecode, sdName, sggName, wiwName) |> 
  mutate(data = pmap(list(sgId, sgTypecode, sdName, sggName), get_elected))

elected_tbl <- elected_raw |> 
  select(data) |> 
  unnest(data)

1.4.3 전체선거 당선인

코드
get_elected_safely <- safely(get_elected, otherwise = "error")

total_elected_raw <- legislator_tbl |> 
  unnest(data)  |> 
  select(sgId, sgTypecode, sdName, sggName, wiwName) |> 
  mutate(data = pmap(list(sgId, sgTypecode, sdName, sggName), get_elected_safely))

total_elected_tbl <- total_elected_raw |> 
  mutate(result = map(data, pluck, "result")) |>
  select(sgId, sgTypecode, sdName, sggName, wiwName, result)

total_elected_tbl |> 
  write_rds("data/total_elected_tbl.rds")

1.4.4 후처리(오류)

코드
total_elected_tbl <- 
  read_rds("data/total_elected_tbl.rds")

total_elected_true <- total_elected_tbl |> 
  mutate(tibble = map_lgl(result, is_tibble)) |> 
  dplyr::filter(tibble) |> 
  select(-tibble)

total_elected_false <- total_elected_raw |> 
  dplyr::filter(sgId == "20120411",
         sdName == "인천광역시",
         sggName %in% c("남동구을", "부평구갑", "서구강화군갑")) |> 
  mutate(data = pmap(list(sgId, sgTypecode, sdName, sggName), get_elected_safely)) |> 
  mutate(result = map(data, pluck, "result")) |>
  select(sgId, sgTypecode, sdName, sggName, wiwName, result)


total_elected_all <- bind_rows(total_elected_true, total_elected_false)

total_elected_all |> 
  write_rds("data/total_elected_all.rds")

2 분석

2.1 국회의원 정수

코드
library(tidyverse)
library(gt)

code_election |> 
  dplyr::filter(str_detect(선거명, "국회의원"),
         선거구분 == "0") |> 
  add_column(의원수 = c(299, 299, 300, 300, 300)) |> 
  gt() |> 
  gtExtras::gt_theme_538() |> 
  cols_align("center")
선거코드 선거명 선거구분 의원수
20040415 제17대 국회의원선거 0 299
20080409 제18대 국회의원선거 0 299
20120411 제19대 국회의원선거 0 300
20160413 제20대 국회의원선거 0 300
20200415 제21대 국회의원선거 0 300

2.2 역대 정당별 의석수

코드
total_elected_all <- 
  read_rds("data/total_elected_all.rds")

elected_tbl <- total_elected_all |> 
  select(result) |> 
  unnest(result)

elected_tbl |> 
  count(name, birthday, sort=TRUE) |> 
  count(n) |> 
  mutate(비율 = nn/sum(nn))
#> # A tibble: 5 × 3
#>       n    nn    비율
#>   <int> <int>   <dbl>
#> 1     1   602 0.632  
#> 2     2   196 0.206  
#> 3     3   105 0.110  
#> 4     4    42 0.0441 
#> 5     5     8 0.00839
코드
elected_tbl |> 
  dplyr::filter(sgId %in% c("20040415", "20080409", "20120411", "20160413", "20200415")) |> 
  count(sdName, sgId, sort = TRUE) |> 
  pivot_wider(names_from = sgId, values_from = n) 
#> # A tibble: 19 × 6
#>    sdName         `20160413` `20200415` `20040415` `20080409` `20120411`
#>    <chr>               <int>      <int>      <int>      <int>      <int>
#>  1 경기도                 60         59         49         51         52
#>  2 전국                   47         47         56         54         54
#>  3 서울특별시             49         49         48         48         48
#>  4 부산광역시             18         18         18         18         18
#>  5 경상남도               16         16         17         17         16
#>  6 경상북도               13         13         15         15         15
#>  7 인천광역시             13         13         12         12         12
#>  8 전라남도               10         10         13         12         11
#>  9 대구광역시             12         12         12         12         12
#> 10 전라북도               10         10         11         11         11
#> 11 충청남도               11         11         10         10         10
#> 12 강원도                  8          8          8          8          9
#> 13 광주광역시              8          8          7          8          8
#> 14 충청북도                8          8          8          8          8
#> 15 대전광역시              7          7          6          6          6
#> 16 울산광역시              6          6          6          6          6
#> 17 제주도                 NA         NA          3         NA         NA
#> 18 제주특별자치도          3          3         NA          3          3
#> 19 세종특별자치시          1          2         NA         NA          1
코드
# 재선 이상 -------------
elected_key <- elected_tbl |> 
  dplyr::filter(sgId %in% c("20040415", "20080409", "20120411", "20160413", "20200415")) |> 
  count(name, birthday, sort=TRUE) |>
  dplyr::filter(n > 2) |> 
  mutate(name_birth = glue::glue("{name}_{birthday}")) 


elected_tbl |> 
    dplyr::filter(sgId %in% c("20040415", "20080409", "20120411", "20160413", "20200415")) |> 
  mutate(name_birth = glue::glue("{name}_{birthday}")) |> 
  inner_join(elected_key) |> 
  ggplot(aes(x = sgId, y = name_birth, group = name_birth)) +
    geom_point() +
    geom_line()

코드
elected_basetable <- elected_tbl |> 
  left_join(code_election |> dplyr::filter(선거구분 == 0), by = c("sgId" = "선거코드")) |> 
  mutate(현정당 = case_when(jdName %in% c("민주정의당", "민주자유당", "신한국당",
                                        "한나라당", "새누리당", "자유한국당","새로운보수당",
                                        "미래를향한전진4.0", "미래통합당", "국민의힘") ~ "국민의힘",
                            jdName %in% c("평화민주당", "통일민주당", "민주당", "새정치국민회의",
                                        "열린우리당", "대통합민주신당", "통합민주당",
                                        "민주통합당", "새정치민주연합", "더불어민주당") ~ "더불어민주당",
                            TRUE ~ "그외정당")) |> 
  dplyr::filter(sgId %in% c("20040415", "20080409", "20120411", "20160413", "20200415")) |>
  mutate(선거명 = str_remove(선거명, "\\s+국회의원선거")) |> 
  mutate(sgId_name = str_glue("{선거명}  \n{sgId}"))


election_total_gg <- elected_basetable |> 
  count(sgId_name, 선거명, 현정당, sort=TRUE) |> 
  ggplot(aes(x = sgId_name, y = n, fill = 현정당)) +
    geom_col(width = 0.5) +
    scale_fill_manual(values = c("더불어민주당" = "#0054A6", "국민의힘" = "#E2231A", 
                                 "그외정당" = "#A6A6A6")) +
    labs(fill = NULL,
         x ="",
         y = "",
         title = "역대 총선 민주당과 국민의힘 선거결과") +
    theme_korean() +
    theme(legend.position = "top",
          legend.key.size = unit(0.3, "cm"),
          axis.text.x = element_text(angle = 0)) +
    coord_flip() +
    geom_hline(yintercept = 150, linetype = 2, color = "gray30") +
    geom_text(aes(label = n), size = 3, position = position_stack(vjust = 0.5)) 

# election_total_gg
# 
# ragg::agg_jpeg("images/election_total_gg.jpeg",
#                width = 10, height = 7, units = "in", res = 600)
# election_total_gg
# dev.off()

2.3 의석당 득표수

코드
elected_region_gg <- elected_basetable |> 
  mutate(권역 = case_when(
    sdName %in% c("경기도", "서울특별시", "인천광역시") ~ "수도권",
    sdName %in% c("전라남도", "전라북도", "광주광역시") ~ "전라권",
    sdName %in% c("경상남도", "경상북도", "대구광역시", "부산광역시", "울산광역시") ~ "경상권",
    sdName %in% "전국" ~ "전국",
    sdName %in% c("강원도", "세종특별자치시", "제주도", "제주특별자치도", "대전광역시", "충청남도", "충청북도") ~ "충청제주강원")) |> 
  mutate(득표수 = parse_number(dugsu),
         득표율 = parse_number(dugyul)) |> 
  group_by(sgId, 권역, 현정당) |>
  summarise(득표수 = sum(득표수),
            득표율 = sum(득표율),
            의석수 = n(), .groups = 'drop') |> 
  pivot_wider(names_from = 현정당, values_from = c("득표수", "득표율", "의석수"), values_fill = 0) |> 
  mutate(의석수차 = 의석수_더불어민주당 - 의석수_국민의힘) |> 
  left_join(code_election |> dplyr::filter(선거구분 == 0), by = c("sgId" = "선거코드")) |>   
  mutate(선거명 = str_remove(선거명, "\\s+국회의원선거")) |>   
  mutate(sgId_name = str_glue("{선거명}  \n{sgId}")) |> 
  select(sgId_name, sgId, 권역, 의석수차) |> 
  mutate(의석수차 = ifelse(권역 == "전국" & sgId == "20200415", -2, 의석수차)) |>
  # 더불어 민주당/시민당 17, 미래통합당/한국당 19, 국민의당 3, 열린민주당 3
  # https://ko.wikipedia.org/wiki/대한민국_제21대_국회의원_선거
  mutate(권역 = factor(권역, levels = c("경상권", "전국", "충청제주강원", "전라권", "수도권"))) |> 
  ggplot(aes(x = sgId_name, y = 의석수차, color = 권역, group = 권역)) +
    geom_point(size = 2, show.legend = TRUE) +
    geom_line(aes(size = 권역)) +
    coord_flip() +
    theme_korean() +
    labs(y = "의석수차(민주당 - 국민의힘)",
         x = "",
         caption = "자료: 중앙선거관리위원회 당선인정보 API",
         title = "역대 권역별 국회의원 의석수 변화",
         subtitle = "권역별 민주당계열 정당 의석수에서 국민의힘 계열정당 의석수 차이") +
    geom_text_repel(aes(label = 의석수차), size = 5, show.legend = FALSE) +
    scale_color_manual(values = c("전라권" = "#b8cafc", "경상권" = "#fcb8b8", 
                                 "전국" = "#A6A6A6", "충청제주강원" = "black", 
                                 "수도권" = "#021ffa")) +
    theme(legend.position = "top") +
    scale_size_manual(values = c(0.5, 0.5, 0.5, 0.5, 1))  

# elected_region_gg
# 
# ragg::agg_jpeg("images/elected_region_gg.jpeg",
#                width = 10, height = 7, units = "in", res = 600)
# elected_region_gg
# dev.off()

2.4 연령

코드
elected_basetable |> 
  mutate(age = parse_number(age)) |> 
  group_by(sgId, 선거명, 현정당) |>
  summarise(평균나이 = mean(age, na.rm = TRUE),
            최고연령 = max(age, na.rm = TRUE),
            최저연령 = min(age, na.rm = TRUE)) |> 
  select(-최고연령, -최저연령) |> 
  pivot_wider(names_from = 현정당, values_from = 평균나이)
#> # A tibble: 5 × 5
#> # Groups:   sgId, 선거명 [5]
#>   sgId     선거명 국민의힘 그외정당 더불어민주당
#>   <chr>    <chr>     <dbl>    <dbl>        <dbl>
#> 1 20040415 제17대     52.1     53.8         49.6
#> 2 20080409 제18대     51.9     57.7         53.1
#> 3 20120411 제19대     55.0     52.0         52.8
#> 4 20160413 제20대     56.6     56.2         54.2
#> 5 20200415 제21대     56.5     52.3         55.0

elected_basetable |> 
  mutate(age = parse_number(age)) |> 
  dplyr::filter(현정당 != "그외정당") |>
  ggplot(aes(x = sgId, y = age, fill = gender)) +
    geom_boxplot(width=0.3) +
    coord_flip() +
    facet_wrap(~현정당) +
    theme(legend.position = "top")

2.5 국회의원 추적

코드
library(ggrepel)

elected_basetable |> 
  mutate(득표수 = parse_number(dugsu),
         득표율 = parse_number(dugyul)) |>
  dplyr::filter(득표수 != 0) |>
  dplyr::filter(현정당 == "더불어민주당",
         sdName %in% c("서울특별시", "경기도", "인천광역시")) |>
  ggplot(aes(x = 득표수, y = 득표율, color = sgId)) +
    geom_point() +
    geom_smooth(method = "lm", se = FALSE) +
    geom_text_repel(aes(label = name), size = 2, position = position_jitter(width = 0.1, height = 0.1)) +
    theme(legend.position = "top") +
    facet_wrap(vars(현정당, sgId), nrow = 1, scales = "free")