O objetivo deste projeto é explorar o Spotify Tracks Dataset, uma base de dados não estruturada que contém métricas acústicas de mais de 114 mil faixas musicais. O desafio arquitetural aqui é transformar abstrações artísticas (como “energia”, “dançabilidade” e “acústica”) em uma matriz numérica sólida.
Esta etapa foca na limpeza, remoção de redundâncias e preparação das features para que, futuramente, possamos treinar algoritmos de Machine Learning para prever a Popularidade de uma música.
O primeiro passo é carregar as ferramentas de trabalho. Utilizamos o
pacote pacman para gerenciar as dependências de forma
automática, garantindo que bibliotecas fundamentais como o
tidyverse (para manipulação) e o janitor (para
padronização) estejam disponíveis no ambiente.
# Instala e carrega as bibliotecas necessárias
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse, janitor, DT, skimr, corrplot)
# Importação dos dados
# A função clean_names() padroniza o cabeçalho para snake_case
spotify_raw <- read_csv("dataset.csv") %>%
clean_names()
Na engenharia de dados, a qualidade do modelo preditivo é diretamente proporcional à qualidade do dado que o alimenta. O dataset original apresenta três problemas estruturais: 1. Uma coluna de índice inútil herdada da extração via Pandas. 2. Valores nulos (NAs) marginais. 3. Redundância: A mesma faixa frequentemente aparece duplicada por estar associada a múltiplos gêneros musicais simultaneamente.
Abaixo, executamos o pipeline de limpeza:
spotify_clean <- spotify_raw %>%
# 1. Remoção da primeira coluna (índice serial)
select(-1) %>%
# 2. Remoção de valores nulos
drop_na() %>%
# 3. Desduplicação baseada no ID único da faixa musical
distinct(track_id, .keep_all = TRUE)
# Verificação do impacto da limpeza
cat("Volume inicial:", nrow(spotify_raw), "linhas.\n")
## Volume inicial: 114000 linhas.
cat("Volume limpo:", nrow(spotify_clean), "linhas exclusivas.\n")
## Volume limpo: 89740 linhas exclusivas.
Houve uma redução significativa, o que evitará viés de treinamento no nosso modelo futuro.
Para que algoritmos analíticos consigam processar as informações
corretamente, os tipos de dados precisam refletir sua natureza
matemática. Variáveis booleanas e categorias textuais devem ser
convertidas para factors no R.
spotify_model_ready <- spotify_clean %>%
mutate(
# Conversão de variável booleana para fator binário (0 e 1)
explicit = as.factor(ifelse(explicit == TRUE, 1, 0)),
# Transformação de metadados em categorias
track_genre = as.factor(track_genre),
key = as.factor(key),
mode = as.factor(mode),
# Arredondamento do tempo (BPM) para facilitar agrupamentos futuros
tempo = round(tempo, 1)
)
Abaixo, temos uma amostra interativa do dataframe processado e pronto para consumo:
# Renderiza uma tabela interativa usando o pacote DT
datatable(head(spotify_model_ready, 100),
options = list(scrollX = TRUE, pageLength = 5))
Antes de construir qualquer modelo, precisamos entender o
comportamento da nossa variável alvo (popularity) e como as
features acústicas se relacionam entre si.
A popularidade é um índice de 0 a 100. Vamos analisar sua distribuição.
ggplot(spotify_model_ready, aes(x = popularity)) +
geom_histogram(fill = "#1DB954", color = "black", bins = 30, alpha = 0.8) +
theme_minimal() +
labs(
title = "Distribuição da Popularidade das Faixas",
subtitle = "Muitas músicas possuem popularidade zero (nichos ou falta de engajamento).",
x = "Índice de Popularidade (0 - 100)",
y = "Frequência (Quantidade de Faixas)"
)
Quais características musicais caminham juntas?
# Seleciona apenas variáveis numéricas contínuas para a matriz matemática
spotify_numerico <- spotify_model_ready %>%
select(danceability, energy, loudness, speechiness, acousticness, instrumentalness, liveness, valence, tempo)
# Calcula a matriz de correlação de Pearson
matriz_corr <- cor(spotify_numerico)
# Plota a matriz visualmente
corrplot(matriz_corr,
method = "color",
type = "upper",
tl.col = "black",
tl.srt = 45,
addCoef.col = "black",
number.cex = 0.7,
title = "Matriz de Correlação Acústica",
mar = c(0,0,2,0))
Insights Iniciais: Como esperado, existe uma forte
correlação negativa entre energy e
acousticness (músicas muito acústicas tendem a ser menos
enérgicas). Por outro lado, energy e loudness
(volume) possuem uma forte correlação positiva. Estas
métricas serão fundamentais para a arquitetura preditiva do sistema de
recomendação.