第三章:数据探查与质量评估
数据探查,说白了就是给你的数据做个体检。我做了这么多年ETL,见过太多项目一上来就急着写清洗逻辑,结果跑到一半发现数据质量根本不过关,回头再改代价就大了。所以我的习惯是——先摸清数据的底细,再动手干活。
3.1 数据完整性检查
完整性检查,就是看数据有没有缺胳膊少腿。比如一张订单表,订单号、用户ID、金额这些关键字段,一个都不能少。
我在项目中遇到过最典型的情况:某张表的主键字段居然有20%的空值。你想想看,主键都为空,这数据基本就是废的。所以完整性检查,我一般分两步走:
- 必填字段检查:哪些字段是业务上必须有的?比如身份证号、手机号、交易金额。
- 关联完整性检查:外键能不能关联到主表?比如订单表的用户ID,在用户表里能不能找到?
核心原则:完整性检查不是简单的非空判断,而是要结合业务规则。比如「用户注册时间」这个字段,空值可能代表该用户是历史导入数据,不一定就是异常。
3.2 空值率统计
空值率,就是某个字段中空值所占的比例。这个指标很直观,但很多人容易忽略一个细节——空值率是动态的,不同时间窗口、不同数据源,空值率可能天差地别。
举个例子,我曾经处理过一个电商平台的用户画像数据。刚开始跑的时候,用户的「职业」字段空值率只有5%,但到了月底,突然飙到30%。查了半天,原来是新接入的一个数据源根本没传这个字段。
空值率统计的SQL其实很简单:
-- 计算空值率
SELECT
COUNT(*) AS total_rows,
COUNT(column_name) AS non_null_count,
COUNT(*) - COUNT(column_name) AS null_count,
ROUND((COUNT(*) - COUNT(column_name)) * 100.0 / COUNT(*), 2) AS null_rate
FROM table_name;
我的建议:空值率超过30%的字段,要特别关注。如果这个字段在业务上很重要,那就要跟数据提供方确认,是数据没采集到,还是业务上本来就没有?
3.3 唯一性校验
唯一性校验,说白了就是看有没有重复数据。这个坑我踩过不止一次。有一次做客户数据清洗,跑完去重逻辑后,发现客户总数少了10%。一查,原来同一个客户在系统里注册了两次,但身份证号是一样的。
唯一性校验通常分两种场景:
- 单字段唯一性:比如订单号、身份证号,理论上不应该重复。
- 组合字段唯一性:比如「用户ID + 商品ID + 购买时间」,组合起来应该是唯一的。
检查重复数据的SQL:
-- 检查重复记录
SELECT
column_name,
COUNT(*) AS duplicate_count
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
注意:唯一性校验不能只看数据本身,还要看业务逻辑。比如「用户ID + 商品ID」在购物车表里可能重复(用户多次加购),但在订单表里就不应该重复。
3.4 数据分布分析
数据分布分析,就是看数据的「长相」。均值、中位数、标准差,这三个指标基本能告诉你数据的全貌。
3.4.1 均值与中位数
均值和中间位数,这两个指标要放在一起看。如果均值远大于中位数,说明数据存在右偏,也就是有少数极端大的值把平均值拉高了。
我记得有一次做用户消费金额分析,均值是500元,但中位数只有120元。一查,原来有2%的用户消费了几十万,把整体均值拉上去了。这种情况下,用均值代表整体水平就不太合适。
-- 计算均值和中位数
SELECT
AVG(amount) AS mean_value,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) AS median_value
FROM transaction_table;
3.4.2 标准差
标准差衡量的是数据的离散程度。标准差越大,说明数据越分散,波动越大。
举个例子,两个部门的月销售额均值都是100万,但A部门的标准差是5万,B部门的标准差是30万。这说明A部门的业绩很稳定,B部门则忽高忽低。做数据清洗时,标准差大的字段要特别留意,可能存在异常值。
| 指标 | 含义 | 使用场景 |
|---|---|---|
| 均值 | 数据的平均水平 | 数据分布对称时使用 |
| 中位数 | 数据的中间位置 | 数据存在偏态或异常值时使用 |
| 标准差 | 数据的离散程度 | 判断数据波动大小 |
实战经验:我一般会先看中位数,再看均值,最后看标准差。如果中位数和均值差距超过20%,就要怀疑数据里是不是有异常值了。
3.5 综合评估报告
数据探查做完后,我会生成一份质量评估报告。报告里至少包含以下内容:
- 每个字段的空值率
- 重复记录的数量和比例
- 关键字段的均值、中位数、标准差
- 异常值的分布情况
- 数据质量评分(我习惯用百分制,90分以上算合格)
这份报告不仅是给技术团队看的,也是给业务方看的。我曾经拿着报告去找业务部门,告诉他们「你们的用户手机号字段空值率高达40%,这个数据没法用」。业务方一看数据,立马就重视起来了。
一个小技巧:数据探查不是一次性工作。我建议每次ETL任务跑完后,都自动生成一份质量报告,跟历史数据做对比。这样数据质量一旦下滑,能第一时间发现。
嗯,数据探查这块就讲这么多。说白了,就是四个字——先查后干。数据质量不过关,后面所有的清洗、转换、分析都是白搭。下一章我们聊聊具体的数据清洗规则,到时候会用到今天讲的这些探查结果。