Introdução

Rotten Tomatoes é uma das grandes plataformas para avaliar e obter informações de filmes, séries e desenhos. Neste site, o usuário pode avaliar um filme, ver avaliações de outros usuários e de críticos especializados da indústria. Essa característica não só pode como influencia as pessoas a consumir uma mídia baseando-se na opinião das outras pessoas. Porém, não é possível ver uma tendência das avaliações dos filmes. Será que o filme X manteve a média de avaliações ao longo do tempo? A média de avaliações aumentou ou diminuiu com o tempo? Talvez a recepção inicial tenha sido fraca por ter sido comparado com outro filme da mesma época, mas com o passar dos meses e anos as pessoas perceberam o valor do filme e sua nota foi sendo ajustada. Essas questões não podemos perceber utilizando apenas o site, por não possuir essa análise de métricas.

Neste relatório, é pretendido avaliar as tendências médias de avaliações de filmes ao longo do tempo para que possamos entender se a nota atual realmente representa o sentimento atual dos espectadores em relação ao filme. As notas no site vão de 0.5 a 5 estrelas. Será feita uma média das notas de todos os anos desde o lançamento do filme até o último ano disponível no conjunto de dados.

Com esta análise, será possível ter uma melhor noção de como as notas variam de acordo com o tempo para que os possíveis espectadores tomem decisões mais acertadas em assistir um filme ou não, baseado nas notas do Rotten Tomatoes.

Pacotes Requeridos

Neste estudo, foram utilizados os pacotes:

Preparação dos Dados

O conjunto de dados foi obtido na plataforma Kaggle, disponível neste link.

O conjunto de dados é composto de dois arquivos csv. Os dados foram obtidos a partir de webscrapping. Por ter sido disponibilizado no Kaggle, o conjunto provavelmente foi desenvolvido para análises estatísticas e aplicação de algoritmos de Inteligência Artificial, para, por exemplo, análise de sentimentos em reviews de filmes. O conjunto foi criado em 2020 e contém informações de mais de 17.000 filmes.

Iniciamos importando os dados a partir dos arquivos csv:

movies <- read.csv("Rotten Tomatoes Dataset/rotten_tomatoes_movies.csv")

reviews <- read.csv("Rotten Tomatoes Dataset/rotten_tomatoes_critic_reviews.csv")

Em seguida, vamos observar como estão organizados os dados utilizando a função colnames():

print("Colunas movies")
## [1] "Colunas movies"
colnames(movies)
##  [1] "rotten_tomatoes_link"             "movie_title"                     
##  [3] "movie_info"                       "critics_consensus"               
##  [5] "content_rating"                   "genres"                          
##  [7] "directors"                        "authors"                         
##  [9] "actors"                           "original_release_date"           
## [11] "streaming_release_date"           "runtime"                         
## [13] "production_company"               "tomatometer_status"              
## [15] "tomatometer_rating"               "tomatometer_count"               
## [17] "audience_status"                  "audience_rating"                 
## [19] "audience_count"                   "tomatometer_top_critics_count"   
## [21] "tomatometer_fresh_critics_count"  "tomatometer_rotten_critics_count"
print("Colunas reviews")
## [1] "Colunas reviews"
colnames(reviews)
## [1] "rotten_tomatoes_link" "critic_name"          "top_critic"          
## [4] "publisher_name"       "review_type"          "review_score"        
## [7] "review_date"          "review_content"

Observando as colunas, só nos interessam rotten_tomatoes_link, movie_title e original_release_date do dataframe movies. Do dataframe reviews, vamos utilizar rotten_tomatoes_link, review_score e review_date. Vamos então o processamento começar removendo as demais colunas:

library(dplyr)

movies <- movies %>% select(rotten_tomatoes_link, movie_title, original_release_date)

reviews <- reviews %>% select(rotten_tomatoes_link, review_score, review_date)

Vamos verificar se as alterações foram corretamente aplicadas.

summary(movies)
##  rotten_tomatoes_link movie_title        original_release_date
##  Length:17712         Length:17712       Length:17712         
##  Class :character     Class :character   Class :character     
##  Mode  :character     Mode  :character   Mode  :character
summary(reviews)
##  rotten_tomatoes_link review_score       review_date       
##  Length:1130017       Length:1130017     Length:1130017    
##  Class :character     Class :character   Class :character  
##  Mode  :character     Mode  :character   Mode  :character

Como as alterações feitas estão corretas, vamos agora procurar por dados faltantes que podem atrapalhar na nossa análise.

colSums(is.na(movies))
##  rotten_tomatoes_link           movie_title original_release_date 
##                     0                     0                     0
colSums(movies == "")
##  rotten_tomatoes_link           movie_title original_release_date 
##                     0                     0                  1166

Não há presença de NA’s no dataframe, porém há vários filmes sem a informação de data de lançamento. Vamos então remover esses filmes que não possuem as datas de lançamento.

movies <- movies[movies$original_release_date != "", ]
colSums(movies == "")
##  rotten_tomatoes_link           movie_title original_release_date 
##                     0                     0                     0

Vamos agora fazer o mesmo processo e conferir o dataframe de reviews.

colSums(is.na(reviews))
## rotten_tomatoes_link         review_score          review_date 
##                    0                    0                    0
colSums(reviews == "")
## rotten_tomatoes_link         review_score          review_date 
##                    0               305936                    0

Podemos ver que o dataframe de reviews também não possui NA’s, mas possui vários campos vazios na coluna review_score. Vamos então fazer a remoção.

reviews <- reviews[reviews$review_score != "", ]
colSums(reviews == "")
## rotten_tomatoes_link         review_score          review_date 
##                    0                    0                    0

Agora, vamos adicionar uma coluna para identificar os filmes pelo título. Para isso, vamos utilizar a coluna rotten_tomatoes_link, que está presente em ambos os dataframes. O nome do filme será adicionado de acordo com o valor da coluna.

reviews <- reviews %>% left_join(movies %>% select(rotten_tomatoes_link, movie_title), by = "rotten_tomatoes_link")

Para conferir se a operação foi efetuada corretamente, vamos pegar um link e título associado presentes no dataframe de filmes e comparar o título e link no dataframe de reviews.

movie_row <- movies[1, ]
movie_row$rotten_tomatoes_link
## [1] "m/0814255"
movie_row$movie_title
## [1] "Percy Jackson & the Olympians: The Lightning Thief"
reviews %>% filter(rotten_tomatoes_link == movie_row$rotten_tomatoes_link) %>% slice(1:2)
##   rotten_tomatoes_link review_score review_date
## 1            m/0814255        3.5/5  2010-02-09
## 2            m/0814255          1/4  2010-02-10
##                                          movie_title
## 1 Percy Jackson & the Olympians: The Lightning Thief
## 2 Percy Jackson & the Olympians: The Lightning Thief

Agora, antes de finalizarmos, devemos lembrar que no início removemos filmes que não possuíam data de lançamento. Como adicionamos filmes baseado na coluna rotten_tomatoes_link, caso o valor não existisse, seria adicionado um NA na coluna movie_title do dataframe de reviews. Vamos verificar se isso aconteceu, e caso tenha acontecido, vamos remover as ocorrências do dataframe de reviews que possuam NA na coluna de título de filme.

colSums(is.na(reviews))
## rotten_tomatoes_link         review_score          review_date 
##                    0                    0                    0 
##          movie_title 
##                14872
reviews <- reviews %>% filter(!is.na(movie_title))

Vamos também remover as colunas rotten_tomatoes_link de ambos os dataframes, já que não irão mais servir para nada.

movies<- movies %>% select(-rotten_tomatoes_link)
reviews<- reviews %>% select(-rotten_tomatoes_link)

Por fim, vamos transformar os scores em números para podermos fazer os cálculos.

reviews <- reviews %>%   filter(grepl("^\\d+/\\d+$", review_score)) %>%   mutate(score = as.numeric(sub("/.*$", "", review_score))) %>%  mutate(score = ifelse(score > 5, score / 2, score))

Agora, terminanos o pré-processamento de nossos dados. Vamos agora as tabelas utilizando a biblioteca DT .

Tabelas

Dataframe Movies

library(DT)

DT::datatable(movies)

Dataframe Reviews

DT::datatable(reviews)

Análise Exploratória dos Dados

Agora, nós iremos analisar os dados e descobrir se existe alguma tendência nas notas médias dos filmes. Dois filmes foram escolhidos para esta tarefa: Percy Jackson e o Ladrão de Raios (do inglês, Percy Jackson & the Olympians: The Lightning Thief) e A Volta dos Bravos (do inglês, Home of the Brave).

Vamos primeiro incluir a biblioteca ggplot2 e definir uma função para desenhar o gráfico.

library("ggplot2")

plot_avg_review_score <- function(reviews, movies, movie_title) {

  release_year <- movies %>%
    filter(movie_title == !!movie_title) %>%
    select(original_release_date) %>%
    mutate(year = format(as.Date(original_release_date), "%Y")) %>%
    pull(year)
  
  release_year <- as.numeric(release_year)
  
  movie_reviews <- reviews %>%
    filter(movie_title == !!movie_title) %>%
    mutate(year = format(as.Date(review_date), "%Y")) %>%
    filter(as.numeric(year) >= release_year) %>%
    group_by(year) %>%
    summarize(avg_score = mean(score, na.rm = TRUE))
  
  ggplot(movie_reviews, aes(x = year, y = avg_score)) +
    geom_point(color = "red") + 
    labs(title = paste("Average Review Score for", movie_title),
         x = "Year",
         y = "Average Review Score") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

Executando a função para o filme “Percy Jackson & the Olympians: The Lightning Thief”, obtemos o seguinte gráfico:

Podemos perceber que inicialmente a nota média é consideravelmente alta mas no ano seguinte tem uma queda e com o passar dos anos há variações mas vai aumentando gradualmente.

Agora, vamos analisar o filme “Home of the Brave”:

Existem algumas semelhanças neste segundo filme, que é uma nota alta no início e uma queda brusca no ano seguinte, porém esse filme demonstra, depois da queda, um aumento considerável da nota, que, novamente cai, para na segunda metade voltar a subir gradativamente, para o que supomos ser um valor mais próximo da real nota daquele filme.

Conclusões

Neste trabalhos percebemos que há grande variação nos primeiros anos nas notas médias de avaliações de filmes, mas com o passar dos anos, a partir da segunda metade dos gráficos é possível observar que as notas vão aumentando gradativamente e tendo menor variação.