페이스북 팬좋아요(fan likes) 데이터를 API를 통해 받게되면 국가별로 구별이 되게 된다. 국가코드는 ISO 3166-1 alpha-2를 따라 페이스북에서 제공하고 있는데, 간단히 보면 대한민국은 KR
, 북한은 KP
, 미국은 US
이런 방식이다.
페이스북 팬좋아요 데이터와 국가코드가 준비되면 이를 지리정보를 통해 쉽게 볼 수 있는 도구가 필요한데 highcharter를 활용하여 시각화한다.
가장 먼저 페이스북 페이지에서 데이터를 가져오고, 웹으로 데이터를 긁어오는데 필요한 팩키지를 설치한다. 그리고 나서 highcharter
, DT
팩키지를 준비한다.
library(Rfacebook)
library(tidyverse)
library(lubridate)
library(ggplot2)
library(stringr)
library(DT)
library(gridExtra)
library(ggthemes)
library(extrafont)
library(scales)
library(plotly)
library(RCurl)
library(highcharter)
library(DT)
loadfonts()
페이스북 페이지에서 “좋아요”를 누른 팬데이터를 가져온다.
“2017-03-09” 기준 주요 대선후보 팬 좋아요 갯수를 국가별로 추출한다. 예비 데이터 분석결과 대한민국(KR
)이 압도적이고 미국 순으로 쭉 나타난다. 특히, 북한(KP
)에서도 좋아요를 보낸 후보가 있고, 북한사람들으로부터 좋아요를 전혀 받지 못한 후보다 있다.
# 페이스북 페이지 팬 지리분포
fb_keys <- "EAACEdEose0cBALuPagskrQxQlybFUYZBcHhRCKT1jVkQmiVSAyyley3oqzZB2vw5RNtnBvmSnPRUHTnNMUMmABi7SSch1k7KsPaZB0ckSv92VOm4jDk4pOW1r2pWZBYHjnVp4cnblqymEHMCijhvO0NqBcH35e3ChesH8At7CZBXE9n3su0EOaIOCSFqkYBcZD"
get_fb_likes <- function(fb_pages, sdate, edate, fb_keys){
url <- paste0("https://graph.facebook.com/v2.8/", fb_pages, "/insights/page_fans_country/lifetime?&since=", sdate, "&until=", edate, "&access_token=", fb_keys)
url_json <- getURL(url)
url_list <- fromJSON(url_json)
url_dat_likes <- lapply(url_list$data[[1]]$values, function(x) {x$value})
library(gtools)
url_dat_df <- do.call(smartbind, url_dat_likes)
url_dat_df[is.na(url_dat_df)] <- 0
url_date <- lapply(url_list$data[[1]]$values, function(x) {x$end_time})
url_date_df <- do.call(rbind, url_date)
url_df <- cbind(url_date_df, url_dat_df)
url_df <- url_df %>%
mutate(url_date_df = ymd(str_sub(url_date_df, 1, 10))) %>%
dplyr::rename(fdate=url_date_df)
return(url_df)
}
# 2. 데이터 가져오기 ---------------------------------------------------------------
start_date <- "2017-03-09"
end_date <- "2017-03-09"
## 2.1. 손학규
sohn_fan <- get_fb_likes("koreasohn", start_date, end_date, fb_keys)
sohn_fan_lng <- sohn_fan %>%
gather(`iso-a2`, fans, -fdate)
sohn_fan[is.na(sohn_fan)] <- 0
sohn_fan <- sohn_fan %>% dplyr::select(-fdate) %>% mutate(fans_sum=rowSums(.))
sohn_fan <- sohn_fan %>% mutate(person="손학규")
## 2.2. 안철수
ahn_fan <- get_fb_likes("ahncs111", start_date, end_date, fb_keys)
ahn_fan_lng <- ahn_fan %>%
gather(`iso-a2`, fans, -fdate)
ahn_fan[is.na(ahn_fan)] <- 0
ahn_fan <- ahn_fan %>% dplyr::select(-fdate) %>% mutate(fans_sum=rowSums(.))
ahn_fan <- ahn_fan %>% mutate(person="안철수")
## 2.3. 문재인
moon_fan <- get_fb_likes("moonbyun1", start_date, end_date, fb_keys)
moon_fan_lng <- moon_fan %>%
gather(`iso-a2`, fans, -fdate)
moon_fan[is.na(moon_fan)] <- 0
moon_fan <- moon_fan %>% dplyr::select(-fdate) %>% mutate(fans_sum=rowSums(.))
moon_fan <- moon_fan %>% mutate(person="문재인")
## 2.4. 이재명
ljm_fan <- get_fb_likes("jaemyunglee1", start_date, end_date, fb_keys)
ljm_fan_lng <- ljm_fan %>%
gather(`iso-a2`, fans, -fdate)
ljm_fan[is.na(ljm_fan)] <- 0
ljm_fan <- ljm_fan %>% dplyr::select(-fdate) %>% mutate(fans_sum=rowSums(.))
ljm_fan <- ljm_fan %>% mutate(person="이재명")
## 2.5. 안희정
ahj_fan <- get_fb_likes("steelroot", start_date, end_date, fb_keys)
ahj_fan_lng <- ahj_fan %>%
gather(`iso-a2`, fans, -fdate)
ahj_fan[is.na(ahj_fan)] <- 0
ahj_fan <- ahj_fan %>% dplyr::select(-fdate) %>% mutate(fans_sum=rowSums(.))
ahj_fan <- ahj_fan %>% mutate(person="안희정")
## 2.6. 황교안
hwang_fan <- get_fb_likes("PM0415HwangKyoahn", start_date, end_date, fb_keys)
hwang_fan_lng <- hwang_fan %>%
gather(`iso-a2`, fans, -fdate)
hwang_fan[is.na(hwang_fan)] <- 0
hwang_fan <- hwang_fan %>% dplyr::select(-fdate) %>% mutate(fans_sum=rowSums(.))
hwang_fan <- hwang_fan %>% mutate(person="황교안")
# 3. 데이터 정리 -----------------------------------------------------------
fb_pg_df <- sohn_fan %>%
bind_rows(ahn_fan) %>%
bind_rows(ahj_fan) %>%
bind_rows(hwang_fan) %>%
bind_rows(ljm_fan) %>%
bind_rows(moon_fan)
fb_pg_df[is.na(fb_pg_df)] <- 0
fb_pg_df_lng <- fb_pg_df %>%
gather(country, fans, -person) %>%
dplyr::filter(country %in% c("fans_sum","KR","KP","CN","RU", "US", "JP", "UK", "DE"))
fb_pg_df_wide <- fb_pg_df_lng %>% spread(country, fans) %>%
dplyr::select(person, fans_sum, KR, KP, US, everything()) %>%
arrange(desc(KP))
datatable(fb_pg_df_wide) %>%
formatCurrency(2:9, ' ', digits = 0)
highcharter를 활용하여 각 후보별 팬수를 지리정보를 활용하여 시각화한다. highcharter
를 활용하여 지리공간정보를 시각화할 경우 지도가 필요한데 지도를 모아놓은 Highmaps - Map Collection에서 다운로드 받아 활용한다.
hcmap(map = "custom/world-eckert3-highres", data = sohn_fan_lng,
joinBy = "iso-a2", value = "fans", name = "손학규 팬수",
download_map_data = TRUE, borderColor = "transparent")
hcmap(map = "custom/world-eckert3-highres", data = ahn_fan_lng,
joinBy = "iso-a2", value = "fans", name = "안철수 팬수",
download_map_data = TRUE, borderColor = "transparent")
hcmap(map = "custom/world-eckert3-highres", data = moon_fan_lng,
joinBy = "iso-a2", value = "fans", name = "문재인 팬수",
download_map_data = TRUE, borderColor = "transparent")
hcmap(map = "custom/world-eckert3-highres", data = ljm_fan_lng,
joinBy = "iso-a2", value = "fans", name = "이재명 팬수",
download_map_data = TRUE, borderColor = "transparent")
hcmap(map = "custom/world-eckert3-highres", data = ahj_fan_lng,
joinBy = "iso-a2", value = "fans", name = "안희정 팬수",
download_map_data = TRUE, borderColor = "transparent")
hcmap(map = "custom/world-eckert3-highres", data = hwang_fan_lng,
joinBy = "iso-a2", value = "fans", name = "황교안 팬수",
download_map_data = TRUE, borderColor = "transparent")