Explorando a filmografia de Tom Hanks
library(tidyverse)
library(here)
library(emo)
library(reshape2)
library(ggbeeswarm)
library(plotly)
library(scales)
library(ggforce)
library(tidyquant)
library(kableExtra)
library(broom)
library(gridExtra)
theme_set(theme_bw())
# Reading data
filmography = read_csv("../data/tom_hanks.csv")
# Removing scientific notation
options(scipen=999)Autor:
Wesley Matteus Araújo dos Santos
Olá! Hoje iremos explorar a filmografia de Tom Hanks, um dos meus atores preferidos - você provavelmente deve conhecê-lo 😄. E nossa meta é tanto descrever as avaliações de críticos e audiência, como também sua relação com a bilheteria dos filmes, por fim, agrupando-os com respeito a essas bilheterias e críticas.
Para atingir esse objetivo, usaremos dados do Rotten Tomatoes (site americano que agrega avaliações sobre filmes e televisão). Nele temos acesso a filmografia de várias celebridades, inclusive a de Tom Hanks! Que conta com a sua participação em 46 filmes, como personagem, voz e produtor. As informações as quais temos acesso incluem os nomes das obras, avaliações de críticos e da audiência (usuários do site), papel desempenhado, bilheteria e ano de lançamento.
Mas sem mais delongas, vamos começar!
Crédito: Warner Brothers; Imagem: Tom Hanks
Descrevendo as críticas e bilheterias dos filmes
Antes de tentar agrupar os filmes segundo bilheteria e avaliações, precisamos entender melhor com o que estamos lidando. Para isso, primeiro iremos descrever as bilheterias dos filmes e depois as suas avaliações.
Quanto as bilheterias, iremos ver as suas distribuições e valores em um gráfico violino (que nos mostrará onde os valores estão mais e menos concentrados) e de pontos (nos dando uma noção de onde está cada ponto), além de uma tabela de estatísticas. O seguinte gráfico é interativo, então tente passar o cursor do mouse em cima dos pontos para ver mais informações do filme!
bilheteria <- filmography %>%
ggplot(aes(x = "", y = box_office, group = 1,
text = paste("Título: ", title,
"<br>Ano: ", year,
"<br>Bilheteria: ", box_office, "mi"))) +
geom_violin(color = "mediumpurple3", alpha = 0.8) +
geom_beeswarm(color = "mediumpurple2", size = 4, cex=4, alpha = 0.8) +
scale_color_manual(name = "Estatísticas",
values = c("mediana" = "chocolate1", "média" = "brown")) +
coord_flip() +
theme_tq() +
labs(
x = "Filmes",
y = "Bilheteria (milhões de dólares)",
title = "Distribuição das bilheterias dos filmes com participação de Tom Hanks",
subtitle = ""
)
ggplotly(bilheteria, tooltip="text", height=400, width=600) %>%
config(displayModeBar = FALSE, displaylogo = FALSE, locale="pt-BR")filmography %>%
summarise("Média" = mean(box_office),
"Médiana" = median(box_office),
"Desvio padrão" = sd(box_office),
"90 percentil" = quantile(box_office, 0.9)) %>%
kable() %>%
kable_paper(full_width = FALSE, position = "center") %>%
add_header_above(header = c("Estatísticas das bilheterias" = 4))|
Estatísticas das bilheterias
|
|||
|---|---|---|---|
| Média | Médiana | Desvio padrão | 90 percentil |
| 101.7152 | 74.15 | 100.0651 | 225.55 |
Esse gráfico nos mostra que a distribuição das bilheterias é relativamente assimétrica, tendendo à esquerda (bilheterias menores). Apresentando uma maior concentração em torno de 40 milhões de dólares, enquanto temos pouquíssimos filmes com bilheterias muito altas. “Toy Story 4” sendo o de maior bilheteria (434 mi), continuando os sucessos da franquia, e “The celluloid closet” sendo o de menor bilheteria (1.4mi), que em certa medida faz sentido, tanto por ser um documentário, quanto por ser da década de 90 e falar sobre personagens LGBTs de filmes de Hollywood (um nicho bem particular, em relação aos seus outros filmes).
Já a tabela indica que a média está em torno de 100mi e a mediana em torno de 70mi milhões de dólares, do que podemos concluir que 50% dos seus filmes atingem mais de 70 de milhões de doláres, enquanto 10% deles ultrapassam os 200 milhões (visto com o auxílio do 90 percentil)! A variação também é bem alta (100 mi), já que ele tem filmes com bilheteria muito baixas e altas.
Ainda é interessante analisarmos as avaliações desses filmes, para as quais usaremos o mesmo tipo de gráfico e tabelas, pelos mesmos motivos apresentados anteriormente.
melted_film <- melt(filmography , id.vars = c("year", "title", "credit", "box_office"), variable.name = 'Avaliações')
levels(melted_film[["Avaliações"]])[levels(melted_film[["Avaliações"]])=="rating"] <- "Críticos"
levels(melted_film[["Avaliações"]])[levels(melted_film[["Avaliações"]])=="audience_score"] <- "Audiência"
interactive <- melted_film %>%
ggplot(aes(x = Avaliações, y = value, group = 1, text = paste("Título: ", title, "<br>Avaliação: ", value))) +
geom_violin(aes(group = Avaliações, color = Avaliações), alpha = 0.8, draw_quantiles = c(0.25, 0.5, 0.75)) +
geom_beeswarm(size = 4, cex=4, aes(color = Avaliações, group = Avaliações), alpha = 0.6) +
coord_flip() +
labs(
x = "Categoria",
y = "Avaliação",
title = "Avaliações dos filmes"
)
ggplotly(interactive, tooltip = "text", height = 400, width = 700) %>%
config(displayModeBar = FALSE, displaylogo = FALSE, locale="pt-BR")filmography %>%
summarise("Média" = mean(audience_score),
"Médiana" = median(audience_score),
"Desvio padrão" = sd(audience_score),
"90 percentil" = quantile(audience_score, 0.9),
"Média " = mean(rating),
"Médiana " = median(rating),
"Desvio padrão " = sd(rating),
"90 percentil " = quantile(rating, 0.9)) %>%
kable() %>%
kable_paper(full_width = FALSE, position = "center") %>%
add_header_above(header = c("Audiência" = 4,
"Críticos" = 4)) %>%
add_header_above(header = c("Estatísticas das avaliações" = 8))|
Estatísticas das avaliações
|
|||||||
|---|---|---|---|---|---|---|---|
|
Audiência
|
Críticos
|
||||||
| Média | Médiana | Desvio padrão | 90 percentil | Média | Médiana | Desvio padrão | 90 percentil |
| 70.69565 | 74.5 | 19.79435 | 91 | 70.56522 | 76.5 | 23.14078 | 97 |
Observamos com os gráficos que as avaliações também parecem assimétricas, agora a direita, com intensidade menor do que nas bilheterias. Interessantemente, os críticos avaliaram melhor vários filmes, como também pior em alguns casos - tomaram as decisões mais bruscas. Ambos estão levemente mais concentrados em torno de 80.
Já com a tabela, confirmamos que os críticos apresentam maior variação em suas avaliações (maior desvio padrão). As suas 10% maiores avaliações ultrapassam os 97/100, enquanto os usuários 91/100. E suas médias e medianas também estão bem próximas (~70).
Resumindo: Todas as bilheterias dos filmes de Tom Hanks ultrapassam a casa do milhão de doláres, uma parte considerável sendo concentrada em torno de 40 milhões, com um desvio padrão de 100 milhões de dólares. Já as suas avaliações também variam consideravelmente, mas a maior parte está acima de 65/100, com concentrações levemente maiores em torno de 80. Como eu, parece que há bastante gente por aí assistindo e gostando dos filmes dele 😁!
Existe relação entre esses aspectos ?
Antes de partirmos para a atração principal, fiquei curioso em descobrir se há alguma relação entre as avaliações e a bilheteria, já que intuitivamente faz sentido que de forma geral filmes melhores avaliados tenham maior bilheteria.
Para testar isso, usaremos um gráfico de pontos e calcularemos o valor de r (coeficiente de correlação de pearson). Primeiro analisando a correlação entre a avaliação da audiência e logo depois as dos críticos com a bilheteria.
cor_plot <- function(df, var = "rating", label.var = "Avaliação dos críticos", label.x = 2,
label.y = 10, color = "mediumturquoise", method = "pearson", ...) {
df %>%
ggplot(mapping = aes(x = box_office, y = get(var))) +
geom_point(size = 3, alpha = 0.8, color = color) +
theme_tq() +
annotate("label", label = paste(
"r =", round(cor(df$box_office, df[[var]], method = method), 2)),
x = label.x, y = label.y, size = 6, colour = "white",
fill=color, alpha = 0.8) +
scale_x_log10() +
labs(
y = label.var,
x = "Bilheteria",
...
)
}cor_plot(filmography,
var = "audience_score",
label.var = "Avaliação da audiência",
method = "pearson",
title = "Correlação entre avaliações da audiência e bilheteria"
)filtered_filmography <- filmography %>%
filter(box_office >= 30)
cor_plot(filtered_filmography,
label.x = 35,
var = "audience_score",
label.var = "Avaliação da audiência",
method = "pearson",
title = "Correlação entre avaliações da audiência e bilheteria",
subtitle = "Bilheterias acima de 30 milhões de dólares"
)Vemos a partir desses gráficos que a avaliação da audiência realmente se relaciona com a bilheteria com intensidade média e positiva (em torno de 0.5), sendo essa relação levemente mais forte nos filmes que ultrapassam 30 milhões de bilheteria. Ou seja, existe uma tendência média de que filmes mais bem avaliados também sejam mais vistos, e vice-versa.
Quanto aos críticos:
cor_plot(filmography,
var = "rating",
label.var = "Avaliação dos críticos",
color = "salmon",
method = "pearson",
title = "Correlação entre avaliações dos críticos e bilheteria"
)filtered_filmography <- filmography %>%
filter(box_office >= 30)
cor_plot(filtered_filmography,
label.x = 35,
var = "rating",
method = "pearson",
color = "salmon",
title = "Correlação entre avaliações dos críticos e bilheteria",
subtitle = "Bilheterias acima de 30 milhões de dólares"
)A relação aqui é bem parecida com a da audiência, mas mais fraca (em torno de 0.4). O que dissemos ainda vale para esse caso, mas em menor grau.
Agrupando os filmes
Agora trataremos do nosso grande objetivo. Agrupar os filmes mais semelhantes em termos das avaliações dos críticos e das bilheterias!
Para essa análise, deixaremos a animosidade de lado, e iremos usar um algoritmo para fazer o agrupamento automático, chamado de K-means. O que precisamos saber dele, é que indentifica grupos que concentram pontos mais semelhantes entre si do que outros.
Mas para usá-lo precisamos decidir o número de grupos que estamos a procura. E o número que escolhemos foi 6, o qual é indicado por uma estratégia que analisa quantidades de grupos e uma razão de duas medidas que iremos omitir por brevidade (betweeness e total sum of squares). Essa técnica usa um gráfico, e sabemos o valor ideal de grupos quando os valores da razão estacionam em torno de 1. Se tiver interesse, o gráfico está no fim do post.
set.seed(123)
alt <- filmography %>%
mutate(log_box_office_scaled = as.vector(scale(log10(box_office))),
rating_scaled = as.vector(scale(rating)))
# O agrupamento de fato:
km = alt %>%
select(rating_scaled, log_box_office_scaled) %>%
kmeans(centers = 6, nstart = 50)
agrupado = km %>%
augment(alt)
levels(agrupado$.cluster) <- list("Medíocres" = "4",
"Sucessos" = "2",
"Melhores que o esperado" = "3",
"Obras primas de bilheteria" = "1",
"No meio do caminho" = "6",
"Fracassos (?)" = "5")
agrupado <- agrupado %>%
rename("Categoria" = .cluster)
agrupado %>%
group_by(Categoria) %>%
ggplot(aes(y = rating, x = box_office)) +
geom_mark_hull(aes(fill = Categoria), alpha=0.4, color="white", concavity = 3) +
geom_point(aes(color = Categoria), alpha=0.8, size=3) +
scale_x_log10() +
theme_tq() +
coord_cartesian(xlim=c(1, 600), ylim=c(1, 105)) +
labs(
x = "Bilheteria (milhões de dólares)",
y = "Avaliação dos críticos",
title = "Críticas versus Bilheteria | Filmes com participação de Tom Hanks",
subtitle = "Gráfico de pontos com agrupamentos"
)make.table <- function(df, filter_by) {
df %>%
filter(Categoria == filter_by) %>%
select(year, title, rating, box_office) %>%
rename(Ano = year, "Título" = title, "Avaliação dos críticos" = rating, Bilheteria = box_office) %>%
kable() %>%
kable_material(full_width = FALSE, position = "center")
}Medíocres
make.table(agrupado, "Medíocres")| Ano | Título | Avaliação dos críticos | Bilheteria |
|---|---|---|---|
| 2017 | The Circle | 15 | 20.5 |
| 2016 | Inferno | 23 | 34.3 |
| 1992 | Radio Flyer | 35 | 4.0 |
No meio do caminho
make.table(agrupado, "No meio do caminho")| Ano | Título | Avaliação dos críticos | Bilheteria |
|---|---|---|---|
| 2012 | Cloud Atlas | 66 | 27.1 |
| 2011 | Larry Crowne | 37 | 35.6 |
| 2011 | Extremely Loud & Incredibly Close | 45 | 31.8 |
| 2004 | The Terminal | 61 | 77.0 |
| 2004 | The Ladykillers | 54 | 39.7 |
| 1990 | Joe Versus the Volcano | 63 | 39.1 |
| 1989 | Turner & Hooch | 52 | 70.5 |
| 1989 | The ’Burbs | 53 | 34.1 |
| 1988 | Punchline | 56 | 20.3 |
| 1987 | Dragnet | 51 | 56.0 |
| 1986 | The Money Pit | 50 | 30.9 |
| 1986 | Nothing in Common | 54 | 32.0 |
| 1985 | Volunteers | 58 | 19.4 |
Melhores que o esperado
make.table(agrupado, "Melhores que o esperado")| Ano | Título | Avaliação dos críticos | Bilheteria |
|---|---|---|---|
| 2020 | News of the World | 88 | 12.7 |
| 2016 | A Hologram for the King | 70 | 4.2 |
| 1996 | The Celluloid Closet | 97 | 1.4 |
Sucessos
make.table(agrupado, "Sucessos")| Ano | Título | Avaliação dos críticos | Bilheteria |
|---|---|---|---|
| 2019 | A Beautiful Day in the Neighborhood | 95 | 61.7 |
| 2017 | The Post | 88 | 81.4 |
| 2016 | Sully | 85 | 125.0 |
| 2015 | Bridge of Spies | 90 | 72.3 |
| 2013 | Captain Phillips | 93 | 107.1 |
| 2013 | Saving Mr. Banks | 79 | 83.3 |
| 2007 | Charlie Wilson’s War | 82 | 66.6 |
| 2002 | Road to Perdition | 81 | 104.1 |
| 1999 | The Green Mile | 78 | 136.8 |
| 1998 | You’ve Got Mail | 70 | 115.7 |
| 1996 | That Thing You Do! | 93 | 25.9 |
| 1995 | Toy Story | 100 | 31.3 |
| 1993 | Philadelphia | 80 | 76.0 |
| 1993 | Sleepless in Seattle | 75 | 125.6 |
| 1992 | A League of Their Own | 79 | 105.1 |
| 1988 | Big | 97 | 113.5 |
Fracassos (?)
make.table(agrupado, "Fracassos (?)")| Ano | Título | Avaliação dos críticos | Bilheteria |
|---|---|---|---|
| 2009 | Angels & Demons | 37 | 133.4 |
| 2006 | The Da Vinci Code | 26 | 217.5 |
| 2004 | The Polar Express | 56 | 125.9 |
Obras primas de bilheteria
make.table(agrupado, "Obras primas de bilheteria")| Ano | Título | Avaliação dos críticos | Bilheteria |
|---|---|---|---|
| 2019 | Toy Story 4 | 97 | 434.0 |
| 2010 | Toy Story 3 | 98 | 415.0 |
| 2007 | The Simpsons Movie | 87 | 183.1 |
| 2002 | Catch Me if You Can | 96 | 164.4 |
| 2000 | Cast Away | 89 | 233.6 |
| 1999 | Toy Story 2 | 100 | 245.9 |
| 1995 | Apollo 13 | 96 | 173.8 |
| 1994 | Forrest Gump | 71 | 330.3 |
O algoritmo gerou esses agrupamentos e os nomeei baseado nas características pelas quais foram reunidos (bilheterias e críticas). Que seriam, do ponto de vista delas: medíocres, filmes que tiveram bilheterias e avaliação baixas; no meio do caminho, filmes que não são os melhores das avaliações nem de bilheteria; melhores que o esperado, filmes com baixa bilheteria e avaliações altas; sucessos, obras com altas avaliações e bilheteria; fracassos (?), filmes que curiosamente foram mal avaliados, mas foram sucessos de bilheteria e obras primas de bilheteria, os quais representam o alge de avaliação e bilheteria.
De ínicio, eu não esperava uma filmografia tão diversa, e no final das contas só conheço em torno de um quarto das obras dele. Por isso só posso falar dos sucessos, fracassos (?) e obras primas de bilheteria.
Dos sucessos, conheço “À espera de um milagre” (The green mile), “Sully - O Herói do Rio Hudson” (Sully) e “Toy Story – Um Mundo de Aventuras” (Toy Story). E merecidamente concordo que eles estejam nessa categoria, até podendo estar entre as obras primas, já que todos têm elementos fascinantes e inspiradores.
Enquanto Sully - O Herói do Rio Hudson trata de um piloto de avião, que após um acidente aéreo tem de provar sua inocência, mesmo tendo salvo a vida de todos os seus passageiros, ao pousar de forma arriscada no Rio Hudson (sendo questionado sob a validade de sua ação), À espera de um milagre trata de um preso acusado de assassinar brutalmente duas meninas, mas que na verdade poderia ser a própria reencarnação de Jesus Cristo (Hanks contracena com esse ator), e Toy Story que nos ensina que tudo na vida é passageiro (Hanks empresta sua voz para Woody).
Já nos fracassos (?), conheço “O Código da Vinci”, o qual foi um sucesso de bilheteria e um fracasso de crítica. Nele temos o conflito entre facções (Opus Dei e Principado) sob a possibilidade de Jesus Cristo ter tido um filho com Maria Madalena, emaranhado com uma série de quebra-cabeças e mortes violentas (Hanks sendo uma espécie de intelectual em assuntos cristãos e criptografias antigas). Em certa medida eu entendo as avaliações negativas depois de ter assistido, mas isso não me impede de mesmo assim ter gostado do filme de início ao fim (por achar interessante os assuntos tratados). Curiosamente, o Opus Dei realmente existe.
Por fim, conheço várias das obras primas, mas vou me limitar a “Forrest Gump - O Contador de Histórias”. Esse é um filme que gostei bastante, nele Hanks interpreta um homem bem simples (inocente, infantil e com QI supostamente baixo), que apesar da sua personalidade, comicamente, a partir de sua atitude positiva e direta acaba fazendo parte de vários eventos históricos importantíssimos nos EUA. Essa com certeza mereceu estar nesse grupo, como também “Me pegue se puder”, “Náufrago” e “Apollo 13”.
Por hoje é só pessoal, até a próxima!
Extra
# Trying to decide K
explorando_k = tibble(k = 1:15) %>%
mutate(agrupamento = map(k, ~ kmeans(
select(alt, rating_scaled, log_box_office_scaled),
centers = .
) %>% glance())) %>%
unnest(agrupamento)
explorando_k %>%
ggplot(aes(x = k, y = betweenss / totss)) +
geom_line(color = "dodgerblue") +
geom_point(color = "dodgerblue") +
geom_vline(xintercept = 6, color = "orange", size = 1) +
geom_label(x = 6, y = 0.5, label = "6", size = 7, fill = "orange", color = "white") +
labs(
x = "K - número de grupos",
title
)Escolhemos 6, por nem ser um valor muito alto (que iria dificultar a categorização), e a razão apresentada no gráfico está bem próxima de 1 (cerca de 0.8).