Data Analysis

基于CSV文件的交互式数据分析流程,支持多格式输出。

已扫描
适合谁
数据分析师、产品经理
不适合谁
无数据文件的用户、需要实时数据库连接的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @yz6214589-hash/yz6214589-hash-data-analysis

Skill 说明

命令、参数、文件名以原文为准

数据分析技能

一个全面且交互式的数据分析工作流,将 CSV 数据转化为可操作的业务洞察。该技能引导您完成从初步探索到最终交付的专业数据分析流程,并在关键决策点设置质量检查和用户确认。

核心工作流

本技能遵循 7 步方法论,包含 3 个交互点:

输入 → 业务理解 → 数据检查 → 清洗策略 → 探索性分析 → 深度分析 → 洞察输出 → 输出
  ↓           ↓                      ↓                ↓                ↓           ↓          ↓
必需       交互点 1        质量门禁       交互点 2    自动运行    自动运行   交互点 3

输入要求

必需:

  • CSV 文件路径(绝对路径或相对路径)
  • 业务问题或分析目标

可选:

  • 数据字典(字段说明)
  • 分析深度:--quick(基础统计)、--standard(默认)、或 --deep(高级建模)
  • 自动模式:--auto(跳过交互,使用推荐策略)
  • 输出偏好:--format=markdown|html|dashboard

使用示例:

"分析 sales_data.csv - 我想知道哪些渠道的转化率最高"
"帮我理解 customer_behavior.csv,特别是留存模式"
"快速分析 Q4_results.csv --quick --auto"

第一步:业务理解(交互点 1)

你的操作

  1. 解析业务问题,并识别:

- 提及的关键指标(收入、转化率、流失率等)

- 所需的分析类型(趋势分析、对比分析、归因分析、预测等)

- 期望的分析维度(时间、地理、客户分群、渠道等)

- 最能说明答案的图表类型

  1. 生成分析计划,格式如下:
   ## 分析计划

   **核心问题:** [用一句话重述用户的目标]

   **需要计算的关键指标:**
   - [指标 1:例如,按渠道划分的月度转化率]
   - [指标 2:例如,订单价值的趋势]

   **分析维度:**
   - [例如,渠道、时间段、客户分群]

   **预期交付成果:**
   - [例如,展示渠道表现的对比图表]
   - [例如,带有关键事件标注的趋势线]

交互点 1

呈现你的分析计划,并询问:

这符合您的预期吗?
如果您希望我关注其他方面或补充内容,请告诉我。

如果业务目标不明确,提供模板参考:

我可以协助以下常见场景:
1. 销售分析(渠道对比、趋势预测、畅销产品)
2. 用户行为分析(漏斗分析、留存分群、流失预测)
3. 运营分析(投资回报率计算、活动效果评估、资源分配)

哪一个最符合您的需求?或者您希望用其他方式描述?

等待用户确认后继续下一步。

---

## 第二步:数据检查(自动运行,带质量门禁)

### 你的操作

1. **加载 CSV 文件:**

import pandas as pd

import numpy as np

# 优先尝试 UTF-8 编码,失败时回退至其他编码

try:

df = pd.read_csv(file_path, encoding='utf-8')

except UnicodeDecodeError:

df = pd.read_csv(file_path, encoding='latin-1')

2. **生成数据概览报告:**

## 数据概览

📊 维度:{rows:,} 行 × {cols} 列

💾 内存占用:{size} MB

📋 列信息:

列名数据类型示例值
.........

🔍 前 5 行预览:

[以表格形式展示]

3. **执行质量检查:**
   - **缺失值:** 按列统计缺失数量与占比
   - **重复项:** 检查是否存在完全重复的行
   - **数据类型:** 确认数值列未误作为字符串存储,日期列可被正确解析
   - **异常值(快速检查):** 使用 IQR 方法标记存在极端值的列

4. **计算数据质量评分(0-100):**

评分 = 100 - (缺失惩罚 + 重复惩罚 + 类型错误惩罚)

其中:

- 缺失惩罚 = min(40, 缺失率 × 100)

- 重复惩罚 = min(20, 重复率 × 100)

- 类型错误惩罚 = 每个类型错误列扣 10 分

### 质量门禁 1

根据评分结果,呈现检查结果:

**评分 ≥ 80(良好):**

✅ 数据质量良好(评分:{score}/100)

发现少量问题:[列出具体问题]

将继续进行分析...

**评分 60–79(一般):**

⚠️ 数据存在一定质量问题(评分:{score}/100)

发现问题:[列出具体问题]

仍可进行分析,但结果可能受限。是否继续?

**评分 < 60(较差):**

🚨 数据质量令人担忧(评分:{score}/100)

主要问题:

  • [问题 1 及其影响]
  • [问题 2 及其影响]

建议:联系数据提供方或提供数据字典。

您希望我在此基础上进行有限分析,还是先解决这些问题?

---

## 第三步:数据清洗策略(交互点 2)

### 你的操作

**若质量评分 ≥ 80 且问题轻微**,应用自动修复并报告:

🧹 已执行自动清洗:

  • 统一 'OrderDate' 列的时间格式
  • 去除文本字段中的首尾空白字符

准备就绪,可开始分析!

**若质量评分 < 80**,列出问题并提供具体处理策略选项:

## 数据清洗建议

### 问题 1:'Age' 列缺失值(20% 缺失)
**策略选项:**
A. 删除 Age 缺失的行(损失 20% 数据)← 若 Age 为关键字段,推荐使用
B. 使用中位数年龄(35 岁)填充
C. 按性别分组计算中位数进行填充
D. 保持原样,分析时排除 Age 字段

### 问题 2:'Price' 列存在异常值(3 个负值)
**策略选项:**
A. 删除这 3 行 ← 推荐
B. 将负值设为 0
C. 设为有效价格的最小值

### 问题 3:'PurchaseDate' 列日期格式不一致
**策略选项:**
A. 统一为 YYYY-MM-DD 格式 ← 推荐(可自动处理)

---

### 交互点 2

请用户选择:

请为每个问题选择策略(例如:“1A, 2A, 3A”),

或输入“recommended”以使用所有推荐策略,

或输入“auto”由我来决定。

**自动模式(`--auto` 标志):** 跳过此交互,直接使用所有推荐策略。

---

### 执行清洗

1. 应用所选策略
2. 记录所有已执行的更改
3. 输出结果报告:

✅ 清洗完成:

- Age:使用中位数(35)填充了 1,234 个缺失值

- Price:移除了 3 条含负值的记录

- PurchaseDate:对全部 6,000 行完成格式标准化

📊 最终数据集:{final_rows:,} 行 × {cols} 列(原数据为 {original_rows:,} 行)

4. **保存清洗后数据:**

cleaned_path = output_dir / 'cleaned_data.csv'

df_clean.to_csv(cleaned_path, index=False)

---

## 第 4 步:探索性数据分析(自动运行)

### 你的操作

1. **描述性统计:**
   - 数值型列:均值、中位数、标准差、最小值、最大值、四分位数
   - 分类型列:各类别频数、唯一值数量、众数

2. **单变量分析:**
   - **数值型:** 生成直方图,识别分布形态(正态、偏态、多峰)
   - **分类型:** 生成条形图,展示各类别频率分布

3. **多变量分析:**
   - **相关性矩阵:** 对所有数值型列进行分析(使用热力图可视化)
   - **交叉表:** 针对第 1 步中确定的关键分类型维度
   - **散点图:** 选取与业务问题相关的前 3 对高相关性变量

4. **生成初步洞察:**
   提取 3-5 条初步发现,例如:
   - “渠道 A 的转化率是渠道 B 的 3 倍”
   - “自 3 月以来销售额呈现明显上升趋势”
   - “年龄与购买金额呈弱负相关(-0.23)”

### 输出

将所有可视化图表保存为 PNG 文件:

import matplotlib.pyplot as plt

import seaborn as sns

示例

fig, ax = plt.subplots(figsize=(10, 6))

sns.histplot(data=df, x='Age', bins=30, ax=ax)

plt.title('年龄分布')

plt.savefig(output_dir / 'age_distribution.png', dpi=300, bbox_inches='tight')

plt.close()

以结构化格式报告发现:

探索性发现

分布概览

  • [关于数据分布的关键观察]

初步洞察

  1. [洞察 1]: [支持该结论的数据依据]
  2. [洞察 2]: [支持该结论的数据依据]
  3. [洞察 3]: [支持该结论的数据依据]

📊 可视化文件已保存:age_distribution.png, correlation_heatmap.png, channel_comparison.png

---

## 第 5 步:深度分析(自动运行)

### 你的操作

根据第 1 步中识别出的业务问题类型,自动选择并应用相应的分析方法:

| 业务问题类型 | 分析方法 |
|--------------|----------|
| **时间趋势** | 时间序列分析(移动平均、季节性检测) |
| **归因/因果** | 分组对比、贡献度分解(例如:哪个因素导致 80% 方差) |
| **用户行为** | 漏斗分析(各环节转化率)、留存率分析(按用户群组) |
| **客户价值** | RFM 模型(最近购买、购买频率、消费金额),聚类划分客户群体 |
| **预测** | 简单线性回归或指数平滑法进行趋势外推 |

### 示例:趋势分析

时间序列分析 + 移动平均

df['Date'] = pd.to_datetime(df['Date'])

df = df.sort_values('Date')

df['7d_MA'] = df['Revenue'].rolling(window=7).mean()

检测趋势

from scipy.stats import linregress

slope, intercept, r_value, p_value, std_err = linregress(

df['Date'].map(pd.Timestamp.toordinal),

df['Revenue']

)

if p_value < 0.05:

trend = "increasing" if slope > 0 else "decreasing"

print(f"检测到显著的 {trend} 趋势(p={p_value:.4f})")

### 示例:RFM 分析

计算 RFM 分数

current_date = df['PurchaseDate'].max()

rfm = df.groupby('CustomerID').agg({

'PurchaseDate': lambda x: (current_date - x.max()).days, # 近期性

'OrderID': 'count', # 频繁性

'Amount': 'sum' # 金额

}).rename(columns={

'PurchaseDate': 'Recency',

'OrderID': 'Frequency',

'Amount': 'Monetary'

})

客户评分(1-5 分制)

rfm['R_Score'] = pd.qcut(rfm['Recency'], 5, labels=[5, 4, 3, 2, 1])

rfm['F_Score'] = pd.qcut(rfm['Frequency'].rank(method='first'), 5, labels=[1, 2, 3, 4, 5])

rfm['M_Score'] = pd.qcut(rfm['Monetary'], 5, labels=[1, 2, 3, 4, 5])

客户分群

rfm['Segment'] = rfm['R_Score'].astype(str) + rfm['F_Score'].astype(str) + rfm['M_Score'].astype(str)

### 输出

## 深度分析结果

### [分析类型:例如“渠道绩效归因”]

**核心指标计算:** [例如“各渠道转化率”]

| 渠道 | 订单数 | 转化率 | 对收入的贡献 |
|------|--------|--------|--------------|
| A    | 5,234  | 8.5%   | 45%          |
| B    | 3,102  | 3.7%   | 28%          |
| C    | 1,876  | 2.1%   | 27%          |

**统计发现:**
渠道 A 的转化率是渠道 B 的 2.3 倍(p < 0.001),表明其在用户定位或用户体验方面具有显著优势。

📊 可视化图表已保存:channel_performance.png

---

## 步骤 6:洞察生成(自动执行)

### 你的操作

将所有发现整合为结构化的叙述,遵循“是什么 → 说明什么 → 接下来做什么”的框架:

分析报告

🔍 核心发现(是什么)

基于数据的事实陈述:

  1. [发现 1]: [具体数据及上下文]
  2. [发现 2]: [具体数据及上下文]
  3. [发现 3]: [具体数据及上下文]

💡 商业洞察(说明什么)

解读与影响分析:

  1. [洞察 1]: 对业务的意义

- 影响:[尽可能量化,例如“可能提升收入 15%”]

- 根本原因假设:[对现象发生原因的推测]

  1. [洞察 2]: 对业务的意义

- 影响:[...]

- 根本原因假设:[...]

🎯 行动建议(接下来做什么)

优先级排序的下一步行动:

  1. [行动 1 - 高优先级]: 具体操作及预期结果

- 时间安排:[立即 / 本季度 / 长期]

- 责任方:[负责团队]

  1. [行动 2 - 中等优先级]: 具体操作及预期结果

- 时间安排:[...]

- 责任方:[...]

### 图表选择建议

针对每个发现,选择最有效的可视化方式:
- **时间趋势** → 带注释的折线图
- **对比分析** → 条形图(类别较多时使用横向条形图)
- **占比关系** → 饼图或堆叠条形图
- **相关性分析** → 带趋势线的散点图
- **分布情况** → 直方图或箱线图

确保所有图表满足以下要求:
- 标题清晰,明确传达核心信息(不要仅写“销售图表”)
- 坐标轴标注单位
- 多系列时添加图例
- 关键数据点添加标签

---

## 步骤 7:输出交付(交互点 3)

### 交互点 3

**若用户在初始请求中指定了格式**(例如 `--format=html`),则跳过此步骤,直接使用指定格式。

**否则,提供以下选项:**

分析已完成!🎉

您的分析已准备就绪。请选择输出格式:

  1. 快速报告 - 嵌入 PNG 图表的 Markdown 文档

- 适用场景:邮件分享、文档记录、GitHub 提交

- 生成耗时:约 10 秒

  1. 交互式报告 - 单页 HTML 文件,集成 Chart.js

- 适用场景:演示展示、数据动态探索

- 生成耗时:约 30 秒

  1. 完整仪表盘 - 多页面网页应用(Tailwind CSS + Chart.js)

- 适用场景:向利益相关方共享、持续监控

- 生成耗时:约 2 分钟

请输入 1、2 或 3:

### 输出生成

#### 选项 1:快速报告(Markdown)

import shutil

report_path = output_dir / 'analysis_report.md'

with open(report_path, 'w', encoding='utf-8') as f:

f.write(f"# 数据分析报告\n\n")

f.write(f"数据集: {csv_filename}\n")

f.write(f"分析日期: {datetime.now().strftime('%Y-%m-%d')}\n\n")

f.write(f"---\n\n")

f.write(f"## 业务问题\n\n{business_question}\n\n")

f.write(f"## 数据概览\n\n{data_overview}\n\n")

f.write(f"## 发现\n\n{findings}\n\n")

f.write(f"## 洞察\n\n{insights}\n\n")

f.write(f"## 建议\n\n{recommendations}\n\n")

f.write(f"---\n\n")

f.write(f"## 附录:可视化图表\n\n")

for chart in chart_files:

f.write(f"![{chart.stem}]({chart.name})\n\n")

将所有图表 PNG 文件复制到输出目录

for chart in chart_files:

shutil.copy(chart, output_dir)

#### 选项 2:交互式报告(单页 HTML)

使用以下模板结构:

markdown
---
name: Data Analysis
version: 1.0.0
description: 从数据中提取洞察,生成可交互的分析报告。
summary: 提供结构化数据分析与可视化报告,支持多种输出格式。
tags:
  - data-analysis
  - visualization
  - report-generation
  - dashboard
---

# 数据分析

## 概述

本技能用于对数据集进行深入分析,生成包含关键发现、可视化图表和建议的完整报告。支持静态 Markdown 报告、带样式的 HTML 报告以及可交互的多页仪表盘。

---

## 功能特性

### ✅ 核心能力
- 自动检测数据质量并提示问题
- 识别业务目标并引导用户明确分析需求
- 生成结构化分析报告(含图表与建议)
- 支持大文件与宽表数据的优化处理
- 输出多种格式:Markdown、HTML、JSON、CSV

### 📊 可视化支持
- 条形图、折线图、饼图等基础图表
- 使用 Chart.js 实现交互式图表
- 基于 Tailwind CSS 的现代化样式布局
- 支持动态数据加载与响应式设计

### 📁 输出格式
| 格式 | 文件名示例 | 说明 |
|------|------------|------|
| 报告 | `analysis_report.html` | 可直接在浏览器打开的交互式报告 |
| 简报 | `analysis_report.md` | 轻量级文本报告,适合快速阅读 |
| 数据 | `cleaned_data.csv` | 经清洗后的可用数据 |
| 代码 | `analysis_notebook.ipynb` | Jupyter Notebook 分析脚本(可选) |

---

## 工作流程

### 第一步:输入数据
提供一个 CSV 或 JSON 格式的数据文件,系统将自动读取并分析其结构。

### 第二步:明确分析目标
若未指定具体问题,系统将引导用户提出业务问题,例如:
- 哪个维度在某指标上表现最佳?
- 某指标随时间如何变化?
- 哪些因素与结果相关?
- 请给出数据的整体概览

### 第三步:数据预处理
根据数据质量评估结果,执行以下操作:
- 缺失值处理
- 重复项删除
- 异常值识别
- 类型转换与标准化

### 第四步:分析与建模
- 描述性统计分析
- 相关性分析
- 分组聚合(如按时间、类别)
- 假设检验(使用 scipy)

### 第五步:生成报告
自动生成包含以下部分的报告:

#### 1. 业务问题
> [在此插入用户提出的分析问题]

#### 2. 关键发现
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
  <div class="bg-blue-50 p-4 rounded-lg">
    <div class="text-3xl font-bold text-blue-600">[指标1]</div>
    <div class="text-sm text-gray-600">[描述]</div>
  </div>
  <!-- 其他指标卡片 -->
</div>

#### 3. 可视化图表
<div class="mb-6">
  <canvas id="chart1"></canvas>
</div>

#### 4. 建议
1. [建议1]
2. [建议2]

---

## 高级功能

### 选项 3:完整仪表盘(多页面)

创建如下文件结构:

dashboard/

├── index.html (概览页)

├── data.html (详细数据探索页)

├── insights.html (发现与建议页)

└── assets/

├── data.json (导出数据,支持交互)

└── styles.css (自定义样式)

该仪表盘支持:
- 多页面导航
- 动态数据渲染
- 本地存储与状态管理(通过 JavaScript)

---

## 最终交付

✅ 分析已完成!

您的分析已保存至:{output_directory}

交付成果:

  • 📄 分析报告:analysis_report.{md|html}
  • 📊 可视化图表:{列出图表文件}
  • 🧹 清洗后数据:cleaned_data.csv
  • 💾 分析代码:analysis_notebook.ipynb(可选)

关键要点:

  1. [针对第一个发现的一句话总结]
  2. [针对第二个发现的一句话总结]
  3. [针对第三个发现的一句话总结]

[如果为 HTML/仪表盘]

您可以在浏览器中打开 {report_filename} 查看交互式报告。

是否需要我进一步解释某个分析环节,或对报告内容进行修改?

---

## 异常处理机制

### 大数据集(> 10万行)
检测到数据量较大时,提供以下选项:

此数据集包含 {rows:,} 行。为提升分析速度,我可以:

  1. 分析随机抽样(10%,约 {sample_size:,} 行) ← 推荐
  2. 在分析前按 {suggested_dimension} 进行聚合
  3. 处理完整数据集(耗时较长)

请选择您偏好的方式?

### 宽表数据(> 50 列)
当列数过多时,提示用户聚焦分析范围:

此数据集有 {cols} 列。为集中分析重点,我可以:

  1. 仅使用与您的问题相关的列:{relevant_cols}
  2. 由您选择要包含的列
  3. 分析所有列(报告会较长)

哪种方式更适合您?

### 业务目标不明确
当用户仅说“分析这个 CSV”而无具体问题时:

我可以为您分析这份数据!为了使结果更有价值,请问您想了解什么?

常见场景:

  • 🎯 性能分析:「哪个 {维度} 在 {指标} 上表现最好?」
  • 📈 趋势分析:「{指标} 如何随时间变化?」
  • 🔍 模式识别:「哪些因素与 {结果} 有关?」
  • 📊 整体概览:「给我一份数据的总体情况」

也可以用您自己的话描述想要解决的问题。

### 数据质量差(评分 < 40)
若数据质量得分低于 40,发出警告:

⚠️ 此数据存在显著质量问题(评分:{score}/100):

  • {issue_1}
  • {issue_2}

建议:

  1. 联系数据提供方获取更干净的版本
  2. 提供数据字典以便正确理解字段含义
  3. 我可继续进行有限分析,但结果将标注为“低置信度”

您希望如何继续?

---

## 技术栈

**数据处理:**
- `pandas` —— 主要数据操作工具
- `numpy` —— 数值计算支持
- `scipy` —— 统计检验与建模

**可视化:**
- `matplotlib` —— 生成静态图表(PNG 输出)
- `seaborn` —— 统计图形美化
- Chart.js(通过 CDN 加载)—— 实现网页端交互式图表

**报告生成:**
- Markdown —— 快速生成简洁报告
- HTML + Tailwind CSS —— 美观且响应式的报告页面
- Chart.js —— 支持动态更新与用户交互

技能:数据分析
版本:1.0.0
分块:5/5

**如果缺少依赖包,请始终安装:**

import subprocess

import sys

def ensure_package(package):

try:

__import__(package)

except ImportError:

subprocess.check_call([sys.executable, "-m", "pip", "install", package])

确保核心包已安装

for pkg in ['pandas', 'numpy', 'scipy', 'matplotlib', 'seaborn']:

ensure_package(pkg)

---

## 质量原则

1. **始终解释“原因”**:不要只报告数字,要解读这些数据对业务的实际意义
2. **使用具体数值**:例如“渠道 A 的转化率为 8.5%”比“渠道 A 转化率更高”更清晰
3. **有效可视化**:选择能立即凸显模式的图表类型
4. **承认不确定性**:若数据质量较差或样本量过小,应明确说明
5. **优先排序建议**:将行动建议标记为高/中/低优先级,并说明预期影响
6. **保存中间结果**:始终保存清洗后的数据和分析代码,以确保可复现性

---

## 工作目录

所有输出均保存至:`./data-analysis-results/{timestamp}/`

目录结构:

data-analysis-results/

└── 2024-03-29_14-30-45/

├── analysis_report.md (或 .html)

├── cleaned_data.csv

├── charts/

│ ├── age_distribution.png

│ ├── correlation_heatmap.png

│ └── channel_comparison.png

└── analysis_notebook.ipynb (如请求生成)

在开始时创建时间戳目录:

from datetime import datetime

from pathlib import Path

timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')

output_dir = Path(f'./data-analysis-results/{timestamp}')

output_dir.mkdir(parents=True, exist_ok=True)

(output_dir / 'charts').mkdir(exist_ok=True)

---

## 成功建议

- **尽早读取 CSV 文件**:不要等待——在第一步就加载文件,验证其存在且可读
- **持续向用户通报进展**:每完成一个步骤后,提供简要的状态更新
- **避免过度设计**:若数据干净且问题简单,无需强行使用复杂分析方法
- **复用代码模式**:常见操作(如加载 CSV、数据质量检查、生成图表)应遵循一致的模式,以保证可靠性
- **测试可视化效果**:始终确认图表清晰可读,主要信息能在一瞥中被理解
YH
@yz6214589-hash

已收录 1 个 Skill

相关推荐