1 광역단체장

시도별 여론조사 현황

# 1. 데이터 -----
## 2018-06-03

sido_df  <- read_rds("data/sido_survey_df.rds")

names(sido_df)  <- c("조사 의뢰", "조사 기관", "응답 인원", "더불어민주당", "자유한국당", 
                           "바른미래당", "정의당", "기타·무응답", "참고", "조사일", "시도명", 
                           "민주평화당", "무소속")

sido_now_df <- sido_df %>% 
    mutate(무소속 = str_replace_all(무소속, "%", "") %>% as.numeric,
              민주평화당 = str_replace_all(민주평화당, "%", "") %>% as.numeric) %>% 
    group_by(시도명) %>% 
    arrange(조사일)  %>% 
    filter(row_number() == n()) %>% 
    select(시도명, contains("당"), contains("무소속")) %>% 
    ungroup()

current_df <- sido_now_df %>% 
    gather(정당, 지지율, -시도명) %>% 
    mutate(지지율 = as.numeric(지지율)) %>% 
    group_by(시도명) %>% 
    summarise(지지율 = max(지지율, na.rm=TRUE))

sido_current_df <- sido_now_df %>% 
    gather(정당, 지지율, -시도명) %>% 
    mutate(지지율 = as.numeric(지지율)) %>% 
    inner_join(current_df)

sido_viz_df <- sido_current_df %>% 
    count(정당)

DT::datatable(sido_current_df)

시도 현황 지도

# 2. 시각화 -----
## 2.0. 지도정보 룩업표 -----
spatial_tbl <- tribble(
    ~"CTPRVN_CD", ~"CTP_KOR_NM", ~"시도명",
    11,  "서울특별시",  "서울특별시장",
    26,  "부산광역시",  "부산광역시장",
    27,  "대구광역시",  "대구광역시장",
    28,  "인천광역시",  "인천광역시장",
    29,  "광주광역시",  "광주광역시장",
    30,  "대전광역시",  "대전광역시장",
    31,  "울산광역시",   "울산광역시장",
    36,  "세종특별자치시", "세종특별자치시장",
    41,  "경기도",         "경기도지사",
    42,  "강원도",         "강원도지사",
    43,  "충청북도",      "충청북도지사",
    44,  "충청남도",      "충청남도지사",
    45,  "전라북도",      "전라북도지사",
    46,  "전라남도",      "전라남도지사",
    47,  "경상북도",      "경상북도지사",
    48,  "경상남도",      "경상남도지사",
    50,  "제주특별자치도", "제주특별자치도지사"
)

## 2.1. 지도 데이터 가져오기 -----
# sido_shp <- st_read("data/shapefile_sido/TL_SCCO_CTPRVN.shp")

sido_shp$CTP_KOR_NM <- iconv(sido_shp$CTP_KOR_NM, from = "CP949", to = "UTF-8", sub = NA, mark = TRUE, toRaw = FALSE)
sido_simp_shp <- st_simplify(sido_shp, dTolerance = 100)

## 2.2. 지지율 데이터 병합 ----
sido_current_df <- left_join(sido_current_df, spatial_tbl) %>% 
    mutate(CTPRVN_CD = factor(CTPRVN_CD))

sido_simp_shp <- left_join(sido_simp_shp, sido_current_df)


## 2.3. 지지율 데이터 시각화 ----

sido_simp_shp %>% 
    ggplot(aes(fill=sido_simp_shp$정당)) +
        geom_sf() +
        theme_minimal(base_family="NanumGothic") +
        labs(title="제7회 지방선거 - 광역단체장") + 
        theme(legend.position = "right") +
        scale_fill_manual(values = c("blue", "gray", "red", "white")) +
        labs(fill="정당") +
        theme(panel.grid.major = element_line(colour = 'transparent'),
          panel.grid = element_blank(), 
          line = element_blank(), 
          axis.ticks = element_blank(),
          axis.text.x = element_blank(), 
          axis.text.y = element_blank(),
          legend.position = "top")

1.1 광역단체장 인터랙티브 지도

## 2.4. 인터랙티브 그래프 ----
sido_simp_shp %>% 
    mapview(., zcol="정당",  col.regions = c("blue", "gray", "red", "red"))

1.2 광역단체장 지지율 추이

sido_now_df <- sido_df %>% 
    mutate(무소속 = str_replace_all(무소속, "%", "") %>% as.numeric,
           민주평화당 = str_replace_all(민주평화당, "%", "") %>% as.numeric) %>% 
    select(시도명, 조사일, contains("당"), contains("무소속")) %>% 
    ungroup() %>% 
    as_tibble()

# 2. 시계열 추세 -----
## 2.1. 정적 시계열 추세 -----
sido_ts_df <- sido_now_df %>% 
    gather(정당, 지지율, -시도명, -조사일) %>% 
    mutate(정당 = factor(정당, levels=c("더불어민주당","자유한국당", "바른미래당", "민주평화당", "정의당", "무소속"))) %>% 
    filter(!str_detect(시도명, "광주")) %>% 
    mutate(지지율 = as.numeric(지지율))

sido_ts_df %>% 
    ggplot(aes(x=조사일, y=지지율, color=정당, group=정당)) +
      geom_line() +
      geom_point() +
      facet_wrap(~시도명) +
      scale_color_manual(values=c("blue", "red", "cyan", "green", "yellow", "gray"))

1.3 광역단체장 인터랙티브 지지율 추이

## 2.2. 동적 시계열 추세 -----
### 2.2.1. 공유 데이터
sido_ts_sd <- SharedData$new(sido_ts_df)

### 2.2.2. 제어
filter_checkbox("시도명", "광역시도명", sido_ts_sd, ~시도명, inline = TRUE)
# sido_ctrl <- filter_select("시도명", "광역시도명", sido_ts_sd, ~시도명)

### 2.2.3. 시각화
sido_ts_g <- ggplot(sido_ts_sd, aes(x=조사일, y=지지율, color=정당, group=정당)) +
    geom_line() +
    geom_point() +
    scale_color_manual(values=c("blue", "red", "cyan", "green", "yellow", "gray"))

sido_ts_gg <- ggplotly(sido_ts_g)
### 2.2.4. 인터랙티브 시각화
bscols(widths = c(12),
       sido_ts_gg)

2 경기도

2.1 경기도 시군별 여론조사 현황

## 2018-06-04
gg_sigun_df <- read_rds("data/gg_sigun_df.rds") %>% 
    rename(시군명 = sigun) %>% 
    filter(X1 != "?%")

gg_sigun_now_df <- gg_sigun_df %>% 
    group_by(시군명) %>% 
    arrange(시작일) %>% 
    filter(row_number() == n()) %>% 
    mutate(X1 = str_replace(X1 , "%", "") %>% as.numeric(),
           X2 = str_replace(X2 , "%", "") %>% as.numeric(),
           X3 = str_replace(X3 , "%", "") %>% as.numeric(),
           X4 = str_replace(X4 , "%", "") %>% as.numeric(),
           X5 = str_replace(X5 , "%", "") %>% as.numeric(),
           X6 = str_replace(X6 , "%", "") %>% as.numeric(),
           X7 = str_replace(X7 , "%", "") %>% as.numeric(),
           X8 = str_replace(X8 , "%", "") %>% as.numeric(),
           X9 = str_replace(X9 , "%", "") %>% as.numeric(),
           X10= str_replace(X10, "%", "") %>% as.numeric()) %>% 
    rename("더불어민주당" = X1, 
           "자유한국당"   = X2, 
           "바른미래당"   = X3, 
           "민주평화당"   = X4, 
           "정의당"       = X5, 
           "민중당"       = X6, 
           "대한애국당"   = X7, 
           "원외1"        = X8, 
           "원외2"        = X9, 
           "원외3"        = X10) %>% 
    ungroup()

## 1.1. 경기도 시군 현재1위 -----
gg_sigun_now_df$당선 <- names(gg_sigun_now_df[,4:13])[apply(gg_sigun_now_df[,4:13], 1, which.max)]
gg_sigun_now_df$지지율1위 <- apply(gg_sigun_now_df[,4:13], 1, max, na.rm=TRUE)

gg_sigun_now_df %>% 
    count(당선) %>% 
    rename(정당=당선) %>% 
    mutate(비율= scales::percent(n/sum(n))) %>% 
    rename(현재1위=n)
# A tibble: 3 x 3
  정당         현재1위 비율 
  <chr>          <int> <chr>
1 더불어민주당      21 91.3%
2 원외2              1 4.3% 
3 자유한국당         1 4.3% 
gg_sigun_now_df %>% 
    DT::datatable() 

2.2 경기도 시군별 1위 지도

# 2. 시각화 -----
## 2.1. 경기도 시군코드 --------
sido_cd_df <- read_excel("data/jscode/jscode20171218/KIKmix.20171218.xlsx", sheet="KIKmix")

sigungu_cd_df <- sido_cd_df %>% 
    mutate(CTPRVN_CD = str_sub(행정동코드, 1,5)) %>% 
    group_by(CTPRVN_CD) %>% 
    summarise(시도명 = first(시도명),
                 시군구명 = first(시군구명)) %>% 
    mutate(시군구명 = ifelse(is.na(시군구명), 시도명, 시군구명))

gg_cd_v <- sigungu_cd_df %>% 
    filter(str_detect(시도명, "경기")) %>% 
    pull(CTPRVN_CD)
## 2.2. 지도 데이터 가져오기 -----
# sgg_shp  <- st_read("data/shapefile_sgg/TL_SCCO_SIG.shp")

sgg_shp$SIG_KOR_NM <- iconv(sgg_shp$SIG_KOR_NM, from = "CP949", to = "UTF-8", sub = NA, mark = TRUE, toRaw = FALSE)
sgg_smpl_shp <- st_simplify(sgg_shp, dTolerance = 100)

gg_shp <- sgg_smpl_shp %>% 
    filter(SIG_CD %in% gg_cd_v)

## 2.3. 경기 시군 데이터 정리 --------
gg_shp <- gg_shp %>% 
    mutate(시군명 = case_when(str_detect(SIG_KOR_NM, "수원") ~ "수원시",
                           str_detect(SIG_KOR_NM, "성남") ~ "성남시",
                           str_detect(SIG_KOR_NM, "안양") ~ "안양시",
                           str_detect(SIG_KOR_NM, "안산") ~ "안산시",
                           str_detect(SIG_KOR_NM, "고양") ~ "고양시",
                           str_detect(SIG_KOR_NM, "용인") ~ "용인시",
                           TRUE ~ SIG_KOR_NM))


## 2.4. 지지율 데이터 병합 ----
gg_sigun_shp <- left_join(gg_shp, gg_sigun_now_df, by="시군명")

gg_sigun_shp <- gg_sigun_shp %>% 
    mutate(당선 = factor(당선, levels = c("더불어민주당", "자유한국당", "원외2")))


# 3. 시각화 ----
## 3.1. 정적 그래프 ----
leader_party_g <- ggplot(data=gg_sigun_shp, aes(fill=당선)) +
    geom_sf() +
    theme_minimal(base_family="NanumGothic") +
    labs(title="제7회 지방선거 - 경기도 기초단체장") + 
    scale_fill_manual(values = c("blue", "red", "gray"), name = "1위 당선자 정당") +
    theme(panel.grid.major = element_line(colour = 'transparent'),
          panel.grid = element_blank(), 
          line = element_blank(), 
          axis.ticks = element_blank(),
          axis.text.x = element_blank(), 
          axis.text.y = element_blank(),
          legend.position = "right")


leader_rate_g <- ggplot(data=gg_sigun_shp, aes(fill=지지율1위)) +
    geom_sf() +
    theme_minimal(base_family="NanumGothic") +
    labs(title="제7회 지방선거 - 경기도 기초단체장") + 
    scale_fill_gradient(low = "wheat1", high = "red", name = "1위 당선자 지지율", labels = scales::comma) +
    theme(panel.grid.major = element_line(colour = 'transparent'),
          panel.grid = element_blank(), 
          line = element_blank(), 
          axis.ticks = element_blank(),
          axis.text.x = element_blank(), 
          axis.text.y = element_blank(),
          legend.position = "right")

grid.arrange(leader_party_g, leader_rate_g, nrow=1)

2.3 경기도 기초다체장 인터랙티브 지도

## 3.2. 인터랙티브 그래프 ----
gg_sigun_shp %>% 
    mapview(., zcol="당선",  col.regions = c("blue", "red", "gray", "gray"))

2.4 경기 기초단체장 지지율 추이

# 1. 데이터 -----
gg_sigun_df  <- read_rds("data/gg_sigun_df.rds")

# 2. 시계열 추세 -----
## 2.1. 정적 시계열 추세 -----
gg_sigun_ts_df <- gg_sigun_df %>% 
    select(-조사기관) %>% 
    rename("더불어민주당" = X1, 
           "자유한국당"   = X2, 
           "바른미래당"   = X3, 
           "민주평화당"   = X4, 
           "정의당"       = X5, 
           "민중당"       = X6, 
           "대한애국당"   = X7, 
           "원외1"        = X8, 
           "원외2"        = X9, 
           "원외3"        = X10) %>% 
    gather(정당, 지지율, -sigun, -시작일) %>% 
    filter(정당 %in% c("더불어민주당","자유한국당", "바른미래당", "민주평화당", "정의당")) %>% 
    mutate(지지율 = str_replace(지지율, "%", "") %>% as.numeric) %>% 
    mutate(정당 = factor(정당, levels=c("더불어민주당","자유한국당", "바른미래당", "민주평화당", "정의당")))

gg_sigun_ts_df %>% 
    ggplot(aes(x=시작일, y=지지율, color=정당, group=정당)) +
    geom_line() +
    geom_point() +
    facet_wrap(~sigun) +
    scale_color_manual(values=c("blue", "red", "cyan", "green", "yellow", "gray")) +
    labs(x="")

2.5 경기 기초단체장 인터랙티브 지지율 추이

## 2.2. 동적 시계열 추세 -----
### 2.2.1. 공유 데이터
sigun_ts_sd <- SharedData$new(gg_sigun_ts_df)

### 2.2.2. 제어
filter_checkbox("sigun", "경기 시군명", sigun_ts_sd, ~sigun, inline = TRUE)
### 2.2.3. 시각화
sigun_ts_g <- sigun_ts_sd %>% 
    ggplot(aes(x=시작일, y=지지율, color=정당, group=정당)) +
        geom_line() +
        geom_point() +
        scale_color_manual(values=c("blue", "red", "cyan", "green", "yellow", "gray")) +
        labs(x="")


sigun_ts_gg <- ggplotly(sigun_ts_g)

### 4.2.5. 인터랙티브 시각화

bscols(widths = c(12),
       sigun_ts_gg)