xwMOOC 데이터 제품

슈퍼영웅(Super Heores)

어벤져스 - 인피니티 워

어벤져스: 인피니티 워 (Avengers: Infinity War), 2018가 절찬상영중이다. 이에 따라 슈퍼영웅에 대한 통계분석이 필요한 시점이 되었다.

슈퍼영웅(Super Heroes)

다행히 SuperHero API를 통해서 슈퍼 영웅과 악당에 대한 세세한 정보를 받아서 지구를 지킬 수 있는 기반이 마련되었다.

슈퍼영웅 명단

SuperHero API의 API 계층구조를 숙독하고 각 영웅에 대한 상세 정보를 가져오기 앞서 SuperHero API에서 제공하는 전체 슈퍼영웅의 ID와 이름을 가져온다.

# 0. 환경설정 -----
library(tidyverse)
library(rvest)
library(httr)
library(glue)
library(trelliscopejs)

# 1. 데이터 가져오기 -----
## 1.1. 캐릭터 ID 
sh_url <- "http://superheroapi.com/ids.html"

sh_one_df <- sh_url %>% 
  read_html() %>% 
  html_node(xpath='/html/body/main/div[1]/table') %>% 
  html_table() %>% 
  as_tibble() %>% 
  rename(char_id = X1, char_name = X2)

sh_two_df <- sh_url %>% 
  read_html() %>% 
  html_node(xpath='/html/body/main/div[2]/table') %>% 
  html_table() %>% 
  as_tibble() %>% 
  rename(char_id = X1, char_name = X2)

sh_three_df <- sh_url %>% 
  read_html() %>% 
  html_node(xpath='/html/body/main/div[3]/table') %>% 
  html_table() %>% 
  as_tibble() %>% 
  rename(char_id = X1, char_name = X2)

sh_char_df <- bind_rows(sh_one_df, sh_two_df) %>% 
  bind_rows(sh_three_df)

DT::datatable(sh_char_df)

plot of chunk super-hero-api-name

슈퍼영웅 능력치와 이미지

슈퍼영웅의 능력치(powerstats)와 이미지(image)를 긁어와서 영웅을 비교할 수 있도록 준비한다. access_token은 간단한 가입절차를 통해서 쉽게 얻을 수 있다.

# 2. 슈퍼히어로 데이터 가져오기 -----
## 2.1. 슈퍼히어로 능력치
superhero_endpoint <- 'http://superheroapi.com/api/'
access_token <- "101xxxxxxxxxxxxxxxxxxx"

sh_powerstat_list <- vector("list", nrow(sh_char_df))

for(i in 1:nrow(sh_char_df)) {
  sh_powerstat_resp <- glue(superhero_endpoint, access_token, '/', sh_char_df$char_id[i], '/powerstats') %>% 
    GET() %>% 
    content()
  sh_powerstat_list[[i]] <- sh_powerstat_resp
}

names(sh_powerstat_list) <- sh_char_df$char_name

listviewer::jsonedit(sh_powerstat_list)

## 2.2. 슈퍼히어로 이미지

sh_image_list <- vector("list", nrow(sh_char_df))

for(i in 1:nrow(sh_char_df)) {
  sh_image_resp <- glue(superhero_endpoint, access_token, '/', sh_char_df$char_id[i], '/image') %>% 
    GET() %>% 
    content()
  sh_image_list[[i]] <- sh_image_resp
  cat(i, ":", sh_char_df$char_name[i], "\n")
}

names(sh_image_list) <- sh_char_df$char_name

listviewer::jsonedit(sh_image_list)

리스트를 데이터프레임으로 변환

능력치와 이미지를 리스트로 다운로드 받은 후에 이를 데이터프레임으로 변환시킨다.

# 2. 리스트 데이터프레임 변환 -----
sh_df <- tibble(
  id = map_chr(sh_powerstat_list, "id"),
  name = map_chr(sh_powerstat_list, "name"),
  intelligence = map_chr(sh_powerstat_list, "intelligence"),
  strength = map_chr(sh_powerstat_list, "strength"),
  speed = map_chr(sh_powerstat_list, "speed"),
  durability = map_chr(sh_powerstat_list, "durability"),
  power = map_chr(sh_powerstat_list, "power"),
  combat = map_chr(sh_powerstat_list, "combat"),
  image = map_chr(sh_image_list, "url")
)

sh_df <- sh_df %>% 
  mutate(intelligence = as.integer(intelligence),
         strength     = as.integer(strength),
         speed        = as.integer(speed),
         durability   = as.integer(durability),
         power        = as.integer(power),
         combat       = as.integer(combat))

DT::datatable(sh_df)

plot of chunk super-hero-api-powerstat-df

슈퍼영웅을 작은 창에 넣기

슈퍼영웅을 작은 창에 넣어 생김새와 능력치를 비교해보자.

# 3. 데이터 시각화 -----
sh_df %>%
  mutate(panel = img_panel(image)) %>%
  trelliscope("SuperHeroes", nrow = 3, ncol = 6,
              state = list(labels = c("name", "commbat", "intelligence")),
              path="superhero_trellis")

plot of chunk super-hero-api-powerstat-trelliscopejs