You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python对混合数据按MAR、MNAR、MCAR机制引入缺失值

三种缺失机制的实现方案

以下实现默认已导入numpy、pandas库,且已加载adult数据集至DataFrame对象df中,所有示例统一设置约20%的整体缺失率,可根据需求调整参数。

1. MCAR(完全随机缺失)

MCAR的缺失概率与所有观测值、未观测值均无关,是完全随机的缺失模式,也就是你已知的实现方法。

  • 实现逻辑:对数据集所有元素完全随机判定是否设为缺失
  • 代码示例:
# 生成20%完全随机缺失
mcar_mask = np.random.random(df.shape) < 0.2
df_mcar = df.mask(mcar_mask)

2. MAR(随机缺失)

MAR的缺失概率仅和已观测到的其他变量的取值有关,和目标缺失列自身的未观测值无关。

  • 实现逻辑:选定1个或多个已观测的特征作为依赖变量,根据该特征的取值计算对应样本的缺失概率,再对目标列按概率设置缺失
  • 代码示例:以adult数据集的age列为依赖特征,给income列加缺失,年龄越大的样本income缺失概率越高,整体缺失率约20%:
df_mar = df.copy()
# 将age归一化到0-1区间作为缺失概率权重
age_norm = (df['age'] - df['age'].min()) / (df['age'].max() - df['age'].min())
# 调整系数控制整体缺失率约为20%
missing_prob = age_norm * 0.4
# 生成缺失掩码
mar_mask = np.random.random(len(df_mar)) < missing_prob
# 给目标列设置缺失
df_mar.loc[mar_mask, 'income'] = np.nan

你也可以根据需求替换为其他特征组合作为依赖变量,比如同时依赖教育年限、周工作时长来给其他列加缺失。

3. MNAR(非随机缺失)

MNAR的缺失概率和目标缺失列自身的未观测值直接相关,是三种机制里缺失和变量本身关联最强的模式。

  • 实现逻辑:直接根据目标列自身的取值计算对应样本的缺失概率,按概率设置缺失
  • 代码示例1:给income列加缺失,收入大于50K的样本缺失概率更高,整体缺失率约20%:
df_mnar = df.copy()
# 自定义不同收入水平的缺失概率
missing_prob = df['income'].map({'<=50K': 0.1, '>50K': 0.35})
# 生成缺失掩码
mnar_mask = np.random.random(len(df_mnar)) < missing_prob
# 给目标列设置缺失
df_mnar.loc[mnar_mask, 'income'] = np.nan
  • 代码示例2:给数值列capital_gain加缺失,资本收益越高的样本缺失概率越高:
df_mnar = df.copy()
# 将capital_gain归一化到0-1区间作为缺失概率权重
gain_norm = (df['capital_gain'] - df['capital_gain'].min()) / (df['capital_gain'].max() - df['capital_gain'].min())
# 调整系数控制整体缺失率约为20%
missing_prob = gain_norm * 0.4
# 生成缺失掩码
mnar_mask = np.random.random(len(df_mnar)) < missing_prob
# 给目标列设置缺失
df_mnar.loc[mnar_mask, 'capital_gain'] = np.nan

内容的提问来源于stack exchange,提问作者wasif khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:57:03