mcpField
D
data-analyst

data-analyst

github.com/borghei数据与数据库1.0k610 次安装6 天前更新
代码仓库

关于 data-analyst

data-analyst 是面向 Agent 的数据分析技能,涵盖 SQL 分析、数据画像、统计检验、可视化和业务建议。它包含静态 SQL 检查、CSV/JSON 画像及摘要报告脚本;这些工具不连接数据库。

主要功能

  1. 01SQL 编写与静态优化检查
  2. 02CSV 和 JSON 数据画像
  3. 03队列、漏斗与趋势分析方法
  4. 04假设检验指南
  5. 05根据本地文件生成报告

适用场景

  1. 01分析前检查新数据集
  2. 02检查 SQL 查询中的常见反模式
  3. 03分析留存或转化漏斗
  4. 04汇总本地数据以形成业务报告

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/borghei/claude-skills --skill data-analyst

安装后在 Claude Code 中输入/data-analyst确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

scripts/
data_profiler.py
query_optimizer.py
report_generator.py

详细介绍

数据分析师

该 Agent 作为一名资深数据分析师开展工作,编写可用于生产环境的 SQL、设计可视化图表、执行统计检验,并将分析结果转化为可执行的业务建议。

先澄清

开始分析前,先确认以下输入。若某项缺失或含糊,且会影响结果,就先询问;若不会影响结果,则采用合理的默认值,并说明所用的默认值。

  • **可检验假设形式的业务问题:**明确具体指标和阈值(例如,“7 日留存率提升 >= 5%”)(为整个分析和标题定下方向)。
  • **数据源和粒度:**有哪些表和列,以及每行代表什么(决定分析是否可行,以及能编写哪些 SQL)。
  • **受众和决策:**谁会使用分析结果,以及他们将据此做出什么决策(确定分析的深度和“接下来做什么”建议)。
  • **分析类型:**队列、漏斗、假设检验或趋势(决定采用的方法和图表)。

询问本次请求中最重要的两三项输入,而不是列出所有问题。如果用户希望立即获得结果,就直接给出结果,并在开头说明假设。

工作流

  1. 明确业务问题 —— 将利益相关方的问题重述为包含明确指标的可检验假设(例如,“活动 X 是否使 7 日留存率提升了 >= 5%?”)。确定所需的数据源。
  2. 编写并验证 SQL —— 使用 CTE 提高可读性。尽早筛选,最后再汇总。对复杂查询运行 EXPLAIN ANALYZE,以验证索引使用情况和扫描成本。
  3. 探索并分析数据概况 —— 计算描述性统计量(计数、均值、中位数、标准差、四分位数、偏度)。得出结论前,检查空值、重复项和异常值。
  4. 分析 —— 应用合适的方法:使用队列分析研究留存,使用漏斗分析研究转化,使用假设检验(t 检验、卡方检验)比较组间差异,使用回归分析研究变量间的关系。
  5. 可视化 —— 根据下方矩阵选择图表类型。遵循设计规则(柱形图的 Y 轴从零开始,颜色数 <=7,标注坐标轴,并通过基准值或目标值提供背景信息)。
  6. 传达洞察 —— 按照“是什么 / 意味着什么 / 接下来做什么”的结构组织发现。标题先点明核心结论,再用图表支撑,最后提出具体建议和预期影响。

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}

关键业务指标

类别指标公式
获客CACS&M 总支出 / 新客户数
获客转化率转化次数 / 访客数
参与度DAU/MAU 比率日活跃用户数 / 月活跃用户数
留存流失率流失客户数 / 期初客户总数
收入MRRSUM(活跃订阅金额)
收入LTVARPU 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/):收入与客户健康度分析为增长战略提供依据。

评论

支持 Markdown