# 0. 환경설정 -----
library(rtweet)
library(tidyverse)
library(lubridate)
library(plotly)
library(htmltools)
library(extrafont)
loadfonts()
# 1. 데이터 가져오기 -----
candid_user_df <- read_rds("data/candid_user_df.rds")
gg_tmls <- read_rds("data/gg_tmls.rds")
candid_name_df <- tribble(
~이름, ~screen_name,
"이재명", "Jaemyung_Lee",
"남경필", "yesKP",
"김영환", "kyh21"
)
candid_v <- c("Jaemyung_Lee", "yesKP", "kyh21")
# 2. 탐색적 데이터 분석 -----
## 2.1. 경기도 지사 후보자 현황 -----
# candid_user_df <- lookup_users(candid_v)
candid_info_df <- candid_user_df %>%
select(name, 팔로워수=followers_count,
친구수=friends_count,
트윗수=statuses_count,
좋아요수=favourites_count, screen_name) %>%
gather(type, value, -name, -screen_name) %>%
mutate(name = factor(name, levels=c("이재명", "남경필", "김영환")))
### 시각화
ggplot(data = candid_info_df,
aes(x = reorder(name, value), y = value,fill = name)) +
geom_col() +
facet_wrap(~type, scales = "free") +
theme_minimal(base_family = "NanumGothic") +
theme(
legend.position = "none",
strip.background = element_blank(),
strip.text = element_text(size = 15, face="bold", colour = "black"),
title = element_blank(),
axis.text.x = element_blank()
) +
coord_flip() +
geom_text(aes(y = value, label = scales::comma(value)), colour = "black", hjust = "inward") +
scale_fill_manual(values = c("skyblue", "red", "cyan"))
일별 틔윗 상태갯수(status
)를 계산하기 위해서 트위터 API에서 제공되는 시점과 트위터에 한국시간으로 트윗되는 시점이 다르기 때문에 이를 맞추기 위해서 시간대(timezone, tz)를 “Asia/Seoul”로 지정한다. 그리고, 경기지사 후보별 일별 트윗갯수를 시계열로 시각화한다.
gg_tmls_df <- gg_tmls %>%
mutate(dtime = format(created_at, tz="Asia/Seoul")) %>%
mutate(tdate = ymd(format(created_at, "%y-%m-%d"), tz="Asia/Seoul")) %>%
mutate(screen_dt = screen_name) %>%
mutate(screen_name = factor(screen_name, levels=c("Jaemyung_Lee", "yesKP", "kyh21"), labels=c("이재명", "남경필", "김영환")))
# 2. 시각화 -----
## 2.1. 트윗갯수
gg_status_cnt_g <- gg_tmls_df %>%
dplyr::filter(created_at > "2018-05-01") %>%
group_by(screen_name, tdate) %>%
summarise(트윗상태수 = n()) %>%
ungroup() %>%
ggplot(aes(x=tdate, y=트윗상태수, group=screen_name, color=screen_name,
text = paste0("후보명: ", screen_name, "\n",
"날짜: ", tdate, "\n",
"트윗상태수: ", 트윗상태수))) +
ggplot2::geom_point() +
geom_line() +
ggplot2::theme_minimal(base_family = "NanumGothic") +
ggplot2::theme(
legend.title = ggplot2::element_blank(),
legend.position = "bottom",
plot.title = ggplot2::element_text(face = "bold")) +
ggplot2::labs(
x = NULL, y = NULL,
title = "경기지사 후보 트위터 상태 빈도(Frequency of Twitter statuses)",
subtitle = "2018년 5월 1일 이후 일자별 집계된 트윗 상태수",
caption = "\n출처: rtweet 팩키지 트위터 REST API"
) +
scale_color_manual(values=c("blue", "red", "cyan"))
ggplotly(gg_status_cnt_g, tooltip="text")
경기지사 후보별 리트윗(retweet) 일별 총합을 구하여 이를 시각화한다.
## 2.2. 리트윗 총합
gg_retweet_cnt_g <- gg_tmls_df %>%
dplyr::filter(created_at > "2018-05-01") %>%
dplyr::group_by(screen_name, tdate) %>%
summarise(리트윗_총합 = sum(retweet_count),
좋아요_총합 = sum(favorite_count)) %>%
ungroup() %>%
ggplot(aes(x=tdate, y=리트윗_총합, group=screen_name, color=screen_name,
text = paste0("후보명: ", screen_name, "\n",
"날짜: ", tdate, "\n",
"리트윗총합: ", scales::comma(리트윗_총합)))) +
ggplot2::geom_point() +
geom_line() +
ggplot2::theme_minimal(base_family = "NanumGothic") +
ggplot2::theme(
legend.title = ggplot2::element_blank(),
legend.position = "bottom",
plot.title = ggplot2::element_text(face = "bold")) +
ggplot2::labs(
x = NULL, y = NULL,
title = "경기지사 후보 트위터 리트윗 총합",
subtitle = "2018년 5월 1일 이후 일자별 집계된 총리트윗 횟수",
caption = "\n출처: rtweet 팩키지 트위터 REST API"
) +
scale_color_manual(values=c("blue", "red", "cyan"))
ggplotly(gg_retweet_cnt_g, tooltip="text")
경기지사 후보별 좋아요(favorite) 일별 총합을 구하여 이를 시각화한다.
## 2.3. 좋아요(favorite) 총합
gg_favorite_cnt_g <- gg_tmls_df %>%
dplyr::filter(created_at > "2018-05-01") %>%
dplyr::group_by(screen_name, tdate) %>%
summarise(리트윗_총합 = sum(retweet_count),
좋아요_총합 = sum(favorite_count)) %>%
ungroup() %>%
ggplot(aes(x=tdate, y=좋아요_총합, group=screen_name, color=screen_name,
text = paste0("후보명: ", screen_name, "\n",
"날짜: ", tdate, "\n",
"좋아요총합: ", scales::comma(좋아요_총합)))) +
ggplot2::geom_point() +
geom_line() +
ggplot2::theme_minimal(base_family = "NanumGothic") +
ggplot2::theme(
legend.title = ggplot2::element_blank(),
legend.position = "bottom",
plot.title = ggplot2::element_text(face = "bold")) +
ggplot2::labs(
x = NULL, y = NULL,
title = "경기지사 후보 트위터 좋아요 총합",
subtitle = "2018년 5월 1일 이후 일자별 집계된 좋아요(favorite) 횟수",
caption = "\n출처: rtweet 팩키지 트위터 REST API"
) +
scale_color_manual(values=c("blue", "red", "cyan"))
ggplotly(gg_favorite_cnt_g, tooltip="text")
경기지사 후보별 트윗별 리트윗(retweet) 평균을 구하여 이를 시각화한다.
## 2.4. 리트윗(retweet) 평균
gg_retweet_mean_g <- gg_tmls_df %>%
dplyr::filter(created_at > "2018-05-01") %>%
dplyr::group_by(screen_name, tdate) %>%
summarise(리트윗_총합 = sum(retweet_count),
좋아요_총합 = sum(favorite_count),
리트윗_평균 = mean(retweet_count),
좋아요_평균 = mean(favorite_count)) %>%
ungroup() %>%
ggplot(aes(x=tdate, y=리트윗_평균, group=screen_name, color=screen_name,
text = paste0("후보명: ", screen_name, "\n",
"날짜: ", tdate, "\n",
"리트윗_평균: ", scales::comma(round(리트윗_평균,0))))) +
ggplot2::geom_point() +
geom_line() +
ggplot2::theme_minimal(base_family = "NanumGothic") +
ggplot2::theme(
legend.title = ggplot2::element_blank(),
legend.position = "bottom",
plot.title = ggplot2::element_text(face = "bold")) +
ggplot2::labs(
x = NULL, y = NULL,
title = "경기지사 후보 트위터 리트윗 평균",
subtitle = "2018년 5월 1일 이후 일자별 집계된 리트윗(retweet) 평균",
caption = "\n출처: rtweet 팩키지 트위터 REST API"
) +
scale_color_manual(values=c("blue", "red", "cyan"))
ggplotly(gg_retweet_mean_g, tooltip="text")
경기지사 후보별 트윗별 좋아요(favorite) 평균을 구하여 이를 시각화한다.
## 2.5. 좋아요(favorite) 평균
gg_favorite_mean_g <- gg_tmls_df %>%
dplyr::filter(created_at > "2018-05-01") %>%
dplyr::group_by(screen_name, tdate) %>%
summarise(리트윗_총합 = sum(retweet_count),
좋아요_총합 = sum(favorite_count),
리트윗_평균 = mean(retweet_count),
좋아요_평균 = mean(favorite_count),
트윗상태수 = n()) %>%
ungroup() %>%
ggplot(aes(x=tdate, y=좋아요_평균, group=screen_name, color=screen_name,
text = paste0("후보명: ", screen_name, "\n",
"날짜: ", tdate, "\n",
"리트윗_평균: ", scales::comma(round(리트윗_평균,0)), "\n",
"트윗상태수: ",트윗상태수))) +
ggplot2::geom_point() +
geom_line() +
ggplot2::theme_minimal(base_family = "NanumGothic") +
ggplot2::theme(
legend.title = ggplot2::element_blank(),
legend.position = "bottom",
plot.title = ggplot2::element_text(face = "bold")) +
ggplot2::labs(
x = NULL, y = NULL,
title = "경기지사 후보 트위터 좋아요 평균",
subtitle = "2018년 5월 1일 이후 일자별 집계된 좋아요(favorite) 평균",
caption = "\n출처: rtweet 팩키지 트위터 REST API"
) +
scale_color_manual(values=c("blue", "red", "cyan"))
ggplotly(gg_favorite_mean_g, tooltip="text")
후부별로 추출한 최대 트윗을 가장 최근 트윗을 기준으로 정렬하여 클릭하면 해당 트윗을 확인할 수 있도록 인터랙티브 표로 시각화한다.
# 3. 표 -----
gg_tmls_df %>%
mutate(status_id = paste0("<a href=https://twitter.com/", screen_dt, '/status/',status_id, "/>", status_id,"</a>")) %>%
select(후보명=screen_name, status_id, dtime, favorite_count, retweet_count, text) %>%
arrange(desc(dtime)) %>%
DT::datatable(rownames = FALSE, escape = FALSE, options = list(
scrollX = TRUE,
autoWidth = TRUE,
columnDefs = list(list(width = '400px', targets = c(5))))) %>%
DT::formatRound(c("favorite_count", "retweet_count"), digits = 0)