ML-For-Beginners 聚类可视化实战:用散点图探索尼日利亚音乐数据并完成 5 图研究笔记
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
导读
本文围绕 ML-For-Beginners 第 5 课「聚类与可视化」(5-Clustering/1-Visualize)配套作业展开,目标是:在聚类建模之前,使用散点图等可视化手段摸清数据分布、发现自然的对象分组,并完成一份包含5 个良好文档化散点图的研究 notebook。读完本文,你将掌握 scatter plot 的多种形态(基础散点、FacetGrid 分组散点、jointplot 联合分布、KDE 密度叠加、pairplot 多变量矩阵),学会用 seaborn/matplotlib 在真实数据集(5-Clustering/data/nigerian-songs.csv)上开展探索性数据分析(EDA),并知道如何满足作业的「Vorbildlich(卓越)」评价标准。
作业目标:为聚类准备数据
在translations/de/5-Clustering/1-Visualize/assignment.md(即本作业的德语译本,英文原版位于 5-Clustering/1-Visualize/assignment.md)中,任务非常明确:
在本课中你已经掌握了一些可视化技术来为聚类准备数据,尤其是散点图(Streudiagramme)在识别对象分组时非常有用。研究创建散点图的不同方法与不同库,并把你的工作记录在一个 notebook 中。你可以使用本课的数据、其他课的数据或自己获取的数据(请在 notebook 中注明数据来源)。绘制若干散点图,并解释你的发现。
评价标准(Bewertungskriterien)
作业附带的评分表直接决定交付物形态:
| 标准 | 卓越(Vorbildlich) | 合格(Angemessen) | 待改进(Verbesserungswürdig) |
|---|---|---|---|
| 交付物 | 提交一个包含5 个良好文档化散点图的 notebook | 提交少于 5 个散点图且文档化程度较低 | 提交一个不完整的 notebook |
因此,要拿到满分,最低交付物就是一个 notebook + 5 张来源明确、每张都配有文字解释的散点图。本文后续给出可直接复用的 5 图模板与评分自检清单。
数据基础:理解你要可视化的对象
推荐使用本课自带的尼日利亚 Spotify 歌曲数据集:5-Clustering/data/nigerian-songs.csv。该文件共 530 条记录、16 列,包含name(歌名)、album、artist、artist_top_genre(艺术家主流流派)、release_date、length(毫秒)、popularity(0–100 热度)、danceability、acousticness、energy、instrumentalness、liveness、loudness、speechiness、tempo、time_signature。其中 0–1 区间的音频特征(danceability、energy、acousticness 等)非常适合作为散点图的两个坐标轴。
先按主课程 README(5-Clustering/1-Visualize/README.md)的流程完成数据加载与清洗,这是做散点图之前的必要准备:
import matplotlib.pyplot as plt import pandas as pd import seaborn as sns df = pd.read_csv("5-Clustering/data/nigerian-songs.csv") df.info() # 530 entries, 16 columns, 无缺失值 df.isnull().sum() df.describe()主课程还建议两步关键清洗:
- 去掉
artist_top_genre为'Missing'的行(Spotify 未分类的噪声); - 只保留三大主流流派
afro dancehall、afropop、nigerian pop,并过滤掉popularity == 0的歌曲:
df = df[df['artist_top_genre'] != 'Missing'] df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] df = df[(df['popularity'] > 0)]课程中的相关性热力图(df.corr(numeric_only=True)+sns.heatmap)提示:唯一较强的相关性出现在energy与loudness之间,其余特征相关性较弱——这意味着散点图不会呈现干净的对角线,而更可能呈现重叠的云团,恰好是聚类前「数据有多难分」的直观预判。
散点图方法库与研究路线
作业要求「研究不同的方法和不同的库」,这是本作业与研究型文章的精华所在。围绕同一数据集,可以按以下路线展开对比:
- matplotlib 原生
plt.scatter:最底层、最灵活,适合快速查看两个连续变量的关系,但不自带分组配色与统计叠加。 - seaborn
sns.scatterplot:直接支持hue(按流派着色)、size、style,是分组散点图的第一选择。 - seaborn
FacetGrid+plt.scatter:按类别分面,课程中正是用它同时绘制三个流派的 popularity–danceability 散点(见下文)。 - seaborn
jointplot:把两个变量的分布(直方图/密度)与散点合并到一张图,是探索联合分布的最佳工具。 - seaborn
pairplot:一次生成多变量的散点图矩阵,适合从 4–5 个音频特征中快速扫描候选「可分对」。 - 其他库(可选加分项):
plotly.express.scatter(交互式缩放/悬停)、altair(声明式语法)等,可用于「研究不同库」的差异化对比。
建议在 notebook 中为每个库/方法单独建一个 Markdown 标题 + 代码单元格 + 结论文本,这就是「良好文档化」的体现。
5 图模板:可直接落地的完整示例
以下 5 张图构成一份能达到「卓越」档的作业 notebook,全部基于清洗后的df(约 292 行、三流派)。
图 1:基础分组散点(seaborn scatterplot)
plt.figure(figsize=(10, 7)) sns.scatterplot(data=df, x="popularity", y="danceability", hue="artist_top_genre", alpha=0.7) plt.title("Popularity vs. Danceability by Genre") plt.show()文档化解释要点:三流派在 popularity–danceability 平面上高度重叠,未形成明显分离的簇;alpha=0.7用于缓解点重叠(overplotting)。
图 2:FacetGrid 分组散点(课程同款)
课程 README 中的原始写法为:
sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend()新版本 seaborn 中size参数已更名为height(解决方案 notebook 5-Clustering/1-Visualize/solution/notebook.ipynb 中运行时会给出对应 UserWarning)。运行结果见下图,三流派均围绕某一中心区域收敛,印证了「尼日利亚听众的流行度–舞蹈性品味在三大流派间趋于一致」的课程观察。
文档化解释要点:分组着色让我们判断「流派」是否足以成为聚类的自然标签;结论是仅凭这两个轴难以区分流派,聚类算法需要更多特征。
图 3:jointplot 联合分布(散点 + KDE)
sns.set_theme(style="ticks") g = sns.jointplot(data=df, x="popularity", y="danceability", hue="artist_top_genre", kind="kde")该图用 KDE(核密度估计)以连续概率密度曲线表示数据,可以看到围绕某一收敛点形成的同心圆状等高线(课程生成的示例见下),非常适合解读多个分布的叠加。
文档化解释要点:三个流派在密度等高线上大致对齐;KDE 能揭示散点图易被遮挡的高密度区域,是「散点图家族」的重要补充。
图 4:多变量扫描(pairplot)
sns.pairplot(df[["popularity", "danceability", "energy", "loudness", "artist_top_genre"]], hue="artist_top_genre", diag_kind="kde")文档化解释要点:一次输出 4×4 散点矩阵,快速定位哪些特征对更可能产生可分簇;例如 energy–loudness 因相关性较强而呈带状,其他组合为弥散云团。这也是「用散点图缩小候选特征集」的典型工作流。
图 5:交互式散点(不同库的对比研究)
import plotly.express as px fig = px.scatter(df, x="popularity", y="danceability", color="artist_top_genre", hover_data=["name", "artist"], title="Interactive Scatter: Popularity vs Danceability") fig.show()文档化解释要点:与静态库对比,plotly 支持悬停查看具体歌曲(如歌名、艺术家)、缩放与图例筛选,适合在「研究不同库」的对比小节中作为差异化结论;并请在 notebook 中注明「数据来源:ML-For-Beginners 仓库 5-Clustering/data/nigerian-songs.csv」。
完成度自检与提交流程
交作业前对照评分表逐项检查:
- 数量:notebook 中至少 5 张散点图(或同类分布图);
- 文档化:每张图前有目标说明、图后有 2–3 句发现总结,涉及判断如「是否存在天然分组」「哪些特征对更可分」;
- 数据来源:使用本课数据时注明
nigerian-songs.csv;自备数据则必须注明出处; - 可复现:notebook 自包含
import、数据读取与清洗步骤,重新运行可复现全部图表。
主课程 README 还给出了一个可选的预习挑战:为「生产环境中可能用到的各种聚类算法」绘制一张对照表并思考各自要解决的问题(如 K-Means 适用于通用归纳式任务、DBSCAN 适用于非平坦几何与密度不均的数据),可将它作为 notebook 的结尾小节,把散点图探索的结论(数据是否可分、大致簇数)与下一课 K-Means 的选择理由衔接起来。
小结
本作业的本质是一次「以散点图为核心的聚类前探索」训练:先在真实音乐数据上完成加载与清洗,再用多种方法与库绘制 5 张以上散点图,围绕「是否收敛、能否分组、哪个特征对可分」输出文字结论。沿用主课程的数据管线(5-Clustering/1-Visualize/README.md)、参考解决方案(5-Clustering/1-Visualize/solution/notebook.ipynb),即可产出一份可直接用于下一课 K-Means 实验的高质量研究笔记。
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考