A indústria fonográfica opera em um ambiente de altíssimo risco. Diariamente, milhares de músicas são lançadas no Spotify, mas apenas uma fração minúscula alcança relevância global. O problema que este projeto endereça é a imprevisibilidade do sucesso musical: é possível identificar padrões técnicos (como energia, ritmo e acústica) que determinam se uma música será um sucesso ou um fracasso absoluto? Compreender a anatomia de um hit reduz a dependência da “sorte” e introduz uma abordagem orientada a dados na produção cultural.
Para abordar este problema, utilizarei o Spotify Tracks Dataset. A metodologia consiste em extrair esses dados brutos, realizar a higienização (removendo anomalias e redundâncias), aplicar engenharia de features (criando novas variáveis de categorização) e, por fim, conduzir uma Análise Exploratória de Dados (EDA). A exploração fará uso de estatística descritiva e visualizações interativas para encontrar correlações entre os atributos sonoros e o índice de popularidade.
A técnica adotada foca em dividir o problema em subproblemas mais simples. Primeiro, trataremos os dados não estruturados no R. Em seguida, criaremos variáveis derivadas (ex: classificar uma faixa como “Hit” baseando-se em quartis de popularidade) para facilitar a visualização de tendências. A técnica visual usará mapeamento interativo para observar o comportamento de clusters de músicas.
Os potenciais clientes desta análise são gravadoras, selos independentes e produtores musicais. Ao entender as características acústicas que mais engajam o público, esses clientes podem otimizar investimentos milionários em marketing, direcionar produtores artísticos para tendências mais lucrativas e mitigar o risco financeiro de novos lançamentos nas plataformas de streaming.
Para garantir a replicabilidade desta análise e manter o código eficiente e sistemático, os seguintes pacotes são carregados antecipadamente:
# Configuração do servidor CRAN para instalações autônomas
if (!require("pacman")) install.packages("pacman", repos = "[http://cran.us.r-project.org](http://cran.us.r-project.org)")
# 2.2 Explicação do propósito de cada pacote:
# - tidyverse: Ecossistema essencial para manipulação (dplyr) e visualização estática (ggplot2).
# - janitor: Ferramenta de higienização de nomes de colunas e remoção de linhas vazias.
# - DT: Criação de tabelas HTML interativas e de fácil navegação.
# - skimr: Geração de sumários estatísticos altamente informativos e condensados.
# - corrplot: Visualização especializada de matrizes de correlação matemática.
# - plotly: Transformação de gráficos estáticos em visualizações interativas (exploração avançada).
pacman::p_load(tidyverse, janitor, DT, skimr, corrplot, plotly)
# Importação bruta dos dados
spotify_raw <- read_csv("dataset.csv", show_col_types = FALSE) %>% clean_names()
Os dados foram obtidos através do repositório público do Kaggle, intitulado “Spotify Tracks Dataset”. Acesso em: Spotify Tracks Dataset - Kaggle.
Originalmente, este conjunto de dados foi coletado via Spotify Web
API para criar sistemas de recomendação. A base bruta possui cerca de
114.000 linhas e 21 colunas. Algumas peculiaridades incluem: a presença
de uma coluna de índice inútil herdada da exportação
(...1), alguns valores ausentes (NAs) marginais nos nomes
das faixas, e um alto nível de redundância, pois a mesma faixa é
duplicada caso pertença a múltiplos gêneros musicais no sistema do
Spotify.
A limpeza segue um processo lógico: remover o que não agrega valor e garantir a unicidade de cada registro para evitar viés estatístico.
spotify_clean <- spotify_raw %>%
# Remove a coluna de índice do Pandas
select(-1) %>%
# Remove linhas com valores nulos que corrompem a análise
drop_na() %>%
# Desduplica as faixas usando o ID único da música da API do Spotify
distinct(track_id, .keep_all = TRUE)
# Criação de Novas Variáveis e Tipagem (Feature Engineering)
spotify_model_ready <- spotify_clean %>%
mutate(
explicit = as.factor(ifelse(explicit == TRUE, 1, 0)),
track_genre = as.factor(track_genre),
# Reformulação: Criação de uma variável categórica de sucesso baseada na popularidade
hit_status = as.factor(case_when(
popularity >= 75 ~ "Global Hit",
popularity >= 40 ~ "Relevante",
TRUE ~ "Nicho/Flop"
))
)
Abaixo, apresentamos as primeiras linhas do conjunto de dados processado de forma interativa.
datatable(head(spotify_model_ready, 50),
options = list(scrollX = TRUE, pageLength = 5),
caption = 'Amostra do Dataset Limpo e Preparado')
Para facilitar a leitura executiva, substituímos os sumários de console por visualizações interativas da distribuição acústica e do sucesso das faixas.
# 1. Gráfico de Rosca Interativo para a Variável Categórica (Hit Status)
resumo_categorias <- spotify_model_ready %>%
count(hit_status)
grafico_donut <- plot_ly(resumo_categorias, labels = ~hit_status, values = ~n, type = 'pie',
textinfo = 'label+percent',
hoverinfo = 'text',
text = ~paste(n, " faixas"),
marker = list(colors = c("#1DB954", "#191414", "#535353")),
hole = 0.6) %>%
layout(title = "Distribuição das Categorias de Sucesso",
showlegend = FALSE,
margin = list(t = 80, b = 0, l = 0, r = 0))
# 2. Gráfico de Barras Interativo (Perfil Acústico: Hits vs Flops)
resumo_medias <- spotify_model_ready %>%
group_by(hit_status) %>%
summarise(
Danceability = mean(danceability, na.rm = TRUE),
Energy = mean(energy, na.rm = TRUE),
Valence = mean(valence, na.rm = TRUE),
Acousticness = mean(acousticness, na.rm = TRUE)
) %>%
pivot_longer(cols = -hit_status, names_to = "Metrica", values_to = "Media")
paleta_cores <- c("Global Hit" = "#1DB954", "Relevante" = "#535353", "Nicho/Flop" = "#191414")
grafico_barras <- plot_ly(resumo_medias, x = ~Metrica, y = ~Media, color = ~hit_status,
colors = paleta_cores, type = 'bar') %>%
layout(title = "Perfil Acústico: Média das Métricas por Status",
barmode = 'group',
xaxis = list(title = ""),
yaxis = list(title = "Valor Médio (0 a 1)"),
margin = list(t = 80, b = 40, l = 40, r = 0))
# Exibindo os dois gráficos interativos na página HTML
grafico_donut
grafico_barras
Resumo Consolidado: O processo de limpeza reduziu a base para faixas exclusivas. A visualização revela a cruel realidade da indústria: a esmagadora maioria das faixas pertence à categoria “Nicho/Flop”, enquanto os “Global Hits” representam uma rara anomalia estatística. No perfil acústico, nota-se que “Global Hits” apresentam índices superiores de dançabilidade e energia em comparação aos fracassos.
O objetivo aqui não é apenas plotar o óbvio, mas cruzar variáveis de formas não evidentes para gerar insights acionáveis.
Quais são as características sonoras que caminham juntas na composição de uma música?
# Filtrando apenas variáveis numéricas para o cruzamento matemático
spotify_numerico <- spotify_model_ready %>%
select(danceability, energy, loudness, speechiness, acousticness, instrumentalness, liveness, valence)
matriz_corr <- cor(spotify_numerico)
corrplot(matriz_corr, method = "color", type = "upper",
tl.col = "black", tl.srt = 45, addCoef.col = "black",
number.cex = 0.7, title = "Correlação entre Variáveis Sonoras", mar = c(0,0,2,0))
Insight: Destaca-se uma correlação positiva massiva
(+0.76) entre Energia e Volume (loudness), e uma correlação
negativa profunda (-0.73) entre Acústica e Energia. Músicas mais
produzidas e sintetizadas dominam os índices de energia.
Para ir além do esperado, desenvolvemos um gráfico interativo
cruzando a Positividade da música (valence) com a
danceability, colorindo pelo hit_status que
criamos. (Passe o mouse sobre os pontos para interagir com os
dados).
# Amostragem para manter o gráfico de dispersão interativo performático no navegador
set.seed(42)
amostra_plot <- spotify_model_ready %>%
filter(hit_status != "Nicho/Flop") %>%
sample_n(2000, replace = TRUE) %>%
drop_na()
grafico_interativo <- ggplot(amostra_plot, aes(x = valence, y = danceability, color = hit_status, text = track_name)) +
geom_point(alpha = 0.7) +
scale_color_manual(values = c("Global Hit" = "#1DB954", "Relevante" = "#191414")) +
theme_minimal() +
labs(
title = "Positividade vs. Dançabilidade em Músicas Relevantes",
x = "Valence (Positividade/Alegria)",
y = "Danceability (Potencial de Dança)"
)
ggplotly(grafico_interativo, tooltip = c("text", "x", "y"))
Insight: Observamos que os “Global Hits” (em verde) tendem a se concentrar agressivamente na metade superior do eixo Y (Danceability acima de 0.5), mesmo quando a música é considerada triste/negativa (Valence próximo a 0). O ritmo dita o sucesso comercial muito mais do que a mensagem emocional.
Agrupamos os dados brutos para criar uma visão sumarizada inédita sobre quais gêneros produzem músicas com os atributos de maior sucesso.
top_generos <- spotify_model_ready %>%
group_by(track_genre) %>%
summarize(
media_popularidade = round(mean(popularity), 2),
media_energia = round(mean(energy), 2),
faixas_totais = n()
) %>%
arrange(desc(media_popularidade)) %>%
slice_head(n = 15)
datatable(top_generos,
options = list(pageLength = 5, dom = 't'),
caption = "Top 15 Gêneros por Média de Popularidade")
O projeto endereçou a complexidade de decodificar o sucesso na indústria musical utilizando dados acústicos em larga escala extraídos do Spotify.
Utilizamos uma abordagem de Data Science em R, realizando higienização severa, criando novas variáveis qualitativas a partir de dados contínuos e aplicando técnicas de visualização estáticas e interativas (Plotly/DT).
A análise revelou estatisticamente que a alegria de uma faixa
(valence) é irrelevante para a sua popularidade global,
enquanto a capacidade de dança (danceability) atua como um
forte pré-requisito comercial. Evidenciamos matematicamente o viés da
“cauda longa”, onde o mercado concentra a popularidade em um grupo
hiper-seleto de faixas.
Para produtores musicais e gravadoras, a análise atua como um sistema de suporte à decisão. A recomendação técnica clara é: ao produzir para as massas com foco em rentabilidade de streaming, deve-se priorizar composições rítmicas de alta energia e alta dançabilidade, independentemente do tom emocional lírico.
A principal limitação desta análise é a exclusão de dados comportamentais externos (ex: viralização no TikTok, alcance do artista nas redes sociais), que sabidamente impactam a popularidade de forma externa ao áudio. Como evolução técnica, um trabalho futuro construiria um modelo preditivo baseado em Machine Learning (como Florestas Aleatórias) para estimar a pontuação de popularidade de uma nova música recém-saída do estúdio.