返回博客
Analytics Log

Spotify 播放量建模复盘

一次 Analytics Log:从 Spotify 2023 数据清洗、log(streams) 建模、残差诊断到共线性检查,整理音乐播放量分析流程。

项目问题

这次分析围绕 Spotify 2023 数据集展开,目标是用歌曲音频特征和分类变量解释 streams。播放量本身跨度很大,所以建模时使用 log(streams) 作为响应变量,让模型更接近线性回归可以处理的尺度。

数据准备

原始数据里有一些数字字段带逗号,直接读入会变成字符。项目里先写了一个 to_num() 工具函数,把逗号移除,再转换为数值。进入模型前保留完整观测:

model_df <- raw_model_df[complete.cases(raw_model_df), ]
model_df$log_streams <- log(model_df$streams)

主要变量包括 bpmkeymodedanceability_%valence_%energy_%acousticness_%instrumentalness_%speechiness_%

模型设计

初始模型使用多元线性回归,并额外加入 mode:valence_percent 交互项。直觉是:歌曲调式可能会改变 valence 对播放量的解释方式。

prelim_model <- lm(
  log_streams ~ bpm + key + mode + danceability_percent + valence_percent +
    energy_percent + acousticness_percent + instrumentalness_percent +
    speechiness_percent + mode:valence_percent,
  data = model_df
)

诊断流程

项目重点不只是拟合模型,而是检查模型是否可靠。诊断包括四类图:

  • Residuals vs Fitted:查看残差是否出现明显结构。
  • Normal Q-Q:检查误差正态性假设是否大致合理。
  • Scale-Location:观察残差方差是否稳定。
  • Residuals vs Leverage:结合 Cook's Distance 找高影响点。

这些图帮助判断模型有没有系统性偏差、异方差或异常影响点。

共线性检查

另一个重要问题是 predictor 之间可能高度相关。项目先对多个 predictor 做辅助回归,再用 VIF 检查模型共线性。特别需要关注 energy_percentvalence_percentacousticness_percent 之间的关系,因为这些变量在音乐情绪和声音特征上可能并不独立。

模型评估

模型表现通过 summary()、ANOVA、置信区间、AIC/BIC 以及 10-fold cross validation 进行评估。交叉验证的意义是避免只看训练集拟合效果,让模型表现更接近“遇到新歌曲时是否还能解释得通”。

我学到的东西

这次项目最有价值的部分是把统计建模流程串起来:数据清洗、变量转换、模型设定、诊断、共线性检查和验证。相比只追求更高的 R-squared,一个更完整的分析应该能解释为什么这样建模、假设哪里可能出问题、以及下一版如何改进。