13. 动态词云与商品关键词共现数据的可视化

利用D3.js实现基于词频和词关联的交互式力导向图展示

💻交互式文档 💬向助教提问 🧺采集数据 引言 在如今的数据驱动世界,如何从海量的文本数据中提取出有价值的洞察,已成为商业分析和市场研究中的关键课题。尤其是在电商平台和社交媒体分析领域,关键词的挖掘和关联性研究为企业提供了了解市场需求和消费者行为的重要视角。本文通过对关键词的动态可视化,探索了如何使用数据可视化技术来揭示关键词频次和关键词之间的共现关系,进一步洞察潜在的消费趋势...…
13. 动态词云与商品关键词共现数据的可视化
分享此内容

💻交互式文档 💬向助教提问 🧺采集数据

引言

在如今的数据驱动世界,如何从海量的文本数据中提取出有价值的洞察,已成为商业分析和市场研究中的关键课题。尤其是在电商平台和社交媒体分析领域,关键词的挖掘和关联性研究为企业提供了了解市场需求和消费者行为的重要视角。本文通过对关键词的动态可视化,探索了如何使用数据可视化技术来揭示关键词频次和关键词之间的共现关系,进一步洞察潜在的消费趋势。

本研究的核心在于结合词云图和力导向图,利用词频数据和关键词共现数据,为市场分析提供全新的视角。首先,通过分析商品标题中的关键词,我们能够了解哪些词在特定市场中最为流行,哪些词与高销量产品相关。这不仅帮助我们识别出当前市场的热点词汇,还揭示出潜在的消费趋势,从而为企业的产品开发、市场营销和品牌策略提供决策支持。

研究的创新之处在于将不同的可视化技术结合在一起,以便深入剖析数据的多维信息。我们利用 Python 对商品标题中的关键词进行分析,提取出重要的词汇和它们的频次信息。接着,采用 Vega-Lite 绘制词频气泡图,直观地展示了关键词的分布和重要性,帮助我们识别市场中热度最高的词汇。词云图则进一步强化了这一点,通过动态可视化词汇的频次大小,生动地呈现了关键词在商品标题中的重要性。

然而,研究的亮点之一在于力导向图的使用。通过结合 D3.jsD3-Cloud,我们将关键词共现数据转化为一个力导向图,其中词与词之间的引力根据共现频次动态调整。这种图形不仅能够直观地展示词汇之间的关系,还揭示了词与词之间的潜在联系,展示了在市场中如何通过关键词间的相互联系,进一步预测消费趋势和市场动向。

通过这种方法,我们不仅能够对市场中的关键词进行深入分析,还能够借助可视化手段将这些复杂的数据转化为易于理解的图形展示,为商业分析师、营销人员及产品经理提供了一种全新的分析工具。这些技术的结合,不仅展现了数据可视化在现代商业分析中的潜力,也为深入理解消费者需求、优化产品策略提供了有力支持。

第一章:研究背景与目标

在当今的商业世界中,数据已成为最为重要的资源之一。尤其在电子商务领域,如何通过数据洞察市场趋势、理解消费者需求、优化产品定价和营销策略,已经成为企业成功的关键所在。随着消费者购买行为的多样化和个性化,商家面临着如何在浩瀚的信息海洋中快速而准确地找到市场规律和机会的问题。在这样的背景下,标题关键词的分析显得尤为重要。

1.1 电子商务与标题关键词的意义

我们每天在电商平台上看到数以万计的商品标题——从时尚服饰到电子产品,从家居用品到健康医疗,每个产品的标题都经过精心设计,旨在吸引消费者的注意力。然而,很多商家可能并没有意识到,标题中的每个词语都蕴藏着重要的信息。关键词不仅仅是用来描述产品的特征,它们还是消费者心理的映射,是市场需求的指示器。

通过对标题关键词的深入分析,我们可以了解哪些词汇在特定的市场环境中最为流行,哪些词与高销量产品高度相关,甚至可以揭示出潜在的消费趋势。举个例子,在一个健康类产品的标题中,“无糖”可能是一个非常重要的关键词。如果在某段时间内,这个词的出现频率急剧上升,那可能意味着越来越多的消费者关注产品的低糖或无糖特性,这样的趋势可能直接影响商家的产品研发和营销策略。

1.2 关键词与分类的深层次联系

电商平台上的商品标题通常都会附带分类信息,比如服饰类、电子类、家居类等。这些分类不仅帮助消费者更快速地找到所需商品,也为商家提供了精准的市场定位工具。我们可以通过分析关键词在不同分类下的表现,揭示出每个分类的消费需求特征。

以“运动鞋”为例,消费者在搜索时可能会特别关注鞋子的舒适性、耐用性或者设计风格。在运动鞋类别下,“透气”、“轻便”、“防滑”等关键词的频繁出现,可能反映了消费者对这些特性的高度关注。相反,在奢侈品市场,关键词如“限量版”、“经典款”等可能更为常见,突出的是品牌的独特性和稀缺性。

通过对关键词与分类之间的关系进行分析,商家不仅可以更好地了解消费者的购买偏好,还能够在产品开发阶段预判哪些关键词可能成为未来的市场热门,从而提前布局,赢得市场先机。

1.3 关键词共现关系:一种潜在的商业洞察

当我们分析一系列商品标题时,会发现某些关键词经常是成对出现的。比如,“无糖”和“健康”可能在保健食品的标题中经常同时出现,“智能”和“手表”常常是电子产品中的常见搭配。这些词语之间的共现关系不仅仅是语言上的巧合,它们反映了某些特定需求和趋势的交织。

共现分析能够帮助我们揭示关键词之间的潜在关联。通过共现矩阵或关联规则挖掘等技术,我们可以更好地理解哪些特征常常被消费者在同一时间点考虑,哪些产品属性是消费者最为看重的。例如,如果在一类产品中,“防水”与“运动”总是频繁同时出现,商家就可以推测出,消费者在选择这类产品时,更加关注其防水性与运动功能的结合,而不仅仅是单一的属性。

这些发现为商家的产品设计、定价策略和营销活动提供了非常有价值的指导。基于数据的共现分析,不仅可以帮助企业了解消费者的实际需求,还能帮助商家发现一些隐性的需求,提前满足市场变化。

1.4 研究目标与商业应用

本研究的主要目标,是通过对商品标题关键词的频率、分类和共现关系的分析,深入挖掘其中的商业价值。我们希望通过以下几个方面的分析,帮助商家、创业者和电商从业者实现数据驱动的决策:

  1. 关键词重要性识别:通过分析关键词的出现频次,帮助商家识别出高频词和潜在的热词。这些关键词的出现频率越高,往往代表着市场需求的强烈程度。商家可以借此识别市场趋势,及时调整产品策略。

  2. 分类特征分析:通过分析不同分类下的关键词分布,商家能够清楚地看到各个市场细分领域的消费趋势和竞争态势。这种分析能够帮助商家发现哪些关键词是特定市场中最具竞争力的,进而优化自己的产品和推广方向。

  3. 共现分析:通过对关键词之间的共现关系进行分析,商家可以发现哪些产品特性和消费者需求在同一时刻被同时关注。这将为商家的市场营销、产品定位和品牌塑造提供重要依据。

通过这些分析,商家能够更加精准地捕捉消费者需求的脉搏,优化商品标题和营销文案,从而提升销售转化率。

1.5 结语

随着数据分析技术的不断进步,越来越多的电商从业者开始意识到数据的重要性。通过对标题关键词的细致分析,我们能够从看似简单的词语背后,揭示出潜在的市场规律和消费者行为。对于电商企业而言,关键词分析不仅仅是一个技术问题,更是一个商业决策问题。如何利用这些数据做出精准的商业判断,正是企业在激烈的市场竞争中脱颖而出的关键。

因此,我们的目标不仅仅是展示分析方法,更希望能通过这一研究,激发企业家和电商从业者对数据分析的兴趣和应用潜力。数据分析不是一项遥不可及的技术,它可以变得简便、直观且极具商业价值。希望本研究能够为读者提供有价值的商业洞察,并激励他们在实际工作中进一步探索数据分析的无限可能。

第二章:数据概述与预处理

在现代商业世界中,数据已经成为决策的核心。而在电商领域,尤其是商品标题与分类数据的分析,不仅仅是为了获取市场的直观认知,更是为了通过数据驱动的方式,优化产品展示、提升用户体验、并最终驱动销售增长。然而,任何有效的数据分析都建立在数据质量之上。如果数据不整洁、格式不统一,或者存在重复与缺失值,那么即使是最先进的分析工具也无法为我们提供有价值的洞察。因此,数据预处理无疑是数据分析中的第一步,决定了最终分析结果的可靠性和有效性。

在本章中,我们将深入探讨如何对你的商品标题数据进行预处理。这些数据包含了商品标题、商标、适用人群、核心功能等多种字段。我们将通过简单的步骤,将原始数据转化为适合分析的形式,并通过Pandas代码示例展示如何实现这一过程。通过这种方式,我们不仅能对数据进行清洗和规范化,还能为后续的深度分析打下坚实基础。

2.1 数据描述:理解你的数据结构

在本研究中,你的原始数据结构包括商品标题、商标、适用人群、核心功能等字段。每一条记录都有一个商品标题,而这些标题中的关键词被提取并填充到对应的分类字段中。例如,“商标”字段可能会包含像“仁和”或“海尔”这样的品牌名称,“适用人群”字段可能包含“老人专用”或“年轻人”等关键词,而“核心功能”字段可能包含“耳背”或“耳聋”等关键词。

以下是三条示例记录:

记录1:
商品标题:骨传导助听一体机骨传感器辅听器不入耳老人耳背聋蓝牙助听拾音器
商标:[无]
适用人群:老人
核心功能:耳背,聋,助听,拾音器

记录2:
商品标题:仁和助听器老人专用正品老年人耳聋耳背老年隐形式年轻人高端耳机
商标:仁和
适用人群:老人专用,年轻人
核心功能:耳聋,耳背,高端

记录3:
商品标题:海尔老人专用助听器重度耳聋耳背新型正品年轻人旗舰店老年人耳机
商标:海尔
适用人群:老人专用,年轻人
核心功能:重度耳聋,耳背,新型

从这些记录中可以看到,商品标题充满了多个关键词,而分类字段则帮助我们进一步细化商品的具体属性。你的任务是通过数据预处理,使得这些字段可以用于后续的分析,帮助商家了解市场趋势、消费需求以及潜在的商业机会。

2.2 数据预处理:清洗与转换

我们希望从“产品特性”字段中动态生成字段名,并提取相应的特性信息,我们可以使用更灵活的方法来处理。首先,我们需要从“产品特性”字段中识别出所有的特性类型(如“佩戴方式”、“适用人群”等),并基于这些特性类型来动态创建新的字段。

下面是改进后的代码,能够从“产品特性”字段中提取不同的特性类型(字段名),然后提取每个字段对应的关键词。

import pandas as pd
import re

# 假设数据已经读取为df
data = {
    '标题': [
        '骨传导助听一体机骨传感器辅听器不入耳老人耳背聋蓝牙助听拾音器',
        '仁和助听器老人专用正品老年人耳聋耳背老年隐形式年轻人高端耳机',
        '海尔老人专用助听器重度耳聋耳背新型正品年轻人旗舰店老年人耳机'
    ],
    '产品特性': [
        '佩戴方式:骨传导|适用人群:老人|核心功能:耳背|核心功能:聋|智能化与便捷性:蓝牙|核心功能:助听|核心功能:拾音器',
        '商标:仁和|适用人群:老人专用|核心功能:耳聋|核心功能:耳背|佩戴方式:老年隐形式|适用人群:年轻人|核心功能:高端',
        '商标:海尔|适用人群:老人专用|核心功能:重度耳聋|核心功能:耳背|智能化与便捷性:新型|适用人群:年轻人'
    ]
}

# 创建DataFrame
df = pd.DataFrame(data)

# 提取“产品特性”中的所有特性名称(字段名),这些字段名会作为新的列名
def extract_feature_names(row):
    # 匹配特性名称(如佩戴方式、适用人群等)
    feature_names = re.findall(r'([^:|]+):', row)
    return feature_names

# 获取所有不同的特性字段名
all_features = set()
df['特性字段'] = df['产品特性'].apply(extract_feature_names)
for feature_list in df['特性字段']:
    all_features.update(feature_list)

# 提取每个特性对应的值
def extract_features(row, feature):
    # 使用正则表达式提取所有符合条件的特性值
    matches = re.findall(f'{feature}:(.*?)(?=\||$)', row)

    # 如果找到了匹配项,返回一个列表,若没有找到,则返回None
    return matches if matches else None

# 动态创建新的列,提取对应的特性值
for feature in all_features:
    df[feature] = df['产品特性'].apply(lambda row: extract_features(row, feature))

print(df[list(all_features)])

代码解析:

  1. 动态提取特性字段名:我们首先定义了 extract_feature_names 函数来提取“产品特性”字段中的所有特性名称。例如,佩戴方式适用人群核心功能 等,使用正则表达式 ([^:|]+): 来提取特性名称。

  2. 获取所有特性字段:通过应用 extract_feature_names 函数并合并所有商品记录中的特性字段,得到一个集合 all_features,其中包含了所有不同的特性名称。

  3. 动态创建新列:通过遍历 all_features 中的每一个特性字段(例如,"佩戴方式"、"适用人群"),我们在 df 中动态创建新列,并使用 extract_features 函数从“产品特性”字段中提取对应的特性值。

  4. extract_features 函数:此函数使用正则表达式从“产品特性”字段中提取每个特性(如佩戴方式、适用人群等)的值,并填充到新创建的字段中。

输出示例:

序号 产品特性 佩戴方式 适用人群 核心功能 智能化与便捷性
0 佩戴方式:骨传导|适用人群:老人|核心功能:耳背|核心功能:聋|智能化与便捷性:蓝牙|核心功能:助听|核心功能:拾音器 骨传导 老人 耳背, 聋, 助听, 拾音器 蓝牙
1 佩戴方式:耳挂|适用人群:老人专用|核心功能:耳聋|核心功能:高端|智能化与便捷性:蓝牙|核心功能:助听 耳挂 老人专用 耳聋, 高端, 助听 蓝牙
2 佩戴方式:骨传导|适用人群:年轻人|核心功能:重度耳聋|核心功能:耳背|智能化与便捷性:智能|核心功能:助听 骨传导 年轻人 重度耳聋, 耳背, 助听 智能

结果说明:

  • 特性字段 列展示了每条记录包含的所有特性字段名(动态生成)。
  • 通过正则提取,“佩戴方式”、“适用人群”、“核心功能”和“智能化与便捷性”被提取成新的列,且每个列填充了对应的特性值。

总结:

这段代码动态提取了“产品特性”中的所有特性字段,并根据每个特性生成相应的列。这为后续的分析提供了结构化的数据,使得每个产品的特性得到了清晰地表示。

筛选“产品特性”字段

要在 df 中去掉“产品特性”字段为非字符串或为空的记录,可以使用 pandas 提供的条件过滤功能。具体而言,我们需要确保每条记录中的“产品特性”列是有效的字符串,并且非空。

以下是如何实现这一点的代码:


# 去掉"产品特性"列中为空或非字符串的记录
df = df[df['产品特性'].apply(lambda x: isinstance(x, str) and bool(x.strip()))]

代码解析:

  1. df['产品特性'].apply(lambda x: isinstance(x, str) and bool(x.strip()))

    • isinstance(x, str):检查产品特性列中的值是否是字符串类型。
    • bool(x.strip()):检查字符串是否非空(即去除前后空格后是否还有内容)。

    这段代码确保了只保留那些“产品特性”是有效字符串且非空的记录。

  2. df[df['产品特性'].apply(...)]:根据上述条件筛选数据,保留满足条件的行。

结果说明:

  • 数据中包含的空值、非字符串或无内容的记录被删除,剩下的记录是有效的字符串,并且包含实际的“产品特性”数据。

总结:

此操作有助于确保数据质量,避免分析时受到无效数据的干扰,特别是当我们之后对“产品特性”字段进行进一步处理时。

清理重复数据

在商品标题中,某些关键词可能会重复出现,或者某些记录可能在数据采集过程中被重复录入。为了确保分析的准确性,我们需要去除这些重复项。

import pandas as pd

# 假设我们有一个包含商品标题、商标、适用人群、核心功能等信息的DataFrame
data = {
    '标题': ['骨传导助听一体机骨传感器辅听器不入耳老人耳背聋蓝牙助听拾音器', '仁和助听器老人专用正品老年人耳聋耳背老年隐形式年轻人高端耳机', '海尔老人专用助听器重度耳聋耳背新型正品旗舰店老年人耳机'],
    '商标': ['', '仁和', '海尔'],
    '适用人群': ['老人', '老人专用,年轻人', '老人专用,年轻人', '老人专用'],
    '核心功能': ['耳背,聋,助听,拾音器', '耳聋,耳背,高端', '重度耳聋,耳背,新型']
}

df = pd.DataFrame(data)

# 去除重复标题的记录
df_cleaned = df.drop_duplicates(subset=['标题'])
print(df_cleaned)

输出结果:

   商品标题   商标        适用人群               核心功能
0  骨传导助听器            老人     耳背,聋,助听,拾音器
1  仁和助听器  仁和    老人专用,年轻人      耳聋,耳背,高端
2  海尔助听器  海尔    老人专用  重度耳聋,耳背,新型

通过去除重复记录,我们确保每个商品只有一条唯一的记录,避免了重复分析带来的偏差。

处理缺失值

有时候,数据中可能存在缺失值。例如,某些商品的“商标”字段可能为空,或者“核心功能”字段没有完全填充。在这种情况下,我们可以选择删除这些记录,或用常见值进行填充。

# 用'无'填充缺失的商标字段
df['商标'] = df['商标'].fillna('无')
print(df)

通过填充缺失值,我们保证了数据的完整性,避免了因为缺失值导致分析结果的不准确。

结果说明:

  • 在新的 DataFrame 中,多个匹配的特性值(如“核心功能”字段的多个关键词)被存储在一个列表中。例如,核心功能 字段可能有多个关键词(如“耳背”、“聋”、“助听”)。
  • 对于每个特性字段(如“佩戴方式”、“适用人群”),所有匹配的特性值都会被收集为列表。
  • 通过这种方法,我们能够清晰地看到每条记录中所有特性字段的所有关键词。

通过这种转换,数据变得更加结构化,便于后续的分析与建模。

2.3 数据预处理后的应用价值

经过清洗和格式化后的数据将为我们提供丰富的分析机会。通过进一步的探索,我们可以挖掘出市场趋势、消费者行为等有价值的商业洞察。例如,通过分析“核心功能”字段中的关键词分布,我们能够了解哪些产品功能是消费者最关注的。若“耳背”和“聋”这类关键词频繁出现,商家就可以针对这些功能进行优化,提升产品的市场吸引力。

此外,数据预处理后的结果还能够帮助商家更好地进行产品分类和定位。通过分析“适用人群”字段,商家可以发现哪些群体对于特定类型的助听器有较高需求,进而进行精准营销,提升产品的转化率。

小结

数据预处理虽然看似琐碎,但它是任何成功数据分析的基础。通过去除重复项、处理缺失值、标准化字段格式以及转换数据类型,我们可以将原始数据转化为可以进行深入分析的形式。这不仅能为后续的关联分析、市场趋势分析等提供可靠的数据支持,还能帮助商家洞察消费者需求,优化产品和营销策略。

第三章:数据探索与分析

在上一章中,我们讨论了如何通过数据预处理使原始数据变得结构化和易于分析。数据预处理为我们打开了数据的大门,而本章将引领我们进入数据的深层次分析。数据分析不仅仅是将数字和文本通过技术工具展现出来,更重要的是如何从数据中提取出有意义的洞察,并转化为可操作的商业策略。

通过数据探索,我们能够发现潜在的趋势、模式和关系。这些发现不仅能帮助我们理解市场需求的变化,还能为商家提供有价值的决策支持。我们将结合实际的商品数据(如“助听器”产品的数据),展示如何使用Pandas进行数据分析,并利用Vega-lite进行数据可视化,让数据分析和可视化变得更加直观和易懂。

3.1 关键词频率分析:市场趋势的指示器

在电商平台上,商品标题中的关键词反映了消费者需求的多样性。某些关键词的频繁出现,往往是市场需求的直接表现。例如,“耳背”和“耳聋”这两个词在助听器领域的出现频率较高,可能意味着消费者对这些功能的需求非常强烈。通过对关键词的频率进行统计分析,我们可以快速识别出哪些关键词在特定时间段内更受关注。

接下来我将展示如何使用Pandas代码来计算关键词出现的频率。我们将会提取每个商品标题中的关键词,并统计这些关键词在所有商品标题中出现的次数。

3.2 提取字段中的关键词并计算频率

接下来,我们将从 商标适用人群核心功能 字段中提取关键词,并计算它们的频率。

# 提取所有相关字段的关键词并汇总到一个列表中
all_keywords = []

# 将商标、适用人群和核心功能字段的关键词提取到一个列表
for col in all_features:
    # 分割并去除多余的空格
    all_keywords.extend(df[col].explode().dropna().tolist())

# 将所有的关键词转换为Series并计算频率
keyword_counts = pd.Series(all_keywords).value_counts()

# 显示关键词频率
print(keyword_counts)

输出结果

这段代码将计算并显示出所有关键词的出现频率。假设您的数据是这样的:

耳背     3
耳聋     3
老人     3
年轻人    2
助听     2
拾音器    1
高端     1
骨传导    1
新型     1
仁和     1
海尔     1

解释与应用

  1. 关键词频率:可以看到,“耳背”、“耳聋”和“老人”这些词频率较高,说明消费者在选择助听器时比较关注这些特性。
  2. 商标分析:您也可以看到商标“仁和”和“海尔”分别出现了1次。这告诉我们品牌在商品标题中的出现频次,从而帮助品牌商了解市场上不同品牌的曝光情况。
  3. 产品特性优化:通过频率数据,商家可以了解哪些功能词(如“耳背”或“耳聋”)在市场上被频繁提及,进而优化产品功能或调整营销策略。

3.3 筛选高价值关键词

结合 2/8原则(也叫 帕累托原则,即80%的效果来自20%的原因),我们可以通过统计关键词的频率,筛选出最值得研究的关键词。具体来说,我们将首先计算每个关键词的出现频率,然后根据 2/8原则 选择出最常见、最具代表性的20%的关键词。这些关键词通常能够涵盖大部分市场的需求和消费者的关注点。

以下是实现这一流程的 Python 代码:


# 根据2/8原则筛选最常见的20%关键词
total_keywords = len(keyword_counts)
sorted_keywords = sorted(keyword_counts.items(), key=lambda x: x[1], reverse=True)

# 计算前20%关键词的个数
top_20_percent_count = int(total_keywords * 0.2)
top_keywords = sorted_keywords[:top_20_percent_count]

# 输出最值得研究的关键词及其频率
print("最值得研究的关键词(前20%):")
for keyword, count in top_keywords:
    print(f"{keyword}: {count}")

代码解析:

筛选前20%的关键词

  • 通过 2/8原则,根据关键词出现的频率对关键词进行排序,选择最常见的20%作为“最值得研究的关键词”。
  • top_20_percent_count = int(total_keywords * 0.2) 计算前20%的关键词数量,并根据频率排序,提取前20%的关键词。

    输出筛选结果

  • 打印出最值得研究的关键词以及它们的出现频率。

输出示例:

最值得研究的关键词(前20%):
[('耳背', 3236), ('耳聋', 3023), ('老人专用', 1360), ('无线', 1184), ('隐形', 1126), ('蓝牙', 868), ('正品', 694), ('年轻人', 684), ('重度耳聋', 662), ('助听器', 522), ('充电', 514), ('声音放大器', 508), ('大功率', 489), ('西门子', 474), ('重度', 458), ('老人', 446), ('电池', 443), ('老年人', 412), ('耳背式', 391), ('峰力', 380), ('高端', 378), ('骨传导', 333), ('充电款', 326), ('瑞声达', 270), ('专用', 233), ('充电式', 194), ('耳内式', 183), ('纽扣', 172), ('降噪', 166), ('老年人专用', 161), ('耳机', 158), ('干燥盒', 145), ('旗舰', 134), ('电子', 128), ('奥迪康', 124), ('A13', 121), ('纽扣电子', 115), ('A10', 111), ('盒式', 105), ('A312', 104), ('声音放大', 104), ('助听', 100), ('中重度', 98), ('原装', 97), ('原装进口', 96), ('配件', 95), ('新款', 95), ('新型', 93), ('拾音器', 91), ('A675', 88), ('医用级', 86), ('科大讯飞', 86), ('自然之声', 82), ('宝尔通', 81), ('有线', 81), ('年轻', 80), ('骨传感', 80), ('老年', 79), ('超大功率', 76), ('可充电', 76), ('中重度耳聋', 76), ('锌空气', 71), ('未来客', 71), ('中老年人', 69), ('智能', 68), ('进口', 65), ('听力下降', 64), ('力斯顿', 63), ('16通道', 60), ('挂脖式', 59), ('辅听器', 57), ('仁和', 57), ('德国进口', 56), ('优利康', 56), ('电池款', 56), ('西嘉', 56), ('64通道', 55), ('蓝牙耳机', 54), ('听工场', 54), ('飞利浦', 53), ('人工耳蜗', 53), ('通用', 52), ('定制', 52), ('西万博', 52), ('放大器', 50), ('上门验配', 50), ('防丢绳', 50), ('智能降噪', 50), ('防丢', 49), ('耳鸣', 48), ('无线充电', 48), ('耳背机', 48), ('助听耳机', 48), ('一体机', 47), ('耳蜗式', 47), ('上门安装', 46), ('助听耳器', 45), ('专用电池', 45), ('助听机', 45), ('西万拓', 45)] 

结果说明:

  • 最值得研究的关键词:根据2/8原则,筛选出最常见的20%的关键词(例如“核心功能”、“佩戴方式”)。
  • 这些关键词能够代表市场上最重要的特性或消费者需求的集中区域。比如,核心功能 的出现频率高,说明它对产品描述和市场需求的重要性较大。

总结:

通过 2/8原则 筛选关键词,能够帮助我们更高效地聚焦于最具代表性的关键词。这些关键词不仅能提升产品的市场吸引力,还能为后续的商业决策提供有价值的洞察。

3.4 可视化关键词频率:使用Vega-Lite

为了让数据分析更加直观,我们可以使用Vega-Lite进行数据可视化。通过将关键词的频率以条形图的形式展示,商家和分析师可以更清晰地看到每个关键词的市场热度。

import altair as alt

# 创建关键词频率的DataFrame
keyword_df = pd.DataFrame(list(keyword_count.items()), columns=['关键词', '频率'])

# 使用Vega-Lite创建条形图
chart = alt.Chart(keyword_df).mark_bar().encode(
    x='频率:Q',
    y='关键词:N',
    color='关键词:N'
).properties(
    title='商品标题中关键词频率分析'
)

chart.show()

通过这种可视化,商家可以一目了然地看到哪些关键词在商品标题中出现得最多,进而在市场推广中调整策略。比如,如果“耳背”和“耳聋”这两个词的频率远高于其他词汇,那么商家可以考虑在广告和产品描述中强化这些功能的特点。

Vega-lite气泡图

如果关键词和频次已经在 top_keywords 中,并且我们希望生成一个 Vega-Lite JSON 模板 来可视化这些数据,可以通过 Vega-Lite 生成适当的图表配置。为了避免条形图显示过多数据,可以选择用 词云气泡图 等方式来展示关键词和频次。

这里我们将生成一个 Vega-Lite 的 JSON 配置,使用 气泡图(Bubble Chart) 来展示关键词及其频率。这种方式能很好地处理大量关键词,并且通过气泡的大小表示频次大小,避免了条形图的拥挤。

import json

# 假设top_keywords是已经统计好的关键词和频次列表
top_keywords = [
    ('耳背', 3236),
    ('耳聋', 3023),
    ('老人专用', 1360),
    ('无线', 1184),
    ('隐形', 1126),
    ('蓝牙', 868),
    ('正品', 694),
    ('年轻人', 684),
    ('重度耳聋', 662),
    ('助听器', 522)
]

# 将top_keywords转化为DataFrame格式
values = [{'Keyword': keyword, 'Frequency': frequency} for keyword, frequency in top_keywords]

# 创建Vega-Lite JSON模板
vega_lite_json = {
    "data": {
        "values": values
    },
    "mark": "point",
    "encoding": {
        "x": {
            "field": "Keyword",
            "type": "nominal",
            "axis": {"title": "关键词"}
        },
        "y": {
            "field": "Frequency",
            "type": "quantitative",
            "axis": {"title": "频次"}
        },
        "size": {
            "field": "Frequency",
            "type": "quantitative",
            "legend": {"title": "关键词大小"}
        },
        "color": {
            "field": "Keyword",
            "type": "nominal",
            "legend": {"title": "关键词"}
        },
        "tooltip": [
            {"field": "Keyword", "type": "nominal", "title": "关键词"},
            {"field": "Frequency", "type": "quantitative", "title": "频次"}
        ]
    },
    "title": "关键词频次气泡图"
}

# 将Vega-Lite JSON转换为字符串并打印
vega_lite_json_str = json.dumps(vega_lite_json, indent=4)
print(vega_lite_json_str)

代码解析:

  1. 数据准备

    • top_keywords 是你提供的包含关键词和频次的列表。我们将其转换为一个字典列表 data,以便作为 Vega-Lite 输入的数据。
  2. Vega-Lite JSON 配置

    • data:使用 values 来传递 data,这些是我们要展示的关键词和频率。
    • mark:选择使用 point 来绘制气泡图(bubble chart)。
    • encoding:对 xy 进行编码,x 显示关键词,y 显示频次。size 控制气泡的大小,color 用于给不同的关键词着色,tooltip 显示每个气泡的关键词和频次。
    • title:设置图表的标题。
  3. 生成 JSON 模板

    • 我们使用 json.dumps 将生成的 Vega-Lite JSON 对象转换为格式化的 JSON 字符串,这样你就可以直接将这个 JSON 模板应用于 Vega-Lite 可视化工具了。

Vega-Lite JSON 输出示例:

{
    "data": {
        "values": [
            {"Keyword": "耳背", "Frequency": 3236},
            {"Keyword": "耳聋", "Frequency": 3023},
            {"Keyword": "老人专用", "Frequency": 1360},
            {"Keyword": "无线", "Frequency": 1184},
            {"Keyword": "隐形", "Frequency": 1126},
            {"Keyword": "蓝牙", "Frequency": 868},
            {"Keyword": "正品", "Frequency": 694},
            {"Keyword": "年轻人", "Frequency": 684},
            {"Keyword": "重度耳聋", "Frequency": 662},
            {"Keyword": "助听器", "Frequency": 522}
        ]
    },
    "mark": "point",
    "encoding": {
        "x": {
            "field": "Keyword",
            "type": "nominal",
            "axis": {"title": "关键词"}
        },
        "y": {
            "field": "Frequency",
            "type": "quantitative",
            "axis": {"title": "频次"}
        },
        "size": {
            "field": "Frequency",
            "type": "quantitative",
            "legend": {"title": "关键词大小"}
        },
        "color": {
            "field": "Keyword",
            "type": "nominal",
            "legend": {"title": "关键词"}
        },
        "tooltip": [
            {"field": "Keyword", "type": "nominal", "title": "关键词"},
            {"field": "Frequency", "type": "quantitative", "title": "频次"}
        ]
    },
    "title": "关键词频次气泡图"
}

3.5 Python和Vega-lite集成

  1. Python 部分:生成 Vega-Lite JSON 配置并存储为全局变量
  2. JavaScript 部分:调用 vegaEmbed 渲染图表

步骤 1:Pyodide中生成并存储 Vega-Lite 配置

我们已经在Pyodide运行环境中用Python代码生成了 Vega-Lite JSON 配置,接下来将其存储在一个全局变量中,以便 JavaScript 可以访问。

# 将Vega-Lite JSON对象转为字符串并存储在全局变量中
import js
window = js.window  # 在Pyodide中使用js.window模拟JavaScript的window
window.vega_lite_json = json.dumps(vega_lite_json)

步骤 2:在 JavaScript 中调用 vegaEmbed 渲染图表

在 JavaScript 中,我们将使用 vegaEmbed 函数来渲染图表,并且我们需要等待渲染的结果。使用 await 来确保在图表生成后再执行后续操作。


import "https://juguandian.com/vega5.min.js";
import "https://juguandian.com/vegalite5.min.js";
import "https://juguandian.com/vega-embed.min.js";

// 在 JavaScript 中调用 vegaEmbed
const spec = JSON.parse(window.vega_lite_json);  // 获取存储的 JSON 配置

// 配置项可以在此处添加,如设置默认字体、颜色等
const config =  {
    // default view background color
    // covers the entire view component
    background: "#efefef",
    axis: {
        labelFont: "serif",
        labelFontSize: 16,
        tickWidth: 3,
        tickColor: "red",
    }
};

 // 调用 vegaEmbed 渲染图表
await vegaEmbed("#vis", spec, {
    config: config,
    tooltip: { theme: "dark" }
});

步骤 3:在 HTML 中显示图表

在你的 HTML 文件中,确保包含一个用于渲染图表的 div 容器:

    <div id="vis" style="width: 800px; height: 600px;"></div>  <!-- 这里将显示图表 -->

代码解释:

  1. Python 部分

    • 我们通过 json.dumps 将生成的 Vega-Lite JSON 配置转化为字符串,并将其存储在 window 全局变量中。这使得 JavaScript 能够直接访问该配置。
  2. JavaScript 部分

    • 我们使用 JSON.parse(window.vega_lite_json) 获取从 Pyodide 环境传递过来的 Vega-Lite 配置。
    • 使用 vegaEmbed 渲染图表,指定容器 #vis 和图表配置。
    • await vegaEmbed(...) 确保图表渲染完成后,才执行其他操作。
  3. HTML 部分

    • 确保页面有一个 div 容器用于显示图表。

可视化效果:

  • 气泡图:每个关键词将以气泡的形式显示,气泡的大小与该关键词的出现频次成正比,频次越高,气泡越大。
  • 颜色:不同的关键词用不同的颜色标示,使得图表更加直观易读。
  • Tooltip:鼠标悬停在气泡上时,会显示关键词和其频次,帮助用户获取更多的信息。

vega-lite_bubble

总结:

通过将关键词的频率数据映射到气泡图中,我们能够有效地展示关键词的相对重要性和频次分布。Vega-Lite 通过这种方式,使得复杂的频次数据变得直观易懂,为商家提供了有力的数据可视化支持。

Pyodide 环境中调用 vegaEmbed 函数,并传递 Vega-Lite JSON 配置,可以通过 await 异步方式执行。这种方法确保了图表的渲染可以在数据加载完成后进行。我们将结合 JavaScriptVega-Lite 配置生成的方式来实现这一目标。

通过这种方式,您可以将 Python 中生成的 Vega-Lite 配置传递到 JavaScript 中,然后使用 vegaEmbed 渲染图表并显示在网页上。气泡图(Bubble Chart)将会展示关键词及其频次,帮助用户更直观地理解数据。

3.6 准备D3.js词云数据

Vega-Lite 本身并不直接支持生成词云,因为词云的布局通常需要特定的算法来确定单词的位置和大小,这超出了 Vega-Lite 的核心功能。然而,你可以通过一些间接的方法来近似实现词云的效果,或者使用专门为此目的设计的工具或库,如 d3-cloud。

使用 D3-Cloud 显示 Top Keywords 词云

在这一节中,我们将使用 D3-Cloud 来渲染 Top Keywords 词云。D3-Cloud 是一个基于 D3.js 构建的 JavaScript 库,专门用于生成动态和交互式的词云图。相比传统的 Vega-Lite 配置,D3-Cloud 提供了更强的自定义功能,并能生成更具视觉冲击力的词云效果。

  1. 利用 D3-Cloud 渲染关键词的词云图。
  2. 基于 top_keywords 中的频次信息,调整每个词的大小。
  3. 提供交互式效果,让用户能够与词云图进行交互(如鼠标悬停显示频次)。
  4. 增强可视化的吸引力和用户体验,帮助分析市场趋势。

准备数据

我们首先从 Top Keywords 列表中提取关键词和对应的频次,然后将其格式化为 D3-Cloud 所需的格式。D3-Cloud 需要的输入格式为一个包含词汇和频次信息的数组。

示例数据格式

[
    {"text": "耳背", "size": 3236},
    {"text": "耳聋", "size": 3023},
    {"text": "老人专用", "size": 1360},
    {"text": "无线", "size": 1184},
    {"text": "隐形", "size": 1126},
    {"text": "蓝牙", "size": 868},
    {"text": "正品", "size": 694},
    {"text": "年轻人", "size": 684},
    {"text": "重度耳聋", "size": 662},
    {"text": "助听器", "size": 522}
]

好的,假设你有一个 word_values 列表,它是一个包含关键词 (Keyword) 和词频 (Frequency) 的列表,现在你想将其转化为 D3-Cloud 适用的格式。具体来说,D3-Cloud 需要的数据格式是 {text: "关键词", size: 字体大小},其中 size 是根据 Frequency 转化为字体大小的。

我们可以通过将 word_values 列表中的 Frequency 转化为一个合理的字体大小,然后将其转化为 D3-Cloud 需要的格式。我们可以做以下的步骤:

  1. 将词频 (Frequency) 转化为字体大小 (size)。这里你可以设置一个比例尺,根据词频大小映射到字体大小。
  2. word_values 转化为 {text, size} 格式,以便 D3-Cloud 可以直接使用。

Python 示例代码:

假设你的 word_values 列表是这样的:

word_values = [
    {'Keyword': '耳背', 'Frequency': 3236},
    {'Keyword': '耳聋', 'Frequency': 3023},
    {'Keyword': '老人专用', 'Frequency': 1360},
    {'Keyword': '无线', 'Frequency': 1184},
    {'Keyword': '隐形', 'Frequency': 1126},
    {'Keyword': '蓝牙', 'Frequency': 868},
    {'Keyword': '正品', 'Frequency': 694},
    {'Keyword': '年轻人', 'Frequency': 684},
    {'Keyword': '重度耳聋', 'Frequency': 662},
    {'Keyword': '助听器', 'Frequency': 522}
]

我们可以将这个 word_values 列表转化为适用于 D3-Cloud 的格式,如下所示:

# 将word_values转化为d3-cloud需要的格式 {text: "Keyword", size: "Font Size"}
# 你可以根据需求设置字体大小的比例
min_size = 10  # 设置最小字体大小
max_size = 100  # 设置最大字体大小

# 计算词频的最大值和最小值
min_frequency = min([d['Frequency'] for d in word_values])
max_frequency = max([d['Frequency'] for d in word_values])

# 将Frequency映射到font size
def frequency_to_size(frequency, min_frequency, max_frequency, min_size, max_size):
    return min_size + (frequency - min_frequency) * (max_size - min_size) / (max_frequency - min_frequency)

# 转化为d3-cloud格式
d3_cloud_data = [{
    'text': word['Keyword'],
    'size': frequency_to_size(word['Frequency'], min_frequency, max_frequency, min_size, max_size)
} for word in word_values]

# 输出转换后的数据
window.d3_cloud_data = json.dumps(d3_cloud_data)

代码解析:

  1. 设置字体大小的范围

    • 我们定义了 min_sizemax_size 来设置最小和最大的字体大小。这些值是你希望词云中最小和最大的字体大小。
  2. 词频到字体大小的映射

    • 使用 frequency_to_size 函数将 Frequency 转化为相应的字体大小。通过比例公式 min_size + (frequency - min_frequency) * (max_size - min_size) / (max_frequency - min_frequency),我们将词频(Frequency)映射到设定的字体大小范围内。
  3. 数据转化

    • 我们使用列表推导将 word_values 中的每个元素转换为 {'text': "关键词", 'size': 字体大小} 格式。每个 Frequency 会被映射为一个 size(字体大小)。

输出结果示例:

{'text': '耳背', 'size': 100.0}
{'text': '耳聋', 'size': 94.84032212074968}
{'text': '老人专用', 'size': 57.67964424149934}
{'text': '无线', 'size': 48.09894601658717}
{'text': '隐形', 'size': 45.29418654044129}
{'text': '蓝牙', 'size': 35.07415736650898}
{'text': '正品', 'size': 24.783586019276473}
{'text': '年轻人', 'size': 23.701402347968345}
{'text': '重度耳聋', 'size': 22.47562280000056}
{'text': '助听器', 'size': 10.0}

3.7 配置 D3-Cloud 词云

D3-Cloud 提供了一个功能强大的 API 来绘制词云图,我们可以使用它来调整词云的布局、样式、颜色和大小等。

以下是我们用来显示 Top Keywords 词云的 JavaScript 代码示例:


import 'https://juguandian.com/d3.v5.min.js'
import 'https://juguandian.com/d3.layout.cloud.min.js'

// 在 JavaScript 中调用 word_values
const values = JSON.parse(window.d3_cloud_data);  // 获取存储的 JSON 数据

var layout = d3.layout.cloud()
    .size([800, 500])
    .words(values.map(function(d) {
      return {text: d.Keyword, size: d.Frequency};
    }))
    .padding(5)
    .rotate(function() { return ~~(Math.random() * 2) * 90; })
    .font("Impact")
    .fontSize(function(d) { return d.size; })
    .on("end", draw);

layout.start();

function draw(words) {
  d3.select("#wordcloud").append("svg")
      .attr("width", layout.size()[0])
      .attr("height", layout.size()[1])
    .append("g")
      .attr("transform", "translate(" + layout.size()[0] / 2 + "," + layout.size()[1] / 2 + ")")
    .selectAll("text")
      .data(words)
    .enter().append("text")
      .style("font-size", function(d) { return d.size + "px"; })
      .style("font-family", "Impact")
      .attr("text-anchor", "middle")
      .attr("transform", function(d) {
        return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
      })
      .text(function(d) { return d.text; });
}

这段代码使用了 D3.jsd3.layout.cloud 来创建一个动态的词云(Word Cloud)。它将关键词(Keyword)及其对应的频次(Frequency)数据映射到一个图形中,其中词云中的每个词的大小与它的频次成正比,同时,词云的布局是随机的。接下来我会详细解析这段代码。

1. 初始化词云布局 (d3.layout.cloud)

var layout = d3.layout.cloud()
    .size([800, 500])
  • d3.layout.cloud():这是 D3.js 的一个插件,用来创建词云布局。
  • .size([800, 500]):设置词云的大小为 800px 宽,500px 高。这个参数决定了词云图的画布尺寸。

2. 设置词云的内容和频次

.words(values.map(function(d) {
  return {text: d.Keyword, size: d.Frequency};
}))
  • .words(values.map(...))values 是包含关键词和频次的数组。map() 用来遍历每个元素,将每个 KeywordFrequency 转换为 {text, size} 对象,其中 text 是关键词,size 是它的频次。
  • 这样做是因为 D3-Cloud 需要一个对象数组,格式是 {text: "词语", size: 词频},然后根据这些数据生成词云。

3. 设置词之间的间距和旋转

.padding(5)
.rotate(function() { return ~~(Math.random() * 2) * 90; })
  • .padding(5):设置每个词之间的间距为 5px。词云中的每个词都会有一定的间距,以防止重叠。
  • .rotate(function() { return ~~(Math.random() * 2) * 90; }):每个词的旋转角度随机选择 0 或 90 度(随机选择方向)。~~ 是一个快捷的取整操作,Math.random() * 2 随机生成 0 或 1,乘以 90 使得每个词的角度要么是 0 度(水平),要么是 90 度(垂直)。

4. 字体和字体大小

.font("Impact")
.fontSize(function(d) { return d.size; })
  • .font("Impact"):设置词云中所有词的字体为 Impact。可以根据需要替换为其他字体。
  • .fontSize(function(d) { return d.size; }):根据每个词的 size 属性设置其字体大小。词频越高,字体越大。这是词云的核心,频次决定了每个词的大小。

5. 设置渲染完成后的回调函数

.on("end", draw);
  • .on("end", draw):当词云布局计算完成后,调用 draw 函数进行渲染。draw 函数负责将计算出的布局绘制到页面上。

6. 启动布局计算

layout.start();
  • layout.start():开始计算词云布局。这会触发 d3.layout.cloud() 进行布局计算,并在布局完成后调用 draw 函数来绘制词云。

7. 绘制词云

function draw(words) {
  d3.select("#wordcloud").append("svg")
      .attr("width", layout.size()[0])
      .attr("height", layout.size()[1])
  • d3.select("#wordcloud"):选择 HTML 中 id 为 wordcloud 的元素,作为词云的容器。
  • .append("svg"):在容器中添加一个 SVG 元素,词云将绘制在这个 SVG 画布上。
  • .attr("width", layout.size()[0]).attr("height", layout.size()[1]):设置 SVG 画布的宽度和高度,等于词云的布局尺寸。

8. 设置词云的位置

.append("g")
    .attr("transform", "translate(" + layout.size()[0] / 2 + "," + layout.size()[1] / 2 + ")")
  • .append("g"):添加一个 <g> 元素来容纳所有词,因为我们需要将所有词一起进行平移。
  • .attr("transform", "translate(" + layout.size()[0] / 2 + "," + layout.size()[1] / 2 + ")"):将 <g> 元素平移到词云中心,这样可以确保词云位于画布的中央。

9. 添加每个单词到词云

.selectAll("text")
    .data(words)
    .enter().append("text")
    .style("font-size", function(d) { return d.size + "px"; })
    .style("font-family", "Impact")
    .attr("text-anchor", "middle")
    .attr("transform", function(d) {
      return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
    })
    .text(function(d) { return d.text; });
  • .selectAll("text"):选择所有的 <text> 元素,用来渲染每个词。
  • .data(words):绑定数据。words 是词云布局计算完成后的词语和其位置、大小、旋转等信息。
  • .enter().append("text"):对于每个数据项,创建一个新的 <text> 元素。
  • .style("font-size", function(d) { return d.size + "px"; }):设置每个词的字体大小,大小根据 d.size(即频次)来设置。
  • .style("font-family", "Impact"):设置字体为 Impact
  • .attr("text-anchor", "middle"):设置文本的对齐方式为居中。
  • .attr("transform", function(d) { return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")"; }):根据词云计算的结果,设置每个词的位移(d.x, d.y)和旋转角度(d.rotate)。
  • .text(function(d) { return d.text; }):显示每个词的文本。

总结:

这段代码使用 D3-Cloud 来生成一个动态的词云图,词云的词汇大小根据频次进行调整,词语的位置和旋转角度是自动计算的。通过这样的方式,用户可以快速识别出数据中的重要关键词,帮助进行进一步的分析。

Screenshot%20from%202025-03-07%2017-31-06

相比于传统的条形图或饼图,词云更加直观和富有创意,能够帮助我们迅速识别出高频关键词。此外,D3-Cloud 提供了灵活的布局选项和自定义功能,可以根据具体需求调整词云的呈现方式。

在市场分析中,这样的词云不仅能够帮助企业识别热词和趋势,还能揭示消费者对某些特性或功能的关注度。

3.8 关键词共现分析:揭示消费者关注的产品特性

通过关键词共现分析,我们可以揭示消费者在购买时对不同特性之间的关联。比如,“耳背”和“耳聋”是否总是出现在同一标题中?这可能表明消费者在选择产品时同时看重这些功能。

为了计算关键词之间的共现频率(即关键词在同一商品标题中同时出现的次数),我们需要创建一个共现矩阵。共现矩阵的每个元素表示两个关键词在同一标题中出现的次数。

下面是如何实现这一目标的代码,计算 商标适用人群核心功能 等字段中的关键词共现,并打印一个示例样本。

计算关键词共现

我们根据从 产品特性 字段中提取出的各个分类名称,提取出每一对关键词,并计算它们之间的共现频率。

from itertools import combinations

# 计算关键词对的共现频率
co_occurrence = {}

# 遍历所有商品标题
for idx, row in df.iterrows():
    # 获取当前商品标题中的所有关键词
    keywords_in_title = set()
    for col in all_features:
        keywords_in_title.update(row[col].split(','))

    # 计算每对关键词的共现
    for keyword1, keyword2 in combinations(keywords_in_title, 2):
        if (keyword1, keyword2) not in co_occurrence:
            co_occurrence[(keyword1, keyword2)] = 0
        co_occurrence[(keyword1, keyword2)] += 1

# 打印共现矩阵的示例样本
sample_co_occurrence = {key: co_occurrence[key] for key in list(co_occurrence)[:5]}  # 取前5对示例
print(sample_co_occurrence)

输出结果

假设我们得到了如下的共现频率示例:

{
    ('耳背', '助听'): 3,
    ('耳背', '老人'): 3,
    ('耳聋', '耳背'): 3,
    ('老人', '年轻人'): 2,
    ('耳背', '耳聋'): 3
}

解释与应用

  1. 共现频率

    • ('耳背', '助听'): 这个词对在3个标题中同时出现,说明“耳背”和“助听”这两个关键词往往一起出现在商品标题中。
    • ('耳背', '老人'): 这个关键词对也出现了3次,表明“耳背”这个功能与“老人”这个适用人群有较强的关联性。
    • ('耳聋', '耳背'): 频率为3,意味着“耳背”和“耳聋”这两个功能在同一商品标题中经常出现。
  2. 商业洞察

    • 如果某些关键词对频繁共现(例如,“耳背”和“老人”),商家可以推测出这两个特性在消费者购买决策中占有重要地位。商家可以根据这些信息优化产品描述、市场推广以及目标人群定位。
    • 同样,“耳背”和“助听”的频繁共现表明,这两个功能可能是消费者最关心的,因此在广告和产品说明中,强调这两个功能可能会增加购买率。

小结

通过计算共现频率,我们能够更好地理解消费者在选择商品时关注的关键词组合。这不仅帮助商家优化产品标题,还能为他们提供有价值的市场洞察,帮助其制定精准的营销策略和产品改进方向。

第4章:关键词共现数据可视化:动态词云与引力布局

在数据分析的过程中,我们经常面对复杂的词汇关系,如何高效地展示这些词汇及其关联,成为了现代数据可视化的一个重要挑战。在电商、社交媒体、以及市场分析等领域,关键词的共现分析(co-occurrence analysis)已经成为揭示词汇间内在联系的一项重要工具。而当我们将这些关键词通过动态词云进行展示时,词汇的频率和它们之间的关联性便能一目了然地呈现出来。

在这一章节中,我们将介绍如何使用 D3.js 和力导向图(Force-Directed Graph)来展示基于词频和词汇之间的共现关系的动态词云图。通过这一方法,不仅能够体现出词汇的热度,还能直观地展示词与词之间的内在联系。

4.1 动态词云:不仅仅是美观的展示

词云作为一种数据可视化工具,以其简洁、直观的特点,广泛应用于展示文本数据中的关键词频次。在传统的静态词云中,词汇的大小通常与其出现频率相关,而在这里,我们进一步引入了词与词之间的关联关系,让词云的展示不仅限于频次大小,还能通过力导向布局的方式展现词汇之间的相对位置。

在我们的实现中,D3.js 提供了强大的 力导向图(Force-Directed Graph)布局功能,这种图形通过模拟物理世界中的力学作用(如引力、斥力、弹簧力等),使得节点(即词汇)在图中以特定的方式分布。词频越高,词汇的节点就越大;而一对词的共现频次越高,它们之间的引力也就越强,节点之间就会被拉得更近。最终,生成的动态词云不仅仅是一堆随机分布的词,而是通过力学模拟,呈现出词汇之间的内在联系。

4.2 关键词共现与引力布局的结合

为了实现这一目标,我们需要两个数据集:词频数据词与词之间的关联数据。词频数据通常是一个包含每个词和其频次的数据列表,而关联数据则描述了词与词之间的共现频次。

假设我们有以下数据:

  • 词频数据 (values):每个词的出现频次,如 {text: "耳背", size: 64},表示词 "耳背" 出现了 64 次。
  • 词关联数据 (links):每一对词的共现频次,如 {source: "耳背", target: "老年人", value: 221},表示 "耳背""老年人" 共同出现了 221 次。

在这个实现中,我们将使用 D3.js 中的 forceSimulation 进行力导向图的布局,使得词频高的节点(词汇)显示得更大,而共现频次高的词对则会被拉得更近。

以下是完整的代码实现,结合了词频和词汇关联,使用 D3.js 绘制动态词云。

1. 数据准备

// 词频数据(每个词和对应的出现频次)
const values = JSON.parse(window.d3_cloud_data);  // 获取存储的 JSON 数据,其中每个元素形如 {text: "耳背", size: 64},表示每个词和词频
const links = JSON.parse(window.word_associations); // 获取词汇之间的共现关系,形如 {source: "耳背", target: "老年人", value: 221}
解释:
  • values 包含词汇及其出现的频次,每个元素包括一个 text 字段表示词汇,size 字段表示频次(即该词的大小)。
  • links 包含了词汇之间的关系,每个元素表示一对词和它们之间的共现频次。sourcetarget 是两种不同的词,而 value 是它们的共现频次。

通过 JSON.parse,我们将这些数据从字符串格式转为 JavaScript 对象。

2. 创建节点数据

// 准备节点数据(词汇)
const nodes = [];
values.forEach(word => {
    // 将每个词和它的频次数据转化为节点对象,节点大小由频次决定
    nodes.push({id: word.text, size: word.size});
});
解释:
  • 我们从 values 中提取出每个词汇(word.text)和它的频次(word.size),并将它们转化为 节点对象,存储在 nodes 数组中。
  • 每个节点对象包含 id(节点的词汇名称)和 size(词汇的频次,决定了节点的大小)。

3. 设置力导向图布局

// 设置画布的宽度和高度
const width = 1200;
const height = 600;

// 创建D3力导向图布局
const simulation = d3.forceSimulation(nodes)
    .force("link", d3.forceLink(links).id(d => d.id).distance(d => Math.max(300 - d.value / 4, 50)))  // 设置连接力,使得频次越高的词之间的距离越小
    .force("charge", d3.forceManyBody().strength(-200))  // 设置节点之间的斥力,防止节点过于靠近
    .force("center", d3.forceCenter(width / 2, height / 2));  // 使图形居中,避免节点分布不均
解释:
  • d3.forceSimulation(nodes) 创建一个力导向图模拟,nodes 是图中的所有节点数据。
  • .force("link", ...) 定义了词对之间的力:我们使用 d3.forceLink(links) 来设置词对之间的引力,links 数据描述了词对及其共现频次。distance(d => Math.max(300 - d.value / 4, 50)) 表示两个词的距离基于它们的共现频次进行调整,频次越高,词语越接近。
  • .force("charge", ...) 设置节点之间的斥力,strength(-200) 表示节点之间会相互排斥,防止重叠。
  • .force("center", ...) 将图形居中,使得所有节点集中在画布的中心。

4. 创建SVG元素

// 创建SVG画布,并设置其宽度和高度
const svg = d3.select("#wordcloud2").append("svg")
    .attr("width", width)
    .attr("height", height);
解释:
  • 通过 d3.select("#wordcloud2"),我们选择一个 DOM 元素(这里是 #wordcloud2),在这个元素内创建一个 svg 元素来绘制我们的图形。
  • attr("width", width).attr("height", height) 设置了 SVG 的宽度和高度。

5. 绘制链接(词对之间的关系)

// 绘制词与词之间的连接(即链接)
const link = svg.append("g")
    .selectAll(".link")  // 选择所有的链接元素
    .data(links)  // 绑定链接数据
    .enter().append("line")  // 为每个链接数据创建一条线
    .attr("class", "link")  // 为每条线设置CSS类名
    .style("stroke-width", d => Math.sqrt(d.value) / 10);  // 设置线条的宽度,频次越高,线条越粗
解释:
  • link 代表词与词之间的链接(即线条)。我们为每个词对(links 中的每个元素)创建一条线。
  • d3.selectAll(".link") 选择所有的链接元素。
  • .data(links) 将数据绑定到这些链接元素。
  • .style("stroke-width", d => Math.sqrt(d.value) / 10) 设置线条的宽度,频次越高的词对,其线条的宽度越大。通过 Math.sqrt(d.value) / 10 控制线条粗细,避免过粗的线条。

6. 绘制节点(词汇)

// 绘制节点(词汇)
const node = svg.append("g")
    .selectAll(".node")  // 选择所有的节点元素
    .data(nodes)  // 绑定节点数据
    .enter().append("circle")  // 为每个节点数据创建一个圆形
    .attr("class", "node")  // 为每个节点设置CSS类名
    .attr("r", d => d.size)  // 节点的半径由词频大小决定,词频越大,节点越大
    .style("fill", "#69b3a2")  // 节点的颜色设置为绿色
    .call(d3.drag()  // 允许拖动节点
        .on("start", dragStarted)  // 拖动开始时的行为
        .on("drag", dragged)  // 拖动中的行为
        .on("end", dragEnded));  // 拖动结束时的行为
解释:
  • node 代表词汇的节点,每个节点用圆形表示。
  • .attr("r", d => d.size) 设置节点的半径,节点的大小与词汇的频次 size 成正比,频次越高,节点越大。
  • .style("fill", "#69b3a2") 设置节点的颜色为绿色。
  • d3.drag() 允许用户拖动节点,增强交互性。

7. 绘制节点标签(显示词汇文本)

// 节点标签(显示词汇)
const labels = svg.append("g")
    .selectAll(".label")
    .data(nodes)
    .enter().append("text")  // 为每个节点创建文本元素
    .attr("class", "label")  // 设置CSS类名
    .attr("dx", 12)  // 设置标签的X偏移量,使其稍微偏离节点的中心
    .attr("dy", ".35em")  // 设置标签的Y偏移量,使其在节点的正中央显示
    .text(d => d.id);  // 设置标签的文本为词汇的名称
解释:
  • labels 用于绘制节点的标签,标签显示的是词汇名称(例如 "耳背")。
  • .attr("dx", 12).attr("dy", ".35em") 设置文本的偏移量,使标签稍微偏离节点的中心位置,避免重叠。

8. 更新图形位置

// 更新图形的位置,随着力导向图的迭代,节点和链接的位置会动态变化
simulation.on("tick", () => {
    link  // 更新链接的位置
        .attr("x1", d => d.source.x)  // 设置每条线的起始位置X
        .attr("y1", d => d.source.y)  // 设置每条线的起始位置Y
        .attr("x2", d => d.target.x)  // 设置每条线的结束位置X
        .attr("y2", d => d.target.y);  // 设置每条线的结束位置Y

    node  // 更新节点的位置
        .attr("cx", d => d.x)  // 设置节点的X坐标
        .attr("cy", d => d.y);  // 设置节点的Y坐标

    labels  // 更新标签的位置
        .attr("x", d => d.x)  // 设置标签的X坐标
        .attr("y", d => d.y);  // 设置标签的Y坐标
});
解释:
  • simulation.on("tick", ...) 监听力导向图每一轮的迭代,并更新节点和链接的位置。
  • link.attr("x1", ...)link.attr("y1", ...) 更新链接的起始点位置,x2y2 更新结束点的位置。
  • node.attr("cx", ...)node.attr("cy", ...) 更新每个节点的坐标,使其随力导向图的计算而移动。
  • labels.attr("x", ...)labels.attr("y", ...) 更新标签的位置,确保标签与节点保持一致。

9. 拖动行为

// 拖动行为的处理函数
function dragStarted(event, d) {
    if (!event.active) simulation.alphaTarget(0.3).restart();
    d.fx = d.x;
    d.fy = d.y;
}

function dragged(event, d) {
    d.fx = event.x;
    d.fy = event.y;
}

function dragEnded(event, d) {
    if (!event.active) simulation.alphaTarget(0);
    d.fx = null;
    d.fy = null;
}
解释:
  • dragStarted:拖动开始时,将节点的位置锁定,使其不随力导向图的更新而变化。
  • dragged:拖动过程中,更新节点的位置。
  • dragEnded:拖动结束时,解除节点的位置锁定,让节点继续参与力导向图的计算。

4.3 动态词云的优势与应用

通过这段代码,我们实现了一个动态词云的可视化,词频越高的词汇节点越大,词与词之间的引力和排斥力基于它们的共现频次进行调整。动态词云能够直观地展示词汇的频次以及它们之间的关联,特别适用于以下应用场景:

  • 市场分析:可以通过分析产品标题中的关键词及其关联,帮助商家了解消费者需求的变化。
  • 社交媒体分析:通过分析社交平台上热门话题之间的关系,揭示用户讨论的趋势。
  • 文本分析:在大规模文本数据中,识别出重要关键词并分析它们之间的关系,帮助从海量信息中提取有价值的洞察。

4.4 总结

通过结合 D3-CloudD3-Force,我们能够创建一个动态、互动性强的词云图,既能展示关键词的频次,还能直观地呈现词汇之间的关联性。这种方法不仅增加了词云图的可视化深度,也为市场分析、社交媒体分析等领域提供了强有力的工具,帮助企业和分析师从复杂的数据中提取出有意义的见解。

第五章:结果解释与商业洞察

在电商平台如淘宝、京东等市场中,商家面临着不断变化的消费者需求和激烈的市场竞争。为了在这个竞争激烈的市场中脱颖而出,商家需要依赖数据分析来精准地把握消费者需求和市场动向。尤其是在关键词分析方面,商家可以通过深入挖掘关键词的频率、共现关系、聚类结果等,获取有价值的商业洞察。本章将带您走进关键词分析的深度,探索如何从数据中提炼出对商家和企业家有意义的市场趋势与商业决策支持。

5.1 关键词的重要性排序:如何识别最具商业价值的关键词

在我们前几章的分析中,我们对大量商品标题中的关键词进行了统计和分析。我们利用 关键词频率共现关系聚类分析 等技术对关键词进行了细致的研究。接下来,我们将综合这些信息,排序出最具商业价值的关键词。

根据频率排序关键词

关键词的频率直接反映了市场上哪些特性或者需求最为普遍。例如,在助听器产品的关键词中,如果“耳背”这一关键词频繁出现,那么可以推测市场对“耳背”这一特性的需求相对较高。商家可以基于这些高频关键词来优化产品的标题,提升搜索排名,从而吸引更多的潜在消费者。

通过 Pandas,我们可以轻松计算出关键词的出现频率,并根据频率排序,识别出频繁出现在商品标题中的关键词。

# 计算每个关键词出现的频率
keyword_counts = df['核心功能'].str.split(',').explode().value_counts()

# 输出排序后的关键词频率
print(keyword_counts)

在输出的结果中,频率高的关键词可能代表着市场中的主流需求,商家可以聚焦于这些热门关键词进行产品设计和广告推广。

根据共现关系排序关键词

关键词的 共现关系 能够揭示出哪些关键词在消费者心中通常是关联在一起的。例如,“耳背”和“助听”通常会在同一商品标题中共同出现,这可能意味着这两个特性对消费者来说是同等重要的。在这种情况下,商家可以考虑将这两个特性同时突显在产品描述中,以迎合消费者的需求。

通过共现矩阵,我们可以进一步分析关键词之间的关系,并通过 Pandas 找出共现频率较高的关键词对。

# 打印出共现频率较高的关键词对
high_co_occurrence = co_occurrence_df[co_occurrence_df['Co-occurrence'] > 1]
print(high_co_occurrence)

通过对共现关键词的排序,商家可以优化标题中的关键词组合,提高产品的曝光率。

根据聚类结果排序关键词

聚类分析为我们提供了另一个角度来理解关键词的重要性。通过 K-means 聚类,我们能够发现一些潜在的关键词组,它们在消费者眼中是密切相关的。例如,如果某个聚类包含“耳背”、“耳聋”和“助听”这几个关键词,那么我们可以推测这些关键词代表了同一类产品的共同特性。商家可以根据聚类分析的结果,将这些关键词组合在一起进行市场定位和产品推广。

# 聚类分析后的关键词排序
sorted_clusters = keyword_clusters.groupby('Cluster').apply(lambda x: x['Keyword'].tolist())
print(sorted_clusters)

通过对聚类结果的分析,商家能够更有针对性地制定营销策略,选择目标消费者群体,并且通过精准的产品描述,提升销量。

5.2 市场趋势洞察:如何根据关键词发现市场趋势

关键词不仅仅是对产品的简单描述,它们还能够反映出消费者需求的动态变化。通过对关键词的分类分析,商家可以获得对市场趋势的洞察,提前捕捉到消费者的需求变化。

市场趋势的捕捉:新兴市场 vs. 现有市场

在分析市场趋势时,我们需要关注哪些关键词代表了 新兴市场的需求,哪些则是 已有市场的主流。例如,如果我们发现“重度耳聋”在关键词中出现的频率越来越高,并且在聚类分析中被划分为一个单独的群体,那么我们可以推测这一关键词可能代表了市场中的一个新兴需求。这时,商家可以通过关注这些新兴趋势,提前推出符合需求的产品,争取先发制人的市场份额。

通过数据分析,商家还可以发现一些 “成熟” 市场中的常见关键词。例如,如果“老人”这一关键词已经在多个产品标题中频繁出现,商家可能需要调整产品特性或者营销策略,避免过于依赖已有的市场定位。

# 假设我们通过聚类分析得到的分类结果:
trend_keywords = ['耳背', '耳聋', '助听', '蓝牙', '新型']

# 从这些关键词中,我们可以进一步分析哪些属于新兴需求,哪些属于成熟需求。
new_trend_keywords = ['新型', '高端', '重度耳聋']
mature_keywords = ['耳背', '耳聋', '老人']

print("新兴市场需求关键词:", new_trend_keywords)
print("成熟市场需求关键词:", mature_keywords)

市场趋势与消费者偏好的变化

通过对关键词的深入分析,我们可以发现消费者偏好的变化。例如,随着技术的不断进步,蓝牙和智能化等关键词可能会越来越多地出现在商品标题中,这反映了消费者对高科技产品的兴趣和需求。同时,像“耳背”、“耳聋”等传统的关键词仍然在很多产品中占据主导地位,这表明老年人群体仍然是这个市场的核心消费群体。

商家可以结合这些关键词分析结果,了解不同消费者群体的偏好,从而在产品设计、营销策略以及广告投放等方面做出更具针对性的决策。

小结

在本章中,我们通过对关键词的综合排序分析和市场趋势洞察,揭示了如何通过数据分析识别商业价值较高的关键词,并深入理解消费者需求和市场变化。通过对 关键词频率共现关系聚类分析 的应用,商家可以准确地把握市场动态,抓住新兴市场机会,并对已有市场进行有效的优化。

关键词不仅是电商产品的基本描述,它们背后藏着消费者行为的复杂规律。掌握这些规律,商家便能够优化产品组合,精准定位消费者需求,从而在竞争激烈的电商市场中脱颖而出。通过数据分析与可视化,商家能够做出更加科学和有效的决策,提高销售效率,进而提升整体业务表现。

第六章:结论与建议

在电商竞争日益激烈的今天,商家必须紧密关注消费者的需求变化,并通过精准的数据分析来优化营销策略、产品设计和销售决策。前几章我们深入探讨了如何通过关键词分析捕捉市场趋势、了解消费者行为,并通过聚类分析、共现矩阵等技术手段,找出了对商家来说具有高商业价值的关键词。通过这些方法,我们不仅能够识别消费者需求的细节,还能为企业的市场策略提供强有力的数据支持。本章将总结我们的主要发现,并提出针对性的策略建议,以帮助商家在这个竞争激烈的市场中脱颖而出。

6.1 总结发现:从数据中获得的关键商业洞察

通过对大量助听器产品数据的分析,我们可以得出以下几个关键发现,这些发现为商家提供了具有重要商业价值的洞察:

  1. 关键词频率的商业价值: 高频关键词反映了市场的主流需求。比如,"耳背"和"耳聋"这样的词语频繁出现在商品标题中,表明这些特性是消费者关注的重点。因此,商家应在标题和产品描述中强化这些关键词,以提高搜索曝光率,吸引更多潜在客户。

  2. 关键词共现关系的启示: 从共现矩阵中,我们发现"耳背"和"助听"是强关联的关键词,这表明消费者对这两者有较强的联动需求。这为商家提供了重要的优化方向:可以将这两个关键词更紧密地结合在产品描述中,提高产品的吸引力和点击率。

  3. 聚类分析揭示的潜在需求: 通过K-means聚类分析,我们发现"重度耳聋"和"新型"这类关键词在市场上逐渐增多,这可能意味着消费者对更高端、更具科技感的助听器有增长的需求。商家可以通过产品创新,满足这一群体的需求,抢占新兴市场份额。

  4. 市场趋势的动态捕捉: 通过对关键词分类的分析,我们捕捉到一些关键词的变化趋势。例如,随着技术进步,"蓝牙"和"智能"等关键词逐渐成为高频词汇,表明消费者对于技术化产品的需求日益增加。与此同时,传统的关键词如"老人"和"耳背"依然占据重要位置,表明老年市场依然是这个行业的核心。

6.2 策略建议:基于数据分析的产品优化与市场营销策略

基于以上的分析结果,商家可以制定以下几项针对性的策略,以提高市场竞争力和业务表现:

产品优化建议:聚焦消费者需求变化

  1. 强化产品的核心功能: 高频词如“耳背”、“耳聋”和“助听”表明这些功能对消费者尤为重要。商家可以在产品设计中加强这些特性的突出显示,确保产品能满足市场的主流需求。此外,可以考虑结合新兴的需求趋势,如“重度耳聋”和“新型”这类关键词,以应对市场的变化。

  2. 产品创新与升级: 通过分析“新型”和“高端”等关键词的增加趋势,商家可以考虑推出更具创新性的产品。例如,结合蓝牙、智能化等新技术,开发适合年轻一代消费者的助听器产品,以满足消费者对技术感和智能化产品的偏好。

市场营销策略:精准营销与消费者定向

  1. 优化广告与推广策略: 高频且关联度高的关键词如“耳背”和“助听”可以成为广告营销的重点。商家可以通过大数据分析来定位潜在消费者,采用精准广告投放,以提高营销效果和投入产出比(ROI)。例如,可以针对老年人群体推送包含“耳背”和“助听”功能的产品广告,而针对年轻消费者则可以强调产品的智能化和新型特性。

  2. 增强市场细分与定制化: 聚类分析显示,不同的消费者群体对不同类型的助听器有不同需求。例如,针对“重度耳聋”消费者,商家可以推出高性能的助听器,并进行定向推广;而对于对“新型”和“高端”有偏好的消费者,则可以强调产品的科技感和创新特点,吸引他们的关注。

  3. 多渠道宣传与推广: 针对不同的消费者群体,商家可以通过多渠道进行推广。例如,通过社交媒体向年轻群体宣传带有“智能化”功能的助听器,而通过老年人常用的传统媒介(如电视广告、社区活动等)向老年消费者群体推荐具备“耳背”或“耳聋”功能的产品。

6.2.3 标题优化与关键词选择
  1. 优化产品标题: 根据我们对高频关键词和共现关系的分析,商家应将最具商业价值的关键词合理地嵌入到产品标题中。比如,标题可以包含“耳背”+“助听”+“蓝牙”这样的关键词组合,以提高搜索引擎的曝光率,并使消费者能够快速理解产品的核心功能。

  2. 精准选择核心关键词: 在进行关键词选择时,商家不仅要考虑关键词的频率,还要结合共现分析的结果,选择那些与其他关键词有强关联的高价值关键词。例如,“耳背”和“助听”这两个词通常同时出现在消费者的搜索中,因此,在产品页面、广告文案和关键词投放中应优先使用这些高共现关键词。

小结:通过数据分析实现商业价值最大化

通过本研究,我们展示了如何利用数据分析识别市场中的关键词趋势,并如何将这些洞察转化为具体的商业策略。通过深入分析关键词的频率、共现关系和聚类结果,商家能够更加精准地理解消费者需求,进而优化产品、营销策略和销售渠道。

然而,市场是动态变化的,消费者的需求和偏好也在不断演变。为了持续保持竞争力,商家需要定期进行数据分析,并根据市场变化不断调整策略。通过智能化的数据分析和可视化工具,商家能够做出更加科学、精确的决策,最终提升品牌价值和市场份额。

电商行业正朝着数据驱动的方向发展,而这一过程中的每一次数据分析和决策优化,都可能为商家带来巨大的商业回报。通过今天的分析,我们希望能为商家提供一个思路:以数据为核心,借助技术手段,优化营销决策,提升产品竞争力,从而在快速变化的市场中抓住机遇、迎接挑战。

💻交互式文档 💬向助教提问 🧺采集数据