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).