1. Introdução e Objetivo

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.


2. Configuração do Ambiente

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()

3. Limpeza de Dados (Data Cleaning)

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.


4. Feature Engineering (Transformação)

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)
  )

4.1. Visualização da Base Estruturada

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))

5. Análise Exploratória de Dados (EDA)

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.

5.1. Distribuição da Popularidade

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)"
  )

5.2. Matriz de Correlação das Features Acústicas

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.