저는 한국나이로 5살 3살 두 아이를 키우고 있는 아빠입니다. 몇일 전 아들과 함께 LEGO를 만들고 있는데 문득 LEGO에서 사용한 색들을 시각화 하고 싶다는 강한 마음이(덕력이) 생겼습니다. 다행히(?) Kaggle에 올라와 있는 LEGO Database에 RGB color code를 포함한 1950-2017 까지 각종 LEGO 관련 데이터가 제공되어 있었고, 이를 사용해 각 시리즈별로 사용된 색상에 대한 와플차트를 만들었습니다.

1. 데이터 정리

먼저 제공되는 데이터를 가져와 각 시리즈별로 데이터를 merge 하였습니다. 데이터의 구조는 다음과 같습니다.

library(tidyverse)
inventories <- read_csv("inventories.csv")
sets <- read_csv("sets.csv")
themes <- read_csv("themes.csv")
inventory_parts <- read_csv("inventory_parts.csv")
colors <- read_csv("colors.csv")

full <- inventory_parts %>%
  left_join(inventories, by = c("inventory_id" = "id")) %>%
  left_join(sets, themes, by = c("set_num" = "set_num")) %>%
  left_join(themes, by = c("theme_id" = "id")) %>%
  left_join(colors, by = c("color_id" = "id")) 

inventory_parts 데이터셋에 각 파츠의 quantity가 제공되기 때문에 이것을 기준점으로 left_join() 함수를 사용해 LEGO 시리즈의 정보와 파츠의 color 데이터를 merge하였습니다. dplyrleft_join() 함수는 왼쪽편에 있는 관측값을 보존합니다. 그리고 분석에 사용할 데이터만 select() 하였습니다.

lego <- full %>%
  select(name.y, year, part_num, rgb, quantity) 

head(lego, 10)
## # A tibble: 10 x 5
##    name.y         year part_num    rgb    quantity
##    <chr>         <dbl> <chr>       <chr>     <dbl>
##  1 Gravity Games  2004 48379c01    6C6E68        1
##  2 Gravity Games  2004 48395       9BA19D        1
##  3 Gravity Games  2004 mcsport6    FE8A18        1
##  4 Gravity Games  2004 paddle      05131D        1
##  5 Friends        2012 11816pr0005 F6D7B3        1
##  6 Friends        2012 2343        FCFCFC        1
##  7 Friends        2012 3003        E4ADC8        1
##  8 Friends        2012 30176       237841        1
##  9 Friends        2012 3020        FFFFFF        1
## 10 Friends        2012 3022        FFFFFF        2

저는 rgb column을 보면서 왼쪽에 #을 넣어주고 싶은 욕구를 주체할 수 없었습니다. 결국 mutate()paste0() 함수를 사용해 데이터를 조금 손봐줬습니다.

lego <- lego %>%
  mutate(rgb = paste0("#", rgb))

head(lego, 10)
## # A tibble: 10 x 5
##    name.y         year part_num    rgb     quantity
##    <chr>         <dbl> <chr>       <chr>      <dbl>
##  1 Gravity Games  2004 48379c01    #6C6E68        1
##  2 Gravity Games  2004 48395       #9BA19D        1
##  3 Gravity Games  2004 mcsport6    #FE8A18        1
##  4 Gravity Games  2004 paddle      #05131D        1
##  5 Friends        2012 11816pr0005 #F6D7B3        1
##  6 Friends        2012 2343        #FCFCFC        1
##  7 Friends        2012 3003        #E4ADC8        1
##  8 Friends        2012 30176       #237841        1
##  9 Friends        2012 3020        #FFFFFF        1
## 10 Friends        2012 3022        #FFFFFF        2

2. 시리즈별로 사용한 color counting

먼저 시리즈이름(name.y)과 색(rgb)으로 그룹을 만들고 summarise()를 사용해 각 시리즈별로 사용한 색을 counting 해줍니다. 시리즈가 매우 많기 때문에 대충 제가 좋아하는 시리즈 몇개를 골랐습니다.

lego_series <- lego %>%
  group_by(name.y, rgb) %>%
  summarise(n = sum(quantity)) %>%
  filter(name.y %in% c("Star Wars", "Minecraft", "Town", "City", "Police", "Train", "Basic", "Iron Man", "Christmas", "Disney Princess", "9V", "Spider-Man 2", "Avatar"))

head(lego_series, 10)
## # A tibble: 10 x 3
## # Groups:   name.y [1]
##    name.y rgb         n
##    <chr>  <chr>   <dbl>
##  1 9V     #0020A0    25
##  2 9V     #0055BF   719
##  3 9V     #05131D  4136
##  4 9V     #0A3463     5
##  5 9V     #184632    95
##  6 9V     #237841   211
##  7 9V     #4B9F4A     2
##  8 9V     #4C61DB     1
##  9 9V     #582A12    23
## 10 9V     #583927    83

3. waffle chart 만들기

CRAN에 올라와 있는 waffle 패키지는 0.7.0으로 ggplot2와 함께 사용할 수 있는 geom_waffle() 함수를 지원하지 않습니다. 따라서 저는 Github을 통해 developer version의 패키지를 사용하였습니다. devtools::install_github("hrbrmstr/waffle")을 통해 설치할 수 있습니다.

library(hrbrthemes) # for the themes
library(waffle)
packageVersion("waffle")
## [1] '1.0.1'

rgb에 알맞는 색을 지정해야 하기 때문에 다음과 같이 palette를 만들어 줍니다. 아까 #을 붙여놓은게 도움이 됩니다.

pal <- unique(lego_series$rgb)
names(pal) <- unique(pal)

와플차트는 숫자만큼 와플이 생성되므로 scale을 조금 손봐줍니다.

lego_series <- lego_series %>%
  mutate(n = ceiling(n/100))

geom_waffle()함수를 응용해 와플차트를 만들어 줍니다. color는 white가 디폴트 값인데 레고 블록 색깔 중 흰색계열도 차트에 들어가야 하므로 대충(?) 색을 지정해 줍니다. 그리고 facet_wrap() 함수로 각 시리즈별로 분리해 시각화 해줍니다.

lego_series %>%
  ggplot(aes(fill = rgb, values = n)) +
  geom_waffle(n_rows = 10, size = 0.33, color = "#f7e8f0", flip = TRUE) +
  facet_wrap(. ~ name.y, ncol = 5) +
  scale_fill_manual(values = pal) +
  coord_equal() +
  theme_ipsum(grid = "") +
  theme_enhance_waffle() +
  theme(legend.position = "none") +
  labs(
    title = "Colors of LEGO Series",
    caption = "Data from https://www.kaggle.com/rtatman/lego-database"
  )

완성되었습니다. 예쁜 그래프를 보면 마음이 평안해집니다.