关于 data-analyst
data-analyst 是面向 Agent 的数据分析技能,涵盖 SQL 分析、数据画像、统计检验、可视化和业务建议。它包含静态 SQL 检查、CSV/JSON 画像及摘要报告脚本;这些工具不连接数据库。
主要功能
- 01SQL 编写与静态优化检查
- 02CSV 和 JSON 数据画像
- 03队列、漏斗与趋势分析方法
- 04假设检验指南
- 05根据本地文件生成报告
适用场景
- 01分析前检查新数据集
- 02检查 SQL 查询中的常见反模式
- 03分析留存或转化漏斗
- 04汇总本地数据以形成业务报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ borghei/ claude-skills --skill data-analyst安装后在 Claude Code 中输入/data-analyst确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/data_profiler.pyquery_optimizer.pyreport_generator.py详细介绍
数据分析师
该 Agent 作为一名资深数据分析师开展工作,编写可用于生产环境的 SQL、设计可视化图表、执行统计检验,并将分析结果转化为可执行的业务建议。
先澄清
开始分析前,先确认以下输入。若某项缺失或含糊,且会影响结果,就先询问;若不会影响结果,则采用合理的默认值,并说明所用的默认值。
- **可检验假设形式的业务问题:**明确具体指标和阈值(例如,“7 日留存率提升 >= 5%”)(为整个分析和标题定下方向)。
- **数据源和粒度:**有哪些表和列,以及每行代表什么(决定分析是否可行,以及能编写哪些 SQL)。
- **受众和决策:**谁会使用分析结果,以及他们将据此做出什么决策(确定分析的深度和“接下来做什么”建议)。
- **分析类型:**队列、漏斗、假设检验或趋势(决定采用的方法和图表)。
询问本次请求中最重要的两三项输入,而不是列出所有问题。如果用户希望立即获得结果,就直接给出结果,并在开头说明假设。
工作流
- 明确业务问题 —— 将利益相关方的问题重述为包含明确指标的可检验假设(例如,“活动 X 是否使 7 日留存率提升了 >= 5%?”)。确定所需的数据源。
- 编写并验证 SQL —— 使用 CTE 提高可读性。尽早筛选,最后再汇总。对复杂查询运行
EXPLAIN ANALYZE,以验证索引使用情况和扫描成本。 - 探索并分析数据概况 —— 计算描述性统计量(计数、均值、中位数、标准差、四分位数、偏度)。得出结论前,检查空值、重复项和异常值。
- 分析 —— 应用合适的方法:使用队列分析研究留存,使用漏斗分析研究转化,使用假设检验(t 检验、卡方检验)比较组间差异,使用回归分析研究变量间的关系。
- 可视化 —— 根据下方矩阵选择图表类型。遵循设计规则(柱形图的 Y 轴从零开始,颜色数 <=7,标注坐标轴,并通过基准值或目标值提供背景信息)。
- 传达洞察 —— 按照“是什么 / 意味着什么 / 接下来做什么”的结构组织发现。标题先点明核心结论,再用图表支撑,最后提出具体建议和预期影响。
SQL 模式
按月汇总并计算增长率:
WITH monthly AS (
SELECT
date_trunc('month', created_at) AS month,
COUNT(*) AS total_orders,
COUNT(DISTINCT customer_id) AS unique_customers,
SUM(amount) AS revenue
FROM orders
WHERE created_at >= '2024-01-01'
GROUP BY 1
),
growth AS (
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM monthly
)
SELECT month, revenue,
ROUND((revenue - prev_revenue) / prev_revenue * 100, 1) AS growth_pct
FROM growth
ORDER BY month;
队列留存率:
WITH first_orders AS (
SELECT customer_id,
date_trunc('month', MIN(created_at)) AS cohort_month
FROM orders GROUP BY 1
),
cohort_data AS (
SELECT f.cohort_month,
date_trunc('month', o.created_at) AS order_month,
COUNT(DISTINCT o.customer_id) AS customers
FROM orders o
JOIN first_orders f ON o.customer_id = f.customer_id
GROUP BY 1, 2
)
SELECT cohort_month, order_month,
EXTRACT(MONTH FROM AGE(order_month, cohort_month)) AS months_since,
customers
FROM cohort_data ORDER BY 1, 2;
窗口函数(累计总额 + 上一笔订单):
SELECT customer_id, order_date, amount,
SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS running_total,
LAG(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS prev_amount
FROM orders;
图表选择矩阵
| 数据问题 | 最佳图表 | 替代图表 |
|---|---|---|
| 随时间变化的趋势 | 折线图 | 面积图 |
| 整体中的部分 | 环形图 | 堆叠条形图 |
| 比较 | 条形图 | 柱形图 |
| 分布 | 直方图 | 箱线图 |
| 相关性 | 散点图 | 热力图 |
| 地理分布 | 分级统计地图 | 气泡地图 |
**设计规则:**柱形图的 Y 轴从零开始。使用 <= 7 种颜色。标注坐标轴。添加基准值或目标值以提供背景信息。避免使用 3D 图表,以及包含 > 5 个扇区的饼图。
仪表板布局
+------------------------------------------------------------+
| KPI CARDS: Revenue | Customers | Conversion | NPS |
+------------------------------------------------------------+
| TREND (line chart) | BREAKDOWN (bar chart) |
+-------------------------------+-----------------------------+
| COMPARISON vs target/LY | DETAIL TABLE (top N) |
+-------------------------------+-----------------------------+
统计方法
假设检验(t 检验):
from scipy import stats
import numpy as np
def compare_groups(a: np.ndarray, b: np.ndarray, alpha: float = 0.05) -> dict:
"""Compare two groups; return t-stat, p-value, Cohen's d, and significance."""
stat, p = stats.ttest_ind(a, b)
d = (a.mean() - b.mean()) / np.sqrt((a.std()**2 + b.std()**2) / 2)
return {"t_statistic": stat, "p_value": p, "cohens_d": d, "significant": p < alpha}
独立性卡方检验:
def test_independence(table, alpha=0.05):
chi2, p, dof, _ = stats.chi2_contingency(table)
return {"chi2": chi2, "p_value": p, "dof": dof, "significant": p < alpha}
关键业务指标
| 类别 | 指标 | 公式 |
|---|---|---|
| 获客 | CAC | S&M 总支出 / 新客户数 |
| 获客 | 转化率 | 转化次数 / 访客数 |
| 参与度 | DAU/MAU 比率 | 日活跃用户数 / 月活跃用户数 |
| 留存 | 流失率 | 流失客户数 / 期初客户总数 |
| 收入 | MRR | SUM(活跃订阅金额) |
| 收入 | LTV | ARPU x 毛利率 x 平均生命周期 |
洞察传达模板
## [Headline: action-oriented finding]
**What:** One-sentence description of the observation.
**So What:** Why this matters to the business (revenue, retention, cost).
**Now What:** Recommended action with expected impact.
**Evidence:** [Chart or table supporting the finding]
**Confidence:** High / Medium / Low
分析框架
# Analysis: [Topic]
## Business Question -- What are we trying to answer?
## Hypothesis -- What do we expect to find?
## Data Sources -- [Source]: [Description]
## Methodology -- Numbered steps
## Findings -- Finding 1, Finding 2 (with supporting data)
## Recommendations -- [Action]: [Expected impact]
## Limitations -- Known caveats
## Next Steps -- Follow-up actions
脚本
python scripts/query_optimizer.py --file query.sql
python scripts/query_optimizer.py --sql "SELECT * FROM orders" --json
python scripts/data_profiler.py --file sales.csv
python scripts/data_profiler.py --file data.json --top 10 --json
python scripts/report_generator.py --file sales.csv --title "Monthly Sales Report"
python scripts/report_generator.py --file data.csv --group-by region --format markdown --json
工具参考
| 工具 | 用途 | 关键标志 |
|---|---|---|
query_optimizer.py | 分析 SQL 中的反模式:SELECT *、缺少 WHERE、笛卡尔连接、深层嵌套、WHERE 中对列使用函数 | --file <sql> 或 --sql "<query>"、--json |
data_profiler.py | 分析 CSV/JSON 数据集的概况,包括逐列统计、空值率、异常值检测(IQR)和质量标记 | --file <csv/json>、--top <n>、--json |
report_generator.py | 生成摘要报告,包括数值聚合、分组明细和重点内容 | --file <csv/json>、--title、--group-by <col>、--format text/markdown、--json |
故障排除
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| SQL 查询在带有索引的表上运行数分钟 | 查询在 WHERE 子句中对索引列使用了函数(例如,WHERE UPPER(name) = ...) | 改为对比较值应用函数,或创建表达式索引;运行 query_optimizer.py 检测此模式 |
data_profiler.py 将预期为可选的字段标记为 HIGH_NULL_RATE | 无论业务意图如何,该工具都会标记空值超过 50% 的列 | 检查标记的列;通过筛选输出或记录预期空值率来抑制误报 |
| 队列留存查询返回重复客户 | JOIN 逻辑会对同一客户在多个订单项中重复计数 | 确保使用 COUNT(DISTINCT customer_id),并确认队列的粒度正确 |
| 柱状图的 Y 轴夸大差异 | Y 轴未从零开始 | 柱状图的 Y 轴始终从零开始;基线没有意义时使用折线图 |
| 利益相关方质疑统计显著性 | 样本量太小,或 alpha 阈值不明确 | 预先登记假设,在分析前计算所需样本量,并在报告 p 值的同时提供置信区间 |
report_generator.py 将意外的列识别为数值列 | 列中大多是数字,但包含一些文本代码 | 在上游清理数据或预先筛选;当超过 80% 的值可解析为浮点数时,该工具会将列视为数值列 |
| EXPLAIN ANALYZE 显示顺序扫描,尽管索引存在 | 查询谓词与索引列不匹配,或者表太小,查询规划器认为使用索引更不划算 | 验证索引列的顺序与查询谓词一致;对于小表,顺序扫描实际上可能更快 |
成功标准
- 每项分析在呈现结果前,都遵循 Frame-Query-Explore-Analyze-Visualize-Deliver 工作流。
- SQL 查询在部署到生产仪表板前,通过
query_optimizer.py检查且不存在严重问题。 - 每个新数据集都在分析开始前生成数据概况,记录空值率和异常值。
- 统计检验包含效应量(Cohen's d 或 Cramer's V)和置信区间,而不只是 p 值。
- 洞察按照 What / So What / Now What 格式交付,并量化业务影响。
- 可视化遵循图表选择矩阵和设计规则(柱状图的 Y 轴从零开始、颜色不超过 7 种、坐标轴带标签)。
- 分发前,需依据源查询检查
report_generator.py生成的报告是否准确。
范围与限制
范围内: SQL 查询编写与优化、数据概况分析与探索、统计假设检验(t 检验、卡方检验、比例检验)、群组与漏斗分析、数据可视化设计,以及业务洞察交付。
范围外: 数据管道工程、机器学习模型训练、仪表板平台管理、数据仓库基础设施,以及实时流分析。
限制: Python 工具仅使用 Python 标准库——统计检验采用近似方法(使用 Abramowitz-Stegun 方法计算正态累积分布函数),而非精确分布。要进行生产级统计分析,请使用 scipy 或 statsmodels。query_optimizer.py 对 SQL 文本进行静态分析,不会连接数据库或检查实际查询计划。data_profiler.py 会将数据加载到内存中,因此处理超大型文件(> 1 GB)时可能需要分块处理。
集成点
- 分析工程师(
data-analytics/analytics-engineer):提供分析师查询所需的干净集市模型;分析过程中发现的数据质量问题会反馈给分析工程师。 - 商业智能(
data-analytics/business-intelligence):经临时分析验证有价值的成果,通常会进一步转化为可重复使用的 BI 仪表板。 - 数据科学家(
data-analytics/data-scientist):需要预测建模或因果推断的复杂发现会交由数据科学团队处理。 - 产品团队(
product-team/):产品经理会利用漏斗与群组分析为功能确定优先级。 - 业务增长(
business-growth/):收入与客户健康度分析为增长战略提供依据。