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

如何使用Python生成数据集的MCAR、MNAR和MAR缺失模式?

如何使用Python生成数据集的MCAR、MNAR和MAR缺失模式?

嘿,我完全懂你找资料的痛点——很多文档要么讲得太复杂,要么解释不到位,找不到简单明了的缺失数据生成方法。下面我就给你一步步拆解三种常见缺失模式的实现,每部分都配代码和直白的解释,你直接就能用!

MCAR(完全随机缺失)

MCAR是最直观的一种:数据的缺失和任何变量(不管是已观测还是未观测的)都没关系,完全是随机发生的。比如你闭着眼睛随机挑一些数据点删掉,就属于MCAR。

用你提供的思路,我们可以这样实现(我给代码加了注释,方便你理解):

import numpy as np
import random
import math

# 假设我们有一个三维数据集,比如形状是(样本数, 特征数1, 特征数2)
data = np.random.randn(100, 5, 3)  # 生成一个示例数据集
mdp = 10  # 缺失数据的比例,这里设为10%

# 把数据集展平成二维,方便随机选取位置
reshaped = data.reshape(data.shape[0] * data.shape[1], data.shape[2])
x, y = reshaped.shape  # x是展平后的行数,y是列数

# 计算需要设置为NaN的总个数
total_missing = math.ceil(x * y * mdp / 100)

# 随机挑选位置并设置为NaN
for _ in range(total_missing):
    row = random.randint(0, x - 1)
    col = random.randint(0, y - 1)
    reshaped[row, col] = float('nan')

# 把数据还原成原来的形状
data_with_mcar = reshaped.reshape(data.shape)

简单说就是:先把数据变平,按比例随机选位置设为缺失值,最后再还原形状就行,完全不考虑任何变量的取值。

MAR(随机缺失)

MAR的特点是:数据的缺失和已观测到的变量有关,和未观测的变量无关。举个例子:假设我们有一个包含「年龄」和「收入」的数据集,年龄越大的人,越不愿意透露自己的收入——这时候收入的缺失就和已观测的年龄变量相关,属于MAR。

下面用Pandas来实现一个简单的例子:

import pandas as pd
import numpy as np

# 生成示例数据集:100个样本,包含年龄和收入
np.random.seed(42)  # 设置随机种子保证结果可复现
df = pd.DataFrame({
    'age': np.random.randint(18, 70, size=100),
    'income': np.random.normal(5000, 1500, size=100)
})

# 设定规则:年龄大于50的样本,有30%的概率让收入变为缺失值
# 先筛选出年龄>50的样本索引
age_over_50 = df[df['age'] > 50].index
# 从这些索引里随机选30%设为NaN
missing_indices = np.random.choice(age_over_50, size=int(len(age_over_50)*0.3), replace=False)
df.loc[missing_indices, 'income'] = np.nan

这里的缺失完全由已观测的「年龄」变量决定,符合MAR的定义。

MNAR(非随机缺失)

MNAR就有点特殊了:数据的缺失和变量自身的未观测值有关。比如高收入人群不愿意透露自己的收入——这时候收入的缺失不是因为其他变量,而是因为收入本身太高,属于MNAR。

我们可以这样实现:

import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'income': np.random.normal(5000, 1500, size=100)
})

# 设定规则:收入排名前20%的样本,直接设为缺失值(模拟高收入人群不愿透露)
# 找到收入前20%的阈值
threshold = df['income'].quantile(0.8)
# 把收入超过阈值的样本设为NaN
df.loc[df['income'] > threshold, 'income'] = np.nan

这里的缺失直接由「收入」变量本身的取值决定,而且是我们无法观测到的(因为一旦缺失,我们就看不到原来的高收入值了),这就是MNAR的典型场景。

备注:内容来源于stack exchange,提问作者Rajesh Bhandari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 12:13:09