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

如何生成保留正相关关系且效果自然的伪数据散点图?

让正相关伪数据更贴近真实的优化方案

你的代码生成的散点图过于规整,核心原因是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:45:34