3. 数据完整性评估:别让缺失值毁了你的分析

大家好,我是老蓝。今天咱们聊聊数据完整性评估。说实话,我在市场分析这行摸爬滚打十几年,见过太多因为数据缺失导致结论翻车的案例。数据完整性,说白了就是你的数据集里有没有「窟窿」——哪些该有的数据没了,哪些字段是空的。

3.1 数据完整性的定义

数据完整性,指的是数据集中所有记录和字段的完整程度。一个完整的数据集,应该没有缺失值,每个观测值都有对应的记录。但现实中,这几乎不可能。

我个人习惯把数据完整性分成三个层次:

  • 记录完整性:该有的样本有没有少?比如本该有1000份问卷,实际只回收了800份。
  • 字段完整性:每个样本的字段是否齐全?比如用户填了姓名,但没填年龄。
  • 值完整性:每个字段的值是否有效?比如年龄字段填了「-1」,这其实也算一种缺失。

核心观点:数据完整性不是「有或无」的问题,而是「缺失了多少、为什么缺失、怎么处理」的问题。

3.2 缺失值的三种类型

你想想看,同样是缺失值,背后的原因可能天差地别。我根据统计学的经典分类,把缺失值分成三类:

3.2.1 完全随机缺失(MCAR)

数据缺失的概率与任何变量都无关。说白了,就是纯随机。比如问卷被咖啡泼到了,或者传感器偶尔失灵。

特点:这种缺失最「干净」,处理起来也最简单。直接删除缺失样本,不会引入偏差。

我在项目中遇到过:有一次做电商用户行为分析,发现某天的日志数据有5%的缺失。排查后发现是服务器凌晨自动重启导致的。这就是典型的MCAR。

3.2.2 随机缺失(MAR)

数据缺失的概率与其他已观测到的变量有关,但与缺失值本身无关。举个例子:高收入人群更不愿意透露收入,但收入缺失的概率与「职业」这个已观测变量有关。

特点:这是实际项目中最常见的类型。处理时需要利用其他变量来预测缺失值。

3.2.3 非随机缺失(MNAR)

数据缺失的概率与缺失值本身有关。比如:收入特别高的人,故意不填收入。或者,血压特别高的患者,拒绝参加后续体检。

特点:这种最棘手。因为缺失本身包含了信息,直接删除或简单填充都会导致严重偏差。

避坑指南:我曾经在一个医疗项目中,直接删除了所有缺失血压数据的样本。结果发现,这些样本恰恰是重症患者。删除后,模型对重症的预测能力直接崩了。后来我才意识到,这是MNAR。

3.3 完整性评估指标

评估数据完整性,我一般看两个核心指标:

3.3.1 缺失率

缺失率 = 缺失值的数量 / 总数据量 × 100%

这个指标告诉你,数据「空」到什么程度。我一般这样判断:

  • 缺失率 < 5%:轻微缺失,可以直接删除或简单填充
  • 缺失率 5%-20%:中度缺失,需要认真分析缺失模式
  • 缺失率 > 20%:重度缺失,要谨慎处理,甚至考虑重新采集

3.3.2 覆盖率

覆盖率 = 完整记录数 / 总记录数 × 100%

这个指标更直观——有多少样本是「完整无缺」的。比如1000条记录中,只有600条所有字段都完整,那覆盖率就是60%。

小技巧:我习惯把缺失率和覆盖率结合起来看。如果缺失率低但覆盖率也低,说明缺失集中在少数样本上,直接删除这些样本即可。如果缺失率高但覆盖率也高,说明缺失分散在很多样本上,需要逐个字段处理。

3.4 完整性处理方法

处理缺失值,说白了就三种思路:删、填、插。我按顺序讲:

3.4.1 删除法

最简单粗暴,但也是最容易出问题的。

  • 整行删除:直接删掉有缺失的样本。适用于MCAR且缺失率低的情况。
  • 整列删除:直接删掉缺失严重的字段。适用于该字段不重要或缺失率超过50%的情况。
# Python示例:删除缺失率超过50%的列
import pandas as pd

df = pd.read_csv('market_data.csv')
# 计算每列的缺失率
missing_rate = df.isnull().mean()
# 删除缺失率超过50%的列
cols_to_drop = missing_rate[missing_rate > 0.5].index
df_cleaned = df.drop(columns=cols_to_drop)

3.4.2 填充法

用某个值填补缺失位置。常见方法:

  • 均值/中位数填充:适用于数值型数据。我一般用中位数,因为它不受极端值影响。
  • 众数填充:适用于分类型数据。比如用最常见的「男」来填充缺失的性别。
  • 前向/后向填充:适用于时间序列数据。用上一个或下一个值填充。
  • 固定值填充:比如用0填充缺失的销售额,或者用「未知」填充缺失的类别。
# Python示例:用中位数填充数值列
df['age'].fillna(df['age'].median(), inplace=True)

# 用众数填充分类列
df['gender'].fillna(df['gender'].mode()[0], inplace=True)

3.4.3 插值法

插值法比简单填充更「聪明」一些。它利用数据的内在规律来预测缺失值。

  • 线性插值:假设缺失值前后呈线性关系。适用于时间序列。
  • 多项式插值:用多项式拟合数据点。适用于非线性关系。
  • KNN插值:找到与缺失样本最相似的K个样本,用它们的均值填充。这是我最常用的方法之一。
  • 回归插值:用其他变量建立回归模型,预测缺失值。
# Python示例:线性插值
df['sales'].interpolate(method='linear', inplace=True)

# KNN插值(需要安装fancyimpute库)
from fancyimpute import KNN
df_filled = KNN(k=5).fit_transform(df)

我的经验:处理缺失值没有银弹。我一般会先分析缺失模式(MCAR/MAR/MNAR),再根据业务场景选择方法。比如在金融风控中,我倾向于用KNN插值,因为它能保留变量间的相关性。而在用户画像分析中,我可能直接用众数填充,因为效率更高。

3.5 知识体系总览

下面这张图,是我自己总结的数据完整性评估框架。你可以把它当作一个检查清单:

数据完整性评估知识框架 数据完整性定义 缺失值类型 MCAR(完全随机) MAR(随机缺失) MNAR(非随机) 评估指标 缺失率 覆盖率 处理方法 删除法 填充法 插值法

嗯,这张图把整个知识体系串起来了。从定义出发,到缺失类型、评估指标,再到处理方法,每一步都有对应的策略。我个人建议,每次拿到新数据集,先按这个框架走一遍,心里就有底了。


公众号:蓝海资料掘金营,微信deep3321