Manipulação de dados para fazer um boxplot com ggplot2

Essa pergunta foi enviada na aula sobre ggplot2, no curso R para Ciência de Dados I.

Porque que esse código não funciona para filtrar os 15 diretores que mais dirigiram filmes?

# Carregar pacotes --------------------------------------------------------

library(tidyverse)

# Ler base IMDB -----------------------------------------------------------

imdb <- readr::read_csv("https://raw.githubusercontent.com/curso-r/main-r4ds-1/master/dados/imdb.csv")
#> 
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#>   titulo = col_character(),
#>   ano = col_double(),
#>   diretor = col_character(),
#>   duracao = col_double(),
#>   cor = col_character(),
#>   generos = col_character(),
#>   pais = col_character(),
#>   classificacao = col_character(),
#>   orcamento = col_double(),
#>   receita = col_double(),
#>   nota_imdb = col_double(),
#>   likes_facebook = col_double(),
#>   ator_1 = col_character(),
#>   ator_2 = col_character(),
#>   ator_3 = col_character()
#> )

imdb <- imdb %>% mutate(lucro = receita - orcamento)


# Box plot do lucro dos 15 diretores que mais dirigiram filmes
imdb %>% 
  filter(!is.na(diretor)) %>%
  group_by(diretor) %>% 
  summarise(diretor, 
            n_numbers_top_15 = n()) %>% 
  filter(n_numbers_top_15 >= 15) %>% 
  ggplot() +
  geom_boxplot(aes(x = diretor, y = lucro))
#> `summarise()` has grouped output by 'diretor'. You can override using the `.groups` argument.
#> Error in FUN(X[[i]], ...): objeto 'lucro' não encontrado

Created on 2021-03-13 by the reprex package (v1.0.0)

Olá! :slight_smile:
O código enviado tem algumas possibilidades de melhorias:

  • Os dados foram agrupados por diretor, então não é necessário indicar diretor no summarize novamente.
  • O filtro está filtrando diretores com mais de 15 filmes dirigidos, não os 15 diretores com mais filmes dirigidos.
  • Como o lucro não está presente no summarize, ao tentar usar essa variável no boxplot, ela não é encontrada.

A forma que pensei de realizar o gráfico que você deseja é essa:

# Carregar pacotes --------------------------------------------------------

library(tidyverse)

# Ler base IMDB -----------------------------------------------------------

imdb <- readr::read_csv("https://raw.githubusercontent.com/curso-r/main-r4ds-1/master/dados/imdb.csv")
#> 
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#>   titulo = col_character(),
#>   ano = col_double(),
#>   diretor = col_character(),
#>   duracao = col_double(),
#>   cor = col_character(),
#>   generos = col_character(),
#>   pais = col_character(),
#>   classificacao = col_character(),
#>   orcamento = col_double(),
#>   receita = col_double(),
#>   nota_imdb = col_double(),
#>   likes_facebook = col_double(),
#>   ator_1 = col_character(),
#>   ator_2 = col_character(),
#>   ator_3 = col_character()
#> )

imdb <- imdb %>% mutate(lucro = receita - orcamento)


# Box plot do lucro dos 15 diretores que mais dirigiram filmes
# Primeiro vamos criar uma base contendo apenas
# os 15 diretores que mais dirigiram filmes

diretores_top_15 <- imdb %>% 
  filter(!is.na(diretor)) %>%
  group_by(diretor) %>% 
  summarise(n_numbers_top_15 = n()) %>% 
  top_n(15) 
#> Selecting by n_numbers_top_15

diretores_top_15
#> # A tibble: 15 x 2
#>    diretor           n_numbers_top_15
#>    <chr>                        <int>
#>  1 Barry Levinson                  13
#>  2 Clint Eastwood                  20
#>  3 Kevin Smith                     12
#>  4 Martin Scorsese                 20
#>  5 Michael Bay                     12
#>  6 Renny Harlin                    14
#>  7 Ridley Scott                    14
#>  8 Robert Rodriguez                12
#>  9 Robert Zemeckis                 13
#> 10 Ron Howard                      12
#> 11 Spike Lee                       16
#> 12 Steven Soderbergh               14
#> 13 Steven Spielberg                24
#> 14 Tim Burton                      14
#> 15 Woody Allen                     18

# Usamos essa base criada, para filtrar a base imdb
# e então criamos o boxplot

imdb %>% 
  filter(diretor %in% diretores_top_15$diretor) %>% 
  ggplot() +
  geom_boxplot(aes(y = diretor, x = lucro)) 
#> Warning: Removed 12 rows containing non-finite values (stat_boxplot).

Created on 2021-03-13 by the reprex package (v1.0.0)

imdb %>%
filter(!is.na(diretor)) %>%
group_by(diretor) %>%
filter(n() >= 15) %>% # filtra a base para os diretores com 15 ou mais filme
ggplot() +
geom_boxplot(aes(x = diretor, y = lucro))