如何生成保留正相关关系且效果自然的伪数据散点图?
让正相关伪数据更贴近真实的优化方案
你的代码生成的散点图过于规整,核心原因是y仅由x乘以固定区间的比例得到,没有模拟真实数据的随机波动、异方差性和异常值等特征。以下是几种保留正相关趋势同时让数据更自然的方法:
1. 添加高斯随机噪声
给y的基础趋势值加上符合正态分布的随机噪声,模拟真实数据的随机波动:
import random import pandas as pd def x_and_y(num_obs): x_list = [] y_list = [] for i in range(num_obs): # 修正原代码少生成一个数据点的问题 x = random.randint(1, 10000) # 设定基础正相关趋势:y ≈ 0.175x base_y = x * 0.175 # 添加均值为0、标准差为100的高斯噪声(标准差可按需调整) noise = random.gauss(0, 100) y = round(base_y + noise) # 可选:避免y出现负数(根据数据场景调整) y = max(y, 0) x_list.append(x) y_list.append(y) return x_list, y_list x, y = x_and_y(500) df = pd.DataFrame(list(zip(x, y)), columns=['X', 'Y']) df.plot.scatter(x='X', y='Y')
2. 引入异方差性
真实数据中,往往存在x越大,y的波动幅度越大的特征(比如收入越高,消费的波动范围越广),可以让噪声的标准差随x增大而变化:
def x_and_y(num_obs): x_list = [] y_list = [] for i in range(num_obs): x = random.randint(1, 10000) base_y = x * 0.175 # 噪声标准差随x增大而增加,系数0.01可按需调整 noise_std = 0.01 * x noise = random.gauss(0, noise_std) y = round(base_y + noise) y = max(y, 0) x_list.append(x) y_list.append(y) return x_list, y_list
3. 添加少量异常值
真实数据偶尔会出现偏离整体趋势的异常点,可随机添加2-3个不符合趋势的点:
def x_and_y(num_obs): x_list = [] y_list = [] for i in range(num_obs): x = random.randint(1, 10000) base_y = x * 0.175 noise = random.gauss(0, 100) y = round(base_y + noise) y = max(y, 0) x_list.append(x) y_list.append(y) # 添加异常值:比如x很大但y远低于预期,或x很小但y远高于预期 x_list.append(8000) y_list.append(500) # 趋势值应为1400,此处大幅偏低 x_list.append(1000) y_list.append(500) # 趋势值应为175,此处大幅偏高 return x_list, y_list
4. 调整X的分布(非均匀分布)
原代码中x是均匀分布,真实数据的变量(如收入、销售额)多为偏态分布,可改用正态分布生成x:
def x_and_y(num_obs): x_list = [] y_list = [] for i in range(num_obs): # 生成均值5000、标准差2000的正态分布x,限制在1-10000区间内 x = round(random.gauss(5000, 2000)) x = max(1, min(x, 10000)) base_y = x * 0.175 noise = random.gauss(0, 100) y = round(base_y + noise) y = max(y, 0) x_list.append(x) y_list.append(y) return x_list, y_list
内容的提问来源于stack exchange,提问作者SCool
相关产品推荐
相关产品推荐

