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

news2025/4/21 3:22:16

作者:来自 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++—类与对象(中)

目录 1、类的6个默认成员函数 2、构造函数 构造函数的特性 3、初始化列表 4、析构函数 概念 5、拷贝构造函数 6、运算符重载 7、赋值运算符重载 赋值运算符重载格式 8、前置和后置重载 9、const修饰的成员 10、取地址及const取地址重载 1、类的6个默认成员函数 一…

MySQL 事务笔记

MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务(Transaction)是数据库操作的逻辑单元,由一组不可分割的SQL操作组成。主要用于保证: 多个操作的原子性(要么全部成功…

网络空间安全(7)攻防环境搭建

一、搭建前的准备 硬件资源:至少需要两台计算机,一台作为攻击机,用于执行攻击操作;另一台作为靶机,作为被攻击的目标。 软件资源: 操作系统:如Windows、Linux等,用于安装在攻击机和…

HarmonyOS学习第11天:布局秘籍RelativeLayout进阶之路

布局基础:RelativeLayout 初印象 在 HarmonyOS 的界面开发中,布局是构建用户界面的关键环节,它决定了各个组件在屏幕上的位置和排列方式。而 RelativeLayout(相对布局)则是其中一种功能强大且灵活的布局方式&#xff0…

【2025年2月28日稳定版】小米路由器4C刷机Immortalwrt 23.05.4系统搭载mentohust 0.3.1插件全记录

小米路由器4C刷机Immortalwrt系统搭载mentohust插件全记录 首先将路由器按住后面的reset,用一个针插进去然后等待5s左右,松开,即可重置路由器。 然后要用物理网线物理连接路由器Lan口和电脑,并将路由器WAN口连接至网口。确保电脑…

【SpringBoot+Vue】博客项目开发二:用户登录注册模块

后端用户模块开发 制定参数交互约束 当前,我们使用MybatisX工具快速生成的代码中,包含了一个实体类,这个类中包含我们数据表中的所有字段。 但因为有些字段,是不应该返回到前端的,比如用户密码,或者前端传…

idea + Docker + 阿里镜像服务打包部署

一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…

ubuntu 20.04 安装labelmg

1. 下载安装包 下载链接:下载链接 2. 安装启动 # 创建labelImg的环境 conda create -n labelImg# 激活labelImg环境 source activate labelImg安装依赖 pip install pyqt5-dev-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/cd requirements/pip install -…

Redis版本的EOL策略与升级路径(刷到别划走)

各位看官,刷到就点进来,大数据已经抓到你喽~😊 前言 在软件行业做服务端开发的我们,多多少少都会接触到Redis,用它来缓存数据、实现分布式锁等,相关八股文烂熟于心,但是往往会忽略具…

ExpMoveFreeHandles函数分析和备用空闲表的关系

第一部分:ExpMoveFreeHandles和备用空闲表的关系 ULONG ExpMoveFreeHandles ( IN PHANDLE_TABLE HandleTable ) { ULONG OldValue, NewValue; ULONG Index, OldIndex, NewIndex, FreeSize; PHANDLE_TABLE_ENTRY Entry, FirstEntry; EXHAND…

java项目之基于ssm的学籍管理系统(源码+文档)

项目简介 基于ssm的学籍管理系统实现了以下功能: 学生信息管理: 学生信息新增 学生信息修改 学籍异动管理: 学籍异动添加 学籍异动删除 学籍异动修改 学生学业管理: 学生学业添加 学生学业修改 学生学业删除 学院信息管理&am…

SpringBoot+Redis+Mybatis-plus黑马点评

短信登录 基于Session实现登录 流程: 发送短信验证码-->短信验证码注册登录-->校验登录状态(保存用户到ThreadLocal,方便后续使用) 不能每次请求服务都要进行登录状态校验,解决办法:拦截器 在Sp…

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…

DeepSeek-V3关键技术之一:DeepSeekMoE

DeepSeekMoE 是一种创新的大规模语言模型架构,旨在通过高效的计算流程和优化设计,在保持高性能的同时显著降低计算成本。 1. 架构设计 DeepSeekMoE 基于 Transformer 架构,融合了以下核心技术: 专家混合系统(Mixture…

Android Activity启动流程详解

目录 Activity 启动流程详细解析 1. 应用层发起启动请求 1.1 调用 startActivity() 1.2 通过 Instrumentation 转发请求 2. 系统服务处理(AMS 阶段) 2.1 Binder IPC 通信 2.2 AMS 处理流程 2.3 跨进程回调 ApplicationThread 3. 目标进程初始化…

夜天之书 #106 Apache 软件基金会如何投票选举?

近期若干开源组织进行换届选举。在此期间,拥有投票权的成员往往会热烈讨论,提名新成员候选人和治理团队的候选人。虽然讨论是容易进行的,但是实际的投票流程和运作方式,在一个成员众多的组织中,可能会有不少成员并不清…

保姆级教程:用Chart.js实现柱状图与折线图联动

保姆级教程:用Chart.js实现柱状图与折线图联动 ▲ 最终实现的交互式组合图表效果 一、技术原理剖析 1.1 Chart.js渲染机制 Chart.js基于HTML5 Canvas实现图表绘制,其核心原理包括: 数据绑定:将数据对象映射为图形元素分层渲染:通过order属性控制图层叠加顺序坐标系计算:…

初阶MySQL(两万字全面解析)

文章目录 1.初识MySQL1.1数据库1.2查看数据库1.3创建数据库1.4字符集编码和排序规则1.5修改数据库1.6删除数据库 2.MySQL常用数据类型和表的操作2.(一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 2.(二)表的操作1查看指定库中所有表2.创建表 3.查看表结构和查看表…

4.3MISC流量分析练习-wireshark-https

流量分析题目的例题 1.了解wireshark的过滤方式 2.了解tls跟ssl协议基本还原 3.了解xor基本变换方式,获取flag 附件是一个流量包,打开之后有各种流量,但是分析无果,然后丢到kali中使用binwalk进行分析,发现有一个r…

STM32CubeMx DRV8833驱动

一、DRV8833驱动原理 ​ STBY口接单片机的IO口,STBY置0电机全部停止,置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。 AIN1AIN2电机状态00停止1speed反转speed1正转11停止 其中A端(AIN1与AIN2)只能控制AO1与…