library(ggplot2)
library(tidyverse)
library(readr)
Depois do lançamento da última temporada de Game of Thrones, surgiu a discussão na internet sobre séries que marcaram os telespectadores por seus finais decepcionantes. Tendo isso em vista, tivemos a curiosidade de descobrir se séries conforme o passar das temporadas decaem sua qualidade na opinião do público.
Para isso, tivemos acesso ao dataset do IMDB com os dados de 889 séries lançadas até o início de 2018 e obtivemos as seguintes variáveis:
data_series <- read.csv("series_from_imdb.csv", header = T, stringsAsFactors = F)
data_series %>% glimpse()
## Observations: 64,018
## Variables: 18
## $ series_name <chr> "Breaking Bad", "Breaking Bad", "Breaking Bad", "Bre…
## $ episode <chr> "Pilot", "Cat's in the Bag...", "...And the Bag's in…
## $ series_ep <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1…
## $ season <int> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2…
## $ season_ep <int> 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, …
## $ url <chr> "http://www.imdb.com/title/tt0959621/?ref_=ttep_ep1"…
## $ user_rating <dbl> 8.9, 8.7, 8.7, 8.2, 8.3, 9.2, 8.8, 8.7, 9.2, 8.3, 8.…
## $ user_votes <int> 18483, 12890, 12499, 12172, 11896, 13716, 12123, 107…
## $ r1 <dbl> 0.06432938, 0.03289372, 0.04088327, 0.07484390, 0.07…
## $ r2 <dbl> 0.001677217, 0.001396431, 0.002480198, 0.002546829, …
## $ r3 <dbl> 0.002055943, 0.002482545, 0.002160173, 0.002300361, …
## $ r4 <dbl> 0.002813396, 0.004344453, 0.003600288, 0.005093658, …
## $ r5 <dbl> 0.007304009, 0.011171451, 0.010400832, 0.013720013, …
## $ r6 <dbl> 0.013039009, 0.018929403, 0.020401632, 0.032533684, …
## $ r7 <dbl> 0.04723259, 0.07866563, 0.06968557, 0.12520539, 0.11…
## $ r8 <dbl> 0.13991235, 0.23840186, 0.20737659, 0.28738087, 0.27…
## $ r9 <dbl> 0.2596981, 0.2604344, 0.2615409, 0.1485376, 0.162491…
## $ r10 <dbl> 0.4619380, 0.3512801, 0.3814705, 0.3078377, 0.316324…
Abaixo temos o significado de cada uma das 18 variáveis:
* series_name <chr> Nome da série
* series_ep <int> Índice geral do episódio
* season <int> Número da temporada
* season_ep <int> Índice do episódio na temporada
* url <chr> url do IMDB para o episódio (eg "http://www.imdb.com/title/tt5174246/")
* episode <chr> Título do episódio
* user_rating <dbl> Avaliação do usuário com base no cálculo do IMDB [tal qual explicado em](http://www.imdb.com/help/show_leaf?votestopfaq).
* user_votes <dbl> Quantidade de votos no episódio
* r1 <dbl> Proporção de usuários que avaliaram esse episódio com nota 1
* r2 <dbl> Proporção de usuários que avaliaram esse episódio com nota 2
* ...
* r10 <dbl> Proporção de usuários que avaliaram esse episódio com nota 10
Através da discussão online, observamos uma grande ocorrência de comentários acerca de determinadas séries. Para visualizarmos se era, de fato, uma opinião geral, exemplificamos através de um gráfico de linha as avaliações por temporada de algumas das séries mais comentadas nas redes sociais. Foram elas:
data_series %>% #
filter(series_name %in% "Dr. House") %>%
group_by(season) %>%
summarise(mediana_votos = median(user_rating)) %>%
ggplot(aes(x = season, y = mediana_votos)) + geom_line()
data_series %>% #
filter(series_name %in% "Prison Break") %>%
group_by(season) %>%
summarise(mediana_votos = median(user_rating)) %>%
ggplot(aes(x = season, y = mediana_votos)) + geom_line()
data_series %>% #
filter(series_name %in% "Vikings") %>%
group_by(season) %>%
summarise(mediana_votos = median(user_rating)) %>%
ggplot(aes(x = season, y = mediana_votos)) + geom_line()
É possível notar nos exemplos que houve uma queda na qualidade das temporadas, segundo os usuários, conforme passaram as temporadas. Entretanto, é necessário estudar outras variáveis antes de tomar conclusões sobre a correlação.
Para melhor verificarmos a nossa hipótese e criar uma noção intuitiva de como os dados se comportam, analisamos a distribuição das avalições para cada temporada nas séries exemplificadas.
data_series %>% filter(series_name == "Dr. House") %>%
ggplot(mapping = aes(x = season, y = user_rating, group = season)) +
geom_boxplot()
data_series %>% filter(series_name == "Prison Break") %>%
ggplot(mapping = aes(x = season, y = user_rating, group = season)) +
geom_boxplot()
data_series %>% filter(series_name == "Vikings") %>%
ggplot(mapping = aes(x = season, y = user_rating, group = season)) +
geom_boxplot()
Podemos perceber que, apesar de a avaliação ainda aparentar decrescer conforme as temporadas avançam, observar a distribuição mostra que esse decaimento é menos acentuado quando comparado com os gráficos de linha. Além disso, é possível notar um aumento na dispersão das avaliações a partir da 5 temporada das séries exemplificadas, possivelmente indicando uma maior divergência de opiniões quanto mais longa a série.
Prosseguindo a análise descritiva dos exemplos de séries escolhidas (Dr. House, Prison Break e Vikings), verificamos também a correlação entre o número da temporada (season) de cada episódio e sua avaliação.
house <- data_series %>% filter(series_name == "Dr. House")
cor(house$season, house$user_rating)
## [1] -0.1848147
pb <- data_series %>% filter(series_name == "Prison Break")
cor(pb$season, pb$user_rating)
## [1] -0.5915697
pb <- data_series %>% filter(series_name == "Vikings")
cor(pb$season, pb$user_rating)
## [1] -0.1993758
A partir da análise de correlação, podemos ver que para essas 3 séries a correlação entre as variáveis escolhidas de fato ocorre. Nos três exemplos, a tendência da avaliação dos episódios é diminuir conforme o número da temporada cresce. A série Prison Break possui a correlação mais acentuada dentre os exemplos: o coeficiente de correlação entre o número da temporada e a avaliação do episódio tem valor -0.5915, ou seja, os episódios têm uma forte tendência a caírem a avaliação com o passar das temporadas.
Com intuição e hipótese prontas, podemos começar a analisar o comportamento das variáveis citadas para todo o banco de dados. Primeiramente verificamos como se comporta a distribuição de avaliações por número de temporada:
data_series %>% filter(season > 0) %>%
ggplot(mapping = aes(x = season, y = user_rating, group = season)) +
geom_boxplot()
Podemos perceber visualmente que as avaliações são extremamente dispersas, principalmente entre as 10 primeiras temporadas. Também é plausivel dizer que existe um suave queda nas notas dos usuários quando observamos o comportamento das medianas, mas ainda são necessárias mais estatísticas que relacionem numericamente a temporada com a avaliação.
Calculamos em seguida a correlação entre o número da temporada e as notas dadas pelos usuários para todo o banco de dados:
pb <- data_series %>% filter(season > 0)
cor(pb$season, pb$user_rating)
## [1] -0.1500418
Com um coeficiente de correlação de aproximadamente -0.15 verificamos que existe uma relação inversamente proporcional entre as variáveis analisadas, ainda que não tão acentuada como nos exemplos discutidos, tal qual Prison Break com seu coeficiente de -0.5915.
A partir da análise descritiva feita nos passos anteriores, testamos se há regressão linear se tratando do número de temporada e avaliação de um episódio.
dados_uteis <- data_series %>% filter(season > 0) %>% select(season, user_rating)
modelo <- lm(data = dados_uteis, user_rating ~ season, na.action = na.omit)
modelo
##
## Call:
## lm(formula = user_rating ~ season, data = dados_uteis, na.action = na.omit)
##
## Coefficients:
## (Intercept) season
## 7.8999 -0.0268
Com o resultado obtido, podemos verificar que a função que determinaria/preveria a nota de um episódio com base em sua temporada, dada a regressão, seria (y = -0.0265 * x + 7.8975); ou seja, a previsão é de que a nota dos episódios caia (ainda que pouco), a cada temporada que se passa, e suas notas iniciais sejam algo próximo de 7.9.
Para realizar a regressão linear com múltiplas variáveis, desconsideramos aquelas variáveis cujo tipo não é numérico, pois necessitaríamos de processamento de linguagem natural, o que não faz parte do escopo da pesquisa. Além disso, também desconsideramos o atributo season_ep, já que o atributo series_ep já nos é suficiente.
atributos_uteis <- data_series %>% select(series_ep, season, user_rating, user_votes, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10)
summary(atributos_uteis)
## series_ep season user_rating user_votes
## Min. : 1.00 Min. :-1.000 Min. :1.600 Min. : 6.0
## 1st Qu.: 20.00 1st Qu.: 2.000 1st Qu.:7.400 1st Qu.: 65.0
## Median : 49.00 Median : 3.000 Median :7.800 Median : 150.0
## Mean : 67.94 Mean : 4.201 Mean :7.786 Mean : 473.7
## 3rd Qu.: 93.00 3rd Qu.: 5.000 3rd Qu.:8.300 3rd Qu.: 394.0
## Max. :875.00 Max. :44.000 Max. :9.900 Max. :159456.0
## r1 r2 r3
## Min. :0.000000 Min. :0.000000 Min. :0.000000
## 1st Qu.:0.007853 1st Qu.:0.000000 1st Qu.:0.000000
## Median :0.020054 Median :0.003017 Median :0.005618
## Mean :0.034721 Mean :0.008504 Mean :0.011304
## 3rd Qu.:0.042305 3rd Qu.:0.010695 3rd Qu.:0.014706
## Max. :0.772455 Max. :0.488636 Max. :0.360000
## r4 r5 r6 r7
## Min. :0.000000 Min. :0.00000 Min. :0.00000 Min. :0.0000
## 1st Qu.:0.002703 1st Qu.:0.01550 1st Qu.:0.04103 1st Qu.:0.1159
## Median :0.010101 Median :0.03030 Median :0.07071 Median :0.1765
## Mean :0.017032 Mean :0.04207 Mean :0.08553 Mean :0.1827
## 3rd Qu.:0.022727 3rd Qu.:0.05556 3rd Qu.:0.11429 3rd Qu.:0.2437
## Max. :0.294118 Max. :0.41667 Max. :0.50000 Max. :0.6667
## r8 r9 r10
## Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.1627 1st Qu.:0.0750 1st Qu.:0.1667
## Median :0.2307 Median :0.1212 Median :0.2306
## Mean :0.2250 Mean :0.1331 Mean :0.2600
## 3rd Qu.:0.2903 3rd Qu.:0.1830 3rd Qu.:0.3221
## Max. :0.6562 Max. :0.5212 Max. :0.9244
modelo2 <- lm(data = atributos_uteis, user_rating ~ .)
modelo2
##
## Call:
## lm(formula = user_rating ~ ., data = atributos_uteis)
##
## Coefficients:
## (Intercept) series_ep season user_votes r1
## 9.830e+00 4.857e-05 1.740e-03 7.295e-06 -8.189e+00
## r2 r3 r4 r5 r6
## -7.527e+00 -6.877e+00 -5.886e+00 -4.926e+00 -3.979e+00
## r7 r8 r9 r10
## -2.857e+00 -1.772e+00 -4.739e-01 NA
summary(modelo2)
##
## Call:
## lm(formula = user_rating ~ ., data = atributos_uteis)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.51935 -0.05182 -0.00084 0.05271 2.31135
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.830e+00 3.706e-03 2652.566 < 2e-16 ***
## series_ep 4.857e-05 7.362e-06 6.597 4.22e-11 ***
## season 1.740e-03 1.298e-04 13.403 < 2e-16 ***
## user_votes 7.295e-06 3.222e-07 22.644 < 2e-16 ***
## r1 -8.189e+00 1.179e-02 -694.423 < 2e-16 ***
## r2 -7.527e+00 3.506e-02 -214.683 < 2e-16 ***
## r3 -6.877e+00 3.597e-02 -191.164 < 2e-16 ***
## r4 -5.886e+00 2.849e-02 -206.611 < 2e-16 ***
## r5 -4.926e+00 1.737e-02 -283.603 < 2e-16 ***
## r6 -3.979e+00 1.254e-02 -317.379 < 2e-16 ***
## r7 -2.857e+00 8.202e-03 -348.344 < 2e-16 ***
## r8 -1.772e+00 7.299e-03 -242.735 < 2e-16 ***
## r9 -4.739e-01 1.064e-02 -44.550 < 2e-16 ***
## r10 NA NA NA NA
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1347 on 64005 degrees of freedom
## Multiple R-squared: 0.9694, Adjusted R-squared: 0.9694
## F-statistic: 1.69e+05 on 12 and 64005 DF, p-value: < 2.2e-16
Com o resultado obtido, podemos ver que o nosso modelo de regressão parece se adequar à nossa base de dados e variáveis escolhidas, já que o seu coeficiente de determinação possui valor elevado (próximo de 100%), e seu erro residual padrão é baixo. A partir dele, podemos verificar que a variável que possui maior correlação com a avaliação dos episódios são as notas dadas pelos usuários (r1, r2, r3… o que já era esperado), e, depois disso, a segunda variável que possui maior correlação é o número da temporada à qual o episódio pertence; mesmo sendo a variável a possuir a segunda maior correlação, podemos perceber que o nível de correlação dela é relativamente baixo quando comparado à correlação das variáveis que representam as notas dadas pelos usuários (o número da temporada quando comparado à variável r8 tem em torno de 2300 vezes menos impacto na avaliação do episódio, por exemplo).
Diante do que foi visto, pudemos perceber que, apesar de haver certa correlação, esta ainda é muito baixa para que possamos confirmar nossa previsão de que séries de uma grande quantidade de temporadas sempre decaem sua qualidade de acordo com a opinião do público conforme o passar do tempo. É possível notar que até mesmo as avaliações positivas, mostradas por r9 e r8, não deixam de indicar que a série continuará decaindo sua performance segundo o público. Em outras palavras, boas avaliações podem até desacelerar o processo, mas, segundo os dados apresentados, toda série tende a uma menor avaliação dos usuários com o passar do tempo. Ou seja, todo cuidado é pouco, roteiristas.