data-analysis/SKILL.md
全链路数据分析技能,支持表格(CSV/Excel)、文档(PDF/DOCX/MD)及图像数据的处理。 核心工作流强制遵循:1. 安全探查:仅读取元数据与少量样本,严禁全量加载以防Token溢出;2. 质量体检:自动检查缺失、重复与一致性;3. 代码执行:基于Python(Pandas/Matplotlib)进行清洗、统计与可视化;4. 结果验证与报告生成。 适用场景:探索性分析(EDA)、多模态数据提取、图表绘制及生成数据洞察报告。
npx skillsauth add atxinsky/skills data-analysisInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
为了防止 Token 溢出和执行环境卡死,智能体 严禁 直接打印全量数据或将其加载到 Prompt 上下文中,只允许将必要的数据概要加载进上下文。
对不同类型的数据应使用不同的读取方法:
在编写正式分析代码前,必须先执行一段轻量级的探查代码。将代码保存至工作空间。
原则:
只看样貌,不看全貌: 仅获取元数据和少量样本。
元数据优先: 必须获取列名(Columns)和数据类型(Dtypes)。
样本限制: 严格限制读取行数(推荐n=5)。
探查全部文件: 若有多份待分析的文件,需要对所有文件逐一探查,并检查文件间可能存在的关联,将具体关联方式保存为csv文档或md文件,供后续分析进行参考。
标准探查代码模式 (Python示例):
import pandas as pd
# 设定文件路径
file_path = 'target_data.csv'
try:
# 1. 仅读取前5行,避免加载大文件占用内存
# 注意:对于非CSV文件 (如 Parquet, Excel),使用相应的 read_ function 并配合 head()
if file_path.endswith('.csv'):
df_preview = pd.read_csv(file_path, nrows=5)
elif file_path.endswith('.parquet'):
df_preview = pd.read_parquet(file_path).head(5)
elif file_path.endswith(('.xls', '.xlsx')):
df_preview = pd.read_excel(file_path, nrows=5)
# 2. 输出关键元数据供智能体思考
print("=== 数据预览 (前5行) ===")
print(df_preview.to_markdown(index=False))
print("\n=== 列信息与类型 ===")
print(df_preview.info())
except Exception as e:
print(f"摄入错误: {e}")
编码回退:如果读取失败,尝试 `encoding='gbk'` 或 `encoding='latin1'`。
分隔符:如果数据挤在一列,尝试 sep=';' 或 sep='\t'。
在进行任何分析前,必须先“体检”。这能避免“垃圾进,垃圾出”。检查结果需放在最后的报告中。
以下是详细的检查清单:
检查数据是否存在缺失,这会直接影响统计的偏差。
缺失值:
检查字段中 NULL 、 NaN 或空字符串的比例。
记录缺失:
截断:
文本字段是否因为字符长度限制被截断(例如 JSON 字符串不完整)。
检查数据是否存在重复,这会导致指标被夸大。
完全重复: 检查是否存在完全相同的行。
主键重复: ID 字段是否唯一?(例如:同一个 UserID 不应该出现在用户表的两行中)。
业务实体重复: 同一个业务对象是否因为大小写不同、空格不同而被记录了多次(例如 "Apple"和 "apple" )。
检查数据是否符合定义的格式和现实世界的物理规则。
数据类型:
取值范围:
检查数据在不同维度或来源上是否统一。
单位统一: 距离是米还是千米?金额是元还是分?
枚举值统一: 同样的含义是否有多种表达?(例如: "Beijing" , "BJ" , "北京" 应该标准化为同一种)。
跨表一致性: 两个表中相同含义的字段,数据是否对得上?(例如:订单表中的总金额是否等于详情表中各商品金额之和)。
若多份文件间存在关联关系,检查关系是否断裂。
外键约束: 事实表中的 ID 是否都能在维度表中找到?(例如:订单表里的 product_id ,在商品表中是否存在?如果不存在,就是“孤儿数据”)。
代码示例:
import pandas as pd
# --- 1. 完整性检查 (Completeness) ---
for col in COLS_CHECK_MISSING:
# 检查 NULL/NaN
missing_count = df[col].isnull().sum()
# 检查空字符串 (如果是字符串列)
empty_str_count = (df[col] == '').sum() if df[col].dtype == 'object' else 0
total_missing = missing_count + empty_str_count
if total_missing > 0:
print(f" -> 警告: 列 '{col}' 存在 {total_missing} 条缺失数据")
else:
print(f" -> 通过: 列 '{col}' 无缺失")
# --- 2. 唯一性检查 (Uniqueness) ---
if df[COL_PRIMARY_KEY].duplicated().any():
duplicate_count = df[COL_PRIMARY_KEY].duplicated().sum()
print(f" -> 警告: 主键 '{COL_PRIMARY_KEY}' 发现 {duplicate_count} 条重复记录")
# 可选:查看重复样本
# print(df[df[COL_PRIMARY_KEY].duplicated(keep=False)])
else:
print(f" -> 通过: 主键唯一")
# --- 3. 准确性检查 (Accuracy) ---
# 过滤出不符合规则的行
invalid_rows = df[df[COL_NUMERIC] < MIN_VALUE_THRESHOLD]
if not invalid_rows.empty:
print(f" -> 警告: 发现 {len(invalid_rows)} 条数据小于最小值 {MIN_VALUE_THRESHOLD}")
else:
print(f" -> 通过: 数值范围正常")
# --- 4. 一致性检查 (Consistency) ---
# 找出不在标准列表中的值
# fillna(False) 是为了处理空值情况,避免报错
invalid_mask = ~df[COL_CATEGORY].isin(VALID_CATEGORIES) & df[COL_CATEGORY].notnull()
invalid_cats = df.loc[invalid_mask, COL_CATEGORY].unique()
if len(invalid_cats) > 0:
print(f" -> 警告: 列 '{COL_CATEGORY}' 包含非标准值: {invalid_cats}")
else:
print(f" -> 通过: 枚举值一致")
# --- 5. 关联性检查 (Integrity) ---
# 注意:此步需要有一个参考表 (ref_df)
try:
# 找出在当前表中存在,但在参考表(ref_df)中找不到的 ID
# 同样排除了当前表外键为空的情况
orphan_mask = ~df[COL_FOREIGN_KEY].isin(ref_df[COL_REF_KEY]) & df[COL_FOREIGN_KEY].notnull()
orphan_count = orphan_mask.sum()
if orphan_count > 0:
print(f" -> 警告: 发现 {orphan_count} 条“孤儿数据” (在维表中找不到对应记录)")
else:
print(f" -> 通过: 外键关联完整")
except NameError:
print(" -> 跳过: 未定义 ref_df (维表),无法进行关联检查")
根据任务需求确定具体的工作流程,优先使用用户指定的分析方法,不要使用与任务无关的分析方法。工作流程一般包含数据处理、分析和可视化呈现。
目标是通过深思熟虑的视觉设计,让数据变得易于理解、富有洞察力。每一个可视化都应该清晰明了,并帮助使用者做出更好的决策。
交互式仪表盘: 创建多面板仪表板、添加筛选器和控件
动画可视化: 展示随时间的变化、阐释复杂过程
根据用户的要求确定所需的报告类型,若无明确要求只需给出一份md格式的数据分析报告。
markdown、pdf、docx
在将结果呈现给用户之前,必须执行以下自检清单:
确认通过质量门控后,才可以交付。
用户指令:
“帮我分析一下 sales_2023.csv,我想看下半年的销售趋势,另外数据里好像有些退款订单,记得处理一下。”
智能体执行流:
步骤一(数据探查):
执行 pd.read_csv('sales_2023.csv', nrows=5)。
发现: 列包含 date, amount, status, product_id。date 为字符串格式,需转换。
步骤二(质量检查):
完整性: 检查 amount 是否有空值。
一致性: 检查 status 字段,发现包含 "Refund" 和 "Completed"。
动作: 过滤掉 status == 'Refund' 的行,只保留已完成订单。
步骤三 & 四(分析与执行):
处理: 将 date 转为 datetime 对象,按月聚合 amount。
代码: 使用 Pandas 进行 resample('M').sum()。
可视化: 生成折线图 sales_trend.png,标注峰值月份。
步骤五(交付): 输出简报和折线图:“2023下半年销售额在 11 月达到峰值(受大促影响),剔除 45 条退款记录后,总营收为 X 元。”
用户指令:
“我有产品类目的定义文件 categories.xlsx,还有一份最近的用户反馈日志 feedback.pdf。请分析一下哪个产品类目的负面反馈最多。”
智能体执行流:
步骤一(数据读入):
对于 categories.xlsx:使用 Pandas 读取前 5 行,确认包含 product_id 和 category_name。
对于 feedback.pdf:调用 \pdf 工具提取文本,通过 LLM 结构化解析为 CSV 格式(包含 product_id, sentiment, content),保存为 temp_feedback_parsed.csv。
步骤二(关联性检查):
探查: 读取 temp_feedback_parsed.csv 样本。
关联性: 检查反馈表中的 product_id 是否都能在 categories.xlsx 中找到。
警告: 发现 3 个 product_id 在类目表中不存在,标记为“未知类目”。
步骤三 & 四(分析与执行):
逻辑: 将两张表基于 product_id 进行 Merge。
筛选: 过滤 sentiment == 'Negative' 的记录。
统计: 按 category_name 进行 value_counts()。
可视化: 使用 Seaborn 绘制横向条形图 negative_feedback_by_category.png。
步骤五(交付): 生成 Markdown 报告,输出可视化图片,指出“电子产品”类目负面反馈最高,主要集中在“电池续航”问题上(基于文本聚类发现)。
development
Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like "the xlsx in my downloads") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.
testing
Use when creating new skills, editing existing skills, or verifying skills work before deployment
development
Use when you have a spec or requirements for a multi-step task, before touching code
documentation
Create detailed implementation plan with bite-sized tasks