페이스북 팬좋아요

페이스북 팬좋아요(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)

페이스북 페이지 팬데이터 시각화 1 2

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")

  1. Joshua, highmaps5.R

  2. Highmaps - Map Collection