1. Introdução

O Rotten Tomatoes é um dos principais sites agregadores de avaliação de filmes, reunindo opiniões de críticos profissionais de diversos veículos de comunicação. Nesse ambiente, existe uma distinção importante: alguns críticos são classificados como Top Critics, ou seja, possuem maior reconhecimento dentro da crítica especializada.

Este relatório busca responder à seguinte pergunta central:

Top Critics são mais rigorosos do que os demais críticos?

Com base em mais de 1 milhão de críticas do Kaggle, iremos analisar:

  • proporção de avaliações Fresh e Rotten
  • diferenças entre grupos de críticos dentro de diversos gêneros cinematográficos
  • comportamento das avaliações ao longo do tempo

A análise é estruturada em etapas progressivas que explicam a razão da escolha de cada abordagem.


2. Importação e Preparação dos Dados

O conjunto inicial contém duas bases de dados:

  • uma com informações gerais dos filmes
  • outra com todas as críticas registradas

Nesta etapa, apenas carregamos os dados e padronizamos os nomes das colunas para facilitar a manipulação posterior.

movies_raw  <- read_csv("dataset/rotten_tomatoes_movies.csv")
reviews_raw <- read_csv("dataset/rotten_tomatoes_critic_reviews.csv")

movies  <- movies_raw %>% clean_names()
reviews <- reviews_raw %>% clean_names()

3. Seleção e Limpeza

Nem todas as variáveis originais são necessárias. Aqui selecionamos apenas as informações essenciais para responder ao objetivo da análise, tais como tipo da crítica, se o crítico é ou não Top Critic, e dados de lançamento do filme.

Além disso, garantimos que as datas sejam reconhecidas corretamente pelo R, permitindo análises temporais.

movies_sel <- movies %>%
  select(rotten_tomatoes_link, movie_title, genres, content_rating, original_release_date) %>%
  mutate(original_release_date = ymd(original_release_date),
         release_year = year(original_release_date))

reviews_sel <- reviews %>%
  select(rotten_tomatoes_link, critic_name, top_critic, publisher_name,
         review_type, review_score, review_date, review_content) %>%
  mutate(review_date = ymd(review_date),
         review_year = year(review_date),
         top_critic = as.factor(top_critic),
         review_type = as.factor(review_type))

4. Dataset Final Integrado

Nesta etapa, unificamos as duas bases utilizando o identificador comum rotten_tomatoes_link. Cada linha passa a representar uma crítica individual, associada ao seu respectivo filme.

dados <- reviews_sel %>%
  inner_join(movies_sel, by = "rotten_tomatoes_link")

glimpse(dados)
## Rows: 1,129,887
## Columns: 14
## $ rotten_tomatoes_link  <chr> "m/0814255", "m/0814255", "m/0814255", "m/081425…
## $ critic_name           <chr> "Andrew L. Urban", "Louise Keller", NA, "Ben McE…
## $ top_critic            <fct> FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, T…
## $ publisher_name        <chr> "Urban Cinefile", "Urban Cinefile", "FILMINK (Au…
## $ review_type           <fct> Fresh, Fresh, Fresh, Fresh, Rotten, Rotten, Rott…
## $ review_score          <chr> NA, NA, NA, "3.5/5", NA, NA, "1/4", "3.5/5", "B"…
## $ review_date           <date> 2010-02-06, 2010-02-06, 2010-02-09, 2010-02-09,…
## $ review_content        <chr> "A fantasy adventure that fuses Greek mythology …
## $ review_year           <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, …
## $ movie_title           <chr> "Percy Jackson & the Olympians: The Lightning Th…
## $ genres                <chr> "Action & Adventure, Comedy, Drama, Science Fict…
## $ content_rating        <chr> "PG", "PG", "PG", "PG", "PG", "PG", "PG", "PG", …
## $ original_release_date <date> 2010-02-12, 2010-02-12, 2010-02-12, 2010-02-12,…
## $ release_year          <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, …

Essa visualização confirma que temos um conjunto rico, com informações de mais de 1 milhão de críticas.


5. Resultados

A seguir exploramos os dados com foco na pergunta principal.

5.1 Fresh vs Rotten por Tipo de Crítico

O primeiro passo é verificar se Top Critics e demais críticos distribuem suas avaliações de forma diferente.

prop_tipo_critica <- dados %>%
  count(top_critic, review_type) %>%
  group_by(top_critic) %>%
  mutate(prop = n / sum(n))

kable(prop_tipo_critica)
top_critic review_type n prop
FALSE Fresh 549814 0.6534638
FALSE Rotten 291570 0.3465362
TRUE Fresh 170299 0.5902850
TRUE Rotten 118204 0.4097150
ggplot(prop_tipo_critica, aes(x = top_critic, y = prop, fill = review_type)) +
  geom_col(position = "fill") +
  scale_y_continuous(labels = percent_format()) +
  labs(title = "Proporção Fresh/Rotten por Tipo de Crítico",
       x = "Critic é Top Critic?",
       y = "Proporção de críticas") +
  theme_minimal()

O gráfico já indica um movimento claro: Top Critics são mais rigorosos, pois publicam mais críticas Rotten do que os demais.


6. Análise por Gênero

Críticos podem ter diferentes níveis de rigor dependendo do estilo do filme. Assim, analisamos os gêneros mais populares.

dados_generos <- dados %>%
  filter(!is.na(genres)) %>%
  separate_rows(genres, sep = ",") %>%
  mutate(genres = str_trim(genres))

top_generos <- dados_generos %>% count(genres, sort = TRUE)
kable(head(top_generos, 15))
genres n
Drama 638038
Comedy 370743
Action & Adventure 296654
Mystery & Suspense 240766
Science Fiction & Fantasy 176166
Romance 120400
Art House & International 111180
Horror 107823
Kids & Family 82570
Documentary 77818
Animation 56199
Special Interest 48833
Musical & Performing Arts 47259
Classics 41673
Western 12278

Selecionamos os 6 gêneros mais frequentes para observar diferenças mais representativas.

generos_foco <- top_generos %>% slice_max(n, n = 6) %>% pull(genres)

prop_genero_topcritic <- dados_generos %>%
  filter(genres %in% generos_foco) %>%
  count(genres, top_critic, review_type) %>%
  group_by(genres, top_critic) %>%
  mutate(prop = n / sum(n))

kable(prop_genero_topcritic)
genres top_critic review_type n prop
Action & Adventure FALSE Fresh 139384 0.6040110
Action & Adventure FALSE Rotten 91380 0.3959890
Action & Adventure TRUE Fresh 34117 0.5177872
Action & Adventure TRUE Rotten 31773 0.4822128
Comedy FALSE Fresh 165946 0.6071780
Comedy FALSE Rotten 107361 0.3928220
Comedy TRUE Fresh 51958 0.5332526
Comedy TRUE Rotten 45478 0.4667474
Drama FALSE Fresh 322935 0.6848735
Drama FALSE Rotten 148590 0.3151265
Drama TRUE Fresh 102348 0.6146547
Drama TRUE Rotten 64165 0.3853453
Mystery & Suspense FALSE Fresh 112681 0.6147321
Mystery & Suspense FALSE Rotten 70620 0.3852679
Mystery & Suspense TRUE Fresh 30524 0.5311755
Mystery & Suspense TRUE Rotten 26941 0.4688245
Romance FALSE Fresh 54972 0.6217427
Romance FALSE Rotten 33444 0.3782573
Romance TRUE Fresh 17505 0.5473049
Romance TRUE Rotten 14479 0.4526951
Science Fiction & Fantasy FALSE Fresh 88498 0.6334996
Science Fiction & Fantasy FALSE Rotten 51199 0.3665004
Science Fiction & Fantasy TRUE Fresh 19815 0.5433382
Science Fiction & Fantasy TRUE Rotten 16654 0.4566618
ggplot(prop_genero_topcritic, aes(x = review_type, y = prop, fill = top_critic)) +
  geom_col(position = "dodge") +
  facet_wrap(~ genres) +
  scale_y_continuous(labels = percent_format()) +
  labs(title = "Proporção Fresh/Rotten por Gênero",
       x = "Tipo de crítica",
       y = "Proporção de críticas") +
  theme_minimal()

O padrão se mantém: em todos os gêneros os Top Critics apresentam uma taxa menor de críticas positivas.


7. Análise Temporal (Filtrada)

Uma análise do comportamento das críticas ao longo das décadas ajuda a entender se houve mudanças no rigor dos críticos.

Contudo, existem anos inválidos no dataset (por exemplo, 1800 ou anos muito antigos com pouquíssimas críticas). Por isso aplicamos um filtro de anos iguais ou superiores a 1980, quando o volume de dados é mais confiável.

prop_ano <- dados %>%
  filter(review_year >= 1980,
         !is.na(review_type),
         !is.na(top_critic)) %>%
  mutate(review_type_bin = if_else(review_type == "Fresh", 1, 0)) %>%
  group_by(review_year, top_critic) %>%
  summarise(
    n = n(),
    prop_fresh = mean(review_type_bin, na.rm = TRUE),
    .groups = "drop"
  )

kable(head(prop_ano, 20))
review_year top_critic n prop_fresh
1980 FALSE 4 1.0000000
1980 TRUE 1 1.0000000
1981 FALSE 11 0.8181818
1981 TRUE 1 1.0000000
1982 FALSE 2 1.0000000
1982 TRUE 2 0.5000000
1983 FALSE 4 0.7500000
1984 FALSE 6 0.8333333
1984 TRUE 3 0.3333333
1985 FALSE 10 0.9000000
1985 TRUE 3 1.0000000
1986 FALSE 5 1.0000000
1986 TRUE 3 1.0000000
1987 FALSE 4 1.0000000
1987 TRUE 3 0.3333333
1988 FALSE 1 0.0000000
1988 TRUE 13 0.4615385
1989 FALSE 3 1.0000000
1989 TRUE 16 0.5000000
1990 FALSE 4 0.7500000
ggplot(prop_ano, aes(x = review_year, y = prop_fresh, color = top_critic)) +
  geom_line() + geom_point() +
  scale_y_continuous(labels = percent_format()) +
  labs(title = "Evolução Temporal das Críticas Fresh (>=1980)",
       x = "Ano da crítica",
       y = "Proporção de críticas Fresh") +
  theme_minimal()

Observamos estabilidade e, novamente, o mesmo comportamento entre os grupos ao longo do tempo.


8. Conclusões

Podemos afirmar com segurança que:

  • Top Critics são mais exigentes
  • aprovam uma menor proporção de filmes
  • o padrão de rigor não depende do gênero
  • essa diferença se mantém ao longo das décadas recentes

Portanto:

Sim, Top Critics são de fato mais rigorosos que os demais críticos, tanto no geral quanto dentro dos principais gêneros do cinema.

Essa conclusão pode ser útil para: - estúdios que desejam compreender recepção crítica de seus filmes - plataformas de streaming que utilizam métricas do Rotten Tomatoes - pesquisadores de mídia e crítica de cinema

Como possíveis trabalhos futuros: - expandir a análise considerando notas numéricas quando disponíveis - comparar com avaliações do público - estudar impacto de veículos específicos de imprensa


9. Referências

  • Kaggle — Rotten Tomatoes Movies and Reviews Dataset
  • Rotten Tomatoes — Glossário de métricas oficiais