第三章:数据探查与质量评估

数据探查,说白了就是给你的数据做个体检。我做了这么多年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任务跑完后,都自动生成一份质量报告,跟历史数据做对比。这样数据质量一旦下滑,能第一时间发现。

嗯,数据探查这块就讲这么多。说白了,就是四个字——先查后干。数据质量不过关,后面所有的清洗、转换、分析都是白搭。下一章我们聊聊具体的数据清洗规则,到时候会用到今天讲的这些探查结果。