1 정당지지율 데이터

위키백과 대한민국의 정당 지지율 데이터가 매주 정당여론조사를 바탕으로 업데이트 되고 있다. 이에 반해 현재(2020-03-28)시점 나무위키 틀:한국갤럽 2020년 정당 여론조사는 아직 체계적으로 여론조사결과가 업데이트 되고 있지는 못하고 있다. 한국갤럽 갤럽리포트에는 갤럽에서 조사한 정당별 지지율이 매주 올라오고 있으나 PDF 파일 형식으로 자료가 제공되고 있다.

2 데이터 가져오기

위키백과 대한민국 정당 지지율 웹사이트에서 체계적으로 정리되고 있는 정당지지율 데이터를 rvest팩키지로 가져온다. 2016년 1월부터 정당지지율 데이터가 정리되어 있다는 점에서 대한민국의 저력을 느낄 수 있다.

library(tidyverse)
library(rvest)

Sys.setlocale("LC_ALL", "C")

party_url <- "https://ko.wikipedia.org/wiki/대한민국의_정당_지지율"

party_html <- party_url %>% 
  read_html()

survey_lst <- party_html %>% 
  html_nodes("table") %>% 
  .[3:7] %>% 
  html_table(fill = TRUE)

Sys.setlocale("LC_ALL", "Korean")

(surv_2020_dat <- survey_lst %>% 
  .[[5]])

surv_2020_dat %>% 
  write_rds("data/surv_2020_dat.rds")

3 데이터 자료구조

각 정당별로 여론조사회사별로 데이터를 준비하고 정제한 후 하나로 합쳐 각 정당별 지지율 데이터를 만들어 낸다.

surv_2020_dat <- read_rds("data/surv_2020_dat.rds")

surv_long_df <- surv_2020_dat %>% 
  janitor::clean_names() %>% 
  gather(정당, 지지율, -조사_기간)

## 더불어민주당
더불어민주당 <- surv_long_df %>% 
  filter(str_detect(정당, "더불어민주당")) %>% 
  filter(조사_기간 != "조사 기간") %>% 
  spread(정당, 지지율) %>% 
  rename(한국갤럽 = 더불어민주당,
         주중리얼 = 더불어민주당_2,
         주간리얼 = 더불어민주당_3) %>% 
  mutate(정당 = "더불어민주당")

## 자유한국당 --> 미래통합당
미래통합당 <- surv_long_df %>% 
  filter(str_detect(정당, "자유한국당")) %>% 
  filter(조사_기간 != "조사 기간") %>% 
  spread(정당, 지지율) %>% 
  rename(한국갤럽 = 자유한국당,
         주중리얼 = 자유한국당_2,
         주간리얼 = 자유한국당_3) %>% 
  mutate(정당 = "미래통합당")

## 정의당
정의당 <- surv_long_df %>% 
  filter(str_detect(정당, "정의당")) %>% 
  filter(조사_기간 != "조사 기간") %>% 
  spread(정당, 지지율) %>% 
  rename(한국갤럽 = 정의당,
         주중리얼 = 정의당_2,
         주간리얼 = 정의당_3) %>% 
  mutate(정당 = "정의당")

## 바른미래당 --> 민생당
민생당 <- surv_long_df %>% 
  filter(str_detect(정당, "바른미래당")) %>% 
  filter(조사_기간 != "조사 기간") %>% 
  spread(정당, 지지율) %>% 
  rename(한국갤럽 = 바른미래당,
         주중리얼 = 바른미래당_2,
         주간리얼 = 바른미래당_3) %>% 
  mutate(정당 = "민생당")

party_dat <- bind_rows(더불어민주당, 미래통합당, 정의당, 민생당)

party_dat %>% 
  DT::datatable()

4 데이터 정제

지지율을 잘 분석할 수 있는 숫자형 자료로 데이터를 변환시킨다.

party_df <- party_dat %>% 
  select(조사기간 = 조사_기간, 갤럽=한국갤럽, 리얼미터=주간리얼, 정당) %>% 
  gather(조사기관, 지지율, -조사기간, -정당) %>% 
  # tbl_df %>% 
  mutate(지지율 = str_extract(지지율, "[0-9]{1,2}\\.[0-9]") %>% as.numeric) %>% 
  mutate(조사기간 = str_remove(조사기간, "2020년 ")) %>% 
  mutate(정당 = factor(정당, levels=c("더불어민주당", "미래통합당", "정의당", "민생당")))

party_df
    조사기간         정당 조사기관 지지율
1    1월 1주 더불어민주당     갤럽     NA
2    1월 2주 더불어민주당     갤럽   40.0
3    1월 3주 더불어민주당     갤럽   39.0
4    1월 4주 더불어민주당     갤럽     NA
5    1월 5주 더불어민주당     갤럽   34.0
6    2월 1주 더불어민주당     갤럽   36.0
7    2월 2주 더불어민주당     갤럽   37.0
8    2월 3주 더불어민주당     갤럽   36.0
9    2월 4주 더불어민주당     갤럽   37.0
10   3월 1주 더불어민주당     갤럽   36.0
11   3월 2주 더불어민주당     갤럽   39.0
12   3월 3주 더불어민주당     갤럽   38.0
13   3월 4주 더불어민주당     갤럽   37.0
14   1월 1주   미래통합당     갤럽     NA
15   1월 2주   미래통합당     갤럽   20.0
16   1월 3주   미래통합당     갤럽   22.0
17   1월 4주   미래통합당     갤럽     NA
18   1월 5주   미래통합당     갤럽   21.0
19   2월 1주   미래통합당     갤럽   20.0
20   2월 2주   미래통합당     갤럽   21.0
21   2월 3주   미래통합당     갤럽   23.0
22   2월 4주   미래통합당     갤럽   21.0
23   3월 1주   미래통합당     갤럽   22.0
24   3월 2주   미래통합당     갤럽   22.0
25   3월 3주   미래통합당     갤럽   23.0
26   3월 4주   미래통합당     갤럽   22.0
27   1월 1주       정의당     갤럽     NA
28   1월 2주       정의당     갤럽    3.0
29   1월 3주       정의당     갤럽    3.0
30   1월 4주       정의당     갤럽     NA
31   1월 5주       정의당     갤럽    2.0
32   2월 1주       정의당     갤럽    2.0
33   2월 2주       정의당     갤럽    3.0
34   2월 3주       정의당     갤럽     NA
35   2월 4주       정의당     갤럽    6.0
36   3월 1주       정의당     갤럽    6.0
37   3월 2주       정의당     갤럽    6.0
38   3월 3주       정의당     갤럽    4.0
39   3월 4주       정의당     갤럽    5.0
40   1월 1주       민생당     갤럽     NA
41   1월 2주       민생당     갤럽    3.0
42   1월 3주       민생당     갤럽    3.0
43   1월 4주       민생당     갤럽     NA
44   1월 5주       민생당     갤럽    2.0
45   2월 1주       민생당     갤럽    2.0
46   2월 2주       민생당     갤럽    3.0
47   2월 3주       민생당     갤럽    4.0
48   2월 4주       민생당     갤럽    1.0
49   3월 1주       민생당     갤럽    1.0
50   3월 2주       민생당     갤럽    0.0
51   3월 3주       민생당     갤럽    1.0
52   3월 4주       민생당     갤럽    0.0
53   1월 1주 더불어민주당 리얼미터   41.8
54   1월 2주 더불어민주당 리얼미터   41.1
55   1월 3주 더불어민주당 리얼미터   38.4
56   1월 4주 더불어민주당 리얼미터   40.4
57   1월 5주 더불어민주당 리얼미터   38.5
58   2월 1주 더불어민주당 리얼미터   40.2
59   2월 2주 더불어민주당 리얼미터   39.9
60   2월 3주 더불어민주당 리얼미터   40.5
61   2월 4주 더불어민주당 리얼미터   41.0
62   3월 1주 더불어민주당 리얼미터   41.7
63   3월 2주 더불어민주당 리얼미터   41.5
64   3월 3주 더불어민주당 리얼미터   42.1
65   3월 4주 더불어민주당 리얼미터     NA
66   1월 1주   미래통합당 리얼미터   32.1
67   1월 2주   미래통합당 리얼미터   31.3
68   1월 3주   미래통합당 리얼미터   32.7
69   1월 4주   미래통합당 리얼미터   32.1
70   1월 5주   미래통합당 리얼미터   29.3
71   2월 1주   미래통합당 리얼미터   30.2
72   2월 2주   미래통합당 리얼미터   32.0
73   2월 3주   미래통합당 리얼미터   33.7
74   2월 4주   미래통합당 리얼미터   31.0
75   3월 1주   미래통합당 리얼미터   31.2
76   3월 2주   미래통합당 리얼미터   32.1
77   3월 3주   미래통합당 리얼미터   33.6
78   3월 4주   미래통합당 리얼미터     NA
79   1월 1주       정의당 리얼미터    5.5
80   1월 2주       정의당 리얼미터     NA
81   1월 3주       정의당 리얼미터    4.7
82   1월 4주       정의당 리얼미터    3.8
83   1월 5주       정의당 리얼미터    3.8
84   2월 1주       정의당 리얼미터    4.1
85   2월 2주       정의당 리얼미터    3.9
86   2월 3주       정의당 리얼미터    1.3
87   2월 4주       정의당 리얼미터    4.3
88   3월 1주       정의당 리얼미터    4.9
89   3월 2주       정의당 리얼미터    4.3
90   3월 3주       정의당 리얼미터    3.7
91   3월 4주       정의당 리얼미터     NA
92   1월 1주       민생당 리얼미터    4.6
93   1월 2주       민생당 리얼미터    4.7
94   1월 3주       민생당 리얼미터    3.9
95   1월 4주       민생당 리얼미터    4.1
96   1월 5주       민생당 리얼미터    3.5
97   2월 1주       민생당 리얼미터    3.3
98   2월 2주       민생당 리얼미터    2.6
99   2월 3주       민생당 리얼미터    3.0
100  2월 4주       민생당 리얼미터    4.1
101  3월 1주       민생당 리얼미터    4.1
102  3월 2주       민생당 리얼미터    2.1
103  3월 3주       민생당 리얼미터    1.4
104  3월 4주       민생당 리얼미터     NA

5 정당지지율 시각화

5.1 정적 시각화

library(extrafont)
loadfonts()

party_g <- party_df %>% 
  ggplot(aes(x=조사기간, y=지지율, group=정당, color=정당)) +
    geom_point() +
    geom_line() +
    facet_wrap(~조사기관) +
    theme_light(base_family = "NanumGothic") +
    labs(x="", y="정당지지율(%)", title="제21대 총선 전 2020년 정당지지율") +
    scale_color_manual(values=c("blue", "#ff00a6", "yellow", "#007d08")) +
    theme(legend.position = "top",
          axis.text.x = element_text(angle = 270, hjust = 1),)

party_g

5.2 인터랙티브 시각화

library(plotly)
ggplotly(party_g) %>% 
  config(displayModeBar = FALSE) %>% 
  layout(showlegend = FALSE)