Este é o trabalho final solicitado no curso de R que eu fiz no mês de Agosto de 2021. Eu me inscrevi para concorrer a uma bolsa de diversidade para o curso R para Ciência de Dados II e fui contemplada. Acessem mais informações do curso neste link: https://curso-r.com/cursos/r4ds-2/ .
library(readr)
library(dplyr)##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
library(purrr)
library(stringr)
library(lubridate)##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(ggplot2)remotes::install_github("curso-r/basesCursoR")## Skipping install of 'basesCursoR' from a github remote, the SHA1 (65685a4e) has not changed since last install.
## Use `force = TRUE` to force installation
imdb <- basesCursoR::pegar_base("imdb_completa")
imdb_pessoas <- basesCursoR::pegar_base("imdb_pessoas")
imdb_avaliacoes <- basesCursoR::pegar_base("imdb_avaliacoes")imdb2 = imdb # Substituindo todos os NAS por " " nas colunas de texto
imdb2 <- imdb2 %>%
mutate(
across(
.cols = where(is.character),
.fns = tidyr::replace_na,
replace = ""
)
)
# Substituindo todos os NAS por zero nas colunas numéricas
imdb2 <- imdb2 %>%
mutate(
across(
.cols = where(is.numeric),
.fns = tidyr::replace_na,
replace = 0
)
)class(imdb2$data_lancamento)## [1] "character"
imdb2 = imdb2 %>% mutate(nova_data_lancamento = as.Date(imdb2$data_lancamento))imdb2 = imdb2 %>% mutate(
ano2 = year(nova_data_lancamento),
mes = month(nova_data_lancamento, label = TRUE, abbr = FALSE),
dia = day(nova_data_lancamento))# Substituindo todos os NAS por " " nas colunas de texto
imdb2 <- imdb2 %>%
mutate(
across(
.cols = where(is.character),
.fns = tidyr::replace_na,
replace = ""
)
)
# Substituindo todos os NAS por zero nas colunas numéricas
imdb2 <- imdb2 %>%
mutate(
across(
.cols = where(is.numeric),
.fns = tidyr::replace_na,
replace = 0
)
)total_data = arrange(imdb2 %>% count(nova_data_lancamento, name = "total"), desc(total))
print(total_data)## # A tibble: 21,907 x 2
## nova_data_lancamento total
## <date> <int>
## 1 NA 4563
## 2 2018-10-26 49
## 3 2017-09-01 44
## 4 2011-04-01 40
## 5 2018-10-12 40
## 6 2019-11-01 39
## 7 2019-12-06 39
## 8 2017-09-29 38
## 9 2020-02-14 38
## 10 2019-03-01 37
## # ... with 21,897 more rows
# removendo os NAS
total_data = total_data[-1,]
print(total_data)## # A tibble: 21,906 x 2
## nova_data_lancamento total
## <date> <int>
## 1 2018-10-26 49
## 2 2017-09-01 44
## 3 2011-04-01 40
## 4 2018-10-12 40
## 5 2019-11-01 39
## 6 2019-12-06 39
## 7 2017-09-29 38
## 8 2020-02-14 38
## 9 2019-03-01 37
## 10 2019-09-13 37
## # ... with 21,896 more rows
top_data = data.frame(top_n(total_data, 5))## Selecting by total
colnames(top_data) = c("Data", "Total")
print(top_data)## Data Total
## 1 2018-10-26 49
## 2 2017-09-01 44
## 3 2011-04-01 40
## 4 2018-10-12 40
## 5 2019-11-01 39
## 6 2019-12-06 39
# removendo os NAS
top_data = top_data[-1,]
print(top_data)## Data Total
## 2 2017-09-01 44
## 3 2011-04-01 40
## 4 2018-10-12 40
## 5 2019-11-01 39
## 6 2019-12-06 39
data_max = total_data[which.max(total_data$total),]
print(data_max)## # A tibble: 1 x 2
## nova_data_lancamento total
## <date> <int>
## 1 2018-10-26 49
data_min = total_data[which.min(total_data$total),]
print(data_min)## # A tibble: 1 x 2
## nova_data_lancamento total
## <date> <int>
## 1 1894-10-09 1
total_mes = arrange(imdb2 %>% count(mes, name = "total"), desc(total))
print(total_mes)## # A tibble: 13 x 2
## mes total
## <ord> <int>
## 1 outubro 8734
## 2 setembro 7924
## 3 março 7435
## 4 novembro 7094
## 5 abril 7078
## 6 dezembro 6618
## 7 fevereiro 6441
## 8 agosto 6399
## 9 janeiro 6361
## 10 maio 6173
## 11 junho 5800
## 12 julho 5235
## 13 <NA> 4563
# removendo os NAs
total_mes = total_mes[-13,]
print(total_mes)## # A tibble: 12 x 2
## mes total
## <ord> <int>
## 1 outubro 8734
## 2 setembro 7924
## 3 março 7435
## 4 novembro 7094
## 5 abril 7078
## 6 dezembro 6618
## 7 fevereiro 6441
## 8 agosto 6399
## 9 janeiro 6361
## 10 maio 6173
## 11 junho 5800
## 12 julho 5235
meu_tema <- function() {
theme(axis.title.y = element_text(color="#005eff", size=14, face=4)) +
theme(axis.title.x = element_text(color="#005eff", size=14, face=4)) +
theme(axis.text = element_text(angle = 45, color="#005eff", size=10, face=4))
}
grafico_dispersao <- function(tab, colx, coly) {
tab %>%
ggplot(aes(x = {{colx}}, y = {{coly}}, color={{coly}})) +
geom_point(size=3, color="#005eff") +
meu_tema()
}
grafico_dispersao(total_mes, colx = mes, coly = total)top_mes = data.frame(top_n(total_mes, 5))## Selecting by total
colnames(top_mes) = c("Mês", "Total")
print(top_mes)## Mês Total
## 1 outubro 8734
## 2 setembro 7924
## 3 março 7435
## 4 novembro 7094
## 5 abril 7078
mes_max = total_mes[which.max(total_mes$total),]
print(mes_max)## # A tibble: 1 x 2
## mes total
## <ord> <int>
## 1 outubro 8734
mes_min = total_mes[which.min(total_mes$total),]
print(mes_min)## # A tibble: 1 x 2
## mes total
## <ord> <int>
## 1 julho 5235
total_dia = arrange(imdb2 %>% count(dia, name = "total"), desc(total))
print(total_dia)## # A tibble: 32 x 2
## dia total
## <dbl> <int>
## 1 1 7260
## 2 0 4563
## 3 15 2831
## 4 14 2728
## 5 25 2727
## 6 21 2647
## 7 10 2626
## 8 20 2611
## 9 12 2600
## 10 28 2574
## # ... with 22 more rows
#removendo NAS
total_dia = total_dia[-2,]
print(total_dia)## # A tibble: 31 x 2
## dia total
## <dbl> <int>
## 1 1 7260
## 2 15 2831
## 3 14 2728
## 4 25 2727
## 5 21 2647
## 6 10 2626
## 7 20 2611
## 8 12 2600
## 9 28 2574
## 10 7 2555
## # ... with 21 more rows
grafico_dispersao(total_dia, colx = dia, coly = total)top_dia = data.frame(top_n(total_dia, 5))## Selecting by total
colnames(top_dia) = c("Dia", "Total")
print(top_dia)## Dia Total
## 1 1 7260
## 2 15 2831
## 3 14 2728
## 4 25 2727
## 5 21 2647
dia_max = total_dia[which.max(total_dia$total),]
print(dia_max)## # A tibble: 1 x 2
## dia total
## <dbl> <int>
## 1 1 7260
dia_min = total_dia[which.min(total_mes$total),]
print(dia_min)## # A tibble: 1 x 2
## dia total
## <dbl> <int>
## 1 23 2523
total_ano = arrange(imdb2 %>% count(ano2, name = "total"), desc(total))
print(total_ano)## # A tibble: 114 x 2
## ano2 total
## <dbl> <int>
## 1 0 4563
## 2 2018 3281
## 3 2017 3276
## 4 2019 3108
## 5 2016 3066
## 6 2015 2907
## 7 2014 2848
## 8 2013 2726
## 9 2012 2419
## 10 2011 2331
## # ... with 104 more rows
# removendo NAS
total_ano = total_ano[-1,]
print(total_ano)## # A tibble: 113 x 2
## ano2 total
## <dbl> <int>
## 1 2018 3281
## 2 2017 3276
## 3 2019 3108
## 4 2016 3066
## 5 2015 2907
## 6 2014 2848
## 7 2013 2726
## 8 2012 2419
## 9 2011 2331
## 10 2009 2156
## # ... with 103 more rows
grafico_dispersao(total_ano, colx = ano2, coly = total)ano_max = total_ano[which.max(total_ano$total),]
print(ano_max)## # A tibble: 1 x 2
## ano2 total
## <dbl> <int>
## 1 2018 3281
ano_min = total_dia[which.min(total_mes$total),]
print(ano_min)## # A tibble: 1 x 2
## dia total
## <dbl> <int>
## 1 23 2523
top_ano = data.frame(top_n(total_ano, 5))## Selecting by total
colnames(top_ano) = c("Ano", "Total")
print(top_ano)## Ano Total
## 1 2018 3281
## 2 2017 3276
## 3 2019 3108
## 4 2016 3066
## 5 2015 2907
imdb_paises <-
imdb2 %>%
mutate(paises_separados = str_split(pais, "\\,")) %>%
unnest(cols = paises_separados)total_pais = arrange(imdb_paises %>% count(paises_separados, name = "total"), desc(total))
print(total_pais)## # A tibble: 345 x 2
## paises_separados total
## <chr> <int>
## 1 "USA" 30910
## 2 "India" 6189
## 3 "UK" 5889
## 4 "France" 5202
## 5 "Italy" 3785
## 6 " USA" 3415
## 7 "Japan" 3275
## 8 " France" 3109
## 9 "Canada" 2508
## 10 "Germany" 2039
## # ... with 335 more rows
top_paises = data.frame(top_n(total_pais, 5))## Selecting by total
colnames(top_paises) = c("Países", "Total")
print(top_paises)## Países Total
## 1 USA 30910
## 2 India 6189
## 3 UK 5889
## 4 France 5202
## 5 Italy 3785
# Primeiro verificando para cada coluna individualmente
# A coluna ORCAMENTO tem ______ moedas diferentes:
moedas_orcamento <-
imdb2 %>% distinct(str_remove(orcamento, pattern="[:digit:]+"))
names(moedas_orcamento) = "orcamento"
nrow(moedas_orcamento)## [1] 80
print(moedas_orcamento)## # A tibble: 80 x 1
## orcamento
## <chr>
## 1 ""
## 2 "$ "
## 3 "ITL "
## 4 "ROL "
## 5 "SEK "
## 6 "FRF "
## 7 "NOK "
## 8 "GBP "
## 9 "DEM "
## 10 "PTE "
## # ... with 70 more rows
# A coluna RECEITA tem ______ moedas diferentes:
moedas_receita <-
imdb2 %>% distinct(str_remove(receita, pattern="[:digit:]+"))
names(moedas_receita) = "receita"
nrow(moedas_receita)## [1] 6
print(moedas_receita)## # A tibble: 6 x 1
## receita
## <chr>
## 1 ""
## 2 "$ "
## 3 "GBP "
## 4 "INR "
## 5 "NPR "
## 6 "PKR "
# Agora considerando as duas colunas ao mesmo tempo
moedas_re_or <-
imdb2 %>%
mutate(
across(
.cols = c(orcamento, receita),
.fns = str_remove, pattern = "[:digit:]+"))
moedas_re_or = distinct(moedas_re_or, across(c(orcamento, receita)
)
)
nrow(moedas_re_or)## [1] 141
print(moedas_re_or)## # A tibble: 141 x 2
## orcamento receita
## <chr> <chr>
## 1 "" ""
## 2 "$ " ""
## 3 "ITL " ""
## 4 "ROL " ""
## 5 "" "$ "
## 6 "SEK " ""
## 7 "$ " "$ "
## 8 "FRF " ""
## 9 "NOK " "$ "
## 10 "GBP " "$ "
## # ... with 131 more rows
imdb_generos <-
imdb2 %>%
mutate(generos_separados = str_split(genero, "\\,")) %>%
unnest(cols = generos_separados)
nrow(imdb_generos)## [1] 175867
# Substituindo todos os NAS por " " nas colunas de texto
imdb_generos <-
imdb_generos %>%
mutate(
across(
.cols = where(is.character),
.fns = tidyr::replace_na,
replace = ""
)
)
# Substituindo todos os NAS por zero nas colunas numéricas
imdb_generos <-
imdb_generos %>%
mutate(
across(
.cols = where(is.numeric),
.fns = tidyr::replace_na,
replace = 0
)
)imdb_generos <-
imdb_generos %>%
mutate(generos_separados = str_remove(imdb_generos$generos_separados, pattern="\\s"))imdb_generos = imdb_generos %>%
filter(str_detect(orcamento, "\\$")&str_detect(receita, "\\$")) %>%
mutate_at(vars(orcamento, receita), parse_number) %>%
mutate(lucro_dolar = receita - orcamento)
resultado = imdb_generos %>%
group_by(generos_separados) %>%
summarise(lucro_medio = mean(receita - orcamento, na.rm = TRUE))resultado2 = imdb_generos %>%
group_by(generos_separados) %>%
summarise(nota_media = mean(nota_imdb, na.rm = TRUE)) %>%
slice_max(nota_media)
nrow(resultado2)## [1] 1
print(resultado2)## # A tibble: 1 x 2
## generos_separados nota_media
## <chr> <dbl>
## 1 Film-Noir 7.85
total_generos = arrange(imdb_generos %>% count(generos_separados, name = "total"), desc(total))
top_generos = data.frame(top_n(total_generos, 5))## Selecting by total
colnames(top_generos) = c("Gêneros", "Total")
print(top_generos)## Gêneros Total
## 1 Drama 4856
## 2 Comedy 3376
## 3 Action 2148
## 4 Crime 1667
## 5 Romance 1541
result = filter(imdb2, imdb2$titulo_original == "Rocky")
meu_filme = result[1,]
print(meu_filme)## # A tibble: 1 x 25
## id_filme titulo titulo_original ano data_lancamento genero duracao pais
## <chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr>
## 1 tt0075148 Rocky Rocky 1976 1977-03-25 Drama, S~ 120 USA
## # ... with 17 more variables: idioma <chr>, orcamento <chr>, receita <chr>,
## # receita_eua <chr>, nota_imdb <dbl>, num_avaliacoes <dbl>, direcao <chr>,
## # roteiro <chr>, producao <chr>, elenco <chr>, descricao <chr>,
## # num_criticas_publico <dbl>, num_criticas_critica <dbl>,
## # nova_data_lancamento <date>, ano2 <dbl>, mes <ord>, dia <dbl>
diretores = c(result$direcao)
print(diretores)## [1] "John G. Avildsen" "Sunil Dutt" "Suresh Krishna"
diretor1 = filter(imdb_pessoas, imdb_pessoas$nome == diretores[1])
diretor1$data_nascimento## [1] "1935-12-21"
diretor1$data_falecimento## [1] "2017-06-16"
diretor1$local_nascimento## [1] "Oak Park, Illinois, USA"
# se estivesse vivo teria
elapsed.time <- diretor1$data_nascimento %--% today()
as.duration(elapsed.time)## [1] "2704665600s (~85.71 years)"
diretor2 = filter(imdb_pessoas, imdb_pessoas$nome == diretores[2])
diretor2$data_nascimento## [1] "1930-06-06"
diretor2$data_falecimento## [1] "2005-05-25"
diretor2$local_nascimento## [1] "Jhelum, Punjab, British India"
# se estivesse vivo teria
elapsed.time <- diretor1$data_nascimento %--% today()
as.duration(elapsed.time)## [1] "2704665600s (~85.71 years)"
diretor3 = filter(imdb_pessoas, imdb_pessoas$nome == diretores[3])
diretor3$data_nascimento## [1] NA NA
diretor3$data_falecimento## [1] NA NA
diretor3$local_nascimento## [1] NA NA
# se estivesse vivo teria
elapsed.time <- diretor1$data_nascimento %--% today()
as.duration(elapsed.time)## [1] "2704665600s (~85.71 years)"
imdb2 <-
imdb_generos %>%
mutate(diretores_separados = str_split(direcao, "\\,")) %>%
unnest(cols = diretores_separados)total_por_diretores = arrange(imdb2 %>% count(direcao, name = "total"), desc(total))total_diretor_1 = filter(total_por_diretores, total_por_diretores$direcao==diretores[1])
total_diretor_2 = filter(total_por_diretores, total_por_diretores$direcao==diretores[2])
total_diretor_3 = filter(total_por_diretores, total_por_diretores$direcao==diretores[3])# Lucro médio dos filmes dirigidos considerando apenas valores em dólar:
imdb2 %>% filter(diretores_separados == diretor1$nome) %>%
group_by(titulo) %>% summarise(lucro_medio = mean(lucro_dolar, na.rm = TRUE))## # A tibble: 7 x 2
## titulo lucro_medio
## <chr> <dbl>
## 1 Conta su di me 21906454
## 2 La formula -4305711
## 3 La guerra del cittadino Joe 19213254
## 4 Otto secondi di gloria 12623396
## 5 Rocky 116275147
## 6 Rocky V 77946358
## 7 The Karate Kid - Per vincere domani 83119319
imdb2 %>% filter(diretores_separados == diretor2$nome) %>%
group_by(titulo) %>% summarise(lucro_medio = mean(lucro_dolar, na.rm = TRUE))## # A tibble: 0 x 2
## # ... with 2 variables: titulo <chr>, lucro_medio <dbl>
imdb2 %>% filter(diretores_separados == diretor3$nome) %>%
group_by(titulo) %>% summarise(lucro_medio = mean(lucro_dolar, na.rm = TRUE))## # A tibble: 0 x 2
## # ... with 2 variables: titulo <chr>, lucro_medio <dbl>
# por algum motivo a ordenação não estava funcionando corretamente
# então primeiro eu retirei todos os espaços vazios
# depois converti para numerico, ai funcionou
imdb2 <-
imdb2 %>%
mutate(nota_imdb = str_remove(imdb2$nota_imdb, pattern="[\\s]+")) %>%
mutate_at(vars(nota_imdb), parse_number)
# ordenado pela nota do filme
imdb2 <- imdb2[order(imdb2$nota_imdb, decreasing = TRUE),]
# criando uma nova coluna com a posição de cada filme
# de acordo com a nota
imdb2 <- imdb2 %>% mutate(posicao = seq(1, nrow(imdb2), by = 1))
# pegando a posição
result2 = filter(imdb2, imdb2$titulo_original == "Rocky")
result2$posicao## [1] 432 433
res <- imdb2 %>% arrange(imdb2$lucro_dolar) %>%
mutate(rank_lucro = seq(1, nrow(imdb2), by = 1)) %>%
filter(meu_filme$titulo == imdb2$titulo)
res$rank_lucro## [1] 432 433
meu_filme$data_lancamento## [1] "1977-03-25"
wday(ymd(meu_filme$data_lancamento), label = TRUE, abbr = FALSE)## [1] sexta-feira
## 7 Levels: domingo < segunda-feira < terça-feira < ... < sábado
imdb2 %>% filter(data_lancamento == meu_filme$data_lancamento)## # A tibble: 2 x 29
## id_filme titulo titulo_original ano data_lancamento genero duracao pais
## <chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr>
## 1 tt0075148 Rocky Rocky 1976 1977-03-25 Drama, S~ 120 USA
## 2 tt0075148 Rocky Rocky 1976 1977-03-25 Drama, S~ 120 USA
## # ... with 21 more variables: idioma <chr>, orcamento <dbl>, receita <dbl>,
## # receita_eua <chr>, nota_imdb <dbl>, num_avaliacoes <dbl>, direcao <chr>,
## # roteiro <chr>, producao <chr>, elenco <chr>, descricao <chr>,
## # num_criticas_publico <dbl>, num_criticas_critica <dbl>,
## # nova_data_lancamento <date>, ano2 <dbl>, mes <ord>, dia <dbl>,
## # generos_separados <chr>, lucro_dolar <dbl>, diretores_separados <chr>,
## # posicao <dbl>
if(as.numeric(meu_filme$ano2)<=1980){
cat("eu ainda não era nascida")
} else{
# exemplo
as.duration(as.Date("1980-09-20") %--% as.Date(imdb2$data_lancamento[1]))
}## eu ainda não era nascida
avaliacoes = imdb_avaliacoes %>% filter(imdb_avaliacoes$id_filme == meu_filme$id_filme)
idade = c(colnames(avaliacoes))
avaliacoes = t(avaliacoes)
notas = c(0)
a = cbind(avaliacoes, data.frame(idade, notas))
a = a %>% filter(str_detect(idade, "nota_media_idade_"))
a$idade = c("0-18", "18-30", "30-45", "45+")
a = data.frame(a[,-3])
b = density(as.numeric(a$avaliacoes))
plot(b)a %>%
ggplot(aes(x=as.numeric(avaliacoes))) +
geom_density(fill="#005eff", color="#e9ecef", alpha=0.6) +
ggtitle("Avaliações por idade") +
meu_tema()