1 여론조사 현황

중앙선거여론조사심의위원회 웹사이트에서 알림마당 → 여론조사결과 현황을 통해 여론조사진행에 대한 전반적인 사항을 확인할 수 있다. MBC 총선여론조사웹사이트에서 동일한 데이터를 크롤링하여 데이터를 제공하고 있다.

알림마당 → 여론조사결과 현황에 담긴 여론조사결과 현황을 긁어와서 분석한다.

Sys.setlocale("LC_ALL","ko_KR.UTF-8")
[1] "ko_KR.UTF-8/ko_KR.UTF-8/ko_KR.UTF-8/C/ko_KR.UTF-8/en_US.UTF-8"
library(tidyverse)
library(webshot2)

webshot("https://www.nesdc.go.kr/portal/bbs/B0000005/list.do?menuNo=200467", "fig/nesdc.png")

1.1 특정 페이지

알림마당 → 여론조사결과 현황의 첫번째 현황만 가져와서 데이터프레임으로 변환시킨다.

library(tidyverse)
library(rvest)

Sys.setlocale("LC_ALL","ko_KR.UTF-8")

nesdc_html <- read_html("https://www.nesdc.go.kr/portal/bbs/B0000005/list.do?menuNo=200467")

nesdc_txt <- nesdc_html %>% 
  html_nodes('div.board') %>% 
  html_nodes('span.col') %>% 
  html_text()

nesdc_dat <- nesdc_txt %>% 
  enframe() %>% 
  mutate(variable = rep(1:7, 11)) %>% 
  mutate(observation = rep(1:11, each=7)) %>% 
  select(-name) %>% 
  spread(variable, value)

nesdc_df <- nesdc_dat %>% 
  set_names(nesdc_dat[1,]) %>% 
  slice(2:n()) %>% 
  select(등록번호, 조사기관명, 조사의뢰자, `여론조사 명칭`, 등록일, 지역)

nesdc_df %>% 
  DT::datatable()

1.2 두번째 페이지

https://www.nesdc.go.kr/portal/bbs/B0000005/list.do?menuNo=200467&pageIndex=2" 와 같이 &pageIndex=2만 조정하게 되면 다른 페이지를 가져올 수 있는 것이 확인되었다.

nesdc_html <- read_html("https://www.nesdc.go.kr/portal/bbs/B0000005/list.do?menuNo=200467&pageIndex=2")

nesdc_txt <- nesdc_html %>% 
  html_nodes('div.board') %>% 
  html_nodes('span.col') %>% 
  html_text()

nesdc_dat <- nesdc_txt %>% 
  enframe() %>% 
  mutate(variable = rep(1:7, 11)) %>% 
  mutate(observation = rep(1:11, each=7)) %>% 
  select(-name) %>% 
  spread(variable, value)

nesdc_df <- nesdc_dat %>% 
  set_names(nesdc_dat[1,]) %>% 
  slice(2:n()) %>% 
  select(-`1`, -결정사항)

nesdc_df

1.3 함수

https://www.nesdc.go.kr/portal/bbs/B0000005/list.do?menuNo=200467&pageIndex=2" 와 같이 &pageIndex=2만 조정하게 되면 다른 페이지를 가져올 수 있는 것이 확인되었기 때문에 함수를 만들어서 이를 테스트 한다.

get_survey_page <- function(page) {
  
  nesdc_url <- glue::glue("https://www.nesdc.go.kr/portal/bbs/B0000005/list.do?menuNo=200467&pageIndex={page}")
  
  nesdc_html <- read_html(nesdc_url)
  
  nesdc_txt <- nesdc_html %>% 
    html_nodes('div.board') %>% 
    html_nodes('span.col') %>% 
    html_text()
  
  nesdc_dat <- nesdc_txt %>% 
    enframe() %>% 
    mutate(variable = rep(1:7, 11)) %>% 
    mutate(observation = rep(1:11, each=7)) %>% 
    select(-name) %>% 
    spread(variable, value)
  
  nesdc_df <- nesdc_dat %>% 
    set_names(nesdc_dat[1,]) %>% 
    slice(2:n()) %>% 
    select(-`1`, -결정사항)
  
  return(nesdc_df)
}

get_survey_page(3)

1.4 전체데이터

https://www.nesdc.go.kr/portal/bbs/B0000005/list.do?menuNo=200467&pageIndex=2" 와 같이 &pageIndex=2만 조정하게 되면 다른 페이지를 가져올 수 있는 것이 확인되었기 때문에 함수를 만들어서 이를 테스트했고, 이제 원하는 만큼 데이터를 페이지수를 조정해서 가져올 수 있다.

page_index <- 1:50

nesdc_full_df <-  map_df(page_index, get_survey_page)

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

nesdc_full_df %>% 
  write_csv("data/nesdc_full_df.csv")

최근 500건의 데이터를 긁어와서 이를 분석하는데 2020-01-01 부터 분석이 되도록 데이터를 정리한다.

# nesdc_full_df <- read_rds("data/nesdc_full_df.rds")
nesdc_full_df <- read_csv("data/nesdc_full_df.csv")

nesdc_eda_df <- nesdc_full_df %>% 
  mutate(`등록일` = lubridate::ymd(`등록일`)) %>% 
  filter(`등록일` >= as.Date("2020-01-01")) %>% 
  mutate_if(is.character, factor)

2 탐색적 데이터 분석

본격적인 탐색적 분석에 앞서 데이터 특성을 알아본다. 이를 위해서 skimr 팩키지 skim() 함수를 사용한다.

nesdc_eda_df %>% 
  skimr::skim(.)
Data summary
Name Piped data
Number of rows 406
Number of columns 6
_______________________
Column type frequency:
Date 1
factor 4
numeric 1
________________________
Group variables None

Variable type: Date

skim_variable n_missing complete_rate min max median n_unique
등록일 0 1 2020-01-02 2020-03-28 2020-02-21 76

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
조사기관명 0 1 FALSE 39 (주): 59, (주): 55, (주): 39, (주): 29
조사의뢰자 0 1 FALSE 114 중부일: 23, 남도일: 18, 경인일: 14, 쿠키뉴: 13
여론조사 명칭 0 1 FALSE 333 전국 : 9, 전국 : 8, 전라남: 7, 광주광: 5
지역 0 1 FALSE 17 전국: 90, 경기도: 56, 서울특: 44, 전라남: 42

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
등록번호 0 1 6571.74 121.89 6362 6465.25 6571.5 6678.75 6782 ▇▇▇▇▇

2.1 데이터프레임

dfSummary() 함수를 사용해서 전체 데이터프레임에 담긴 정보를 개괄적으로 파악한다.

library(summarytools)
st_options(plain.ascii = FALSE)
print(dfSummary(nesdc_eda_df, graph.magnif = 0.75), method = 'render')

Data Frame Summary

nesdc_eda_df

Dimensions: 406 x 6
Duplicates: 0
No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
1 등록번호 [numeric] Mean (sd) : 6571.7 (121.9) min < med < max: 6362 < 6571.5 < 6782 IQR (CV) : 213.5 (0) 406 distinct values 406 (100%) 0 (0%)
2 조사기관명 [factor] 1. (주)글로벌리서치 2. (주)데이터앤리서치 3. (주)데일리리서치 4. (주)디오피니언 5. (주)리서치뷰 6. (주)리서치앤리서치 7. (주)리얼미터 8. (주)마크로밀엠브레인 9. (주)메트릭스리서치 10. (주)메트릭스코퍼레이션 [ 29 others ]
1(0.2%)
2(0.5%)
9(2.2%)
4(1.0%)
9(2.2%)
6(1.5%)
55(13.5%)
5(1.2%)
1(0.2%)
1(0.2%)
313(77.1%)
406 (100%) 0 (0%)
3 조사의뢰자 [factor] 1. (주)경북미디어 뉴스앤포항 2. (주)고향신문사 3. (주)로이슈 4. 가로세로연구소 5. 강원일보 6. 경기신문 7. 경기일보 8. 경남도민신문 9. 경남연합일보,미래한국연구소 10. 경북정치신문 [ 104 others ]
2(0.5%)
1(0.2%)
1(0.2%)
2(0.5%)
1(0.2%)
1(0.2%)
11(2.7%)
2(0.5%)
6(1.5%)
3(0.7%)
376(92.6%)
406 (100%) 0 (0%)
4 여론조사 명칭 [factor] 1. 강원도 속초시 고성군 양양군 국회의원선거 정 2. 강원도 원주시 국회의원선거 비례대표국회의원선 3. 강원도 태백시 횡성군 영월군 평창군 정선군 4. 강원도 횡성군 기초단체장선거 정당지지도 5. 경기도 고양시 덕양구 국회의원선거 비례대표국 6. 경기도 고양시 덕양구 고양시 일산동구 국회의 7. 경기도 고양시 일산서구 국회의원선거 8. 경기도 고양시 일산서구 국회의원선거 비례대표 9. 경기도 고양시 일산서구 국회의원선거 비례대표 10. 경기도 고양시 일산서구 국회의원선거 정당지지 [ 323 others ]
1(0.2%)
1(0.2%)
1(0.2%)
1(0.2%)
1(0.2%)
1(0.2%)
1(0.2%)
1(0.2%)
1(0.2%)
1(0.2%)
396(97.5%)
406 (100%) 0 (0%)
5 등록일 [Date] min : 2020-01-02 med : 2020-02-21 max : 2020-03-28 range : 2m 26d 76 distinct values 406 (100%) 0 (0%)
6 지역 [factor] 1. 강원도 2. 경기도 3. 경상남도 4. 경상북도 5. 광주광역시 6. 대구광역시 7. 대전광역시 8. 부산광역시 9. 서울특별시 10. 세종특별자치시 [ 7 others ]
4(1.0%)
56(13.8%)
15(3.7%)
24(5.9%)
26(6.4%)
9(2.2%)
4(1.0%)
14(3.4%)
44(10.8%)
1(0.2%)
209(51.5%)
406 (100%) 0 (0%)

Generated by summarytools 0.9.6 (R version 3.5.1)
2020-03-28

2.2 단변량 분석

각 변수별로 특성을 살펴본다.

nesdc_eda_df %>% 
  freq(`조사기관명`, style = 'rmarkdown')

2.2.1 Frequencies

2.2.1.1 nesdc_eda_df$조사기관명

Type: Factor

  Freq % Valid % Valid Cum. % Total % Total Cum.
(주)글로벌리서치 1 0.25 0.25 0.25 0.25
(주)데이터앤리서치 2 0.49 0.74 0.49 0.74
(주)데일리리서치 9 2.22 2.96 2.22 2.96
(주)디오피니언 4 0.99 3.94 0.99 3.94
(주)리서치뷰 9 2.22 6.16 2.22 6.16
(주)리서치앤리서치 6 1.48 7.64 1.48 7.64
(주)리얼미터 55 13.55 21.18 13.55 21.18
(주)마크로밀엠브레인 5 1.23 22.41 1.23 22.41
(주)메트릭스리서치 1 0.25 22.66 0.25 22.66
(주)메트릭스코퍼레이션 1 0.25 22.91 0.25 22.91
(주)모노커뮤니케이션즈 9 2.22 25.12 2.22 25.12
(주)비전코리아솔루션즈 3 0.74 25.86 0.74 25.86
(주)세종리서치 4 0.99 26.85 0.99 26.85
(주)순천투데이 1 0.25 27.09 0.25 27.09
(주)싸이리서치(SAI) 1 0.25 27.34 0.25 27.34
(주)아이소프트뱅크 22 5.42 32.76 5.42 32.76
(주)알앤써치 59 14.53 47.29 14.53 47.29
(주)에브리미디어 9 2.22 49.51 2.22 49.51
(주)에스엠소프트 1 0.25 49.75 0.25 49.75
(주)에이스리서치 10 2.46 52.22 2.46 52.22
(주)엠브레인퍼블릭 9 2.22 54.43 2.22 54.43
(주)우리리서치 1 0.25 54.68 0.25 54.68
(주)윈지코리아컨설팅 1 0.25 54.93 0.25 54.93
(주)이너텍시스템즈 2 0.49 55.42 0.49 55.42
(주)조원씨앤아이 39 9.61 65.02 9.61 65.02
(주)칸타코리아 1 0.25 65.27 0.25 65.27
(주)코리아리서치인터내셔널 20 4.93 70.20 4.93 70.20
(주)코리아정보리서치 6 1.48 71.67 1.48 71.67
(주)코리아정보리서치 중부본부 7 1.72 73.40 1.72 73.40
(주)폴리컴 3 0.74 74.14 0.74 74.14
(주)피플네트웍스 13 3.20 77.34 3.20 77.34
(주)한국갤럽조사연구소 29 7.14 84.48 7.14 84.48
(주)한국리서치 24 5.91 90.39 5.91 90.39
(주)한길리서치센타 5 1.23 91.63 1.23 91.63
(주)홍성신문 1 0.25 91.87 0.25 91.87
에스.엠.소프트웨어(주) 1 0.25 92.12 0.25 92.12
여론조사공정(주) 4 0.99 93.10 0.99 93.10
입소스 주식회사 19 4.68 97.78 4.68 97.78
케이에스오아이 주식회사(한국사회여론연구소) 9 2.22 100.00 2.22 100.00
<NA> 0 0.00 100.00
Total 406 100.00 100.00 100.00 100.00
조사의뢰자_v <- nesdc_eda_df %>% 
  count(`조사의뢰자`, sort=TRUE) %>% 
  pull(`조사의뢰자`)

nesdc_eda_df %>% 
  mutate(조사의뢰자 = factor(조사의뢰자, levels=조사의뢰자_v)) %>% 
  freq(`조사의뢰자`, style = 'rmarkdown')

2.2.2 Frequencies

2.2.2.1 nesdc_eda_df$조사의뢰자

Type: Factor

  Freq % Valid % Valid Cum. % Total % Total Cum.
중부일보 23 5.67 5.67 5.67 5.67
남도일보,뉴스1광주전남취재본부 18 4.43 10.10 4.43 10.10
경인일보 14 3.45 13.55 3.45 13.55
쿠키뉴스 13 3.20 16.75 3.20 16.75
KBS 12 2.96 19.70 2.96 19.70
MBN, 매일경제신문사 12 2.96 22.66 2.96 22.66
경기일보 11 2.71 25.37 2.71 25.37
전주MBC, JTV 전주방송, 전북도민일보, 전라일보 11 2.71 28.08 2.71 28.08
한국갤럽 자체조사 11 2.71 30.79 2.71 30.79
뉴스1 전북취재본부 10 2.46 33.25 2.46 33.25
광주일보, kbc광주방송 9 2.22 35.47 2.22 35.47
중앙일보 9 2.22 37.68 2.22 37.68
SBS 9 2.22 39.90 2.22 39.90
YTN 9 2.22 42.12 2.22 42.12
뉴스토마토 8 1.97 44.09 1.97 44.09
굿모닝충청 7 1.72 45.81 1.72 45.81
아시아투데이 7 1.72 47.54 1.72 47.54
KBS, 한국일보(전국단위 신문) 7 1.72 49.26 1.72 49.26
경남연합일보,미래한국연구소 6 1.48 50.74 1.48 50.74
뉴시스광주전남/무등일보/전남일보/광주·여수·목포MBC 6 1.48 52.22 1.48 52.22
로이슈 6 1.48 53.69 1.48 53.69
영남일보, 대구CBS 6 1.48 55.17 1.48 55.17
제주MBC, 제주CBS, 제주신보, 제주의소리 6 1.48 56.65 1.48 56.65
tbs 6 1.48 58.13 1.48 58.13
뉴스핌 5 1.23 59.36 1.23 59.36
동아일보 5 1.23 60.59 1.23 60.59
문화일보 5 1.23 61.82 1.23 61.82
서울경제 5 1.23 63.05 1.23 63.05
오마이뉴스 5 1.23 64.29 1.23 64.29
TBS 5 1.23 65.52 1.23 65.52
뉴시스광주전남, 무등일보, 전남일보, 광주MBC, 여수MBC, 목포MBC 4 0.99 66.50 0.99 66.50
스트레이트 뉴스 4 0.99 67.49 0.99 67.49
시사저널 4 0.99 68.47 0.99 68.47
에브리미디어 4 0.99 69.46 0.99 69.46
청주KBS 4 0.99 70.44 0.99 70.44
CMB광주방송,투데이광주,중앙뉴스라인 4 0.99 71.43 0.99 71.43
news1 4 0.99 72.41 0.99 72.41
경북정치신문 3 0.74 73.15 0.74 73.15
국제신문 3 0.74 73.89 0.74 73.89
뉴시스 3 0.74 74.63 0.74 74.63
데일리안 3 0.74 75.37 0.74 75.37
미디어오늘 3 0.74 76.11 0.74 76.11
제주일보, KCTV제주방송, 제주투데이, 헤드라인제주 3 0.74 76.85 0.74 76.85
한국일보 3 0.74 77.59 0.74 77.59
MBC 3 0.74 78.33 0.74 78.33
(주)경북미디어 뉴스앤포항 2 0.49 78.82 0.49 78.82
가로세로연구소 2 0.49 79.31 0.49 79.31
경남도민신문 2 0.49 79.80 0.49 79.80
고령군민신문 2 0.49 80.30 0.49 80.30
공유경제신문 2 0.49 80.79 0.49 80.79
금강일보사 2 0.49 81.28 0.49 81.28
나주신문 2 0.49 81.77 0.49 81.77
민초커뮤니케이션 2 0.49 82.27 0.49 82.27
브레이크뉴스 2 0.49 82.76 0.49 82.76
비전코리아뉴스 2 0.49 83.25 0.49 83.25
상주신문 2 0.49 83.74 0.49 83.74
새전북신문 2 0.49 84.24 0.49 84.24
전주일보 2 0.49 84.73 0.49 84.73
제주KBS 2 0.49 85.22 0.49 85.22
펜앤드마이크 2 0.49 85.71 0.49 85.71
포천뉴스 2 0.49 86.21 0.49 86.21
한국경제신문사 2 0.49 86.70 0.49 86.70
JTBC 2 0.49 87.19 0.49 87.19
ytn 2 0.49 87.68 0.49 87.68
(주)고향신문사 1 0.25 87.93 0.25 87.93
(주)로이슈 1 0.25 88.18 0.25 88.18
강원일보 1 0.25 88.42 0.25 88.42
경기신문 1 0.25 88.67 0.25 88.67
경상매일신문 1 0.25 88.92 0.25 88.92
광양시민신문 1 0.25 89.16 0.25 89.16
교차로신문 1 0.25 89.41 0.25 89.41
남도타임스 1 0.25 89.66 0.25 89.66
뉴스웍스 1 0.25 89.90 0.25 89.90
대덕희망플랜2020 1 0.25 90.15 0.25 90.15
대전KBS 1 0.25 90.39 0.25 90.39
목포시민신문 1 0.25 90.64 0.25 90.64
문화일보/서울대 폴랩 1 0.25 90.89 0.25 90.89
비욘드포스트 1 0.25 91.13 0.25 91.13
새목포일보 1 0.25 91.38 0.25 91.38
서라벌신문 1 0.25 91.63 0.25 91.63
서산시대, 태안신문, 충남방송 1 0.25 91.87 0.25 91.87
서산타임즈 1 0.25 92.12 0.25 92.12
서산포스트 1 0.25 92.36 0.25 92.36
세계일보 1 0.25 92.61 0.25 92.61
세종신문사 1 0.25 92.86 0.25 92.86
스트레이트뉴스 1 0.25 93.10 0.25 93.10
시민일보 1 0.25 93.35 0.25 93.35
알앤써치 &리서치TV 1 0.25 93.60 0.25 93.60
영양신문 1 0.25 93.84 0.25 93.84
월간전남,시사21 1 0.25 94.09 0.25 94.09
이뉴스투데이 1 0.25 94.33 0.25 94.33
인천뉴스 1 0.25 94.58 0.25 94.58
인천투데이 1 0.25 94.83 0.25 94.83
일요신문 1 0.25 95.07 0.25 95.07
임순남타임즈 1 0.25 95.32 0.25 95.32
장흥신문 1 0.25 95.57 0.25 95.57
전남도민일보 1 0.25 95.81 0.25 95.81
창원일보,미래한국연구소 1 0.25 96.06 0.25 96.06
천안신문 1 0.25 96.31 0.25 96.31
천지일보 1 0.25 96.55 0.25 96.55
프레시안 1 0.25 96.80 0.25 96.80
하나로신문사 1 0.25 97.04 0.25 97.04
한국여성의정 1 0.25 97.29 0.25 97.29
한길리서치센타 1 0.25 97.54 0.25 97.54
헤럴드 경제 1 0.25 97.78 0.25 97.78
홍성신문 1 0.25 98.03 0.25 98.03
화순군민신문 1 0.25 98.28 0.25 98.28
횡성희망신문 1 0.25 98.52 0.25 98.52
MBN, 매일경제 1 0.25 98.77 0.25 98.77
NSP통신 대구경북본부, (주)경북미디어 뉴스앤포항, 영남경제신문(주), 일간경북신문, 경북뉴스통신 1 0.25 99.01 0.25 99.01
NSP통신사 1 0.25 99.26 0.25 99.26
tbs, YTN 1 0.25 99.51 0.25 99.51
TV조선 1 0.25 99.75 0.25 99.75
UGN경북뉴스 1 0.25 100.00 0.25 100.00
<NA> 0 0.00 100.00
Total 406 100.00 100.00 100.00 100.00
nesdc_eda_df %>% 
  freq(`지역`, style = 'rmarkdown')

2.2.3 Frequencies

2.2.3.1 nesdc_eda_df$지역

Type: Factor

  Freq % Valid % Valid Cum. % Total % Total Cum.
강원도 4 0.99 0.99 0.99 0.99
경기도 56 13.79 14.78 13.79 14.78
경상남도 15 3.69 18.47 3.69 18.47
경상북도 24 5.91 24.38 5.91 24.38
광주광역시 26 6.40 30.79 6.40 30.79
대구광역시 9 2.22 33.00 2.22 33.00
대전광역시 4 0.99 33.99 0.99 33.99
부산광역시 14 3.45 37.44 3.45 37.44
서울특별시 44 10.84 48.28 10.84 48.28
세종특별자치시 1 0.25 48.52 0.25 48.52
인천광역시 13 3.20 51.72 3.20 51.72
전국 90 22.17 73.89 22.17 73.89
전라남도 42 10.34 84.24 10.34 84.24
전라북도 27 6.65 90.89 6.65 90.89
제주도 11 2.71 93.60 2.71 93.60
충청남도 16 3.94 97.54 3.94 97.54
충청북도 10 2.46 100.00 2.46 100.00
<NA> 0 0.00 100.00
Total 406 100.00 100.00 100.00 100.00