library(tidyverse)
## ── Attaching packages ───────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.0 ✓ purrr 0.3.3
## ✓ tibble 2.1.3 ✓ dplyr 0.8.5
## ✓ tidyr 1.0.2 ✓ stringr 1.4.0
## ✓ readr 1.3.1 ✓ forcats 0.5.0
## ── Conflicts ──────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(ggbeeswarm)
theme_set(theme_bw())
Exercício que tem como objetivo treinar a EDA (Análise Exploratório de Dados) através de visualização gráfica e análise. Além de alguns exemplos de correlação e coeficientes de correlação entre alguns atributos dos nossos dados.
Os dados que vamos analisar são sobre algumas playlists do spotify e suas características, abaixo poderemos ter uma visão incial dos dados que serão utilizados.
playlists = read_csv("data/playlists-spotify.csv")
## Parsed with column specification:
## cols(
## .default = col_double(),
## playlist_id = col_character(),
## playlist_name = col_character(),
## track_id = col_character(),
## track_explicit = col_logical(),
## track_href = col_character(),
## track_is_local = col_logical(),
## track_name = col_character(),
## track_preview_url = col_character(),
## track_uri = col_character(),
## track_album_id = col_character(),
## track_album_name = col_character(),
## track_album_release_date = col_character(),
## track_album_release_date_precision = col_character(),
## key_name = col_character(),
## mode_name = col_character(),
## key_mode = col_character()
## )
## See spec(...) for full column specifications.
glimpse(playlists)
## Observations: 502
## Variables: 32
## $ playlist_id <chr> "37i9dQZF1DWYYeOy9vs7I5", "37i9dQZ…
## $ playlist_name <chr> "Bonde do Funk", "Bonde do Funk", …
## $ danceability <dbl> 0.819, 0.940, 0.940, 0.888, 0.708,…
## $ energy <dbl> 0.684, 0.711, 0.711, 0.841, 0.305,…
## $ key <dbl> 6, 3, 3, 6, 6, 7, 1, 3, 0, 11, 6, …
## $ loudness <dbl> -7.169, -3.975, -3.975, -1.933, -1…
## $ mode <dbl> 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0…
## $ speechiness <dbl> 0.1190, 0.1910, 0.1910, 0.1470, 0.…
## $ acousticness <dbl> 0.13200, 0.00369, 0.00369, 0.46000…
## $ instrumentalness <dbl> 0.00e+00, 1.17e-04, 1.17e-04, 9.12…
## $ liveness <dbl> 0.0942, 0.0765, 0.0765, 0.0568, 0.…
## $ valence <dbl> 0.959, 0.693, 0.693, 0.964, 0.860,…
## $ tempo <dbl> 170.187, 130.000, 130.000, 149.994…
## $ track_id <chr> "5dKesZwp6deuhEeW8F1UEi", "4mkagJJ…
## $ time_signature <dbl> 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4…
## $ track_disc_number <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ track_duration_ms <dbl> 137125, 132923, 132923, 120200, 13…
## $ track_explicit <lgl> FALSE, FALSE, FALSE, FALSE, FALSE,…
## $ track_href <chr> "https://api.spotify.com/v1/tracks…
## $ track_is_local <lgl> FALSE, FALSE, FALSE, FALSE, FALSE,…
## $ track_name <chr> "Hit Contagiante", "Te Amo Sem Com…
## $ track_popularity <dbl> 82, 80, 80, 53, 56, 0, 60, 74, 60,…
## $ track_preview_url <chr> "https://p.scdn.co/mp3-preview/7df…
## $ track_track_number <dbl> 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ track_uri <chr> "spotify:track:5dKesZwp6deuhEeW8F1…
## $ track_album_id <chr> "5da8Quq01mGKZvEpBRfFZh", "0SG6SKX…
## $ track_album_name <chr> "Hit Contagiante", "Sintonia (Uma …
## $ track_album_release_date <chr> "2019-07-26", "2019-08-16", "2019-…
## $ track_album_release_date_precision <chr> "day", "day", "day", "day", "day",…
## $ key_name <chr> "F#", "D#", "D#", "F#", "F#", "G",…
## $ mode_name <chr> "minor", "major", "major", "major"…
## $ key_mode <chr> "F# minor", "D# major", "D# major"…
Com base na tabela cima podemos ter uma ideia inicial dos nossos dados. Embora tenhamos muitos atributos, podemos destacar alguns atributos mias relevantes, são eles: danceability que indica o nível de dançabilidade de uma determinada música, energy que indica o quão energética uma música é e track_popularity que indica a popularidade da música. Vamos nos concentrar nesses atributos.
playlists %>%
count(playlist_name, sort = TRUE)
## # A tibble: 8 x 2
## playlist_name n
## <chr> <int>
## 1 Bonde do Funk 83
## 2 Pop Up 80
## 3 Pop Brasil 64
## 4 Clássicos do Funk 62
## 5 Funknejo 62
## 6 Esquenta Sertanejo 51
## 7 Clássicos Sertanejos 50
## 8 Coração Partido 50
Acima destacamos a quantiade de músicas que cada uma das playlists possui para termos uma ideia inicial sobre a distribuição das músicas nas playlists. Com isso já podemos tirar conclusões: as maiores playlists são Bonde do Funk e Pop Up enquanto que as menores são Esquenta Sertanejo, Clássicos Sertanejos e Coração Partido.
O gráfico abaixo mostra visualmente a distribuição das músicas em cada playlist de acordo com a dançabilidade.
playlists %>%
ggplot(mapping = aes(y = playlist_name, x = danceability, color = playlist_name, group = playlist_name)) +
geom_jitter(alpha = 0.5) +
labs(title = "Gráfico de dançabilidade das músicas", y = "Nome da Playlist", x = "Dançabilidade", color = "Nome da Playlist")
Com base na análise do gráfico podemos concluir que a playlist que aparentemente é a mais dançavel é a Clássicos do Funk, a concentração de músicas com dançabilidade acima de 0.8 é maior nela do que em todas as outras playlists. Enquanto que as menos dançaveis pelo gráfico são as playlists Coração Partido e Clássicos Sertanejos que possuem uma quantidade de pontos abaixo de 0.4 maior que todas as outras, além de possuírem poucos pontos acima de 0.8, no caso da playlist Clássicos Sertanejos não há pontos acima de 0.8.
No sumário abaixo calculamos a média, mediana e desvio padrão da dançabilidade em todas a playlists.
playlists %>%
group_by(playlist_name) %>%
summarise(dancabilidade_media = mean(danceability),
dancabilidade_mediana = median(danceability),
dp_dancabilidade = sd(danceability)) %>%
arrange(dancabilidade_media)
## # A tibble: 8 x 4
## playlist_name dancabilidade_media dancabilidade_media… dp_dancabilidade
## <chr> <dbl> <dbl> <dbl>
## 1 Coração Partido 0.522 0.533 0.146
## 2 Clássicos Sertanejos 0.534 0.542 0.148
## 3 Esquenta Sertanejo 0.652 0.664 0.104
## 4 Pop Up 0.695 0.728 0.137
## 5 Pop Brasil 0.719 0.717 0.109
## 6 Funknejo 0.756 0.768 0.0990
## 7 Bonde do Funk 0.784 0.794 0.0991
## 8 Clássicos do Funk 0.860 0.881 0.0920
Podemos dizer que os dados de dançabilidade em casa playlist não são muito dispersos, pois o desvio padrão é baixo em todas as playlist, sendo o maior desvio de aproximadamente 0.15. Podemos reforçar essa observação com o fato das médias e médianas serem próximas, ou seja, não há muitos pontos extremos nas playlists quanto a dançabilidade.
musicas_mais_dancaveis = playlists %>%
group_by(playlist_name) %>%
filter(danceability == max(danceability))
musicas_mais_dancaveis %>%
group_by(playlist_name, track_name) %>%
select(playlist_name, track_name, danceability) %>%
distinct() %>%
arrange(danceability)
## # A tibble: 8 x 3
## # Groups: playlist_name, track_name [8]
## playlist_name track_name danceability
## <chr> <chr> <dbl>
## 1 Clássicos Sertanejos Menina Veneno 0.792
## 2 Coração Partido Somebody That I Used To Know 0.862
## 3 Esquenta Sertanejo Regras - Ao Vivo 0.873
## 4 Pop Up Little Square UBitchU (feat. Anitta) 0.897
## 5 Pop Brasil Te Amo Sem Compromisso 0.94
## 6 Bonde do Funk O Pai Tá Livre 0.954
## 7 Funknejo Aposta 0.955
## 8 Clássicos do Funk Fazenda dos Mineiros 0.981
Acima descobrimos quais as músicas mais dançaveis de cada uma das playlists e podemos destacar que as músicas mais dançaveis das playlists Pop Up, Bonde do Funk, Funknejo e Clássicos do Funk tem níveis de dançabilidade muito próximos, ou seja, os máximos de dançabilidade nessas quatro playlists são bem próximos. Além disso, é possível observar que dentro todas as playlists o máximo mais baixo é da Clássicos Sertanejos.
musicas_menos_dancaveis = playlists %>%
group_by(playlist_name) %>%
filter(danceability == min(danceability))
musicas_menos_dancaveis %>%
group_by(playlist_name, track_name) %>%
select(playlist_name, track_name, danceability) %>%
distinct() %>%
arrange(danceability)
## # A tibble: 8 x 3
## # Groups: playlist_name, track_name [8]
## playlist_name track_name danceability
## <chr> <chr> <dbl>
## 1 Coração Partido You 0.197
## 2 Clássicos Sertanejos Romaria 0.217
## 3 Pop Up The Archer 0.292
## 4 Esquenta Sertanejo Notificação Preferida - Ao Vivo 0.398
## 5 Pop Brasil Dona de mim 0.412
## 6 Funknejo Um Brinde 0.504
## 7 Bonde do Funk Love 66 0.548
## 8 Clássicos do Funk Garota Nota 100 (Ao Vivo) 0.594
Acima podemos ver quais as músicas menos dançaveis de cada playlist, é possível notar que os maiores mínimos são das playlists Coração Partido e Clássicos Sertanejos o que reforça a conclusão que tivemos com a observação do gráfico de que elas são as menos dançaveis, enquanto que a conclusão de que Clássicos do Funk é a mais dançavel foi reforçada, pois podemos ver que o mínimo dessa playlist ainda é mais dançavel que os mínimos de todas as outras playlists.
O gráfico abaixo mostra a distribuição das músicas na playlist, mas de acordo com a energia da música.
playlists %>%
ggplot(mapping = aes(y = playlist_name, x = energy, color = playlist_name, group = playlist_name)) +
geom_jitter(alpha = 0.5) +
labs(title = "Gráfico de energia das músicas", y = "Nome da Playlist", x = "Energia", color = "Nome da Playlist")
Com base na anlise visual do gráfico podemos concluir que três playlists tem níveis de enegia que se destacam, são elas a playlist Clássicos do Funk, Funknejo e Esquenta Sertanejo, embora a playlist Bonde do Funk tambem possua valores altos, eles estão mais dispersos, com uma concentraçaõ de músicas abaixo de 0.5. É possível notar também que a playlist que parece ter a menor energia é a Coração Partido, ela possui varias músicas abaixo de 0.25 de energia.
Abaixo calculamos a média, mediana e desvio padrão da medida da energia em cada uma das playlist analisadas.
playlists %>%
group_by(playlist_name) %>%
summarise(energia_media = mean(energy),
energia_mediana = median(energy),
dp_energia = sd(energy)) %>%
arrange(energia_media)
## # A tibble: 8 x 4
## playlist_name energia_media energia_mediana dp_energia
## <chr> <dbl> <dbl> <dbl>
## 1 Coração Partido 0.453 0.433 0.194
## 2 Clássicos Sertanejos 0.623 0.642 0.145
## 3 Pop Brasil 0.641 0.627 0.146
## 4 Pop Up 0.677 0.696 0.146
## 5 Bonde do Funk 0.682 0.685 0.172
## 6 Funknejo 0.770 0.782 0.130
## 7 Clássicos do Funk 0.771 0.803 0.143
## 8 Esquenta Sertanejo 0.772 0.787 0.112
Com base nos sumários calculados podemos afirmar que a playlist com maior dispersão nos dados é a Coração Partido que tem o maior desvio padrão dentre todas as playlists, sendo ele de 0.19. É importante destacar que as médias e as medianas não são muito diferentes, o que nos leva a conclusão de quem embora exista uma dispersão nos dados, ela não é muito grande.
musicas_mais_energeticas = playlists %>%
group_by(playlist_name) %>%
filter(energy == max(energy))
musicas_mais_energeticas %>%
group_by(playlist_name, track_name) %>%
select(playlist_name, track_name, energy) %>%
distinct() %>%
arrange(energy)
## # A tibble: 9 x 3
## # Groups: playlist_name, track_name [9]
## playlist_name track_name energy
## <chr> <chr> <dbl>
## 1 Pop Up Motivation 0.887
## 2 Pop Up Giant (with Rag'n'Bone Man) 0.887
## 3 Coração Partido Love The Way You Lie 0.922
## 4 Clássicos Sertanejos Dormi Na Praça - Ao Vivo 0.922
## 5 Pop Brasil Contatinho - Ao Vivo Em São Paulo / 2019 0.934
## 6 Bonde do Funk Fuga nas Cunhadas 0.954
## 7 Esquenta Sertanejo Quem Traiu Levou - Ao Vivo 0.958
## 8 Clássicos do Funk Rap Da Espuma 0.984
## 9 Funknejo E Essa Boca Aí? - Ao Vivo 0.986
Acima destacamos as músicas mais energéticas de cada uma das playlists, podemos ver que so picos de todas as playlists são muito altos, sendo a maioria acima de 0.900. Com essas informações podemos reforçar a conclusão que tivemos com a observação do gráfico de que a energia das playlists Esquenta Sertanejo, Clássicos do Funk e Funknejo são muito semelhantes.
musicas_menos_energeticas = playlists %>%
group_by(playlist_name) %>%
filter(energy == min(energy))
musicas_menos_energeticas %>%
group_by(playlist_name, track_name) %>%
select(playlist_name, track_name, energy) %>%
distinct() %>%
arrange(energy)
## # A tibble: 8 x 3
## # Groups: playlist_name, track_name [8]
## playlist_name track_name energy
## <chr> <chr> <dbl>
## 1 Coração Partido How 0.102
## 2 Pop Up Get You The Moon (feat. Snøw) 0.235
## 3 Bonde do Funk Satélite no Setor 0.255
## 4 Clássicos do Funk Feira de Acari 0.301
## 5 Pop Brasil Outro Dia 0.303
## 6 Clássicos Sertanejos Cabecinha No Ombro 0.369
## 7 Funknejo Amém 0.487
## 8 Esquenta Sertanejo Bagunça Minha Vida - Ao Vivo Em Goiânia / 2019 0.494
Acima estão destacadas as músicas menos energéticas de cada uma das playlists, podemos destacar o maior mínimo como sendo o da playlist Coração Partido e a playlist Esquenta Sertanejo possui o maior mínimo dentre todas as playlists.
O gráfico abaixo mostra a distribuição das músicas com base na popularidade da música.
playlists %>%
ggplot(mapping = aes(y = playlist_name, x = track_popularity, color = playlist_name, group = playlist_name)) +
geom_jitter(alpha = 0.5) +
labs(title = "Gráfico de populariade das músicas", y = "Nome da Playlist", x = "Popularidade", color = "Nome da Playlist")
Analisando o gráfico acima podemos notar que as músicas mais populares estão na playlist Pop Up, com uma grande concentração de músicas com popularidade acima de 75, além disso, podemos destacar que a música menos popular da Pop Up ainda está acima das menos populares de todas as outras playlists. Podemos observar que várias playlists tem músicas com popularidade 0, e a que parece ter a maior concentração de pontos no 0 é a playlist Clássicos do Funk, podemos concluir que ela é a playlist menos popular, pois além da concentração de pontos no 0, a música com maior popularidade desta playlist ainda está abaixo das mais populares de todas as outras.
Abaixo calculamos a média, mediana e desvio padrão da popularidade em cada uma das playlists.
playlists %>%
group_by(playlist_name) %>%
summarise(popularidade_media = mean(track_popularity),
popularidade_mediana = median(track_popularity),
dp_popularidade = sd(track_popularity)) %>%
arrange(popularidade_media)
## # A tibble: 8 x 4
## playlist_name popularidade_media popularidade_mediana dp_popularidade
## <chr> <dbl> <dbl> <dbl>
## 1 Clássicos do Funk 27.3 32 19.0
## 2 Clássicos Sertanejos 45.9 51 17.3
## 3 Funknejo 48.5 51.5 18.9
## 4 Coração Partido 48.6 55 26.8
## 5 Bonde do Funk 58.6 57 14.3
## 6 Pop Brasil 63.1 65 14.7
## 7 Esquenta Sertanejo 72.5 74 13.0
## 8 Pop Up 77.9 81.5 12.8
Podemos concluir com base nesses sumários estatísticos que existe uma certa dispersão nos dados das playlists qaunto a popularidade, pois para todas as playlists o desvio padrão é acima de 10 e o maior deles é da playlist Coração Partido que é de aproximadamente 26.8. Podemos reforçar a observação de que há uma dispersão nos dados observando as diferenças entre a média e a mediana, que no caso da playlist Coração Partido é de 6.5 aproximadamente.
musicas_mais_populares = playlists %>%
group_by(playlist_name) %>%
filter(track_popularity == max(track_popularity))
musicas_mais_populares %>%
group_by(playlist_name, track_name) %>%
select(playlist_name, track_name, track_popularity) %>%
distinct() %>%
arrange(track_popularity)
## # A tibble: 10 x 3
## # Groups: playlist_name, track_name [10]
## playlist_name track_name track_popularity
## <chr> <chr> <dbl>
## 1 Clássicos do Funk Deu Onda 58
## 2 Clássicos Sertane… Sinônimos / Pense Em Mim / É o Amor 60
## 3 Funknejo Vingança - Ao Vivo 71
## 4 Pop Brasil Te Amo Sem Compromisso 80
## 5 Pop Brasil Uma nora pra cada dia 80
## 6 Bonde do Funk Hit Contagiante 82
## 7 Bonde do Funk Quando a vontade bater (Participação esp… 82
## 8 Esquenta Sertanejo Tijolão - Ao Vivo 83
## 9 Coração Partido Someone You Loved 93
## 10 Pop Up Señorita 100
Acima destacamos as músicas mais populares de cada uma das playlists, com isso foi possível reforçar o que já havia sido observado no gráfico: o máximo da playlist Clássicos do Funk ainda é menor que os máximos das outras playlists. É importante destacar que a música mais popular da playlist Pop Up tem a nota máximo da popularidade.
musicas_menos_populares = playlists %>%
group_by(playlist_name) %>%
filter(track_popularity == min(track_popularity))
musicas_menos_populares %>%
group_by(playlist_name, track_name) %>%
select(playlist_name, track_name, track_popularity) %>%
distinct() %>%
arrange(track_popularity)
## # A tibble: 30 x 3
## # Groups: playlist_name, track_name [30]
## playlist_name track_name track_popularity
## <chr> <chr> <dbl>
## 1 Bonde do Funk Reboladinha 0
## 2 Clássicos do Funk Rap Da Felicidade 0
## 3 Clássicos do Funk Quero Te Encontrar 0
## 4 Clássicos do Funk Atoladinha 0
## 5 Clássicos do Funk Agora Eu Sou Solteira 0
## 6 Clássicos do Funk Estrada Da Posse 0
## 7 Clássicos do Funk Ela Só Pensa Em Beijar 0
## 8 Clássicos do Funk Adulterio - Ao Vivo 0
## 9 Clássicos do Funk Rap Da Espuma 0
## 10 Clássicos do Funk Rap Do Salgueiro 0
## # … with 20 more rows
Acima destacamos as músicas menos populares de cada uma das playlists e com isso foi possível reforçar a observação de que a playlist com maior número de músicas com popularidade 0 é a Clássicos do Funk. Além disso, podemos ver que a música menos popular da Pop Up ainda tem uma diferença considerável em relação as músicas menos populares de todas as outras playlists.
Com base no que já foi observado podemos verificar se existem correlações entre os atributos analisados anteriormente.
Abaixo podemos ver graficamente a relação entre dançabilidade e a popularidade em cada uma das playlists.
playlists %>%
ggplot(mapping = aes(x = danceability, y = track_popularity, color = playlist_name)) +
geom_point() +
facet_wrap(~ playlist_name)
Analisando o gráfico acima podemos ver que a relação não é clara nas playlists e não parece linear na maioria das playlists, além disso podemos notar a existência de pontos extremos na maioria das playlists, a relação não parece forte.
Abaixo calculamos o coeficiente de correlação dessa relação com os três métodos: Pearson, Spearman e Kendall.
playlists %>%
group_by(playlist_name) %>%
summarise(pearson = cor(track_popularity, danceability, method = "pearson"), spearman = cor(track_popularity, danceability, method = "spearman"), kendall = cor(track_popularity, danceability, method = "kendall"))
## # A tibble: 8 x 4
## playlist_name pearson spearman kendall
## <chr> <dbl> <dbl> <dbl>
## 1 Bonde do Funk 0.00349 0.00403 0.00328
## 2 Clássicos do Funk -0.0861 -0.101 -0.0671
## 3 Clássicos Sertanejos 0.253 0.305 0.206
## 4 Coração Partido 0.116 0.131 0.0963
## 5 Esquenta Sertanejo -0.0161 -0.0833 -0.0646
## 6 Funknejo -0.0907 -0.189 -0.140
## 7 Pop Brasil 0.272 0.323 0.218
## 8 Pop Up -0.156 -0.129 -0.0803
Os resultados dos coeficiente confirmam o que observamos no gráfico, os resultados indicam relações muito fracas e não lineares entre esses dois atributos (dançabilidade e popularidade).
O gráfico abaixo mostra a relação entre dançabilidade e a energia em cada uma das playlists.
playlists %>%
ggplot(mapping = aes(x = danceability, y = energy, color = playlist_name)) +
geom_point() +
facet_wrap(~ playlist_name)
A relação entre dançabilidade e energia parece ser fraca, positiva e ter um formato não linear na maioria das playlists analisadas. Além disso, os pontos tendem a ficar próximos, concentrados e existem poucos pontos extremos na maioria das playlists.
playlists %>%
group_by(playlist_name) %>%
summarise(pearson = cor(energy, danceability, method = "pearson"), spearman = cor(energy, danceability, method = "spearman"), kendall = cor(energy, danceability, method = "kendall"))
## # A tibble: 8 x 4
## playlist_name pearson spearman kendall
## <chr> <dbl> <dbl> <dbl>
## 1 Bonde do Funk 0.123 0.0953 0.0643
## 2 Clássicos do Funk 0.0466 0.0538 0.0493
## 3 Clássicos Sertanejos 0.0546 0.0615 0.0499
## 4 Coração Partido 0.175 0.120 0.0720
## 5 Esquenta Sertanejo -0.291 -0.295 -0.195
## 6 Funknejo -0.248 -0.234 -0.149
## 7 Pop Brasil 0.0545 0.0500 0.0434
## 8 Pop Up 0.289 0.225 0.148
Os resultados dos coeficientes de correlação para essa relação Dançabilidade x Energia reforçam nossas observações, a relação tendem a ser fraca e não linear em todas as playlists.
Com base nos dados e nas análises feitas, podemos concluir que a playlist mais dançavel é a Clássicos do Funk, quanto a energia podemos destacar três playlists: Clássicos do Funk, Funknejo e Esquenta Sertanejo e quanto a popularidade a playlist que mais se destaca é a Pop Up.
A popularidade das músicas não parece estar atrelada a dançabilidade delas tendo em vista que pelos dados e analises feitas, as playlists com as músicas mais dançantes estão longe de serem as mais populares. Além disso, os resultados dos coeficientes de correlação encontrados reforçaram essa ideia. A relação entre a dançabilidade e a energia também é fraca e não linear.