# Data Analysis Skills

> 当用户提供数据文件（CSV / Excel / JSON / TSV）或表格数据，想要做分析、找洞察或要一份报告时使用——例如「分析数据」「做数据报告」「帮我看看这份数据」「这批订单数据说明什么」，以及销售 / 经营 / 运营数据复盘、探索性分析（EDA）、A/B 实验评估、趋势预测，或要一份可交互的 HTML 数据报告。不适用于：搭建 dashboard 应用、网页爬取、连接线上数据库。

- Skill: `cabbage2000-lab/data-analysis-skills` (Agent Skill, multi-file: 18 files)
- Install (CLI): `npx skillmds@latest add cabbage2000-lab/data-analysis-skills`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cabbage2000-lab/data-analysis-skills/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: cabbage2000-lab (https://skillmd.com/u/cabbage2000-lab)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/cabbage2000-lab/data-analysis-skills

---


# data-analysis-skills：行业化数据分析与叙事报告

## 概述

把原始数据变成会自己讲故事的行业化数据报告——交付物不是孤立的图表和数字，而是一份有洞察、有结论、能推动业务决策的分析报告。

```
一次分析 = 五阶段流程（主线）
         × 一个行业模版 industries/（分析什么、对谁说）
         × 按需加载的方法模块 references/（怎么分析）
         → 数据 JSON 注入 assets/report_template.html → 单文件 HTML 报告
```

支持的输入：CSV、Excel（.xlsx/.xls）、JSON、TSV。**一份输入可能含多个数据集**——一个 Excel 有多个 sheet、一次给过来两个及以上文件、或 JSON 顶层是含多个数组键的 dict；这些走阶段 1 的多源接入（见 `references/data-sources.md`）。分析用 Python 执行（pandas 等；缺依赖先尝试 pip 安装，失败按降级表处理）。

## 首先：任务分流

| 用户要的是什么 | 走哪条路 |
|------|------|
| 开放式分析，想要报告/洞察（「分析这份数据」「给我一份报告」） | **完整五阶段流程**（含阶段 1 门禁），见下文 |
| 单个统计问题（「检验 B 方案是否显著」「算一下这两列的相关性」） | **轻量路径**：直接算出来，回复结果 + 注意事项；不强加行业确认，也不套完整报告流程 |

分流判据：用户点名了具体的统计计算、且没有要整体洞察或报告 → 轻量路径。**拿不准就走完整流程。统计纪律对两条路径一视同仁。**

## 五阶段流程

开工时立即用宿主的任务清单工具（Claude Code 用 TodoWrite、Codex 用 update_plan、其它宿主用各自等价的 plan/todo 工具）为每个阶段建一条 todo，逐阶段推进并更新状态。**宿主没有这类工具，就在开头列一份纯文本的五阶段清单，并在推进时逐次复述进度**——阶段追踪不因为工具缺失就丢掉。阶段 2–5 一气呵成，不再打断用户提问；每个阶段开始时打印一行进度提示。

### 阶段 1：数据接入与理解【唯一的强制门禁】

1. 读取数据并给出画像：行列数、字段类型、缺失情况、时间范围、关键字段的唯一值分布
2. **行业识别**：从字段名、数据特征和用户描述推断所属行业，并自评置信度
3. **多源接入（当输入含 >1 个数据集时）**：一个 Excel 有多个 sheet、一次给过来两个及以上文件、或 JSON 顶层是含多个数组键的 dict，都算多个数据集。**必须枚举出每一个数据源**（全部 sheet 名 / 全部文件 / 全部顶层键），把完整清单摆给用户看，并加载 `references/data-sources.md` 取读取模式与关系矩阵。**绝不允许只读第一个 sheet、只读用户点名的那个文件、或把 JSON 的多个键压成一个**——那会产出一份用户根本看不出它不完整的报告
4. **用户确认（强制门禁）**：以结构化选择题提问——宿主有结构化提问工具就用（如 Claude Code 的 AskUserQuestion）；宿主没有、工具不可用、或用户拒绝使用时，改为纯文本编号选择题，并**等到用户回复后才继续**。**降级的只是呈现方式，门禁本身从不降级。** 第一轮里一次问完：
   - 行业确认（置信度高 → 给一个确认选项即可；置信度低或字段被脱敏 → 给 3–4 个行业选项，**绝不自行猜定**）
   - 分析目标（当用户没讲清想看什么时）
   - 报告受众（高管 = 结论先行、少术语 / 分析师 = 保留技术细节）
   - 数据口径歧义（当字段含义、单位或统计周期不清楚时）
   - **多源关系策略**（当第 3 步适用时）：融合（join/concat 成一张表）还是各源独立分析，以及关联键是什么
5. 提问预算：最多 3 轮，每轮最多 3 道选择题；目标是把整个流程所需的问题都压进本阶段的一轮里

**什么情况下可以免问直接进阶段 2**：行业、分析目标、受众三者都能从用户的输入里直接读出来（例如「我是创始人，这是我们 SaaS 三年的经营数据，看增长和留存」）。只要行业还没得到用户确认，就必须问——**数据看起来像零售 ≠ 用户确认了按零售解读**。

**为什么这个门禁不能跳过**：跳过确认，等于你替用户定了分析议程、行业叙事和受众风格。基线测试里模型以「先交付完整 EDA 才是专业默认动作，反问会阻塞用户」为由跳过提问，产出了一份用户可能根本不想要的中性分析。一轮选择题只花用户几十秒；方向错了则整个分析全废。下面这些借口都不成立：

| 跳过的借口 | 事实 |
|------|------|
| 「先交付价值，反问会阻塞用户」 | 一轮选择题 ≪ 一份方向错的报告。门禁是硬要求 |
| 「字段语义很清楚，不用确认」 | 字段清楚 ≠ 行业已确认 + 目标已明确。议程不由你替用户定 |
| 「EDA 不依赖业务语义，先做了再说」 | 没有行业和目标的 EDA 就是一堆中性数字——恰恰站在本 skill 的核心定位的反面 |
| 「用户发现问题自然会说」 | 确认必须前置；报告发出去之后再纠偏是代价最高的路 |

确认落定后选行业模版：有对应模版（见下方映射表）→ 加载它；行业能识别但没有对应模版 → `industries/general.md` + 把行业术语注入叙事；识别不出 / 用户否掉了猜测又没点名行业 → `industries/general.md`，叙事保持行业中立。

### 阶段 2：数据清洗

- 缺失值：按缺失比例和字段性质选择删除/填充/标记
- 异常值：用 IQR 和 Z-score 检测；处理前先评估业务合理性（**异常 ≠ 错误**——比如大促当天的峰值）
- 去重，统一格式（日期、编码、单位）
- **可追溯（强制）**：记录每一个关键清洗决策，写进报告附录的「数据处理说明」
- **终止型门禁**：数据质量差到支撑不了分析（关键字段大面积缺失 / 数据整体不可用）→ 产出一份数据质量诊断报告（问题 + 修复建议），终止流程，不硬做分析

### 阶段 3：数据转换

- 计算派生指标时**优先采用行业模版里的 KPI 定义**；模版里某个指标所需字段缺失 → 跳过该指标并在报告里说明，绝不编造
- 按分析主题做透视、聚合、长宽表重塑
- 转换逻辑同样写进「数据处理说明」

### 阶段 4：数据分析

- 默认先做 EDA：分布、异常、相关性
- **分析议程围绕行业模版的「典型分析主题」组织**，逐主题深入
- 按任务需要加载方法模块（见「按需加载」表）
- 全程遵守统计纪律（见下文）

### 阶段 5：数据报告

1. **必读 `references/visualization.md`**——按它的规则选图表类型、生成 ECharts option
2. 把分析结果组织成数据 JSON（六段式内容 + 图表 option + 叙事文字），注入 `assets/report_template.html`（数据契约见模板头部注释），产出**单文件 HTML**
3. 六段式结构由模板固定：核心发现（3–5 条，结论先行）→ 分析背景与目标 → 数据概况 → 深入分析（按行业主题分节）→ 结论与建议 → 附录：数据处理说明
4. 每张图回答一个明确的问题；`insight` 字段必填（这张图说明了什么、对决策意味着什么）
5. 叙事术语和风格遵循行业模版与已确认的受众
6. **报告语言跟随用户**：用户用中文提问就出中文报告；用户用英文提问且数据也是英文，就出英文报告

**不要自己手写 HTML，也不要用 matplotlib 静态图拼报告**——基线测试里模型即兴做了一份 base64 静态图报告：没有交互、结构随意，违反交付规范。模板已经把交互（ECharts 缩放/悬停/工具箱）、CDN 固定版本、中文字体都打磨好了，你只需注入数据。matplotlib 只用于分析过程中的探查，或用户明确要求静态图/PDF 时。

## 统计纪律（全局强制，两条路径一视同仁）

1. 统计检验必须报告 p 值和置信区间，并检查其前提假设
2. 相关性结论措辞要审慎，主动点出数据里可见的混淆因素；没有因果方法验证过，绝不使用「提升了/导致了/带动了」这类措辞（措辞对照表见 `references/causal-inference.md`）
3. 样本量太小时明确说明统计功效的局限——**不要因为用户在催（「老板今天就要结论」）就硬给判断**
4. **行业基准纪律**：基准对比只在两种情况下出现——（a）用户提供了基准数据；（b）用户**明确授权**联网搜索，且结果标注了来源。两者都没有：只做内部对比，并在回复里说明「如需行业基准对比，请提供基准数据或授权我联网搜索（搜到的结果仅供方向性参考）」。**绝不凭记忆引用行业均值，绝不未经授权就联网搜索**——基线测试里模型自行搜索并引用了外部数据；即便标注了来源，这也违反授权要求：搜不搜、信哪个来源，是用户的决定
5. **多源不得静默丢失**：输入含多个数据集（多 sheet Excel / 多文件 / 多键 JSON）时，必须枚举每一个源、把完整清单摆给用户、并确认关系策略——**绝不允许只读第一个 sheet、只读点名的文件、或压掉 JSON 的键**（见 `references/data-sources.md`）。这是把模板的「不得静默截断」从输出层延伸到输入层

## 按需加载

| 文件 | 何时加载 |
|------|------|
| `industries/retail.md` | 确认为零售 / 电商 |
| `industries/saas.md` | 确认为互联网 / SaaS / 订阅制业务 |
| `industries/self-media.md` | 确认为自媒体 / 内容创作者账号运营 |
| `industries/corporate-finance.md` | 确认为企业财务 / FP&A（损益、费用、预算、现金流分析） |
| `industries/fund.md` | 确认为基金行业（基金净值表现、规模与申赎、持有人分析） |
| `industries/real-estate.md` | 确认为房地产（项目销售与去化、回款、市场量价走势） |
| `industries/construction.md` | 确认为建筑施工（项目产值与进度、人材机成本、合同承接与回款） |
| `industries/education.md` | 确认为教育培训（招生与续报、出勤与完课、渠道获客） |
| `industries/general.md` | 行业识别不出 / 无对应模版 / 用户否掉了猜测（兜底） |
| `references/data-sources.md` | 输入含多个数据集——多 sheet Excel、多文件、或多键 JSON |
| `references/visualization.md` | 阶段 4–5 只要出图就加载（阶段 5 必读） |
| `references/ab-testing.md` | 用户提到实验、对照组、A/B 测试 |
| `references/causal-inference.md` | 用户问「X 是否导致了 Y」或想要因果结论 |
| `references/time-series.md` | 数据有时间维度且需要趋势/预测 |
| `references/machine-learning.md` | 建模、分类、聚类或预测类任务 |

行业模版是薄层：**只调整分析重点与叙事风格，绝不替换五阶段流程或统计纪律。**

## 降级路径

| 情况 | 行为 |
|------|------|
| 数据质量太差 | 诊断报告 + 修复建议，终止（见阶段 2） |
| 样本太小做不了统计检验 | 描述性分析 + 统计功效局限说明 |
| 问了 3 轮目标仍不明确 | 按数据特征产出标准 EDA 报告，开头声明所做假设 |
| 环境无法交互（任何非交互模式，如 `codex exec` / `claude -p`） | 按「问了 3 轮仍不明确」处理：标准 EDA 报告 + general 行业兜底 + 开头声明假设 |
| 宿主缺任务清单工具或结构化提问工具 | **只降级呈现方式**——纯文本阶段清单 / 纯文本编号选择题，然后等回复。阶段 1 门禁与五阶段流程原样保留 |
| 行业识别置信度低 | 给 3–4 个行业选项，不猜 |
| 行业能识别但没有对应模版 | general.md + 行业术语注入叙事 |
| 用户否掉识别结果又不点名行业 | general.md，叙事保持行业中立 |
| 数据不满足因果推断前提 | 只给相关性结论 + 说明需要什么样的数据条件 |
| 时间序列点数太少 | 不做预测，只做趋势描述，并说明原因 |
| 没有可用的行业基准 | 只做内部对比，绝不编造外部基准 |
| 图表数据量过大 | 先聚合/采样再注入 HTML，并在附录注明粒度（规则见 visualization.md） |
| Python 依赖缺失 | 告知并尝试 pip 安装；失败则降级（没有 statsmodels 就只做趋势描述；没有 scikit-learn 就跳过建模并说明） |
| 多源关联键缺失 / 无法融合 | 各源独立分析，说明这一点并解释为什么融合不了 |
| 多源的 schema/结构不兼容 | 把冲突摆给用户；降级为单源或请用户澄清 |

## 危险信号（Red Flags）——冒出这些念头立刻停

- 「数据够清楚了，不用问行业」 → 回阶段 1 门禁
- 「先跑个分析给用户看看」 → 回阶段 1 门禁
- 「行业均值大概是 X%，这是常识」 → 违反基准纪律，删掉
- 「我快速搜一下行业基准」 → 未经授权不得搜索，先问
- 「样本小但趋势很明显，结论应该没问题」 → 报告统计功效局限
- 「相关性都这么强了，说『提升了』不算过」 → 查措辞对照表
- 「我自己组织报告结构会更好」 → 用模板的六段式
- 「matplotlib 图嵌进 HTML 也一样」 → 用 ECharts + 模板
- 「第一个 sheet 就够了，读它就行」/「用户点名了哪个文件我就处理哪个」 → 触碰多源静默丢失红线：枚举每一个源、摆出清单、确认策略（阶段 1 第 3 步 + `references/data-sources.md`）

## 完成前自检清单

- [ ] 行业已由用户确认（或走了正确的降级路径）
- [ ] 报告开篇是 3–5 条核心发现，结论先行
- [ ] 行业指标按模版定义计算；字段缺失的指标已说明，而非编造
- [ ] 每张图回答一个明确问题，且配有解读
- [ ] 检验报告了 p 值/置信区间；没有因果方法就没有因果措辞
- [ ] 报告里没有无来源的行业基准数字
- [ ] 附录含完整的「数据处理说明」
- [ ] 单文件 HTML；ECharts 走固定版本 CDN；联网打开时交互正常
- [ ] 报告语言与用户语言一致；叙事风格与受众匹配
- [ ] 若输入含多个数据集（sheet/文件/JSON 键），所有源都已枚举、关系策略已确认或已说明——没有任何一个被静默丢弃

