name: 数据探索 description: 在分析之前,剖析和探索数据集以了解其形状、质量和模式。使用当遇到新数据集、评估数据质量、发现列分布、识别空值和异常值,或决定分析哪些维度时。
数据探索技能
系统化的方法论,用于剖析数据集、评估数据质量、发现模式和理解模式。
数据剖析方法论
阶段1:结构理解
在分析任何数据之前,了解其结构:
表级问题:
- 有多少行和列?
- 粒度是什么(每行代表什么)?
- 主键是什么?是否唯一?
- 数据上次更新时间?
- 数据追溯多远?
列分类: 将每列分类为以下之一:
- 标识符:唯一键、外键、实体ID
- 维度:用于分组/筛选的分类属性(状态、类型、区域、类别)
- 指标:用于测量的定量值(收入、计数、持续时间、分数)
- 时间:日期和时间戳(创建时间、更新时间、事件日期)
- 文本:自由格式文本字段(描述、笔记、名称)
- 布尔:真/假标志
- 结构:JSON、数组、嵌套结构
阶段2:列级剖析
对每列,计算:
所有列:
- 空值计数和空值率
- 唯一值计数和唯一性比率(唯一值 / 总数)
- 最常见值(前5-10个及其频率)
- 最不常见值(底部5个以发现异常)
数值列(指标):
最小值、最大值、平均值、中位数(p50)
标准差
百分位数:p1、p5、p25、p75、p95、p99
零值计数
负值计数(如果意外)
字符串列(维度、文本):
最小长度、最大长度、平均长度
空字符串计数
模式分析(值是否遵循某种格式?)
大小写一致性(全大写、全小写、混合?)
前导/尾随空格计数
日期/时间戳列:
最小日期、最大日期
空日期
未来日期(如果意外)
按月/周分布
时间序列中的间隔
布尔列:
真值计数、假值计数、空值计数
真值率
阶段3:关系发现
剖析各个列后:
- 外键候选:可能链接到其他表的ID列
- 层次结构:形成自然下钻路径的列(国家 > 州 > 城市)
- 相关性:一起移动的数值列
- 派生列:似乎从其他列计算得出的列
- 冗余列:具有相同或近似相同信息的列
质量评估框架
完整性得分
对每列评分:
- 完整 (>99% 非空):绿色
- 基本完整 (95-99%):黄色——调查空值
- 不完整 (80-95%):橙色——理解原因及其重要性
- 稀疏 (<80%):红色——可能无法在不填充的情况下使用
一致性检查
查找:
- 值格式不一致:相同概念以不同方式表示(“美国”、“USA”、“United States”、“us”)
- 类型不一致:数字存储为字符串、日期以各种格式
- 引用完整性:外键不匹配任何父记录
- 业务规则违反:负数量、结束日期早于开始日期、百分比 > 100
- 跨列一致性:状态 = “完成”但完成时间为空
准确性指标
表明准确性问题的红旗:
- 占位符值:0、-1、999999、“N/A”、“TBD”、“test”、“xxx”
- 默认值:单一值频率异常高
- 过时数据:更新_时间显示在活跃系统中没有最近更改
- 不可能值:年龄 > 150、未来日期、负持续时间
- 整数偏见:所有值以0或5结尾(表明估计,而非测量)
及时性评估
- 表上次更新时间?
- 预期更新频率?
- 事件时间和加载时间之间是否有延迟?
- 时间序列中是否有间隔?
模式发现技术
分布分析
对数值列,描述分布:
- 正态:均值和接近中位数,钟形
- 右偏:高值长尾(常见于收入、会话持续时间)
- 左偏:低值长尾(较少见)
- 双峰:两个峰值(表明两个不同群体)
- 幂律:少数极大值,多数小值(常见于用户活动)
- 均匀:整个范围频率大致相等(通常为合成或随机)
时间模式
对时间序列数据,查找:
- 趋势:持续向上或向下移动
- 季节性:重复模式(每周、每月、每季度、每年)
- 星期几效应:工作日与周末差异
- 假日效应:已知假日周围下降或峰值
- 变化点:水平或趋势的突然变化
- 异常值:违反模式的单个数据点
分段发现
通过以下识别自然分段:
- 找到具有3-20个唯一值的分类列
- 比较跨分段值的指标分布
- 查找行为显著不同的分段
- 测试分段是否同质或包含子分段
相关性探索
数值列之间:
- 计算所有指标对的相关矩阵
- 标记强相关性(|r| > 0.7)以调查
- 注意:相关性不意味着因果关系——明确标记此点
- 检查非线性关系(例如,二次、对数)
模式理解和文档
模式文档模板
为团队使用记录数据集时:
## 表:[模式.表名]
**描述**:[此表代表什么]
**粒度**:[每行代表...]
**主键**:[列(s)]
**行计数**:[大约,带日期]
**更新频率**:[实时 / 每小时 / 每天 / 每周]
**所有者**:[负责的团队或个人]
### 关键列
| 列 | 类型 | 描述 | 示例值 | 备注 |
|--------|------|-------------|----------------|-------|
| user_id | 字符串 | 唯一用户标识符 | “usr_abc123” | 外键到 users.id |
| event_type | 字符串 | 事件类型 | “点击”、“查看”、“购买” | 15个唯一值 |
| revenue | 小数 | 交易收入(美元) | 29.99, 149.00 | 非购买事件为空 |
| created_at | 时间戳 | 事件发生时间 | 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
血统和依赖
探索不熟悉的数据环境时:
- 从“输出”表开始(报告或仪表板消费的表)
- 向上游追踪:哪些表馈入它们?
- 识别原始/暂存/集市层
- 映射从原始数据到分析表的转换链
- 注明数据在哪里被丰富、筛选或聚合