<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Philipp Kahr - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Philipp Kahr - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/cn/search-labs/author/philipp-kahr</link>
    </image>
    <link>https://www.elastic.co/cn/search-labs/author/philipp-kahr</link>
    <atom:link href="https://www.elastic.co/cn/search-labs/rss/author/philipp-kahr.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[cn]]></language>
    <lastBuildDate>Tue, 22 Sep 2026 17:31:19 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Spotify Wrapped 第 2 部分：数据分析和可视化]]></title>
    <description><![CDATA[我们将比以往任何时候都更深入地研究您的 Spotify 数据，探索您甚至不知道的联系。]]></description>
    <content:encoded><![CDATA[<p>在 Iulia Feroli 撰写的本系列<a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">第一部分中</a>，我们谈到了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第二部分中，我们将深入研究数据，看看还能发现什么。为此，我们将采用一种不同的方法，使用<a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify to Elasticsearch</a>将数据索引到 Elasticsearch 中。这个工具比较先进，需要更多的设置，但它是值得的。数据更加结构化，我们可以提出更复杂的问题。</p><h2>与第一次 Spotify Wrapped 分析的不同之处</h2><p>在第一篇博客中，我们直接使用 Spotify 导出，没有执行任何规范化任务或其他数据处理。这一次，我们将使用相同的数据，但我们将对数据进行一些处理，使数据更加可用。这将使我们能够回答更复杂的问题，例如：.....：</p><ul><li><p>排名前 100 的歌曲的平均时长是多少？</p></li><li><p>排名前 100 的歌曲平均受欢迎程度是多少？</p></li><li><p>一首歌曲的中位收听时长是多少？</p></li><li><p>我跳得最多的曲目是什么？</p></li><li><p>我什么时候喜欢跳过曲目？</p></li><li><p>我是否在一天中的某个时段比其他时段听得更多？</p></li><li><p>我是否在一周中的某一天比其他日子听得更多？</p></li><li><p>是特别感兴趣的月份吗？</p></li><li><p>聆听时间最长的艺术家是谁？</p></li></ul><p>Spotify Wrapped 每年都会给你带来有趣的体验，向你展示今年你都听了些什么。它不会提供每年的变化情况，因此你可能会错过一些曾在你的前十名中，但现在已经消失的艺术家。</p><h2>处理 Spotify Wrapped 数据以供分析</h2><p>在第一个和第二个职位中，我们处理数据的方式有很大不同。如果您想继续使用第一篇文章中的数据，您需要考虑一些字段名称的变化，还需要恢复到 ES|QL 来进行某些提取，如<code>hour of day</code> on the fly。</p><p>不过，大家应该都能跟上这个帖子。在<a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify 到 Elasticsearch</a>存储库中进行的数据处理包括向 Spotify API 询问歌曲的持续时间、受欢迎程度，以及重命名和增强某些字段。例如，Spotify 导出中的<code>artist</code> 字段本身只是一个字符串，并不代表功能或多艺术家曲目</p><h2>使用仪表盘可视化 Spotify Wrapped 数据</h2><p>我在 Kibana 中创建了一个仪表盘，将数据可视化。仪表板可<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/spotify-to-elasticsearch/kibana/dashboard.ndjson">在此处</a>获取，您可以将其导入到您的 Kibana 实例中。仪表盘的内容相当广泛，可以回答上述许多问题。</p><p>让我们一起来了解一些问题以及如何回答这些问题！</p><h3>排名前 100 的歌曲的平均时长是多少？</h3><p>要回答这个问题，我们可以使用 Lens 或 ES|QL。让我们来探讨这三种方案。让我们用 Elasticsearch 的方式来正确表述这个问题。我们要找出排名前 100 的歌曲，然后计算所有这些歌曲加在一起的平均持续时间。用 Elasticsearch 术语来说，就是两个聚合：</p><ol><li><p>找出排名前 100 的歌曲</p></li><li><p>计算这 100 首歌曲的平均持续时间。</p></li></ol><p><strong>Lens</strong></p><p>在 Lens 中，这非常简单：创建一个新的 Lens，切换到表格，然后将<code>title</code> 字段拖放到表格中。然后点击<code>title</code> 字段，将大小设置为 100，并设置<code>accuracy</code> 模式。然后将<code>duration</code> 字段拖放到表中，并使用<code>last value</code> ，因为我们只需要每首歌曲持续时间的最后一个值。同一首歌只有一个持续时间。在<code>last value</code> 聚合的底部有一个摘要行下拉菜单，选择<code>average</code> ，它就会显示出来。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5df1d7f36de5e2ae/6a17e5df0b0beddd57dd355c/a56f6e48e6b53af3ca3d38d67ce0916d0621ef16-2910x1058.png" alt="使用 Lens 获取 Spotify 封装数据" /><p><strong>ES|QL</strong></p><p>与 DSL&amp; 聚合语言相比，ES|QL 是一种相当新鲜的语言，但它非常强大且易于使用。要在 ES|QL 中回答同样的问题，您需要编写以下查询：</p><p>让我带您逐步了解这个 ES|QL 查询：</p><ol><li><p><code>from spotify-history</code> - 这就是我们使用的索引模式。</p></li><li><p><code>stats duration=max(duration), count=count() by title</code> - 这是第一次汇总，我们正在计算每首歌曲的最长持续时间和每首歌曲的计数。我们使用<code>max</code> 而不是 Lens 中使用的<code>last value</code> ，这是因为 ES|QL 目前没有首字母或末字母。</p></li><li><p><code>sort count desc</code> - 我们按照每首歌曲的收听次数进行排序，因此收听次数最多的歌曲排在最前面。</p></li><li><p><code>limit 100</code> - 我们将结果限制在前 100 首歌曲中。</p></li><li><p><code>stats Average duration of the songs=avg(duration)</code> - 我们计算歌曲的平均持续时间。</p></li></ol><h3>我是否对某个月份特别感兴趣？</h3><p>要回答这个问题，我们可以借助运行时字段和 ES|QL 使用 Lens。我们马上就会发现，数据中没有直接表示<code>month</code> 的字段，而是需要从<code>@timestamp</code> 字段中计算出来。有多种方法可以做到这一点：</p><ol><li><p>使用运行时场，为透镜供电</p></li><li><p>ES|QL</p></li></ol><p>我个人认为，ES|QL 是更整洁、更快捷的解决方案。</p><p>我们可以利用<code>DATE_EXTRACT</code> 函数从<code>@timestamp</code> 字段中提取月份，然后对其进行汇总。使用 ES|QL 可视化功能，我们可以将其放到仪表盘上。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c221ad4446cfb09/6a17e5e03e9e45076eba144c/7f942cf38fbe0fecec1d741e7df922196f4e9483-1878x722.png" alt="Spotify Wrapped 每月明细可视化" /><h3>每位艺术家每年的收听时长是多少？</h3><p>这样做的目的是要看艺术家是否只是一朝一夕的事，或者是否会再次出现。如果我没记错的话，Spotify 只显示年度包装前 5 名的艺术家。也许你的第 6 位艺术家一直保持不变，或者他们在第 10 位之后发生了很大变化？</p><p>最简单的表示方法之一就是百分比柱形图。为此，我们可以使用透镜。跟着步骤走：</p><p>拖放<code>listened_to_ms</code> 字段。该字段以毫秒为单位表示您聆听一首歌曲的时间。默认情况下，Lens 将创建<code>median</code> 聚合，我们不希望这样，请将其更改为<code>sum</code> 。在顶部选择<code>percentage</code> ，而不是<code>stacked</code> 作为条形图类型。细目请选择<code>artist</code> ，并注明前 10 名。在<code>Advanced</code> 下拉菜单中，不要忘记选择<code>accuracy mode</code> 。现在，每一个色块都代表了你对这位艺术家的聆听程度。根据时间选择器的不同，条形图可能代表从天、周、月到年的数值。如果需要每周细分，请选择<code>@timestamp</code> ，并将<code>mininum interval</code> 设为<code>year</code> 。从我的情况来看，<code>Fred Again..</code> 是我听得最多的艺术家，我的总收听时间中有近 12% 被<code>Fred Again..</code> 占用。我们还看到，2024 年，<code>Fred Again..</code> 略有下降，但<code>Jamie XX</code> 很大程度上有所增长。如果我们只比较条形图的大小。我们还可以看出，在<code>Billie Eilish</code> 不断播放的同时，2024 酒吧也在不断扩大。这意味着我在 2024 年比 2023 年收听了更多的<code>Billie Eilish</code> 。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteb0c11b909be859f/6a17e5e2e8fbce239a3a18ee/61a5bcc6b7385ed0a11b67c9c6bab32d27f4a49b-2942x1354.png" alt="使用 Kibana 实现 Spotify Wrapped 历史可视化" /><h3>每位艺术家每次收听时间与总体收听时间相比，收听率最高的曲目是什么？</h3><p>这真是一个令人咂舌的问题。让我试着解释一下我想说的话。Spotify 会告诉你某位艺术家的热门歌曲，或你的 5 首热门歌曲。这确实很有趣，但艺术家的细分情况又如何呢？我的所有时间都被一首反复播放的歌曲消耗掉了，还是平均分配？</p><p>创建一个新镜头，选择<code>Treemap</code> 作为类型。对于<code>metric</code> ，与之前相同：选择<code>sum</code> 并使用<code>listened_to_ms</code> 作为字段。对于<code>group by</code> ，我们需要两个值。第一个是<code>artist</code> ，然后添加第二个<code>title</code> 。中间结果是这样的</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9aa0e4877472123f/6a17e5e44b055d6dcf43218e/2dea389664a0d3d13fff03c6337bff3ce740f9b1-2922x1430.png" alt="使用 Kibana 实现 Spotify Wrapped 历史可视化" /><p>让我们将其更改为前 100 名艺术家，并取消选择高级下拉菜单中的<code>other</code> ，同时启用精确度模式。标题改为前 10 名，并启用精确度模式。最终结果是这样的</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt070bf745be1d3f92/6a17e5e66864a43a0fb6875b/7e99a15c69801e58302af4c12b500242a7e8bc9d-2640x1622.png" alt="使用 Kibana 实现 Spotify Wrapped 可视化" /><p>这究竟说明了什么？在不考虑任何时间成分的情况下，我们可以知道，在我所有的 Spotify 收听记录中，我花了 5.67% 收听<code>Fred Again..</code> 。其中，我花了 1.21% 来收听<code>Delilah (pull me out of this)</code> 。有趣的是，是否有一首歌占据了一位艺术家的位置，或者是否还有其他歌曲。树状地图本身就是一种很好的数据分布表现形式。</p><h3>我是否在特定的时间和日期收听？</h3><p>那么，我们可以利用<code>Heat Map</code>.Lens 可视化来回答这个超级简单的问题。创建新透镜，选择<code>Heat Map</code> 。对于<code>Horizontal Axis</code> ，选择<code>dayOfWeek</code> 字段，并将其设置为<code>Top 7</code> ，而不是 Top 3。<code>Vertical Axis</code> 选择<code>hourOfDay</code> ，<code>Cell Value</code> 选择简单的<code>Count of records</code> 。现在，这将产生这个面板：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d08e4f4d0a90550/6a17e5e7e8fbce1af43a18f2/c83ec13a3c7d1b71b8a6b110ed2b74e691d868e6-3538x1720.png" alt="使用仪表盘实现 Spotify Wrapped 收听习惯可视化" /><p>在这本《透镜》中有几处恼人的地方，让我在口译时感到不安。让我们试着清理一下。首先，我不太在意图例，请使用顶部的三角形、方形和圆形符号，并禁用它。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce46c47addd91c61/6a17e5e94b055d15d5432192/84f51d6c885b929bf47ac05edd32ca149ad2e651-1040x298.png" alt="Spotify 包装可视化 " /><p>现在，令人讨厌的第二部分是日期排序。周一、周三、周四或其他任何时间，取决于你的价值观。<code>hourOfDay</code> 已正确排序。对日期进行排序的方法是一种有趣的黑客手段，即使用<code>Filters</code> 而不是<code>Top Values</code> 。点击<code>dayOfWeek</code> 并选择<code>Filters</code> ，现在应该是这样的：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e9c6005a917d4de/6a17e5eb4b055d6e10432196/2498a66098d40a1ba44d3f88464a9888dca204af-3574x1294.png" alt="利用 Kibana 仪表板实现 Spotify Wrapped 历史可视化" /><p>现在开始输入日期。每天一个过滤器。<code>"dayOfWeek" : Monday</code> 并给它贴上标签<code>Monday</code> ，然后冲洗并重复。</p><p>但需要注意的是，Spotify 以 UTC+0 为单位提供数据，不包含任何时区信息。当然，他们也会提供 IP 地址和您收听的国家，我们可以从中推断出时区信息，但这可能会很复杂，而且对于像美国这样有多个时区的国家来说，这可能太麻烦了。这一点很重要，因为 Elasticsearch 和 Kibana 都支持时区，只要在<code>@timestamp</code> 字段中提供正确的时区，Kibana 就会自动根据浏览器时间调整时间。</p><p>我们可以看出，我在工作时间是一个非常活跃的倾听者，而在周六和周日就不那么活跃了。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8eaab83c8c9c7f2/6a17e5ed6df7315e250a0ec5/c664c90ff8e852e1766e8101afc20c58e110f09c-3582x2030.png" alt="使用 Kibana 仪表板实现 Spotify 包裹式可视化" /><h2>结论</h2><p>在这篇博客中，我们对 Spotify 数据所提供的错综复杂的信息进行了深入探讨。我们展示了一些简单快捷的方法来启动和运行一些可视化功能。能对自己的收听历史拥有如此大的控制权，实在令人惊叹。查看该系列的其他部分：</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">第 1 部分：如何在 Kibana 中制作自己的 Spotify 包裹</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-anomaly-detection-jobs">第 3 部分：异常检测人口工作</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/find-relationships-in-data">第 4 部分：检测数据中的关系</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/vectors-spotify-wrapped-part-05">第 5 部分：用矢量找到最好的音乐朋友</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[分析]]></category>
    <dc:creator><![CDATA[Philipp Kahr]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f8cddbca1a54cd5/6a17e5efe9ea87717ba9c585/e04f85e87b5b4e69b6e2df9367840a56985b96a1-1792x1024.png" length="0" type="image/png"/>
    <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>