Vamos dar uma olhada nos filmes da atriz americana Meryl Streep para entender o perfil de seus trabalhos a partir dos dados coletados do Rotten Tomatoes.

filmes_streep = read_imported_data()
summary(filmes_streep)
##    avaliacao        filme              papel             bilheteria    
##  Min.   :27.00   Length:25          Length:25          Min.   :  7.20  
##  1st Qu.:55.00   Class :character   Class :character   1st Qu.: 22.20  
##  Median :71.00   Mode  :character   Mode  :character   Median : 33.50  
##  Mean   :65.76                                         Mean   : 51.03  
##  3rd Qu.:80.00                                         3rd Qu.: 80.40  
##  Max.   :92.00                                         Max.   :143.80  
##       ano      
##  Min.   :2002  
##  1st Qu.:2006  
##  Median :2008  
##  Mean   :2009  
##  3rd Qu.:2012  
##  Max.   :2018

O resumo dos dados obtidos do Rotten Tomatoes mostra que ela tem filmes muito variados com bilheterias e avaliações altas e baixas. Ao mesmo tempo, seus trabalhos estão concentrados nos anos 00’s e 10’s. Como consequência, o gráfico da relação entre bilheteria e avaliações tem distribuição variada.

filmes_streep %>% 
    ggplot(aes(x = avaliacao, y = bilheteria)) + 
    geom_point(size = 4, color="#900C3F") 

Histogramas facilitam a visualização da distribuição dos dados. Então, vamos vê-los. Como visto anteriormente, a bilheteria tem valores bem distribuídos, com bilheterias modestas sendo mais recorrentes, mantendo a média baixa. A possibilidade de um período de sucesso de bilheteria é descartada, pois nos anos com maior dos filmes das atriz renda, também há filmes muito impopulares sob esse ponto de vista.

ano_bilheteria = filmes_streep %>% 
    ggplot(aes(x = ano, y = bilheteria)) + 
    geom_point(size = 4, color="#900C3F") 

bilheteria_hist = gghistogram(filmes_streep, x = "bilheteria", bins = 15 , 
            fill = "#900C3F", color = "#900C3F",
            add = "mean", rug = TRUE) +
    labs(y="Frequência", x="Bilheteria")

grid.arrange(bilheteria_hist, ano_bilheteria, ncol = 2)

Já olhando a avaliação, vê-se que seus filmes são, em geral medianos, mas com ocorrências excelentes e outras duas muito ruins. Tendo a média de 65 e uma mediana ainda melhor, 71, mostra que, no fim, ela participa, majoritariamente, de filmes, pelo menos, bons.

gghistogram(filmes_streep, x = "avaliacao", bins = 15 , 
            fill = "#900C3F", color = "#900C3F",
            add = "mean", rug = TRUE) +
    labs(y="Frequência", x="Avaliação")

Vendo a distribuição dos dados e testando(testes aqui omitidos), visualmente, agrupamentos, notamos que a divisão entre três grupos é satisfatória. Vemos um grupo de filmes maus de crítica e maus/bons de bilheteria; muito bons de crítica e maus/bons de bilheteria; e os sucessos de público e de bilheteria. Como exemplos de cada grupo podemos elencar os com maior bilheteria de cada, e talvez por isso mais conhecidos: The Giver, The Manchurian Candidate, Mamma Mia!

m2 = filmes_streep %>% select(avaliacao, bilheteria) %>% as.matrix() 
km_streep = kmeans(m2, 3, nstart = 15)%>% 
        augment(filmes_streep) %>% 
        mutate(.cluster = as.character(.cluster))

km_streep %>% 
    ggplot(aes(x = avaliacao, y = bilheteria, color = .cluster), size = 100)  + 
    geom_quasirandom(width = 50) +
    labs(title="Agrupando os dados crus", x="Avaliação", y="Bilheteria", color="Grupos")

A utilização de z-score como forma de normalizar os dados para realizar o agrupamento melhorou os resultados, apesar de, anteriormente, os grupos já estarem satisfatórios sob a informal análise visual e, de fato, permanecerem semelhantes.

filme_normalizado = filmes_streep %>% 
    mutate(bilheteria_normalizada = as.vector(scale(log10(bilheteria))), 
           avaliacao_normalizada = as.vector(scale(avaliacao))) 

m2 = filme_normalizado %>% select(avaliacao_normalizada, bilheteria_normalizada) %>% as.matrix() 
km2 = kmeans(m2, 3, nstart = 15)%>% 
        augment(filmes_streep) %>% 
        mutate(.cluster = as.character(.cluster))

km2%>% 
    ggplot(aes(x = avaliacao, y = bilheteria, color = .cluster), size = 10)  + 
    geom_quasirandom(width = .5) +
    scale_y_log10() +
    labs(title="Agrupando os dados Normalizados", x="Avaliação Z-Norm", y="Bilheteria Z-Norm", color="Grupos")

Também é possível ver como os dados normalizados se dispõem em relação uns aos outros numa escala resultante do mapeamento dos dados através da aplicação do Z-Score aos dados.

km3 = kmeans(m2, 3, nstart = 15)
fviz_cluster(km3, m2, ellipse.type = "norm") +
    labs(title="Visualizando grupos dos dados normalizados ", x="Avaliação Z-Norm", y="Bilheteria Z-Norm")