在 Iulia Feroli 撰写的本系列第一部分中,我们谈到了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第二部分中,我们将深入研究数据,看看还能发现什么。为此,我们将采用一种不同的方法,使用Spotify to Elasticsearch将数据索引到 Elasticsearch 中。这个工具比较先进,需要更多的设置,但它是值得的。数据更加结构化,我们可以提出更复杂的问题。
与第一次 Spotify Wrapped 分析的不同之处
在第一篇博客中,我们直接使用 Spotify 导出,没有执行任何规范化任务或其他数据处理。这一次,我们将使用相同的数据,但我们将对数据进行一些处理,使数据更加可用。这将使我们能够回答更复杂的问题,例如:.....:
- 排名前 100 的歌曲的平均时长是多少?
- 排名前 100 的歌曲平均受欢迎程度是多少?
- 一首歌曲的中位收听时长是多少?
- 我跳得最多的曲目是什么?
- 我什么时候喜欢跳过曲目?
- 我是否在一天中的某个时段比其他时段听得更多?
- 我是否在一周中的某一天比其他日子听得更多?
- 是特别感兴趣的月份吗?
- 聆听时间最长的艺术家是谁?
Spotify Wrapped 每年都会给你带来有趣的体验,向你展示今年你都听了些什么。它不会提供每年的变化情况,因此你可能会错过一些曾在你的前十名中,但现在已经消失的艺术家。
处理 Spotify Wrapped 数据以供分析
在第一个和第二个职位中,我们处理数据的方式有很大不同。如果您想继续使用第一篇文章中的数据,您需要考虑一些字段名称的变化,还需要恢复到 ES|QL 来进行某些提取,如hour of day on the fly。
不过,大家应该都能跟上这个帖子。在Spotify 到 Elasticsearch存储库中进行的数据处理包括向 Spotify API 询问歌曲的持续时间、受欢迎程度,以及重命名和增强某些字段。例如,Spotify 导出中的artist 字段本身只是一个字符串,并不代表功能或多艺术家曲目
使用仪表盘可视化 Spotify Wrapped 数据
我在 Kibana 中创建了一个仪表盘,将数据可视化。仪表板可在此处获取,您可以将其导入到您的 Kibana 实例中。仪表盘的内容相当广泛,可以回答上述许多问题。
让我们一起来了解一些问题以及如何回答这些问题!
排名前 100 的歌曲的平均时长是多少?
要回答这个问题,我们可以使用 Lens 或 ES|QL。让我们来探讨这三种方案。让我们用 Elasticsearch 的方式来正确表述这个问题。我们要找出排名前 100 的歌曲,然后计算所有这些歌曲加在一起的平均持续时间。用 Elasticsearch 术语来说,就是两个聚合:
- 找出排名前 100 的歌曲
- 计算这 100 首歌曲的平均持续时间。
Lens
在 Lens 中,这非常简单:创建一个新的 Lens,切换到表格,然后将title 字段拖放到表格中。然后点击title 字段,将大小设置为 100,并设置accuracy 模式。然后将duration 字段拖放到表中,并使用last value ,因为我们只需要每首歌曲持续时间的最后一个值。同一首歌只有一个持续时间。在last value 聚合的底部有一个摘要行下拉菜单,选择average ,它就会显示出来。

ES|QL
与 DSL& 聚合语言相比,ES|QL 是一种相当新鲜的语言,但它非常强大且易于使用。要在 ES|QL 中回答同样的问题,您需要编写以下查询:
让我带您逐步了解这个 ES|QL 查询:
from spotify-history- 这就是我们使用的索引模式。stats duration=max(duration), count=count() by title- 这是第一次汇总,我们正在计算每首歌曲的最长持续时间和每首歌曲的计数。我们使用max而不是 Lens 中使用的last value,这是因为 ES|QL 目前没有首字母或末字母。sort count desc- 我们按照每首歌曲的收听次数进行排序,因此收听次数最多的歌曲排在最前面。limit 100- 我们将结果限制在前 100 首歌曲中。stats Average duration of the songs=avg(duration)- 我们计算歌曲的平均持续时间。
我是否对某个月份特别感兴趣?
要回答这个问题,我们可以借助运行时字段和 ES|QL 使用 Lens。我们马上就会发现,数据中没有直接表示month 的字段,而是需要从@timestamp 字段中计算出来。有多种方法可以做到这一点:
- 使用运行时场,为透镜供电
- ES|QL
我个人认为,ES|QL 是更整洁、更快捷的解决方案。
我们可以利用DATE_EXTRACT 函数从@timestamp 字段中提取月份,然后对其进行汇总。使用 ES|QL 可视化功能,我们可以将其放到仪表盘上。

每位艺术家每年的收听时长是多少?
这样做的目的是要看艺术家是否只是一朝一夕的事,或者是否会再次出现。如果我没记错的话,Spotify 只显示年度包装前 5 名的艺术家。也许你的第 6 位艺术家一直保持不变,或者他们在第 10 位之后发生了很大变化?
最简单的表示方法之一就是百分比柱形图。为此,我们可以使用透镜。跟着步骤走:
拖放listened_to_ms 字段。该字段以毫秒为单位表示您聆听一首歌曲的时间。默认情况下,Lens 将创建median 聚合,我们不希望这样,请将其更改为sum 。在顶部选择percentage ,而不是stacked 作为条形图类型。细目请选择artist ,并注明前 10 名。在Advanced 下拉菜单中,不要忘记选择accuracy mode 。现在,每一个色块都代表了你对这位艺术家的聆听程度。根据时间选择器的不同,条形图可能代表从天、周、月到年的数值。如果需要每周细分,请选择@timestamp ,并将mininum interval 设为year 。从我的情况来看,Fred Again.. 是我听得最多的艺术家,我的总收听时间中有近 12% 被Fred Again.. 占用。我们还看到,2024 年,Fred Again.. 略有下降,但Jamie XX 很大程度上有所增长。如果我们只比较条形图的大小。我们还可以看出,在Billie Eilish 不断播放的同时,2024 酒吧也在不断扩大。这意味着我在 2024 年比 2023 年收听了更多的Billie Eilish 。

每位艺术家每次收听时间与总体收听时间相比,收听率最高的曲目是什么?
这真是一个令人咂舌的问题。让我试着解释一下我想说的话。Spotify 会告诉你某位艺术家的热门歌曲,或你的 5 首热门歌曲。这确实很有趣,但艺术家的细分情况又如何呢?我的所有时间都被一首反复播放的歌曲消耗掉了,还是平均分配?
创建一个新镜头,选择Treemap 作为类型。对于metric ,与之前相同:选择sum 并使用listened_to_ms 作为字段。对于group by ,我们需要两个值。第一个是artist ,然后添加第二个title 。中间结果是这样的

让我们将其更改为前 100 名艺术家,并取消选择高级下拉菜单中的other ,同时启用精确度模式。标题改为前 10 名,并启用精确度模式。最终结果是这样的

这究竟说明了什么?在不考虑任何时间成分的情况下,我们可以知道,在我所有的 Spotify 收听记录中,我花了 5.67% 收听Fred Again.. 。其中,我花了 1.21% 来收听Delilah (pull me out of this) 。有趣的是,是否有一首歌占据了一位艺术家的位置,或者是否还有其他歌曲。树状地图本身就是一种很好的数据分布表现形式。
我是否在特定的时间和日期收听?
那么,我们可以利用Heat Map.Lens 可视化来回答这个超级简单的问题。创建新透镜,选择Heat Map 。对于Horizontal Axis ,选择dayOfWeek 字段,并将其设置为Top 7 ,而不是 Top 3。Vertical Axis 选择hourOfDay ,Cell Value 选择简单的Count of records 。现在,这将产生这个面板:

在这本《透镜》中有几处恼人的地方,让我在口译时感到不安。让我们试着清理一下。首先,我不太在意图例,请使用顶部的三角形、方形和圆形符号,并禁用它。

现在,令人讨厌的第二部分是日期排序。周一、周三、周四或其他任何时间,取决于你的价值观。hourOfDay 已正确排序。对日期进行排序的方法是一种有趣的黑客手段,即使用Filters 而不是Top Values 。点击dayOfWeek 并选择Filters ,现在应该是这样的:

现在开始输入日期。每天一个过滤器。"dayOfWeek" : Monday 并给它贴上标签Monday ,然后冲洗并重复。
但需要注意的是,Spotify 以 UTC+0 为单位提供数据,不包含任何时区信息。当然,他们也会提供 IP 地址和您收听的国家,我们可以从中推断出时区信息,但这可能会很复杂,而且对于像美国这样有多个时区的国家来说,这可能太麻烦了。这一点很重要,因为 Elasticsearch 和 Kibana 都支持时区,只要在@timestamp 字段中提供正确的时区,Kibana 就会自动根据浏览器时间调整时间。
我们可以看出,我在工作时间是一个非常活跃的倾听者,而在周六和周日就不那么活跃了。

结论
在这篇博客中,我们对 Spotify 数据所提供的错综复杂的信息进行了深入探讨。我们展示了一些简单快捷的方法来启动和运行一些可视化功能。能对自己的收听历史拥有如此大的控制权,实在令人惊叹。查看该系列的其他部分:



