data-analysis by excelsioryy/data-analysis-skill
npx skills add https://github.com/excelsioryy/data-analysis-skill --skill data-analysis为了防止 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}")
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
编码回退:如果读取失败,尝试 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
pandas, `numpyscipy, sklearn (如需)matplotlib, seaborn (静态); plotly (交互式)tabulate (美化打印), \xlsx工具, \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 报告,输出可视化图片,指出“电子产品”类目负面反馈最高,主要集中在“电池续航”问题上(基于文本聚类发现)。
Weekly Installs
82
Repository
First Seen
Feb 27, 2026
Security Audits
Installed on
kimi-cli82
gemini-cli82
amp82
cline82
github-copilot82
codex82
DOCX文件创建、编辑与分析完整指南 - 使用docx-js、Pandoc和Python脚本
51,800 周安装