데이터 과학자와 함께 하는 제19대 대통령 선거

페이스북 페이지 - 국민의당 경선

페이스북 페이지 국민의당 경선

국민의당 내에 크게 대권을 향한 두명의 주자가 열심히 달려나가고 있다. 두 후보 중 한명은 국민의당 후보가 되어 민주당, 바른정당 등 후보와 대선을 치르게 된다. 여론지지율에서는 손학규 후보가 안철수후보와 비교하여 데이터 분석하고 있는 현 시점에서 3%와 10%대로 3배 정도 차이가 나고 있다.

손학규 페북 페이지

먼저 손학규 페북 페이지에서 데이터를 긁어와서 ggplot2에 넣고 이를 plotly에 넣어 동적 그래프로 시각화하여 페북 활동성 추세를 살펴본다.

fb_keys <- "EAACEdEose0cBAJZCHBaDcekwSMcnQwqHHAR2qEJAO24MVKor0K1pEEWvazfWGMzeis6FCnmdl0cZAaQkEtn2BUbVau3ZBsxVhZB8XbvVQOn9OZA7xQhrMBpw9PniYFrTZC0Cc6WR5j18O4sK5A89OzaT1Luh89tyzaHHzTiCi3z07fO5gzS4HVZAg1IINLfRUYZD"

# 페북 포스트글 긁어오기: 일별 100개
get_fb_posts <- function(page_name, start_date, end_date, fb_keys) {
  # 긁어올 날짜 생성
  scraping_days <- seq(from=as.Date(start_date), to=as.Date(end_date), by='days')
  posts  <- data.frame()
  for(scrape_day in scraping_days){
    daily_post  <- data.frame()
    tryCatch({
      daily_post <- getPage(page=page_name, token=fb_keys,
                            since=as.Date(scrape_day, origin='1970-01-01'),
                            until=as.Date(scrape_day, origin='1970-01-01')+1)},
      error = function(e){})
    posts <- rbind(posts, daily_post)
  }
  return(posts)
}

start_date <- "2017-01-01"
end_date   <- "2017-03-08"

sohn <- get_fb_posts("koreasohn", start_date, end_date, fb_keys)
ahn  <- get_fb_posts("ahncs111", start_date, end_date, fb_keys)

# 1. 데이터 불러오기 ---------------------------------------------------------------------
## 1.1. 손학규 
fb_page_df <- sohn %>% 
  mutate(fb_date = ymd(substr(created_time, 1,10))) %>% 
  dplyr::select(fb_date, likes_count, comments_count, shares_count) %>% 
  group_by(fb_date) %>% 
  dplyr::summarise(
            like_mean    = mean(likes_count),
            comment_mean = mean(comments_count),
            share_mean   = mean(shares_count) )
Error in mutate_impl(.data, dots): Evaluation error: 객체 'created_time'를 찾을 수 없습니다.
fb_page_df_lng <- fb_page_df %>% ungroup %>% dplyr::select(fb_date, like_mean, share_mean, comment_mean) %>% 
  gather(type, activity_avg, -fb_date) %>% 
  mutate(type=factor(type, levels=c("like_mean", "share_mean", "comment_mean")))
Error in eval(lhs, parent, parent): 객체 'fb_page_df'를 찾을 수 없습니다
## 1.2. 안철수
ahn_fb_page_df <- ahn %>% 
  mutate(fb_date = ymd(substr(created_time, 1,10))) %>% 
  dplyr::select(fb_date, likes_count, comments_count, shares_count) %>% 
  group_by(fb_date) %>% 
  dplyr::summarise(
    like_mean    = mean(likes_count),
    comment_mean = mean(comments_count),
    share_mean   = mean(shares_count) )
Error in mutate_impl(.data, dots): Evaluation error: 객체 'created_time'를 찾을 수 없습니다.
ahn_fb_page_df_lng <- ahn_fb_page_df %>% ungroup %>% dplyr::select(fb_date, like_mean, share_mean, comment_mean) %>% 
  gather(type, activity_avg, -fb_date) %>% 
  mutate(type=factor(type, levels=c("like_mean", "share_mean", "comment_mean")))
Error in eval(lhs, parent, parent): 객체 'ahn_fb_page_df'를 찾을 수 없습니다

안철수 페북 페이지

먼저 안철수 페북 페이지에서 데이터를 긁어와서 ggplot2에 넣고 이를 plotly에 넣어 동일한 방법으로 동적 그래프로 시각화하여 페북 활동성 추세를 살펴본다.

## 2. 페북 시각화 ---------------------------------

## 2.1. 손학규 페이지 한장 찍기
dlist <- unique(fb_page_df_lng$fb_date)
Error in unique(fb_page_df_lng$fb_date): 객체 'fb_page_df_lng'를 찾을 수 없습니다
g <- ggplot(data=fb_page_df_lng, aes(x=fb_date, y=activity_avg, color=type)) +
  geom_point(aes(colour=type), alpha=0.3) +
  geom_line() +
  theme_tufte() +
  theme(legend.position="top", 
        legend.title=element_blank(),
        plot.caption=element_text(hjust=0,size=8),
        plot.subtitle=element_text(face="italic"),
        axis.text=element_text(size=7.5))+
  labs(x="",y="",title="공식 손학규 페이스북 페이지") +
  theme(text=element_text(family="NanumGothic")) +
  scale_x_date(date_labels="%m-%d", breaks=seq(dlist[1], tail(dlist,1), "7 day"))
Error in ggplot(data = fb_page_df_lng, aes(x = fb_date, y = activity_avg, : 객체 'fb_page_df_lng'를 찾을 수 없습니다
ggplotly(g)
Error in ggplotly(g): 객체 'g'를 찾을 수 없습니다
## 2.2. 손학규 페이지 격자그림에 시각화

g_facet <- ggplot(data=fb_page_df_lng, aes(x=fb_date, y=activity_avg, color=type)) +
  geom_point(aes(colour=type), alpha=0.3) +
  geom_line() +
  theme_tufte() +
  theme(legend.position="bottom", 
        legend.title=element_blank(),
        plot.caption=element_text(hjust=0,size=8),
        plot.subtitle=element_text(face="italic"),
        axis.text=element_text(size=7.5))+
  labs(x="",y="",title="공식 손학규 페이스북 페이지") +
  theme(text=element_text(family="NanumGothic")) +
  scale_x_date(date_labels="%m-%d", breaks=seq(dlist[1], tail(dlist,1), "7 day")) +
  facet_wrap(~type, nrow=3)
Error in ggplot(data = fb_page_df_lng, aes(x = fb_date, y = activity_avg, : 객체 'fb_page_df_lng'를 찾을 수 없습니다
ggplotly(g_facet)
Error in ggplotly(g_facet): 객체 'g_facet'를 찾을 수 없습니다
## 2.2. 안철수 페이지 한장 찍기
dlist <- unique(ahn_fb_page_df_lng$fb_date)
Error in unique(ahn_fb_page_df_lng$fb_date): 객체 'ahn_fb_page_df_lng'를 찾을 수 없습니다
g <- ggplot(data=ahn_fb_page_df_lng, aes(x=fb_date, y=activity_avg, color=type)) +
  geom_point(aes(colour=type), alpha=0.3) +
  geom_line() +
  theme_tufte() +
  theme(legend.position="top", 
        legend.title=element_blank(),
        plot.caption=element_text(hjust=0,size=8),
        plot.subtitle=element_text(face="italic"),
        axis.text=element_text(size=7.5))+
  labs(x="",y="",title="공식 안철수 페이스북 페이지") +
  theme(text=element_text(family="NanumGothic")) +
  scale_x_date(date_labels="%m-%d", breaks=seq(dlist[1], tail(dlist,1), "7 day"))
Error in ggplot(data = ahn_fb_page_df_lng, aes(x = fb_date, y = activity_avg, : 객체 'ahn_fb_page_df_lng'를 찾을 수 없습니다
ggplotly(g)
Error in ggplotly(g): 객체 'g'를 찾을 수 없습니다
## 2.2. 안철수 페이지 격자그림에 시각화

g_facet <- ggplot(data=ahn_fb_page_df_lng, aes(x=fb_date, y=activity_avg, color=type)) +
  geom_point(aes(colour=type), alpha=0.3) +
  geom_line() +
  geom_smooth(se=FALSE) +
  theme_tufte() +
  theme(legend.position="bottom", 
        legend.title=element_blank(),
        plot.caption=element_text(hjust=0,size=8),
        plot.subtitle=element_text(face="italic"),
        axis.text=element_text(size=7.5))+
  labs(x="",y="",title="공식 안철수 페이스북 페이지") +
  theme(text=element_text(family="NanumGothic")) +
  scale_x_date(date_labels="%m-%d", breaks=seq(dlist[1], tail(dlist,1), "7 day")) +
  facet_wrap(~type, nrow=3)
Error in ggplot(data = ahn_fb_page_df_lng, aes(x = fb_date, y = activity_avg, : 객체 'ahn_fb_page_df_lng'를 찾을 수 없습니다
ggplotly(g_facet)
Error in ggplotly(g_facet): 객체 'g_facet'를 찾을 수 없습니다