IMDb (Internet Movie Data Base) é uma base de dados disponível online que compila informações sobre cinema, TV, música e jogos.
Para realizar as análises do banco de dados IMDB e responder as perguntas do relatório, a primeira coisa a se fazer foi baixar as bases através do pacote basesCursoR.
imdb <- basesCursoR::pegar_base("imdb_completa")
imdb_pessoas <- basesCursoR::pegar_base("imdb_pessoas")
imdb_avaliacoes <- basesCursoR::pegar_base("imdb_avaliacoes")
Com as bases já baixadas no environment, carreguei os pacotes que irei utilizar nas análises. O pacote tidyverse será utilizado para manipulação geral dos dados, o lubridate para trabalhar com datas e o reactable para geração de tabelas.
library(tidyverse)
library(lubridate)
library(reactable)
O mês do ano com maior número de filmes foi o mês de outubro, com 8734 filmes. Já o dia do ano com maior número de filmes foi o dia 1, com 7260 filmes.
imdb |> filter(!is.na(data_lancamento)) |>
mutate(data = as_date(data_lancamento),
year = lubridate::year(data),
month = lubridate::month(data),
day = lubridate::day(data)) |> count(month) |>
arrange(desc(n)) |> head(5) |>
reactable(columns = list(
month = colDef(name = "Mês do Ano"),
n = colDef(name = "Número de Filmes")))
imdb |> filter(!is.na(data_lancamento)) |>
mutate(data = as_date(data_lancamento),
year = lubridate::year(data),
month = lubridate::month(data),
day = lubridate::day(data)) |> count(day) |>
arrange(desc(n)) |> head(5) |> drop_na() |>
reactable(columns = list(
day = colDef(name = "Dia do Mês"),
n = colDef(name = "Número de Filmes")))
O top 5 países com mais filmes na base foram: USA, França, Reino Unido, India e Itália.
imdb |> separate_rows(pais, sep=", ") |>
group_by(pais) |> summarise(n = n()) |> arrange(desc(n)) |> head(5) |>
reactable(columns = list(
pais = colDef(name = "País"),
n = colDef(name = "Número de Filmes")))
orcamento
e receita
da base
imdb_completa
.Apareceram 62 tipos diferentes de moedas nas colunas orçamento e receita. Elas estão listadas abaixo.
imdb |> drop_na(orcamento, receita) |> select(orcamento, receita) |>
mutate(orcamento = str_replace(orcamento, "\\s.*$", ""),
receita = str_replace(orcamento, "\\s.*$", "")) |> unique() |>
reactable(columns = list(
orcamento = colDef(name = "Moedas que aparecem em Orçamento"),
receita = colDef(name = "Moedas que aparecem em Receita")))
Como eu preciso calcular o lucro algumas vezes, resolvi criar uma função para realizar essa análise. A função está descrita a seguir:
calcular_lucro <- function(db) {
db |> drop_na(orcamento | receita) |>
separate(receita, into = c("moeda_receita", "receita"), sep = " ") |>
separate(orcamento, into = c("moeda_orcamento", "orcamento"), sep = " ") |>
filter(moeda_receita == "$", moeda_orcamento == "$") |>
mutate(across(c("receita", "orcamento"), as.numeric),
lucro = receita - orcamento)
}
lucro_nota_media_genero <- calcular_lucro(imdb) |>
separate_rows(genero, sep=", ") |>
group_by(genero) |> summarise(lucro = sum(lucro),
nota_media = mean(nota_imdb))
Considerando receitas e orçamentos em dólar, o gênero que apresentou o maior lucro foi o gênero aventura, enquanto o que apresentou maior nota média foi o film-noir, com a nota de 7.85.
lucro_nota_media_genero |> arrange(desc(lucro)) |> head(5) |>
mutate(lucro = scales::dollar(lucro)) |> select(genero, lucro) |>
reactable(columns = list(genero = colDef(name = "Gênero do Filme"),
lucro = colDef(name = "Lucro Obtido")))
lucro_nota_media_genero |> arrange(desc(nota_media)) |> head(5) |> select(genero, nota_media) |> mutate(nota_media = round(nota_media, digits = 2)) |> reactable(columns = list(
genero = colDef(name = "Gênero do Filme"),
nota_media = colDef(name = "Nota Média IMDB")))
imdb_completa
, escolha o
seu favorito. Então faça os itens a seguir:O filme favorito escolhido foi Alice in Wonderland
,
dirigido por Tim Burton
.
imdb_pessoas
).O filme foi dirigido por Tim Burton, ele nasceu em Burbank na Califórnia, mede 1,80m e nasceu no ano de 1958, tendo na data atual, 63 anos.
imdb_pessoas |> mutate(data_nascimento = as_date(data_nascimento),
idade = trunc((data_nascimento %--% Sys.Date()) / years(1))) |>
filter(nome == "Tim Burton") |> select(nome, altura, data_nascimento, idade, local_nascimento)|>
reactable(columns = list(
nome = colDef(name = "Nome"),
altura = colDef(name = "Altura"),
data_nascimento = colDef(name = "Data de Nascimento"),
idade = colDef(name = "Idade"),
local_nascimento= colDef(name = "Local de Nascimento")))
O Tim Burton possui 19 filmes como diretor. O nome dos filmes e a data de lançamento segue abaixo.
tim_burtom_imdb <- imdb |> separate_rows(direcao, sep=", ") |>
filter(direcao == "Tim Burton")
tim_burtom_imdb |> select(titulo_original, direcao, data_lancamento) |> arrange(desc(data_lancamento)) |> reactable(columns = list(
titulo_original = colDef(name = "Título do Filme"),
direcao = colDef(name = "Diretor"),
data_lancamento = colDef(name = "Data de Lançamento")))
Com relação ao lucro médio dos filmes que ele dirigiu, o valor é $159,126,502.
lucro_tim_burton <- tim_burtom_imdb |> calcular_lucro()
lucro_tim_burton$lucro |> mean() |> scales::dollar()
## [1] "$159,126,502"
O fime Alice in Wonderland
está na posição 29 do ranking
de notas do IMDB e na posição 51 do ranking de lucro considerando apenas
valores em dólares.
imdb |> calcular_lucro() |> filter(moeda_orcamento == "$", moeda_receita == "$") |> mutate(ranking_nota = dense_rank(desc(nota_imdb)),
ranking_lucro = dense_rank(desc(lucro))) |>
filter(titulo == "Alice in Wonderland", direcao == "Tim Burton") |>
select(titulo, direcao, ranking_nota, ranking_lucro) |>
reactable(columns = list(
titulo = colDef(name = "Título"),
direcao = colDef(name = "Diretor"),
ranking_nota = colDef(name = "Ranking Nota"),
ranking_lucro = colDef(name = "Ranking Lucro")))
O filme escolhido foi lançado no dia 03-03-2010, numa quarta-feira. Junto dele, foram lançados outros 4 filmes, que estão listados abaixo. Nessa data eu tinha 16 anos.
imdb |> filter(titulo == "Alice in Wonderland", direcao == "Tim Burton") |>
select(titulo, data_lancamento) |> mutate(dia_semana = weekdays(as_date(data_lancamento))) |>
reactable(columns = list(
titulo = colDef(name = "Título"),
data_lancamento = colDef(name = "Data de Lançamento"),
dia_semana = colDef(name = "Dia da Semana")))
imdb |> filter(data_lancamento == "2010-03-03") |>
filter(titulo_original != "Alice in Wonderland") |>
select(titulo_original, direcao, data_lancamento) |>
reactable(columns = list(
titulo_original = colDef(name = "Título do Filme"),
direcao = colDef(name = "Direção"),
data_lancamento = colDef(name = "Data de Lançamento")))
data_lancamento_alice <- as_date("2010-03-03")
minha_data_nascimento <- as_date("1993-11-12")
interval(minha_data_nascimento, data_lancamento_alice) |> as.period() |> year()
## [1] 16
imdb_avaliacoes
).É possível observar que as notas não variaram muito conforme a idade, se mantendo entre 6.4 e 6.7. A maior nota foi obtida pelo voto das idades de 0-18 anos enquanto a menor foi de pessoas de 30-45 anos.
imdb_avaliacoes |> filter(id_filme == "tt1014759") |>
select(contains("nota_media_idade")) |>
pivot_longer(everything(),
names_to = "nome",
values_to = c("nota")) |> mutate(across(nome, str_remove_all, pattern = ".*\\idade_")) |> ggplot(aes(x = nome, y = nota, fill = nome, label = nota)) + geom_col(show.legend = FALSE) + labs(x = "Idade", y = "Nota Média") + scale_fill_brewer(palette = "Accent") + theme_light() + ylim(0,10) + geom_text(size = 6)