/explore-data -
分析和探索数据集
如果你看到不熟悉的占位符或需要检查已连接的工具,请参阅 CONNECTORS.md。
生成表或上传文件的全面数据剖析报告。在深入分析之前了解其结构、质量和模式。
用法
/explore-data <表名或文件>
工作流程
1. 访问数据
如果数据仓库 MCP 服务器已连接:
- 解析表名(处理模式前缀,不明确时建议匹配项)
- 查询表元数据:列名、类型、描述(如有)
- 对实时数据运行剖析查询
如果提供了文件(CSV、Excel、Parquet、JSON):
- 读取文件并加载到工作数据集中
- 从数据中推断列类型
如果两者都没有:
- 请用户提供表名(连接其数据仓库)或上传文件
- 如果他们描述了表模式,提供关于运行哪些剖析查询的指导
2. 理解结构
在分析任何数据之前,先了解其结构:
表级问题:
- 有多少行和列?
- 粒度是什么(每行代表什么)?
- 主键是什么?是否唯一?
- 数据最近何时更新?
- 数据的历史回溯范围?
列分类——将每列归类为以下之一:
- 标识符:唯一键、外键、实体 ID
- 维度:用于分组/筛选的分类属性(状态、类型、区域、类别)
- 指标:用于测量的定量值(收入、计数、时长、分数)
- 时间:日期和时间戳(created_at、updated_at、event_date)
- 文本:自由格式的文本字段(描述、备注、名称)
- 布尔值:真/假标志
- 结构型:JSON、数组、嵌套结构
3. 生成数据剖析
运行以下剖析检查:
表级指标:
- 总行数
- 列数和类型分布
- 近似表大小(如元数据可用)
- 日期范围覆盖(日期列的最小/最大值)
所有列:
- 空值计数和空值率
- 去重计数和基数比(去重数 / 总数)
- 最常见值(前 5-10 个及其频率)
- 最不常见值(底部 5 个以发现异常)
数值列(指标):
最小值、最大值、均值、中位数(p50)
标准差
百分位数:p1、p5、p25、p75、p95、p99
零值计数
负值计数(如果不应出现)
字符串列(维度、文本):
最小长度、最大长度、平均长度
空字符串计数
模式分析(值是否遵循某种格式?)
大小写一致性(全大写、全小写、混合?)
前导/尾随空格计数
日期/时间戳列:
最小日期、最大日期
空值日期
未来日期(如果不应该出现)
按月/周分布
时间序列中的断点
布尔列:
真值计数、假值计数、空值计数
真值率
将剖析结果呈现为清晰的汇总表,按列类型分组(维度、指标、日期、ID)。
4. 识别数据质量问题
应用下面的质量评估框架。标记潜在问题:
- 高空值率:空值超过 5% 的列(警告),超过
20%(警报)
- 低基数异常:本应是高基数的列实际并非如此(例如,"user_id"只有
50 个不同的值)
- 高基数异常:本应是分类的列有太多不同的值
- 可疑值:仅在正数预期的地方出现负数金额、历史数据中的未来日期、明显的占位符值(例如
"N/A"、"TBD"、"test"、"999999")
- 重复检测:检查是否有自然键及其是否有重复
- 分布偏态:极偏斜的数值分布可能影响平均值
- 编码问题:分类字段中的大小写混合、尾随空格、不一致的格式
5. 发现关系和模式
在分析单个列之后:
- 外键候选:可能与其他表关联的 ID 列
- 层级结构:形成自然下钻路径的列(国家 > 州 >
城市)
- 相关性:一起变化的数值列
- 派生列:似乎由其他列计算得出的列
- 冗余列:包含相同或几乎相同信息的列
6. 建议有趣的维度和指标
基于列剖析,推荐:
- 最佳维度列用于数据切分(具有合理基数的分类列,3-50
个值)
- 关键指标列用于测量(具有有意义分布的数值列)
- 时间列适合趋势分析
- 数据中明显的自然分组或层级结构
- 可能连接到其他表的连接键(ID 列、外键)
7. 推荐后续分析
建议 3-5 个用户可以接下来运行的具体分析:
- "按 [维度] 分组的 [指标] 在 [时间列] 上的趋势分析"
- "对 [偏斜列] 进行分布深度分析以了解异常值"
- "关于 [问题列] 的数据质量调查"
- "[指标_a] 和 [指标_b] 之间的相关性分析"
- "使用 [日期列] 和 [状态列] 的群组分析"
输出格式
## 数据剖析:[表名]
### 概览
- 行数:2,340,891
- 列数:23(8 个维度,6 个指标,4 个日期,5 个 ID)
- 日期范围:2021-03-15 至 2024-01-22
### 列详情
[汇总表]
### 数据质量问题
[标记的问题及其严重程度]
### 推荐探索方向
[建议的后续分析编号列表]
质量评估框架
完整性评分
评估每列:
- 完整(>99% 非空):绿色
- 基本完整(95-99%):黄色——调查空值
- 不完整(80-95%):橙色——了解原因及是否重要
- 稀疏(<80%):红色——未经插补可能无法使用
一致性检查
查找:
- 值格式不一致:同一概念以不同方式表示("USA"、"US"、"United
States"、"us")
- 类型不一致:数字存储为字符串,日期格式各异
- 引用完整性:不匹配任何父记录的外键
- 业务规则违反:负数数量、结束日期早于开始日期、百分比超过
100
- 跨列一致性:状态为"completed"但 completed_at
为空
准确性指标
表明准确性问题的红旗:
- 占位符值:0、-1、999999、"N/A"、"TBD"、"test"、"xxx"
- 默认值:单个值出现频率异常高
- 过时数据:活跃系统中 updated_at 显示近期无变化
- 不可能的值:年龄超过
150、远未来的日期、负的持续时间
- 整十整百偏差:所有值以 0 或 5
结尾(表明是估算而非测量)
时效性评估
- 表最近何时更新?
- 预期的更新频率是多少?
- 事件时间与加载时间之间是否有延迟?
- 时间序列中是否有断点?
模式发现技术
分布分析
对于数值列,描述分布特征:
- 正态分布:均值和中间值接近,钟形曲线
- 右偏:高值长尾(收入、会话时长常见)
- 左偏:低值长尾(不太常见)
- 双峰:两个峰值(表明两个不同的群体)
- 幂律分布:少数非常大的值,许多小值(用户活动常见)
- 均匀分布:整个范围内频率大致相等(通常是合成或随机数据)
时间模式
对于时间序列数据,查找:
- 趋势:持续的上升或下降运动
- 季节性:重复模式(每周、每月、每季度、每年)
- 星期几效应:工作日与周末的差异
- 节假日效应:已知节假日附近的下降或峰值
- 变化点:水平或趋势的突然转变
- 异常值:打破模式的单个数据点
细分发现
通过以下方式识别自然细分:
- 查找具有 3-20 个不同值的分类列
- 比较跨细分值的指标分布
- 寻找行为显著不同的细分
- 测试细分是同质的还是包含子细分
相关性探索
数值列之间:
- 计算所有指标对的相关矩阵
- 标记强相关性(|r| > 0.7)进行调查
- 注意:相关性不意味着因果——明确标记这一点
- 检查非线性关系(例如二次、对数)
模式理解和文档
模式文档模板
为团队记录数据集时:
## 表:[schema.table_name]
**描述**:[该表代表什么]
**粒度**:[每行代表……]
**主键**:[列名]
**行数**:[近似值,含日期]
**更新频率**:[实时/每小时/每日/每周]
**负责人**:[负责团队或个人]
### 关键列
| 列名 | 类型 | 描述 | 示例值 | 备注 |
|--------|------|-------------|----------------|-------|
| user_id | STRING | 唯一用户标识符 | "usr_abc123" | 外键关联 users.id |
| event_type | STRING | 事件类型 | "click", "view", "purchase" | 15 个不同值 |
| revenue | DECIMAL | 交易收入(美元) | 29.99, 149.00 | 非购买事件为 NULL |
| created_at | TIMESTAMP | 事件发生时间 | 2024-01-15 14:23:01 | 基于该列分区 |
### 关系
- 通过 `user_id` 连接到 `users`
- 通过 `product_id` 连接到 `products`
- 作为 `event_details` 的父表(1:多 通过 event_id)
### 已知问题
- [列出任何已知的数据质量问题]
- [标注分析师的任何陷阱]
### 常见查询模式
- [该表的典型用例]
模式探索查询
连接数据仓库时,使用以下模式探索模式:
-- 列出模式中的所有表(PostgreSQL)
SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;
-- 列详情(PostgreSQL)
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'my_table'
ORDER BY ordinal_position;
-- 表大小(PostgreSQL)
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
-- 所有表的行数(通用模式)
-- 按表执行:SELECT COUNT(*) FROM table_name
谱系和依赖关系
探索不熟悉的数据环境时:
- 从"输出"表开始(报告或仪表盘消费哪些表)
- 向上游追踪:哪些表为它们提供数据?
- 识别原始/中间/数据市场层级
- 绘制从原始数据到分析表的转换链
- 标注数据在哪里被丰富、筛选或聚合
技巧
- 对于非常大的表(1
亿行以上),剖析查询默认使用采样——如果需要精确计数请说明
- 如果是第一次探索新数据集,此命令可在编写特定查询之前提供整体概览
- 质量标记是启发式的——并非每个标记都是真正的问题,但每个都值得快速检查