名称: data-analyst
版本: 1.0.0
描述: "数据可视化、报告生成、SQL查询与电子表格自动化。将您的AI助手转变为精通数据的分析师,将原始数据转化为可执行的见解。"
作者: openclaw
将您的AI助手打造成数据分析利器。
查询数据库、分析电子表格、创建可视化图表,并生成驱动决策的深刻见解。
✅ SQL查询 — 编写并执行数据库查询
✅ 电子表格分析 — 处理CSV、Excel、Google Sheets数据
✅ 数据可视化 — 创建图表、图形和仪表板
✅ 报告生成 — 自动生成包含见解的报告
✅ 数据清洗 — 处理缺失值、异常值和格式问题
✅ 统计分析 — 描述性统计、趋势分析、相关性分析
在 TOOLS.md 中配置您的数据源:
```markdown
### 数据源
设置您的工作空间:
bash
./scripts/data-init.sh
开始分析!
基础数据探索
-- 行数统计
SELECT COUNT(*) FROM table_name;
-- 数据抽样
SELECT * FROM table_name LIMIT 10;
-- 列统计
SELECT
column_name,
COUNT(*) as count,
COUNT(DISTINCT column_name) as unique_values,
MIN(column_name) as min_val,
MAX(column_name) as max_val
FROM table_name
GROUP BY column_name;
基于时间的分析
-- 每日聚合
SELECT
DATE(created_at) as date,
COUNT(*) as daily_count,
SUM(amount) as daily_total
FROM transactions
GROUP BY DATE(created_at)
ORDER BY date DESC;
-- 月度环比
SELECT
DATE_TRUNC('month', created_at) as month,
COUNT(*) as count,
LAG(COUNT(*)) OVER (ORDER BY DATE_TRUNC('month', created_at)) as prev_month,
(COUNT(*) - LAG(COUNT(*)) OVER (ORDER BY DATE_TRUNC('month', created_at))) /
NULLIF(LAG(COUNT(*)) OVER (ORDER BY DATE_TRUNC('month', created_at)), 0) * 100 as growth_pct
FROM transactions
GROUP BY DATE_TRUNC('month', created_at)
ORDER BY month;
队列分析
-- 按注册月份划分的用户队列
SELECT
DATE_TRUNC('month', u.created_at) as cohort_month,
DATE_TRUNC('month', o.created_at) as activity_month,
COUNT(DISTINCT u.id) as users
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY cohort_month, activity_month
ORDER BY cohort_month, activity_month;
漏斗分析
-- 转化漏斗
WITH funnel AS (
SELECT
COUNT(DISTINCT CASE WHEN event = 'page_view' THEN user_id END) as views,
COUNT(DISTINCT CASE WHEN event = 'signup' THEN user_id END) as signups,
COUNT(DISTINCT CASE WHEN event = 'purchase' THEN user_id END) as purchases
FROM events
WHERE date >= CURRENT_DATE - INTERVAL '30 days'
)
SELECT
views,
signups,
ROUND(signups * 100.0 / NULLIF(views, 0), 2) as signup_rate,
purchases,
ROUND(purchases * 100.0 / NULLIF(signups, 0), 2) as purchase_rate
FROM funnel;
| 问题 | 检测方法 | 解决方案 |
|---|---|---|
| 缺失值 | IS NULL 或空字符串 |
填充、删除或标记 |
| 重复项 | GROUP BY 配合 HAVING COUNT(*) > 1 |
根据规则去重 |
| 异常值 | Z分数 > 3 或 IQR方法 | 调查、封顶或排除 |
| 格式不一致 | 抽样和模式匹配 | 通过转换标准化 |
| 无效值 | 范围检查、参照完整性 | 验证并纠正 |
-- 查找重复项
SELECT email, COUNT(*)
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
-- 查找空值
SELECT
COUNT(*) as total,
SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) as null_emails,
SUM(CASE WHEN name IS NULL THEN 1 ELSE 0 END) as null_names
FROM users;
-- 标准化文本
UPDATE products
SET category = LOWER(TRIM(category));
-- 移除异常值 (IQR方法)
WITH stats AS (
SELECT
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY value) as q1,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY value) as q3
FROM data
)
SELECT * FROM data, stats
WHERE value BETWEEN q1 - 1.5*(q3-q1) AND q3 + 1.5*(q3-q1);
# 数据质量审计: [数据集]
## 行级检查
- [ ] 总行数: [X]
- [ ] 重复行: [X]
- [ ] 包含空值的行: [X]
## 列级检查
| 列名 | 类型 | 空值数 | 唯一值数 | 最小值 | 最大值 | 问题 |
|--------|------|-------|--------|-----|-----|--------|
| [col] | [type] | [n] | [n] | [v] | [v] | [notes] |
## 数据谱系
- 来源: [数据来源]
- 最后更新: [日期]
- 已知问题: [列表]
## 已执行的清洗操作
1. [操作及原因]
2. [操作及原因]
import pandas as pd
# 加载数据
df = pd.read_csv('data.csv') # 或 pd.read_excel('data.xlsx')
# 基础探索
print(df.shape) # (行数, 列数)
print(df.info()) # 列类型和空值
print(df.describe()) # 数值统计
# 数据清洗
df = df.drop_duplicates()
df['date'] = pd.to_datetime(df['date'])
df['amount'] = df['amount'].fillna(0)
# 分析
summary = df.groupby('category').agg({
'amount': ['sum', 'mean', 'count'],
'quantity': 'sum'
}).round(2)
# 导出
summary.to_csv('analysis_output.csv')
# 筛选
filtered = df[df['status'] == 'active']
filtered = df[df['amount'] > 1000]
filtered = df[df['date'].between('2024-01-01', '2024-12-31')]
# 聚合
by_category = df.groupby('category')['amount'].sum()
pivot = df.pivot_table(values='amount', index='month', columns='category', aggfunc='sum')
# 窗口函数
df['running_total'] = df['amount'].cumsum()
df['pct_change'] = df['amount'].pct_change()
df['rolling_avg'] = df['amount'].rolling(window=7).mean()
# 合并
merged = pd.merge(df1, df2, on='id', how='left')
| 数据类型 | 最佳图表 | 适用场景 |
|---|---|---|
| 时间趋势 | 折线图 | 展示随时间变化的模式 |
| 类别比较 | 柱状图 | 比较离散类别 |
| 部分与整体 | 饼图/环形图 | 展示比例 (≤5个类别) |
| 分布情况 | 直方图 | 理解数据分布 |
| 相关性 | 散点图 | 两个变量间的关系 |
| 多类别 | 横向条形图 | 排名或比较多个项目 |
| 地理数据 | 地图 | 基于位置的数据 |
import matplotlib.pyplot as plt
import seaborn as sns
# 设置样式
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")
# 折线图 (趋势)
plt.figure(figsize=(10, 6))
plt.plot(df['date'], df['value'], marker='o')
plt.title('时间趋势')
plt.xlabel('日期')
plt.ylabel('数值')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('trend.png', dpi=150)
# 柱状图 (比较)
plt.figure(figsize=(10, 6))
sns.barplot(data=df, x='category', y='amount')
plt.title('按类别统计金额')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('comparison.png', dpi=150)
# 热力图 (相关性)
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', center=0)
plt.title('相关性矩阵')
plt.tight_layout()
plt.savefig('correlation.png', dpi=150)
无法生成图片时,可使用ASCII图表:
月度营收 (单位:千美元)
========================
一月: ████████████████ 160
二月: ██████████████████ 180
三月: ████████████████████████ 240
四月: ██████████████████████ 220
五月: ██████████████████████████ 260
六月: ████████████████████████████ 280
# [报告名称]
**周期:** [日期范围]
**生成时间:** [日期]
**作者:** [AI助手/人员]
## 执行摘要
[2-3句话总结关键发现]
## 关键指标
| 指标 | 当前值 | 前值 | 变化 |
|--------|---------|----------|--------|
| [指标] | [数值] | [数值] | [+/-X%] |
## 详细分析
### [部分 1]
[分析及支持数据]
### [部分 2]
[分析及支持数据]
## 可视化
[插入图表]
## 见解
1. **[见解]**: [支持证据]
2. **[见解]**: [支持证据]
## 建议
1. [可执行的建议]
2. [可执行的建议]
## 方法论
- 数据源: [来源]
- 日期范围: [范围]
- 应用的过滤器: [过滤器]
- 已知限制: [限制]
## 附录
[支持数据表]
#!/bin/bash
# generate-report.sh
# 拉取最新数据
python scripts/extract_data.py --output data/latest.csv
# 运行分析
python scripts/analyze.py --input data/latest.csv --output reports/
# 生成报告
python scripts/format_report.py --template weekly --output reports/weekly-$(date +%Y-%m-%d).md
echo "报告已生成: reports/weekly-$(date +%Y-%m-%d).md"
| 统计量 | 含义 | 使用场景 |
|---|---|---|
| 均值 | 平均值 | 集中趋势 |
| 中位数 | 中间值 | 对异常值稳健 |
| 众数 | 最常见值 | 分类数据 |
| 标准差 | 围绕均值的离散程度 | 变异性 |
| 最小值/最大值 | 范围 | 数据边界 |
| 百分位数 | 分布形状 | 基准测试 |
# 完整的描述性统计
stats = df['amount'].describe()
print(stats)
# 附加统计量
print(f"中位数: {df['amount'].median()}")
print(f"众数: {df['amount'].mode()[0]}")
print(f"偏度: {df['amount'].skew()}")
print(f"峰度: {df['amount'].kurtosis()}")
# 相关性
correlation = df['sales'].corr(df['marketing_spend'])
print(f"相关性: {correlation:.3f}")
| 检验 | 使用场景 | Python |
|---|---|---|
| T检验 | 比较两个均值 | scipy.stats.ttest_ind(a, b) |
| 卡方检验 | 分类变量独立性 | scipy.stats.chi2_contingency(table) |
| 方差分析 | 比较3个及以上均值 | scipy.stats.f_oneway(a, b, c) |
| 皮尔逊相关 | 线性相关性 | scipy.stats.pearsonr(x, y) |
定义问题
理解数据
清洗与准备
探索
分析
沟通
# 分析请求
## 问题
[我们试图回答什么问题?]
## 背景
[为什么这很重要?将影响什么决策?]
## 可用数据
- [数据集 1]: [描述]
- [数据集 2]: [描述]
## 预期输出
- [交付物 1]
- [交付物 2]
## 时间线
[何时需要?]
## 备注
[任何限制或注意事项]
初始化数据分析工作空间。
快速执行SQL查询。
# 从文件运行查询
./scripts/query.sh --file queries/daily-report.sql
# 运行内联查询
./scripts/query.sh "SELECT COUNT(*) FROM users"
# 保存输出到文件
./scripts/query.sh --file queries/export.sql --output data/export.csv
Python分析工具包。
# 基础分析
python scripts/analyze.py --input data/sales.csv
# 指定分析类型
python scripts/analyze.py --input data/sales.csv --type cohort
# 生成报告
python scripts/analyze.py --input data/sales.csv --report weekly
| 技能 | 集成方式 |
|---|---|
| 市场营销 | 分析活动表现、内容指标 |
| 销售 | 销售管道分析、转化分析 |
| 业务拓展 | 市场研究数据、竞争对手分析 |
❌ 确认偏误 — 寻找支持结论的数据
❌ 相关≠因果 — 谨慎做出因果论断
❌ 选择性呈现 — 仅使用有利数据
❌ 忽视异常值 — 移除前先调查
❌ 过度复杂化 — 简单的分析往往更有效
❌ 缺乏上下文 — 没有比较的数字毫无意义
许可证: MIT — 可自由使用、修改、分发。
"目标是将数据转化为信息,将信息转化为见解。" — 卡莉·菲奥莉娜