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 个数据集时):一个 Excel 有多个 sheet、一次给过来两个及以上文件、或 JSON 顶层是含多个数组键的 dict,都算多个数据集。必须枚举出每一个数据源(全部 sheet 名 / 全部文件 / 全部顶层键),把完整清单摆给用户看,并加载
references/data-sources.md取读取模式与关系矩阵。绝不允许只读第一个 sheet、只读用户点名的那个文件、或把 JSON 的多个键压成一个——那会产出一份用户根本看不出它不完整的报告 - 用户确认(强制门禁):以结构化选择题提问——宿主有结构化提问工具就用(如 Claude Code 的 AskUserQuestion);宿主没有、工具不可用、或用户拒绝使用时,改为纯文本编号选择题,并等到用户回复后才继续。降级的只是呈现方式,门禁本身从不降级。 第一轮里一次问完:
- 行业确认(置信度高 → 给一个确认选项即可;置信度低或字段被脱敏 → 给 3–4 个行业选项,绝不自行猜定)
- 分析目标(当用户没讲清想看什么时)
- 报告受众(高管 = 结论先行、少术语 / 分析师 = 保留技术细节)
- 数据口径歧义(当字段含义、单位或统计周期不清楚时)
- 多源关系策略(当第 3 步适用时):融合(join/concat 成一张表)还是各源独立分析,以及关联键是什么
- 提问预算:最多 3 轮,每轮最多 3 道选择题;目标是把整个流程所需的问题都压进本阶段的一轮里
什么情况下可以免问直接进阶段 2:行业、分析目标、受众三者都能从用户的输入里直接读出来(例如「我是创始人,这是我们 SaaS 三年的经营数据,看增长和留存」)。只要行业还没得到用户确认,就必须问——数据看起来像零售 ≠ 用户确认了按零售解读。
为什么这个门禁不能跳过:跳过确认,等于你替用户定了分析议程、行业叙事和受众风格。基线测试里模型以「先交付完整 EDA 才是专业默认动作,反问会阻塞用户」为由跳过提问,产出了一份用户可能根本不想要的中性分析。一轮选择题只花用户几十秒;方向错了则整个分析全废。下面这些借口都不成立:
| 跳过的借口 | 事实 |
|---|---|
| 「先交付价值,反问会阻塞用户」 | 一轮选择题 ≪ 一份方向错的报告。门禁是硬要求 |
| 「字段语义很清楚,不用确认」 | 字段清楚 ≠ 行业已确认 + 目标已明确。议程不由你替用户定 |
| 「EDA 不依赖业务语义,先做了再说」 | 没有行业和目标的 EDA 就是一堆中性数字——恰恰站在本 skill 的核心定位的反面 |
| 「用户发现问题自然会说」 | 确认必须前置;报告发出去之后再纠偏是代价最高的路 |
确认落定后选行业模版:有对应模版(见下方映射表)→ 加载它;行业能识别但没有对应模版 → industries/general.md + 把行业术语注入叙事;识别不出 / 用户否掉了猜测又没点名行业 → industries/general.md,叙事保持行业中立。
阶段 2:数据清洗
- 缺失值:按缺失比例和字段性质选择删除/填充/标记
- 异常值:用 IQR 和 Z-score 检测;处理前先评估业务合理性(异常 ≠ 错误——比如大促当天的峰值)
- 去重,统一格式(日期、编码、单位)
- 可追溯(强制):记录每一个关键清洗决策,写进报告附录的「数据处理说明」
- 终止型门禁:数据质量差到支撑不了分析(关键字段大面积缺失 / 数据整体不可用)→ 产出一份数据质量诊断报告(问题 + 修复建议),终止流程,不硬做分析
阶段 3:数据转换
- 计算派生指标时优先采用行业模版里的 KPI 定义;模版里某个指标所需字段缺失 → 跳过该指标并在报告里说明,绝不编造
- 按分析主题做透视、聚合、长宽表重塑
- 转换逻辑同样写进「数据处理说明」
阶段 4:数据分析
- 默认先做 EDA:分布、异常、相关性
- 分析议程围绕行业模版的「典型分析主题」组织,逐主题深入
- 按任务需要加载方法模块(见「按需加载」表)
- 全程遵守统计纪律(见下文)
阶段 5:数据报告
- 必读
references/visualization.md——按它的规则选图表类型、生成 ECharts option - 把分析结果组织成数据 JSON(六段式内容 + 图表 option + 叙事文字),注入
assets/report_template.html(数据契约见模板头部注释),产出单文件 HTML - 六段式结构由模板固定:核心发现(3–5 条,结论先行)→ 分析背景与目标 → 数据概况 → 深入分析(按行业主题分节)→ 结论与建议 → 附录:数据处理说明
- 每张图回答一个明确的问题;
insight字段必填(这张图说明了什么、对决策意味着什么) - 叙事术语和风格遵循行业模版与已确认的受众
- 报告语言跟随用户:用户用中文提问就出中文报告;用户用英文提问且数据也是英文,就出英文报告
不要自己手写 HTML,也不要用 matplotlib 静态图拼报告——基线测试里模型即兴做了一份 base64 静态图报告:没有交互、结构随意,违反交付规范。模板已经把交互(ECharts 缩放/悬停/工具箱)、CDN 固定版本、中文字体都打磨好了,你只需注入数据。matplotlib 只用于分析过程中的探查,或用户明确要求静态图/PDF 时。
统计纪律(全局强制,两条路径一视同仁)
- 统计检验必须报告 p 值和置信区间,并检查其前提假设
- 相关性结论措辞要审慎,主动点出数据里可见的混淆因素;没有因果方法验证过,绝不使用「提升了/导致了/带动了」这类措辞(措辞对照表见
references/causal-inference.md) - 样本量太小时明确说明统计功效的局限——不要因为用户在催(「老板今天就要结论」)就硬给判断
- 行业基准纪律:基准对比只在两种情况下出现——(a)用户提供了基准数据;(b)用户明确授权联网搜索,且结果标注了来源。两者都没有:只做内部对比,并在回复里说明「如需行业基准对比,请提供基准数据或授权我联网搜索(搜到的结果仅供方向性参考)」。绝不凭记忆引用行业均值,绝不未经授权就联网搜索——基线测试里模型自行搜索并引用了外部数据;即便标注了来源,这也违反授权要求:搜不搜、信哪个来源,是用户的决定
- 多源不得静默丢失:输入含多个数据集(多 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 键),所有源都已枚举、关系策略已确认或已说明——没有任何一个被静默丢弃