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.
Neste estudo, foram utilizados os pacotes:
dplyr: É um pacote do R usado para manipulação de dados de maneira eficiente e intuitiva. Ele facilita a transformação e análise de dados, permitindo operações como filtragem, ordenação, criação de novas colunas e agregação de dados.
ggplot2: O ggplot2 é um pacote do R amplamente utilizado para a criação de gráficos. Baseado no The Grammar of Graphs, ele oferece uma maneira flexível e poderosa de visualizar dados. Com o ggplot2, você pode criar gráficos personalizáveis e de alta qualidade com facilidade.
DT: DT é um pacote do R que facilita a criação de tabelas interativas utilizando a biblioteca JavaScript DataTables. Com ele, é possível exibir, filtrar, ordenar e paginar grandes conjuntos de dados de maneira eficiente em aplicações web ou em relatórios interativos, como os feitos com o R Markdown ou o Shiny.
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 .
library(DT)
DT::datatable(movies)
DT::datatable(reviews)