Kibana:Spotify Wrapped 第二部分:深入挖掘数据

发布于:2025-02-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

作者:来自 Elastic Philipp Kahr

我们将比以往更深入地探究你的 Spotify 数据并探索你甚至不知道存在的联系。

在由 Iulia Feroli 撰写的本系列的第一部分中,我们讨论了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第 2 部分中,我们将深入研究数据,看看还能发现什么。为此,我们将利用一些不同的方法,并使用 Spotify 到 Elasticsearch 将数据索引到 Elasticsearch。这个工具更先进一些,需要更多的设置,但它是值得的。数据更加结构化,我们可以提出更复杂的问题。

与第一种方法有何不同?

在第一篇博客中,我们直接使用了 Spotify 导出功能,并没有执行任何规范化任务或任何其他数据处理。这次我们将使用相同的数据,但我们将执行一些数据处理以使数据更易于使用。这将使我们能够回答更复杂的问题,例如:

  • 我最喜欢的 100 首歌曲的平均时长是多少?
  • 我最喜欢的 100 首歌曲的平均受欢迎程度是多少?
  • 一首歌曲的平均聆听时长是多少?
  • 我最常跳过的曲目是什么?
  • 我什么时候喜欢跳过曲目?
  • 我是否在一天中的某个特定时间比其他时间听得更多?
  • 我是否在某一周的某一天比其他日子听得更多?
  • 这是一个特别有趣的月份吗?
  • 收听时间最长的艺术家是哪位?

Spotify 每年都会推出一项有趣的体验,向你展示你当年听过的音乐。它不会提供逐年的变化,因此你可能会错过一些曾经位列前十但现在已经消失的艺术家。

数据处理

我们在第一篇和第二篇文章中处理数据的方式有很大的不同。如果你想继续使用第一篇文章中的数据,你将需要考虑一些字段名称的变化,以及需要恢复到 ES|QL 来动态地进行某些提取,例如一天中的 hour of day。

尽管如此,大家都应该能够跟上这篇文章。 在 Spotify to Elasticsearch 仓库中进行的数据处理涉及向 Spotify API 请求歌曲时长、流行度,并对某些字段进行重命名和增强。 例如,Spotify 导出的 artist 字段本质上只是一个字符串,无法表示合作曲目或多艺术家参与的歌曲。

仪表板

我在 Kibana 中创建了一个仪表板来可视化数据。仪表板在这里可用,你可以将其导入到你的 Kibana 实例中。仪表板非常全面,可以回答上述许多问题。

让我们一起探讨一些问题并了解如何回答它们!

我最喜欢的 100 首歌曲的平均时长是多少?

为了回答这个问题,我们可以使用 Lens 或 ES|QL。让我们来探讨一下这三个选项。让我们以 Elasticsearch 的方式正确地表述这个问题。我们想要找到最热门的 100 首歌曲,然后计算所有这些歌曲的平均时长。用 Elasticsearch 术语来说,这将是两个聚合:

  1. 找出最热门的 100 首歌曲
  2. 计算这100首歌曲的平均时长。

Lens

在 Lens 中,这个过程相当简单。创建一个新的 Lens 视图,切换到表格模式,然后将 title 字段拖放到表格中。接着,点击 title 字段,将大小设置为 100,并启用精确模式(accuracy mode)。然后,将 duration 字段拖放到表格中,并选择 last value,因为我们只需要每首歌的最新时长数据。同一首歌的时长是固定的。在 last value 聚合方式的底部,有一个用于汇总行的下拉菜单,选择 average,这样就能看到平均值。

ES|QL

与 DSL 和聚合相比,ES|QL 是一种相当新鲜的语言,但它非常强大且易于使用。要在 ES|QL 中回答同样的问题,你可以编写以下查询:

from spotify-history
| stats duration=max(duration), count=count() by title
| sort count desc
| limit 100
| stats `Average duration of the songs`=avg(duration)

让我带你一步步解析这条 ES|QL 查询:

  1. from spotify-history - 这是我们使用的索引模式。
  2. stats duration=max(duration), count=count() by title - 这是第一步的聚合,我们计算每首歌的最大时长 (max(duration)) 和播放次数 (count())。在 Lens 中我们使用的是 last value,但由于 ES|QL 目前不支持 firstlast,我们改用 max
  3. sort count desc - 按播放次数降序排列歌曲,使最常听的歌曲排在最前面。
  4. limit 100 - 限制结果仅返回前 100 首歌曲。
  5. stats Average duration of the songs=avg(duration) - 计算所有歌曲的平均时长。

某个月是否对我特别重要?

要回答这个问题,我们可以使用 Lens,结合 runtime fieldES|QL

首先,我们注意到数据中没有直接表示 month 的字段,而是需要从 @timestamp 字段计算出来。有多种方法可以实现这一点:

  1. 使用 runtime field,为 Lens 提供支持。
  2. 使用 ES|QL 进行计算。

我个人认为 ES|QL 是更简洁且更快速的解决方案。

FROM spotify-history
| eval month=DATE_EXTRACT("MONTH_OF_YEAR", @timestamp)
| stats count=count() by month

就是这样,不需要做任何特别的事情,我们可以利用 DATE_EXTRACT 函数从 @timestamp 字段中提取月份,然后对其进行聚合。使用 ES|QL 可视化,我们可以将其放到仪表板上。

如何查看每位艺术家的年度听歌时长?

这个分析的目的是观察某位艺术家是否只是短暂流行,还是长期受到关注。例如,Spotify 的年度 Wrapped 只展示前 5 位艺术家,但也许你的第 6 位艺术家一直保持不变,或者你的 第 10 位之后的艺术家变化很大?

用 Lens 创建百分比柱状图
  1. 拖拽 listened_to_ms 字段 —— 这个字段表示你听某首歌的时长(单位:毫秒)。
  2. 修改聚合方式 —— Lens 默认使用 median(中位数),但我们需要改成 sum(总和)。
  3. 设置图表类型 —— 在顶部选择 百分比(percentage) 而不是 堆叠(stacked)
  4. 按艺术家拆分数据 —— 选择 artist 字段,并设置为 Top 10(前 10 位艺术家)。
  5. 启用精确模式(accuracy mode —— 在 高级(Advanced) 下拉菜单中,选择 accuracy mode
  6. 调整时间维度(可选)—— 选择 @timestamp 作为时间字段,并将最小间隔 (minimum interval) 设为 year,这样每个柱状条代表一年的数据。
如何解读图表?
  • 每种颜色代表一个艺术家,占比显示该艺术家的听歌时长在总时长中的百分比。
  • 例如,在我的数据里:
    • Fred Again.. 是我听得最多的艺术家,占了 近 12% 的总听歌时长。
    • 2024 年 Fred Again.. 的播放占比有所下降,而 Jamie XX 显著上升。
    • Billie Eilish 在 2024 年依旧被频繁播放,而且柱状条变宽了,说明她的播放总时长比 2023 年增加了。

这样,我们就能清楚地看到某位艺术家的受欢迎程度是如何随时间变化的! 🎵

如何分析每位艺术家的热门歌曲播放时长占比?

这个问题比听上去更复杂!Spotify 可能会告诉你某位艺术家的最热单曲,或者你的前 5 首最常听的歌,但它不会告诉你:

  • 你听这位艺术家的时间是否集中在一首歌上,还是分布在多首歌之间?
  • 你最喜欢的艺术家是否有一首特别 “上头” 的歌,你不断循环播放?

使用 Lens 和 Treemap 进行可视化分析

  1. 创建一个新的 Lens 视图
  2. 选择 Treemap(矩形树图) 作为图表类型。
  3. 设置度量值(Metric)
    • 选择 sum 作为聚合方式。
    • 选择 listened_to_ms 作为字段(表示歌曲的总播放时长)。
  4. 设置分组(Group by)
    • 第一层分组:选择 artist(按艺术家分组)。
    • 第二层分组:添加 title(按歌曲分组)。

如何解读这个图表?

  • 如果一个艺术家的 Treemap 主要被一首歌占据 🟩,那么你的听歌时间可能集中在单曲循环。
  • 如果一个艺术家的 Treemap 比较均匀 🟦🟨🟥,说明你喜欢他的多首歌曲,而不是单一曲目。
  • 可以观察不同艺术家之间的占比,看看是否有某些艺术家特别突出。

例如,

  • Fred Again.. 可能有一首歌占了他播放时长的 80%,说明这首歌你一直在循环。
  • Billie Eilish 可能的播放时长较均匀分布在她的多张专辑中,说明你喜欢她的整体作品。

优化 Treemap:分析前 100 位艺术家的播放时长分布

为了让数据更加全面,我们可以调整 Treemap 设置,使其更具可读性和精确度。

调整设置:

  1. 限制艺术家数量

    • artist 维度中,选择 Top 100(前 100 位艺术家)。
    • 高级选项(Advanced dropdown) 中,取消选择 “other”(即不包含未进入前 100 的艺术家)。
    • 启用 accuracy mode 以确保数据更精确。
  2. 限制单曲数量

    • title(歌曲)维度中,选择 Top 10(每位艺术家的前 10 首歌)。
    • 启用 accuracy mode,保证排序准确。

如何解读 Treemap 结果?

通过 Treemap,即使不考虑时间因素,我们可以直观地看到:

  • Fred Again.. 占了我所有 Spotify 听歌时间的 5.67%
  • 其中,1.21% 仅仅用于播放 Delilah (pull me out of this),说明这首歌占据了 Fred Again.. 总播放时间的较大比例。
  • 这让我们可以分析,某位艺术家的播放时间是否被一首歌主导,还是多个歌曲均匀分布。

Treemap 直观地展示了数据分布,能够帮助我们发现长期重复听的歌曲或特定偏好。 🎶📊

我是否在特定的时间和星期听歌?

我们可以使用 Lens 结合 Heat Map(热力图) 轻松可视化分析听歌习惯。

创建 Heat Map

  1. 创建新的 Lens 视图,选择 Heat Map(热力图) 作为图表类型。
  2. 设置水平轴(Horizontal Axis)
    • 选择 dayOfWeek(星期几)。
    • 设置为 Top 7(默认可能是 Top 3,修改为 7 以显示所有天)。
  3. 设置垂直轴(Vertical Axis)
    • 选择 hourOfDay(小时)。
  4. 设置单元格值(Cell Value)
    • 选择 Count of records(记录数量),即播放次数。

如何解读 Heat Map?

  • 颜色越深,表示你在该时间段的播放次数越多
  • 你可以发现:
    • 是否有固定的听歌高峰?(如每天晚上 9 点,或周六下午)
    • 你更喜欢早晨听歌,还是深夜循环播放?
    • 工作日和周末的听歌模式是否不同?

这样,你可以清楚地了解自己的听歌习惯,甚至可以用来发现 Spotify 推荐算法是否与你的日常习惯匹配 🎧🔥

优化 Heat Map 可视化,提高可读性

在解释 Heat Map 结果时,有一些细节可能会让人困扰。让我们优化它,使其更清晰、更直观。

改进点 1:隐藏图例

  • 默认情况下,Heat Map 会显示图例(Legend),但它可能并不那么重要。
  • 解决方案:点击顶部的 图例符号(Triangle, Square, Circle),然后 禁用图例(disable legend)

这样可以减少视觉干扰,让 Heat Map 更聚焦于数据本身! 🎧🔥

优化 Heat Map:排序问题和使用 Filters 排序星期几

排序问题确实会影响数据的易读性,尤其是星期几的排序。默认情况下,星期几的排序可能会乱序,变成 Monday, Wednesday, Thursday 或其他任何顺序,具体取决于数据的排列。让我们通过 Filters 来修正星期几的排序。

改进点 2:使用 Filters 排序星期几

  1. 点击 dayOfWeek 字段。
  2. 选择 Filters 而不是 Top Values。这样,星期几会按照标准的顺序排列(例如:Monday, Tuesday, Wednesday 等)。

使用 Filters 来排序能确保星期几按照正确的顺序显示,从而更方便地解读数据! 🎯

优化 Heat Map 排序:手动设置每个星期几的过滤器

  1. Filters 选项中,开始输入每个星期几的名称。
  2. 为每个星期几设置过滤器,例如:
    • "dayOfWeek": "Monday" 并为其设置标签为 "Monday"。
    • 重复这个过程,设置每个星期几的过滤器,直到所有星期几都设置好。

这样,你就能确保每个星期几按照正确的顺序排列在热力图中,便于更准确地解读数据。

关于时区的注意事项

需要注意的是,Spotify 提供的数据是以 UTC+0 为标准的,并且没有时区信息。尽管他们提供了 IP 地址和你收听时的国家,理论上我们可以推测时区信息,但这可能会很麻烦,尤其是像美国这样有多个时区的国家。

为什么这很重要?

  • Elasticsearch 和 Kibana 都有时区支持。
  • 如果你为 @timestamp 字段提供了正确的时区信息,Kibana 会自动将时间调整为你浏览器的本地时间。

最终效果:

  • 一旦完成这些设置,你的 Heat Map 应该看起来像这样:
    • 从图表中,我们可以看出,我在工作日(尤其是工作时间)非常活跃,而在周六和周日的听歌时间较少。

通过这种方式,你可以更加准确地分析自己的听歌习惯,并且不受时区问题的干扰! 📊🎧

结论

在这篇博客中,我们深入探讨了 Spotify 数据的一些细节,展示了几种简单快捷的可视化方法,帮助你更好地了解和分析自己的听歌历史。能够如此深入地掌控自己的数据,确实令人惊叹!希望你们继续关注我们的后续博客文章,探索更多有趣的分析技巧!

想要获得 Elastic 认证?
了解下一期 Elasticsearch Engineer 培训 的时间安排!

Elastic 提供了许多新功能,帮助你构建适合自己需求的最佳搜索解决方案。通过我们的 样本笔记本,你可以深入了解更多,开始免费云试用,或在本地机器上尝试 Elastic。

原文:Spotify Wrapped part 2: Diving deeper into the data - Elasticsearch Labs


网站公告

今日签到

点亮在社区的每一天
去签到