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

구글 추세(Google Trend)

구글 추세(Google Trends) 서비스를 통해 사용자들이 가장 많이 검색하는 검색어를 통해 추세를 대세(?)를 살펴볼 수 있다. 특히, 안드로이드, iOS 탑재된 스마트폰이 널리 보급되고 검색 인터페이스가 기존 입력방식에서 음성언어를 폭넓게 지원하고, 인식률도 현저히 높아짐에 따라 사람들의 검색량도 증가하고 구글 추세 분석 결과도 신빙성을 높혀가고 있다.

미국 대선 선거

미국 대선에서 소셜미디어로 대표되는 새로운 선거예측방식이 기존 설문에 기반한 여론조사보다 정확하게 대통령을 예측하면서 크게 주목을 받고 있다.

gtrendsR 환경설정

gtrendsR 팩키지는 현재 한창 활발히 개발되고 있고, 구글 추세 서비스를 R에 연결시키는 핵심 팩키지로 자리잡아가고 있다.

# 0. 환경설정 --------------------------------------------------
# devtools::install_github("PMassicotte/gtrendsR")
library(gtrendsR)
library(tidyverse)
library(extrafont)
loadfonts()
par(family = "NanumGothic")

gtrendsR 팩키지 살펴보기

ls("package:gtrendsR") 명령어를 던져보면 많은 함수는 없다. 다국어 지원 및 처리를 위해 몇가지 설정을 해야 한다.

# 활용가능한 함수 
ls("package:gtrendsR")
[1] "categories" "countries"  "gtrends"   
# 0.1. 비영어권 언어 --------------------------------------------------
# 로컬(locale) 문자집합 확인
localeToCharset()
[1] "UTF-8"
kw <- "webzen"

if (!(Encoding(kw) == "utf-8")) {
    kw <- iconv(kw, "latin1", "utf-8", sub = "byte")
}

검색어 하나 던져보기

검색어 하나 웹젠에 대한 추세를 살펴본다.

# 1. 단일 검색어 추세 --------------------------------------------------
gtrends("webzen") %>% 
    plot()

다수 검색어 던져서 비교하기

웹젠에서 서비스하는 주요 게임에 대한 구글 추세를 살펴보자.

# 2. 다수 검색어 추세 --------------------------------------------------
wz <- gtrends(c("webzen", "mu origin", "metin2", "R2", "Shot Online"))

# 2.1. 데이터 살펴보기
head(wz$interest_over_time)
        date hits keyword   geo gprop
1 2012-02-26    2  webzen world   web
2 2012-03-04    2  webzen world   web
3 2012-03-11    1  webzen world   web
4 2012-03-18    1  webzen world   web
5 2012-03-25    2  webzen world   web
6 2012-04-01    2  webzen world   web
head(wz$interest_by_region %>% dplyr::filter(location =="South Korea"))
     location hits     keyword   geo gprop
1 South Korea    0      webzen world   web
2 South Korea    0   mu origin world   web
3 South Korea    0      metin2 world   web
4 South Korea    4          R2 world   web
5 South Korea    0 Shot Online world   web
6 South Korea   40          R2 world   web
# 2.2. 시각화
plot(wz)

추억의 격자그림(Trellis)

[trelliscopejs R (https://github.com/hafen/trelliscopejs) 팩키지는 데이터를 작은 조각으로 나누고 각 조각에 대한 그래프 시각화를 하고 나서 특정 변수에 맞춰 배열하는 격자(trellis) 그림을 R로 구현한 것이다. Analyze and Visualize Large Complex Data in R에서 복잡성 높은 대용량 데이터를 분석하고 시각화하는 방법에 대한 다양한 정보를 얻을 수 있다.

구글 추세 검색어

gtrends() 함수는 최대 5개까지 검색어 지정이 가능하다. 더 많은 검색어를 통해 추세를 확인하고자 하면 bind_rows 함수를 통해 합하면 된다.

# 1. 검색어 불러오기 --------------------------------------------------
terms <- c("webzen", "mu origin", "metin2", "mu online", "r2")

trend <- gtrends(terms) 

# 2. 검색어 데이터 정제 --------------------------------------------------
df <- trend$interest_over_time %>% dplyr::select(date, hits, keyword)

정적 구글 추세 시각화

ggplot() 함수를 활용하여 한장에 모아찍거나, facet_wrap 기능을 활용하여 데이터를 쪼개서 시각화도 가능하다.

# 3. 정적 데이터 시각화 --------------------------------------------------
## 3.1. 한장에 모아찍기
ggplot(df, aes(x=date, y=hits, fill=keyword, color=keyword)) +
    geom_line() +
    theme_tufte(base_family="NanumGothic") +
    theme(legend.position="top", 
          plot.caption=element_text(hjust=0,size=8),
          plot.subtitle=element_text(face="italic"),
          axis.text=element_text(size=7.5),
          axis.text.x = element_text(angle = 90, hjust = 1),
          text=element_text(family="NanumGothic"))+
    labs(x="",y="",title="웹젠 관련 주요 키워드",
         caption="\n 자료출처: 구글 추세(Google Trends), https://trends.google.com/trends/")

## 3.2. facet으로 나눠 찍기
ggplot(df, aes(x=date, y=hits, fill=keyword, color=keyword)) +
    geom_line() +
    theme_tufte(base_family="NanumGothic") +
    theme(legend.position="none", 
          plot.caption=element_text(hjust=0,size=8),
          plot.subtitle=element_text(face="italic"),
          axis.text=element_text(size=7.5),
          axis.text.x = element_text(angle = 90, hjust = 1),
          text=element_text(family="NanumGothic"))+
    labs(x="",y="",title="웹젠 관련 주요 키워드",
         caption="\n 자료출처: 구글 추세(Google Trends), https://trends.google.com/trends/") +
    facet_wrap(~keyword)

trelliscope 격자 시각화 1

facet_wrap의 문제는 격자가 한 화면에 담기에 너무 많은 경우 발생된다. 이를 해결하는 방식이 trelliscopejs 를 활용하는 방법이다.

# 4. 동적(plot.ly) 격자(Trellis) 시각화 --------------------------------------------------
# devtools::install_github("hafen/trelliscopejs")
# library(trelliscopejs)
# library(rbokeh)
# library(plotly)

qplot(date, hits, data=df, geom=c("point", "smooth"), color=keyword, size=I(0.7)) +
    ylim(0,100) +
    theme_bw(base_family="NanumGothic") +
    theme(legend.position="none") +
    labs(x="",y="",title="Webzen Keywords",
         caption="\n Source: Google Trends, https://trends.google.com/trends/") +
    facet_trelliscope( ~keyword, width=600, nrow=2, ncol=3, as_plotly = TRUE, self_contained = TRUE)
`geom_smooth()` using method = 'loess'
`geom_smooth()` using method = 'loess'
`geom_smooth()` using method = 'loess'
`geom_smooth()` using method = 'loess'
`geom_smooth()` using method = 'loess'