diff --git a/.gitignore b/.gitignore index 8dbeaa9..19c468c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # macOS .DS_Store +# Cursor / IDE 本地历史 +.history/ + # Python 310py/ .venv/ @@ -28,6 +31,11 @@ voc_clustering.sqlite # 流水线输出(含 word_freq.csv、报告 HTML 等) output/ +# 样例报告 HTML(可本地重生成) +bikini-trimmer-voc-v*.html +voc_业务_2/bikini-trimmer-voc-report.html +voc_业务_2/.echarts_cache.js + # 原始 / 中间 CSV(不纳入版本库) *.csv diff --git a/业务说明.html b/AMZ评论VOC流程解释.html similarity index 100% rename from 业务说明.html rename to AMZ评论VOC流程解释.html diff --git a/VOC分析方法论与报告生成逻辑.md b/VOC分析方法论与报告生成逻辑.md new file mode 100644 index 0000000..fb72d07 --- /dev/null +++ b/VOC分析方法论与报告生成逻辑.md @@ -0,0 +1,815 @@ +# VOC 数据清洗、分析与报告生成通用方法论 + +> 文档版本:v1.0 · 2026-06-11 +> 适用范围:亚马逊任意品类竞品 VOC 分析 +> 数据来源:卖家精灵 / Shulex 导出的实时评论 CSV +> 报告输出:双层结构 HTML 报告(描述层 What + 分析层 Why) + +--- + +## 目录 + +1. [原始数据结构](#1-原始数据结构) +2. [数据清洗规则](#2-数据清洗规则) +3. [描述层 What — 分析逻辑](#3-描述层-what--分析逻辑) + - 3.1 有效评论统计 + - 3.2 用户画像(Persona)识别 + - 3.3 正负反馈主题提取 + - 3.4 情感关键词分析 +4. [分析层 Why — 分析逻辑](#4-分析层-why--分析逻辑) + - 4.1 KANO 模型需求分类 + - 4.2 JTBD 动机框架 + - 4.3 人群 × 场景 × 需求矩阵 + - 4.4 痛点根因分析 +5. [报告生成逻辑](#5-报告生成逻辑) + - 5.1 HTML 整体结构 + - 5.2 可视化组件 + - 5.3 使用场景字段写入规则(核心规则) +6. [执行 SOP(逐步操作流程)](#6-执行-sop逐步操作流程) +7. [关键阈值与判断规则速查表](#7-关键阈值与判断规则速查表) +8. [新品类接入清单](#8-新品类接入清单) + +--- + +## 1. 原始数据结构 + +### 文件命名规则 + +``` +{ASIN}_realtime.csv +``` + +每个竞品 ASIN 对应一个独立文件,分析时批量读取同一目录下的全部文件。 + +### CSV 字段说明 + +| 字段名 | 类型 | 说明 | +|---|---|---| +| `asin` | string | 亚马逊标准识别号,文件可能带 BOM 头(`\ufeffasin`),读取时须用 `utf-8-sig` 编码 | +| `rating` | float(字符串形式) | 评分,取值 `1.0` / `2.0` / `3.0` / `4.0` / `5.0`,须用 `float()` 转换,**不能用 `int()`** | +| `title` | string | 评论标题 | +| `content` | string | 评论正文(主要分析字段) | +| `verified` | string | `"True"` / `"False"`,是否已验证购买 | +| `vine` | string | `"True"` / `"False"`,是否为 Vine 评测 | +| `review_date` | string | ISO 8601 格式,如 `2026-05-28T00:00:00+00:00` | + +--- + +## 2. 数据清洗规则 + +### 2.1 有效评论筛选(不可更改的核心规则) + +**只保留以下两类评论,其余全部排除:** + +```python +def is_valid(row): + return ( + row.get('verified', '').strip().lower() == 'true' + or + row.get('vine', '').strip().lower() == 'true' + ) +``` + +**排除理由**:未验证且非 Vine 的评论可能包含刷评、竞品恶意差评或未实际购买的猜测,会干扰真实用户体验数据。 + +### 2.2 差评 / 好评 / 中性评论定义 + +| 分类 | 星级 | 用途 | +|---|---|---| +| 好评(Positive) | ★★★★★ / ★★★★ | 提取正向主题、魅力型需求、用户满意点 | +| 中性(Neutral) | ★★★ | 单独记录,不进入主题频次统计 | +| 差评(Negative) | ★★ / ★ | 主要分析对象,提取痛点主题和根因 | + +### 2.3 新买家 vs 复购买家区分规则 + +| 类型 | content 字段识别关键词 | +|---|---| +| **新买家** | `first time` / `just got` / `just bought` / `new to` | +| **复购买家** | `reorder` / `bought again` / `second time` / `repurchase` / `keep buying` | + +> 两类买家的差评重点通常不同: +> - 新买家 → 效果不符预期、开箱即坏、使用门槛高 +> - 复购买家 → 某个功能在长期使用后失效、品质下降 + +--- + +## 3. 描述层 What — 分析逻辑 + +### 3.1 有效评论统计 + +对每个 ASIN 分别计算,再汇总全市场数据: + +| 指标 | 计算公式 | +|---|---| +| 有效评论数 | 通过 `is_valid()` 筛选后的总行数 | +| 加权平均评分 | `Σ(各ASIN均分 × 各ASIN有效评论数) / 全市场有效评论总数` | +| 差评率 | `≤2星评论数 / 有效总数` | +| 正评率 | `≥4星评论数 / 有效总数` | +| 各星级分布 | 1–5 星各自数量及占比 | + +**市场竞争状态判断**: + +| 加权均分 | 判断 | +|---|---| +| < 3.5 | 市场存在严重系统性缺陷,是新品进入的明确窗口期 | +| 3.5 – 4.0 | 市场有改进空间,部分功能存在普遍短板 | +| > 4.0 | 市场整体较成熟,需通过差异化或细分切入 | + +### 3.2 用户画像(Persona)识别 + +#### 识别方法 + +在评论 `title + content` 字段中搜索特征词,将评论人归入对应 Persona。一条评论可同时归入多个 Persona。 + +#### Persona 识别词的建立原则 + +1. **阅读全部差评(≤2星)**,找出用户描述自身处境的词汇("I have... / I am... / As a...") +2. **阅读全部好评(≥4星)**,找出用户描述自身需求背景的词汇 +3. 从中归纳出 4–6 个差异化的用户群体 +4. 每个群体设定 5–10 个识别关键词 + +#### ⚠️ Persona 必须覆盖的三个分类维度(缺一不可) + +在最终确认 Persona 列表前,必须检查是否已从以下三个维度进行了覆盖,**不能只按其中一个维度拆分就停止**: + +| 维度 | 说明 | 典型信号词 | +|---|---|---| +| **A. 物理/生理特征** | 用户身体特征决定了产品对他们的效果上限(最易被遗漏) | `thick/dark/coarse hair` / `sensitive skin` / `pregnant` / `curly` / `Latina` / `Type 4 hair` | +| **B. 行为/场景** | 用户在什么情境下使用产品 | `travel` / `in the shower` / `gift` / `daily` | +| **C. 购买动机/背景** | 用户为何从其他方案切换过来 | `switched from razor` / `too expensive` / `saw on TikTok` / `first time` | + +> **关键原则**:如果你的 Persona 列表里只有场景类和动机类群体,而没有任何一个群体是按身体特征定义的,说明维度 A 被遗漏了,必须重新检查差评中的自我标注词汇。 + +#### 自我标注信号强制检查步骤 + +在完成初步 Persona 归纳后,**必须**额外执行以下搜索,确认是否有被遗漏的物理特征用户群: + +``` +搜索差评中所有含以下模式的句子: + "I have [adj] [noun]"(如 I have thick hair / I have sensitive skin) + "My [noun] is/are [adj]"(如 My skin is super sensitive) + "As a [noun/adj person]"(如 As a Latina / As a curly-haired person) + "[族裔/肤色/发质形容词]"(如 Latina / dark hair / coarse / Type 4) + +若上述词汇出现 ≥ 5 条,则该物理特征代表一个独立 Persona,必须单独列出。 +``` + +#### Persona 识别词模板格式 + +```python +PERSONA_KEYWORDS = { + '{群体名称A}': ['{关键词1}', '{关键词2}', ...], + '{群体名称B}': ['{关键词1}', '{关键词2}', ...], + # 根据实际品类补充 +} +``` + +#### Persona 占比估算规则 + +``` +占比 = 命中该Persona识别词的评论数 / 有效评论总数 +四舍五入至整5% +``` + +> 因一条评论可被多个 Persona 命中,各 Persona 占比之和可超过 100%。 + +#### Persona 卡片内容规格(每个群体输出以下信息) + +| 字段 | 来源 | 说明 | +|---|---|---| +| 群体名称 | 自定义 | 简洁描述身份特征,≤6 字 | +| 占比 | 统计计算 | 见上方公式 | +| 核心痛点 | 该群体差评 | ≤3 条,原文语义概括 | +| 核心需求 | 该群体好评+诉求 | ≤3 条 | +| 购买动机 | JTBD 分析 | 用"雇佣产品做什么"句式 | +| 代表性引用 | 真实评论原文 | 必须来自实际评论,注明 ASIN | + +### 3.3 正负反馈主题提取 + +#### 主题识别关键词组的建立方法 + +1. 阅读**全部差评(≤2星)**,记录用户描述问题时的高频词 +2. 将语义相近的词归为同一主题,形成关键词组 +3. 每个主题设定 5–10 个关键词 +4. 覆盖 80%+ 的差评内容(长尾主题可合并为"其他") + +#### ⚠️ 主题拆分规则:相近但机制不同的问题必须独立成主题 + +语义相近不等于根因相同。以下情况**必须拆分为独立主题,不得合并**: + +| 合并后失真的典型例子 | 应该如何拆分 | 原因 | +|---|---|---| +| "剃效差"(笼统) | ① 留茬/剃不干净 ② 拉扯/扯毛而非切断 | 机制不同:留茬=刀头贴肤不足;拉扯=刀片咬不断粗硬毛,影响人群完全不同 | +| "皮肤问题"(笼统) | ① 割伤/出血 ② 摩擦热/灼烧感 ③ 剃须疹/内生毛 | 根因不同,对应不同的工程解决方案 | +| "产品损坏"(笼统) | ① 充电失效 ② 配件断裂/脱落 | 分属电气系统和结构系统,受影响时间节点不同(充电=使用初期;断裂=一段时间后) | + +> **判断是否需要拆分的问题**: +> "同一主题下的差评,是否描述的是同一个物理/工程原因?" +> 如果不是,必须拆开。 + +**通用差评主题模板格式**: + +```python +NEGATIVE_THEMES = { + '{主题名称}': ['{关键词1}', '{关键词2}', ...], + # 品类相关主题 +} +``` + +**通用好评主题模板格式**: + +```python +POSITIVE_THEMES = { + '{主题名称}': ['{关键词1}', '{关键词2}', ...], +} +``` + +#### 频次统计规则 + +1. 在 `title + content` 中搜索关键词 +2. 同一评论中同一关键词出现多次,仍计为 1 次(避免重复计数) +3. 差评主题只统计 ≤2 星评论;好评主题只统计 ≥4 星评论 +4. **频次 = 命中该主题的评论条数**(非词语出现总次数) + +#### 主题优先级判定规则 + +| 优先级 | 差评频次门槛 | 涉及竞品范围 | +|---|---|---| +| **P0(立即处理)** | ≥ 总有效差评数的 20% | 80%+ 竞品均出现 | +| **P1(短期处理)** | 总有效差评数的 10–20% | 60%+ 竞品出现 | +| **P2(中期关注)** | 总有效差评数的 3–10% | 40%+ 竞品出现 | + +> **频次门槛的动态计算**: +> `P0 绝对门槛 = 全市场有效差评数 × 20%` +> 例:1123 条有效评论,差评率 35% ≈ 393 条差评,P0 门槛 ≈ 79 条 + +### 3.4 情感关键词分析 + +对所有有效评论进行词频统计,提取高频情感词。 + +**输出字段规格**: + +| 字段 | 说明 | 规则 | +|---|---|---| +| 词汇 | 英文原词或词组 | 保留原文,不翻译 | +| 出现频次 | 在有效评论中出现的条数 | 同一评论多次出现计1次 | +| 情感极性 | 正面 / 负面 / 中性 | 根据语境判断,同一词在不同语境可有不同极性 | +| 含义/使用场景 | 该词汇在评论中的具体语境 | **只写评论中明确出现的内容,不推断** | +| 主要关联人群 | 对应的 Persona 名称 | 可多个 | + +--- + +## 4. 分析层 Why — 分析逻辑 + +### 4.0 Persona 完整性验证(进入分析层前的强制关卡) + +**在开始 KANO / JTBD 分析之前,必须完成以下交叉验证,发现遗漏立即返回 3.2 节补充。** + +#### 验证方法:每个 P0/P1 主题 → 强制归因到 Persona + +为每一个 P0/P1 差评主题填写下表: + +| 差评主题 | 频次 | 该主题的典型描述 | 主要影响哪类用户? | 对应已有 Persona? | +|---|---|---|---|---| +| {主题1} | {N条} | {原文特征} | {用户特征描述} | {Persona名 / ❌未覆盖} | +| {主题2} | ... | ... | ... | ... | + +**如果某个 P0/P1 主题在"对应已有 Persona"列填写了 ❌,说明存在遗漏的用户群体,必须新增 Persona。** + +#### 常见漏洞场景 + +| 被遗漏的情况 | 漏洞原因 | 补救方式 | +|---|---|---| +| 身体特征群体(如粗硬发质用户) | 只按场景/动机分群,未检查维度 A(物理特征) | 返回 3.2 节执行自我标注信号强制检查 | +| 长期使用复购用户 | 只看差评内容,未注意时间轴("after months of use") | 检查含 `months` / `after a while` / `second bottle` 的差评是否形成独立群体 | +| 特定人群的特殊需求 | 该群体占比较小但痛点极具体 | 即使占比低(~5%),若痛点独特且无法被其他 Persona 代表,必须单独列出 | + +### 4.1 KANO 模型需求分类 + +#### 四种类型定义与判断标准 + +| 类型 | 定义 | 判断标准 | 常见错误 | +|---|---|---|---| +| **基本型(Must-be)** | 不满足→强烈差评;满足→用户不会特别提及或表扬 | ① 差评频次达 P0 级别 ② 80%+ 竞品均出现该缺陷 ③ 好评中几乎不出现"因为做到了 X 所以好评" | 把"剃净度"归为基本型——剃净度好坏都会被用户提及,属期望型 | +| **期望型(Performance)** | 做得越好评分越高,做得越差评分越低,线性关系 | ① 好评中被作为"这款优于竞品"的主要理由 ② 差评中作为"原本期待但未达到"的失望点 ③ 用户用程度词描述(`better/worse/not as good as`) | 把"电池续航"归为基本型——续航差才差评,续航超长会被用户特别称赞 | +| **魅力型(Attractive)** | 满足→产生超预期惊喜和好评;不满足→用户不会差评 | ① 好评中出现强情感词 `love` / `obsessed` / `amazing` / `didn't expect` / `bonus` ② 该功能在差评中几乎不出现 ③ 竞品普遍缺失,属市场空白 | 把"附赠收纳袋"归为期望型——用户从未因为"没有收纳袋"而差评,属意外惊喜 | +| **反向型(Reverse)** | 某些用户认为该功能是负担,反而差评 | ① 差评中出现对某个"功能"的明确抱怨 ② 该内容在好评中也受另一部分人喜爱(说明用户分歧) | 把"产品损坏"归为反向型——没有用户"希望产品能损坏" | + +#### 各类型的输出格式要求 + +每个 KANO 条目必须包含以下 5 个字段,缺一不可: + +``` +需求项:[具体需求描述,动词+名词形式] +评论频次证据:[支撑该分类的评论条数及代表性原文片段] +主要影响 Persona:[哪类用户群对该需求最敏感] +分类原因:[用一句话解释为什么是这个 KANO 类型,而不是其他类型] +竞品现状:[现有竞品是否满足,满足程度如何] +``` + +**示例(基本型)**: +``` +需求项:充电后可正常启动 +评论频次证据:118条差评(P0级别),"stopped working after a few uses" / "won't charge at all" +主要影响 Persona:所有群体,尤其是复购用户(第二台也坏后彻底失去信任) +分类原因:充电失效是"有就正常、坏了就1星"的底线需求,好评中没有人因"能充电"而特别表扬 +竞品现状:全部5款竞品均有此问题,说明是行业普遍工程缺陷 +``` + +**示例(魅力型)**: +``` +需求项:LCD 电量显示 +评论频次证据:好评中 28条提及,"love that I can see the battery level" / "so convenient",差评中0条因缺少LCD而差评 +主要影响 Persona:旅行护理族(出行前确认电量)/ 所有群体 +分类原因:用户不会因为"没有电量显示"而差评,但有了之后会主动提及并作为推荐理由 +竞品现状:仅1款(FANKRUAI)有此功能,属差异化空白 +``` + +#### KANO 归类操作步骤 + +**步骤一:基本型识别** +- 列出所有 P0/P1 差评主题 +- 检查每个主题对应的好评:如果好评中几乎没有人因"做到了这点"而表扬,确认为基本型 +- 每个基本型需求必须注明:频次(条数)+ 出现该问题的竞品数量 + +**步骤二:期望型 vs 魅力型区分** + +在好评中对每个高频好评主题做以下判断: + +| 判断问题 | 若"是"→ | 若"否"→ | +|---|---|---| +| 差评中有人因该功能**不够好**而差评? | 期望型 | 魅力型候选 | +| 好评用程度词描述(`better/works great/very`)? | 期望型 | 魅力型候选 | +| 好评中出现 `love/obsessed/amazing/bonus/didn't expect`? | 魅力型 | 继续判断 | +| 竞品普遍缺失,属市场新鲜感? | 魅力型 | 继续判断 | + +**步骤三:反向型搜索(不得以"未发现"一笔带过)** + +必须主动在差评中搜索以下关键词,并记录每个词的出现频次: + +``` +搜索词组(在全部有效评论 title+content 中搜索): + 过于复杂:too many parts / too complicated / confusing / hard to use + 过于嘈杂:too loud / so loud / noise / noisy + 功能多余:don't need / unnecessary / didn't ask for / useless feature + 操作繁琐:takes too long / too many steps / annoying to clean +``` + +**结果处理规则**: +- 若任意词组频次 ≥ 5 条 → 该功能为反向型,单独列出并附引用 +- 若所有词组总频次 < 5 条 → 填写:"反向型:经主动搜索 [列出搜索词],出现频次共 [N] 条,低于阈值,本品类暂无明确反向需求"(**禁止直接写"无"或"未发现"**) + +### 4.2 JTBD 动机框架 + +> JTBD(Jobs To Be Done):用户"雇佣"产品来完成什么任务。分析维度:功能性动机、情感性动机、社会性动机。 + +**输出格式(每个 Persona 一行)**: + +| 字段 | 说明 | 填写规则 | +|---|---|---| +| 用户群 | Persona 名称 | — | +| 核心 Job | 用户想完成的任务 | 动词+宾语形式,如"用电动工具替代传统方式" | +| 功能性动机 | 实用层面的驱动因素 | 必须能从评论中找到佐证句子 | +| 情感性动机 | 情绪/心理层面的驱动因素 | 必须能从评论中找到佐证句子 | +| 社会性动机 | 他人视角/社交驱动(如无评论佐证则留空) | 可选 | +| 购买触发时机 | 什么具体事件让用户决定购买 | 来自评论中的具体描述 | + +### 4.3 人群 × 场景 × 需求矩阵 + +矩阵将 Persona、使用场景、KANO 需求分层和当前满意度整合为一张全景视图。 + +**列结构**: + +| 列 | 填写来源 | +|---|---| +| 用户群 | Persona 名称 + 占比 | +| 使用场景(When/Where) | **严格遵守场景字段规则(见 5.3 节)** | +| 基本型需求 | KANO 基本型 + 该群体 P0 差评 | +| 期望型需求 | KANO 期望型 + 该群体 P1 差评 | +| 魅力型需求 | KANO 魅力型 + 该群体好评加分点 | +| 当前满意度 | 该群体对应评论的均分和好评率综合判断 | + +**满意度评级标准**: + +| 当前满意度 | 对应均分参考 | 显示样式 | +|---|---|---| +| 高 | ≥ 4.0 | 绿色 | +| 中等 | 3.3 – 3.9 | 黄色 | +| 低 ⚠ | < 3.3 | 红色 | + +### 4.4 痛点根因分析 + +**适用条件**:差评主题达到 P0 或 P1 级别时,必须进行根因分析。 + +**分析框架**: + +``` +根因 N:[工程/设计/材料/体验设计问题名称] +→ 导致后果:[差评主题名称] × [频次] +→ 失效机制:[从产品结构或工作原理层面解释为什么会出现这个问题] +→ 关键引用:[2-3条真实评论原文(英文)— 所属ASIN品牌] +``` + +**根因分析的层次要求**: + +| 层次 | 示例(错误 → 正确) | +|---|---| +| 停留在现象层(❌) | "产品质量差" | +| 到达机制层(✅) | "充电口防水胶圈未达到IP67标准,浴室蒸汽渗入导致腐蚀" | + +--- + +## 5. 报告生成逻辑 + +### 5.1 HTML 整体结构 + +报告采用**纯 HTML 内嵌 CSS + JS**,无外部文件依赖,单文件可直接分享。 + +``` +{产品关键词}-voc-v{版本号}.html +├──
+│ ├── Chart.js CDN(可视化依赖) +│ │ └── https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js +│ └── + + + + + +{{ASIN_COUNT}} 个竞品 ASIN · 数据来源:{{DATA_SOURCE}} · 分析日期:{{ANALYSIS_DATE}}
+ +描述层 What:先看「决策摘要」→ 数据总览 → 各 ASIN 主题对比 → 受众画像 → 正负反馈主题 → 情感词频
+ 分析层 Why:解释动机根因(KANO 需求分层 → JTBD 动机框架 → 人群×场景×需求矩阵 → 痛点根因分析)
{{MARKET_DESC}}
+{{STAR_CHART_NOTE}}
+数据来源:{{DATA_SOURCE}} · 筛选 verified=True 或 vine=True · 轴标签 A/B/… 悬停图表查看完整竞品名
+横向对比各竞品在 Top 差评/好评主题上的评论命中数,识别弱点集中 ASIN 与卖点组合差异。
+ {{ASIN_THEME_INSIGHTS_HTML}} + +{{NEG_THEME_CHART_NOTE}}
+ + {{NEG_THEME_MINI_HTML}} +{{POS_THEME_CHART_NOTE}}
+ + {{POS_THEME_MINI_HTML}} +{{NEG_THEME_SUMMARY_NOTE}}
+ +| 差评主题(按根因拆分,不合并) | 频次 | 占差评比 | 优先级 | 涉及范围&最痛 ASIN |
|---|
占好评比基于单主题命中计数;同一评论可命中多个主题,各行占比之和可能超过 100%(当前合计约 {{POS_PCT_SUM}}%)。KANO 预判为 What 层摘要,详细分类见下方 KANO 模型章节。
+| 好评主题 | 频次 | 占好评比 | KANO 预判 |
|---|
规则:同一评论中同一词组多次出现计 1 次;极性根据评论语境判断;含义只写评论中明确出现的内容,不推断。
+ +| 词汇 | 频次 | 情感极性 | 评论中使用语境 | 主要关联 Persona |
|---|
| 词汇 | 频次 | 情感极性 | 评论中使用语境 | 主要关联 Persona |
|---|
每个需求条目包含:需求项 · 频次证据 · 主要影响 Persona · 分类原因 · 竞品现状(5 字段,按 SOP 要求)
+ + {{KANO_GRID_HTML}} + +各动机字段须来自 Persona 聚类数据(keywords / core_pain / core_need 等)佐证;无法找到佐证的字段填「-」。
+ +| 用户群 | 核心 Job | 功能性动机 | 情感性动机 | 社会性动机 | 购买触发时机 |
|---|
场景字段来源:评论中出现次数 ≥5 的场景词方可填写;每 Persona 最多 2 个场景、全报告最多 4 个 Persona。全市场均分偏低时,「高满意度」会自动校准为中等并注明原因。
+ +| 用户群 | +使用场景(When/Where) 仅评论中佐证≥5条的场景 |
+ 基本型需求 | +期望型需求 | +魅力型需求 | +当前满意度 | +
|---|