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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Week2 Using the Java Collection Libraries Lecture 2

1. Java为数据结构编程提供了哪些支持? (1)Java 提供了丰富的数据结构类,通过 Java 集合框架(Java Collections Framework) 来实现,常见的包括: Java 集合框架(Java Col…

武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会

2025年2月21日下午,武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司(以下简称“谱度众合”)在学院学术厅举行校企联培专业学位研究生合作交流会。武汉大学生命科学学院副院长刘星教授、生命科学学院周宇教授、产…

【随时随地学算法】本地部署hello-algo结合内网穿透远程学习新体验

文章目录 前言1.关于hello-algo2.安装Docker和Docker compose3.本地部署hello-algo4. hello-algo本地访问5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 本篇文章主要介绍如何在本地部署hello-algo算法学习必备项目,并结合cpol…

加油站小程序实战教程03站点管理

目录 1 创建数据源2 搭建后台功能2.1 搭建类目配置功能2.2 配置系统信息2.3 配置站点功能2.4 配置油号功能2.5 配置油枪功能2.6 配置站点菜单2.7 设置站点的操作列 总结 在开发小程序的时候,通常需要先拆解业务对应我们的需求分析,根据需求来推导数据结构…

Vidma Ver.2.14.0 高级版

Vidma Ver.2.14.0 高级版 Vidma 是一款易于使用的视频编辑器,提供多种音乐和流行视频效果选择,让您的视频在社交媒体上脱颖而出。您可以通过添加 swooshing 文本、流行效果、复古滤镜、精美贴纸、平滑过渡等等,轻松地从您的宝贵时刻创建有意…

网络通信/IP网络划分/子网掩码的概念和使用

文章目录 概述子网的考题子网掩码的历史有/无类地址子网划分!子网掩码超网技术/CIDR子网掩码和路由IP子网掩码定义 网络规划网络规划-拆子网网络规划-组超网子网划分案例 区分于其他特殊IP地址IP地址和网络地址子网掩码和网络地址子网掩码和广播地址 子网间的通信其他 概述 本…

win11编译pytorch cuda128版本流程

Geforce 50xx系显卡最低支持cuda128,torch cu128 release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022,工作负荷选择【使用c的桌面开发】,安装完成后将…

一周学会Flask3 Python Web开发-Jinja2模版中加载静态文件

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 一个Web项目不仅需要HTML模板,还需要许多静态文件,比如 CSS、JavaScript文件、图片以及音频等。在Fla…

DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略

DualPipe简介 今天是DeepSeek开源周的第四天,官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学,对这个技术并不陌生。 开源地址:https://github.com/deepseek-ai/DualPipe 核心亮点 DualPipe&…

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具,它支持多种编程接口,方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互,充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…

Redis实现滑动窗口限流实践(Redisson限流器版)

文章目录 一、滑动窗口限流原理二、Redisson限流器三、代码示例1. 引入依赖2. 配置Redis连接3. 使用Redisson限流器4. 使用示例 四、总结五、其他优化方向六、代码说明 在高并发系统中,为了保护系统稳定性,防止突发流量压垮服务,限流是一种常…

实现Python+Django+Transformers库中的BertTokenizer和BertModel来进行BERT预训练,并将其应用于商品推荐功能

一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…

ollama本地部署DeepSeek-R1大模型使用前端JS调用的详细流程

以下是关于如何在本地部署 DeepSeek-R1 大模型(通过 Ollama),并使用前端 JavaScript 调用其功能的详细流程。 前提条件 硬件要求: 建议至少 16GB RAM(运行较小模型如 1.5B 或 7B 参数版本),如果…

Rocky Linux 8.5 6G内存 静默模式(没图形界面)安装Oracle 19C

Oracle19c 下载地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目录 一、准备服务器 1、服务器可以克隆、自己装 2、修改主机名 3、重启 4、关闭selinux 5、关闭防火墙 5.1、…

【Qt QML】QML鼠标事件(MouseArea)

QML鼠标事件全面解析 一、MouseArea基础概念 在 QML 中,鼠标事件是处理用户与界面元素交互的重要部分。QML 提供了多种方式来处理鼠标事件,MouseArea 是 QML 中用于处理鼠标事件的核心元素,它可以覆盖在其他元素之上,捕获鼠标操作并触发相应的信号。 1、基本用法 import …

【Project】基于Prometheus监控docker平台

一、设计背景 1.1项目简介 本项目旨在创建一个全面的容器化应用程序监控解决方案,基于Prometheus监控Docker平台上的各种服务。在当今的软件开发环境中,容器化技术已成为一种关键的工具,使应用程序能够更快速、可靠地交付和扩展。然而&…

SV——Clocking block的应用

在system verilog中,clocking block是一种简化时钟域信号同步和采样的机制。可以帮助验证工程师简化复杂时序问题,尤其是在测试平台中,既要对信号进行驱动,又要对信号进行采样。 clocking block块一般有以下应用场景:…

RabbitMQ 的介绍与使用

一. 简介 1> 什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。 其主要用途:不同进程Process/线程T…

unity pico开发 一:环境准备

文章目录 前言一些容易混淆的概念下载SDK导入SDK配置环境注册PICO APP下载PDC 前言 本文将配置pico开发所有必须的环境 官方文档 一些容易混淆的概念 OpenXR:OpenXR是国际通用的vr开发协议,目的是为了解决各个硬件设备自己搞自己的sdk,导致…

Java数据结构_一篇文章了解常用排序_8.1

本文所有排序举例均默认为升序排列。 目录 1. 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想: 2.1.2 直接插入排序 2.1.3 希尔排序(缩小增量排序) 2.2 选择排序 2.2.1 基本思想: 2.2.2 直接选择排…