Projeto visualização de dados

Saulo Valentim

2022-05-25

Board Games

O objetivo desse projeto é criar visualizações da base de dados “Board Games” do TidyTuesday.

TidyTuesday é um evento onde toda semana uma nova base de dados é liberada, e as pessoas engajadas na comunidade montam suas visualizações para compartilhar nas redes sociais.

Board Games trata-se de um conjunto de dados sobre jogos de tabuleiro, incluindo duas bases:

  • i) detalhes sobre os jogos;

  • ii) as notas de reviews de usuários.

Para mais detalhes, acesse o link: https://github.com/rfordatascience/tidytuesday/blob/master/data/2022/2022-01-25/readme.md

As principais ideias para construção das visualizações foram as seguintes:

  • Quais jogos são para maiores de 18 anos;
  • Tempo máximo de jogo por faixa de idade;
  • Os 10 jogos mais jogados;

  • Jogos que tiveram maior nota média de reviews nos últimos 5 anos;

  • Os 10 jogos com maiores e menores ranks em 2022;

  • Os 20 jogos mais adquiridos (owned);

  • Relação entre quantidade de jogos adquiridos x idade.

Primeiro vamos carregar os pacotes necessários:

# carregar pacotes --------------------------------------------------------
library(tidyverse)
library(highcharter)
library(patchwork)
library(ggthemes)
library(highcharter)
library(ggtext)
library(plotly)

Em seguida vamos importar a base de dados:

# importar dados ----------------------------------------------------------
ratings <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-01-25/ratings.csv')
details <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-01-25/details.csv')

Agora vamos as visualizações !!!

Gráfico 1 - Quais jogos são para maiores de 18 anos

# grafico_1 -------------------------------------------------
idade_max <- filter(details, minage == 25)

details %>%
  filter(minage > 18) %>% 
  mutate(primary = fct_reorder(primary, minage)) %>% 
  ggplot() +
  aes(x = primary, y= minage) +
  geom_col() +
  geom_col(
    data = idade_max,
    fill = "orange"
    ) +
  coord_flip() +
  theme_base() +
  labs(
    title = "Jogos para maiores de idade",
    subtitle = "Acima de 18 anos",
    y = "Idade",
    x = "Jogo",
  )

Gráfico 2 - Tempo máximo de jogo por faixa de idade

# grafico_2 -------------------------------------------------
details %>%
  mutate(minage = cut_width(minage, width=5, boundary=0)) %>% 
  ggplot() +
  aes(x= minage, y= log10(maxplaytime), fill = minage) +
  geom_boxplot() +
  labs(
    title = "Tempo máximo de jogo por faixa de idade",
    x = "Idade",
    y = "Log10(tempo máximo)"
  ) + 
  theme_stata() +
  theme(legend.position = "none")

Gráfico 3 - Os 10 jogos mais jogados

# grafico_3 -------------------------------------------------
details %>% 
  arrange(desc(maxplaytime)) %>% 
  slice(1:10) %>% 
  hchart("bar", hcaes(
    x = primary, y = maxplaytime
  )) %>% 
  hc_title(text = "Top10 - jogos que foram mais jogados") %>% 
  hc_xAxis(title = list(text = "")) %>% 
  hc_yAxis(title = list(text = "maxplaytime")) 

Gráfico 4 - Jogos que tiveram maior nota média de reviews nos últimos 5 anos

# gráfico_4 ------------------------------------------------- 
nomes <- data.frame(name = c("Malhya: Lands of Legends", "Erune", "Aeolis", 
                             "Wings of the Motherland", "TerroriXico"))

da_board <- ratings %>% 
  filter(year != 0, year %in% c(2018:2022)) %>% 
  group_by(year) %>% 
  summarise(maior_media = max(average)) %>% 
  arrange(desc(year)) %>% 
  bind_cols(nomes) %>% 
  left_join(ratings, by = "name") %>% 
  rename(year=year.x) %>% 
  select(name, year, maior_media, thumbnail) %>% 
  mutate(name = fct_reorder(name, year))

gg_board <- da_board %>% 
  ggplot() +
  geom_segment(
    aes(x = 0, xend = maior_media, y = name, yend = name)
    ) +
  geom_point(
    aes(x = maior_media, y = name, colour = name),
    size = 2.5
    ) +
  annotate(
    "label",
    x = da_board$maior_media,
    y = da_board$name,
    label = paste(da_board$maior_media,"\nano:",da_board$year),
    size = 4,
    fill = c("orange", "light blue", "royal blue", "red", "Brown")
    ) +
  scale_colour_manual(
    name = "",
    values = c("orange", "light blue", "royal blue", "red", "Brown"),
    labels = c("Malhya: Lands of Legends", "Erune", 
               "Aeolis", "Wings of the Motherland", "TerroriXico")
    ) +
  labs(
    x = "nota media reviews",
    y = "",
    title = "Jogo com maior nota media de reviews",
    subtitle = "Período: 2018 a 2022"
   ) +
  theme_minimal()

# library(remotes)
# extrafont::font_import("exemplos_de_aula/fontes", prompt = FALSE)
extrafont::loadfonts("win")

gg_board +
  scale_y_discrete(
    name = NULL,
    labels = glue::glue("<img src='{da_board$thumbnail[5:1]}' width='60'>")
    ) +
  theme(
    plot.title = element_markdown(family = "101! CheckBoard", size = 28),
    axis.text.y = element_markdown()
    )

Gráfico 5 - Os 10 jogos com maiores e menores ranks em 2022

# gráfico_5 -------------------------------------------------
p1 <- ratings %>% 
  filter(year == 2022) %>% 
  arrange(desc(rank)) %>% 
  head(10) %>% 
  mutate(name = fct_reorder(name, rank)) %>%
  ggplot() +
  aes(x = name, y = rank) +
  geom_col() +
  coord_flip() +
  labs(
    title = "Top10 - Jogos com maior classificação em 2022",
    x = "",
    y = "Rank"
  ) +
  theme_solarized()

p2 <- ratings %>% 
  filter(year == 2022) %>% 
  arrange(desc(rank)) %>% 
  tail(10) %>%
  mutate(name = fct_reorder(name, rank, .desc = T)) %>% 
  ggplot() +
  aes(x = name, y = rank) +
  geom_col() +
  coord_flip() +
  labs(
    title = "Top10 - Jogos com menor classificação em 2022",
    x = "",
    y = "Rank"
  ) +
  theme_solarized()

p1 / p2

Gráfico 6 - Os 20 jogos mais adquiridos (owned)

# gráfico_6 -------------------------------------------------
p3 <- details %>% 
  arrange(desc(owned)) %>% 
  head(20) %>% 
  mutate(primary = fct_reorder(primary, owned)) %>% 
  ggplot() +
  aes(x = primary, y = owned) +
  geom_col() +
  coord_flip() +
  labs(
    title = "Top20 - Jogos mais adquiridos",
    x = "",
    y = "Qtd.adquirida"
  ) +
  theme_fivethirtyeight()
  
ggplotly(p3)

Gráfico 7 - Relação entre quantidade de jogos adquiridos vs idade

# gráfico_7 -------------------------------------------------
jogo <- details %>% 
  arrange(desc(owned)) %>% 
  head(3)

details %>% 
  ggplot() +
  aes(x = minage, y = owned) +
  geom_point() + 
  annotate(
    "text",
    x = jogo$minage,
    y = jogo$owned,
    label = jogo$primary,
    hjust = 1.1,
    vjust = 0.5,
    size = 2.5,
    color = "red"
    ) +
  labs(
    title = "Relação entre quantidade adquirida x idade",
    x = "Idade",
    y = "Qtd.adquirida"
  ) +
  theme_clean()

Obrigado!!!