A quantidade de dias que os filmes passam em cartaz nos cinemas depedndo do gênero do filme?
library(readr)
FilmData <- read_csv("FilmData.csv")
filmes_df <- FilmData
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
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.
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 (%)
|
filmes_df %>%
dplyr::group_by(Genre) %>%
get_summary_stats(Days, type = "mean_sd")
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()
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.
As observações são independentes, uma vez que cada filme só estará enquadrado em um único gênero.
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.
Há duas maneiras de checar normalidade:
Analizando os resíduos da ANOVA.
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.
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.
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.