logo

1 Pergunta a ser respondida

A quantidade de dias que os filmes passam em cartaz nos cinemas depedndo do gênero do filme?

2 Carregando a base de dados

library(readr)
FilmData <- read_csv("FilmData.csv")

filmes_df <- FilmData

3 Pacotes necessários

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ dplyr   1.0.7
## ✓ tibble  3.1.2     ✓ stringr 1.4.0
## ✓ tidyr   1.1.3     ✓ forcats 0.5.1
## ✓ purrr   0.3.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggpubr)
library(rstatix)
## 
## Attaching package: 'rstatix'
## The following object is masked from 'package:stats':
## 
##     filter

4 Algumas informações sobre a base de dados

library(tidyverse)
glimpse(filmes_df)
## Rows: 151
## Columns: 15
## $ Rank      <dbl> 1, 2, 4, 8, 9, 13, 15, 16, 17, 18, 20, 22, 23, 27, 28, 29, 3…
## $ Film      <chr> "Avatar", "Titanic", "Harry Potter and the Deathly Hallows P…
## $ Studio    <chr> "Fox", "Par.", "WB", "Sony", "WB", "Fox", "WB", "WB", "WB", …
## $ Genre     <chr> "Action/Adventure", "Drama", "Action/Adventure", "Action/Adv…
## $ Year      <dbl> 2009, 1997, 2011, 2012, 2012, 1999, 2012, 2008, 2001, 1993, …
## $ Gross     <dbl> 2782300000, 2185400000, 1341500000, 1108600000, 1084400000, …
## $ Gross.Dom <dbl> 760500000, 658700000, 381000000, 304400000, 448100000, 47450…
## $ Pct.Dom   <dbl> 0.273, 0.301, 0.284, 0.275, 0.413, 0.462, 0.298, 0.532, 0.32…
## $ Gross.Ovr <dbl> 2021800000, 1526700000, 960500000, 804200000, 636300000, 552…
## $ Pct.Ovr   <dbl> 0.727, 0.699, 0.716, 0.725, 0.587, 0.538, 0.702, 0.468, 0.67…
## $ Rotten    <dbl> 83, 88, 96, 92, 87, 57, 65, 94, 80, 92, 78, 79, 84, 87, 63, …
## $ IMDB      <dbl> 8.0, 7.6, 8.1, 7.8, 8.6, 6.5, 8.1, 9.0, 7.3, 8.0, 7.6, 7.4, …
## $ Rating    <chr> "PG13", "PG13", "PG13", "PG13", "PG13", "PG", "PG13", "PG13"…
## $ Days      <dbl> 238, 219, 133, 122, 147, 261, 133, 231, 162, 147, 140, 156, …
## $ Budget    <dbl> 237.0, 200.0, 125.0, 200.0, 250.0, 115.0, 180.0, 185.0, 125.…

A base de dados tem 151 observações, com 15 variáveis.

5 Estatística descritiva

Temos uma visão geral dos dados ao fazer a descritiva:

library(gtsummary)
## #BlackLivesMatter
filmes_df %>% 
  dplyr::select(-Film) %>% 
  tbl_summary()
Characteristic N = 1511
Rank 126 (70, 184)
Studio
Fox 41 (27%)
Par. 24 (16%)
Sony 19 (13%)
Uni. 27 (18%)
WB 40 (26%)
Genre
Action/Adventure 111 (74%)
Animation 14 (9.3%)
Comedy 17 (11%)
Drama 9 (6.0%)
Year 2,005 (1,998, 2,009)
Gross 470,700,000 (378,950,000, 623,950,000)
Gross.Dom 196,600,000 (155,350,000, 257,050,000)
Pct.Dom 0.40 (0.33, 0.49)
Gross.Ovr 277,000,000 (208,700,000, 403,300,000)
Pct.Ovr 0.60 (0.51, 0.67)
Rotten 70 (52, 84)
IMDB 7.10 (6.40, 7.60)
Rating
PG 39 (26%)
PG13 94 (62%)
R 18 (12%)
Days 140 (115, 158)
Budget 110 (69, 150)
Unknown 1

1 Median (IQR); n (%)

6 Respondendo à pergunta: A quantidade de dias que os filmes passam em cartaz nos cinemas depende do gênero do filme?

6.1 Média e desvio-padrão por gênero

filmes_df %>% 
  dplyr::group_by(Genre) %>% 
  get_summary_stats(Days, type = "mean_sd")

6.2 Visualização

library(ggsci)
library(ggplot2)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
filmes_df %>% 
  ggplot(aes(x = Genre, y = Days, fill = Genre)) +
  geom_boxplot() +
  scale_fill_lancet() +
  theme_bw() 

6.3 Checando suposições

Como temos mais de dois grupos para comparar, o teste paramétrico a ser usado é ANOVA de uma via. Porém, necessitamos checar os seguintes pressupostos antes de executarmos o teste:

  • Independência das observações

  • Sem outliers significativos

  • Normalidade

  • Homogeneidade da variância

Caso estes pressupostos não sejam satisfeitos, necessitaremos usar o teste não paramétrico alternativo à ANOVA, o teste de Kruskal-Wallis.

6.3.1 Independência das observações

As observações são independentes, uma vez que cada filme só estará enquadrado em um único gênero.

6.3.2 Sem outliers significativos

class(filmes_df$Genre)
## [1] "character"
filmes_df$Genre <- factor(filmes_df$Genre)
filmes_df %>% 
  dplyr::group_by(Genre) %>% 
  identify_outliers(Days)

Não há outliers extremos.

6.3.3 Normalidade

Há duas maneiras de checar normalidade:

  1. Analizando os resíduos da ANOVA.

  2. Checando a normalidade para cada grupo separadamente.

Vamos usar a primeira opção, uma vez que a segunda opção é utilizada quando temos apenas alguns grupos e muitos dados por grupo. Como vimos na tabela descritiva, temos apenas 9 observações para Drama, 14 para Animação e 17 para Comédia. Somente Ação/Aventura tem um número de observações mais alto, 111.

# Criando um modelo linear
model <- lm(Days ~ Genre, data = filmes_df)

# QQ plot
ggqqplot(residuals(model))

Alguns pontos à direita, do qq plot saem um pouco da área sombreada, que nos dá o intervalo de confiança. Vamos aplicar o teste de Shapiro-Wilk para normalidade.

shapiro_test(residuals(model))

O p-valor < 0.005 confirma nossa desconfiança ao olhar o qq plot, os pontos que saem muito da nossa área sombreada fazem com que os dados não sejam normalmente distribuídos. Mesmo assim, vamos também checar a normalidade por grupos:

filmes_df %>% 
  dplyr::group_by(Genre) %>% 
  shapiro_test(Days)
ggqqplot(filmes_df, "Days", facet.by = "Genre")

Vemos que somente os gêneros Animação e Comédia seguem a distribuição normal (p > 0.005). Assim, prosseguiremos com teste não paramétrico de Kruskall-Wallis.

Mesmo já tendo determinado que vamos usar um teste não paramétrico, vamos ver como funciona a análise de homogeneidade da variância.

6.3.4 Homogeneidade da variância

plot(model, 1)

O gráfico acima não mostra uma relação evidente entre os resíduos e os valores ajustados (a média de cada grupo), neste caso assumimos homogeneidade de variância.

Também é possível fazer o teste de Levene para checar a homegeneidade de variância:

filmes_df %>% 
  levene_test(Days ~ Genre)

p > 0.05, mostrando que o teste não é significativo. Isto significa que não há diferença significativa entre as variâncias. Mesmo esse pressuposto sendo satisfeito, como os outros não o foram, seguiramos para o teste de Kruskal-Wallis.

7 Teste de Kruskal-Wallis

res.kruskal <- filmes_df %>% 
  kruskal_test(Days ~ Genre)
res.kruskal

Como o p-valor é maior que 0.05 (p = 0.262), não há diferença estatística entre a média de dias que os filmes passam no cinema quando comparamos por gênero.

Calculando o tamanho do efeito (que mede a força da relação entre duas variáveis):

filmes_df %>% 
  kruskal_effsize(Days ~ Genre)

A magnitude do efeito é pequena, isto significa que a relação entre as duas variáveis não é forte. Este resultado está alinhado com o teste de Kruskal-Wallis.

Caso a diferença fosse estatisticamente significativa, teríamos mais um passo na análise, que seria a comparação dois a dois, para verificar que duplas de grupos possuem diferença entre si.