我们已经讨论了使用统计分布和基于规则的系统生成数据的一般思路。现在,让我们将这些思路付诸实践,创建一些简单的数值人工数据。数值数据代表数量或测量值(如年龄、温度或价格),是许多数据集中不可或缺的组成部分。从统计分布生成数字生成人工数值数据最直接的方法之一是从已知的统计分布中抽取样本。可以将分布视为一个蓝图,它描述了不同数值出现的可能性。均匀分布假设您需要为模拟生成客户年龄,但您只知道年龄范围在18到80岁之间,并且没有任何理由认为该范围内某个年龄比其他年龄更有可能出现。均匀分布对此非常适用。它为指定范围 $[a, b]$ 内的所有值分配相同的概率。要从均匀分布生成数字,您需要定义最小值 ($a$) 和最大值 ($b$)。然后,您可以在此区间内随机选择数字,每个数字被选中的机会相同。例如,要生成18到80岁之间的5个模拟年龄:# 伪代码示例 import random min_age = 18 max_age = 80 number_of_samples = 5 synthetic_ages = [] for _ in range(number_of_samples): # 生成 min_age 和 max_age 之间的随机浮点数 age = random.uniform(min_age, max_age) # 通常,我们可能需要整数(如年龄) synthetic_ages.append(int(age)) print(synthetic_ages) # 可能的输出: [45, 22, 71, 58, 30]如果我们以这种方式生成大量数据点,它们将相当均匀地分布在18-80的范围内。正态(高斯)分布如果您需要生成围绕某个中心值聚集的数据怎么办?例如,模拟成年男性的身高,他们的身高往往围绕平均身高波动。正态分布(常称为高斯分布或钟形曲线)在此非常适用。要使用正态分布,您需要两个参数:均值 ($ \mu $): 数据点倾向于聚集的中心值。标准差 ($ \sigma $): 衡量数据与均值分散程度的指标。较小的 $ \sigma $ 表示数据点紧密聚集在均值附近,而较大的 $ \sigma $ 表示数据分布更广。让我们生成5个模拟身高(厘米),假设均值 ($ \mu $) 为175厘米,标准差 ($ \sigma $) 为7厘米。# 伪代码示例 import random mean_height = 175 std_dev_height = 7 number_of_samples = 5 synthetic_heights = [] for _ in range(number_of_samples): # 从正态分布生成随机数 height = random.gauss(mean_height, std_dev_height) # 四舍五入到合理的精度,例如一位小数 synthetic_heights.append(round(height, 1)) print(synthetic_heights) # 可能的输出: [178.2, 166.5, 175.1, 184.0, 172.9]大多数生成的升高将接近175厘米,而较少的值会出现在较远的位置。生成许多值将产生特征性的钟形。{"layout": {"title": "模拟身高(正态分布)", "xaxis": {"title": "身高 (cm)"}, "yaxis": {"title": "计数"}, "bargap": 0.1, "template": "plotly_white"}, "data": [{"type": "histogram", "x": [178.2, 166.5, 175.1, 184.0, 172.9, 174.5, 180.1, 169.8, 176.3, 171.0, 177.5, 168.9, 173.3, 175.8, 170.5, 181.2, 174.9, 168.1, 176.9, 172.1, 179.5, 173.8, 165.0, 175.5, 182.0, 171.8, 176.0, 169.2, 174.1, 178.8], "marker": {"color": "#228be6"}}]}一个直方图,显示了使用均值为175厘米、标准差为7厘米的正态分布生成的模拟身高。大多数值都聚集在175厘米附近。还存在其他分布(如用于等待时间的指数分布,或用于计数的泊松分布),但均匀分布和正态分布是生成简单数值数据的优秀起点。使用规则生成数字有时,数值数据遵循特定的模式或依赖于其他值。基于规则的系统允许您明确定义这些模式。顺序值最简单的规则是生成顺序数字。这对于创建唯一标识符(ID)来说很常见。# 伪代码示例 start_id = 1001 number_of_records = 5 synthetic_ids = [] for i in range(number_of_records): synthetic_ids.append(start_id + i) print(synthetic_ids) # 输出: [1001, 1002, 1003, 1004, 1005]基于其他值的计算您可能需要基于另一个模拟(或真实)值来生成一个值。例如,根据 base_price 和 tax_amount 计算 total_price。# 伪代码示例 # 假设 base_prices 是之前生成的,例如使用分布生成 base_prices = [50.0, 120.0, 75.5] synthetic_totals = [] tax_rate = 0.08 # 8% 税率 for price in base_prices: tax_amount = price * tax_rate total_price = price + tax_amount synthetic_totals.append(round(total_price, 2)) print(synthetic_totals) # 输出: [54.0, 129.6, 81.54]条件规则规则也可以包含条件。例如,传感器读数可能取决于一天中的时间。# 伪代码示例 - 简化版 # 假设 'hour_of_day' 已生成或已知 (0-23) synthetic_temperatures = [] hours = [6, 14, 22] # 早上, 下午, 晚上 for hour in hours: if 6 <= hour < 12: # 早上 # 较低的温度范围 temp = random.uniform(15, 20) elif 12 <= hour < 18: # 下午 # 较高的温度范围 temp = random.uniform(22, 28) else: # 傍晚/夜晚 # 温度下降 temp = random.uniform(18, 22) synthetic_temperatures.append(round(temp, 1)) print(synthetic_temperatures) # 可能的输出: [17.8, 25.1, 19.5]这些基于规则的方法使您能够将特定的逻辑或关系直接嵌入到人工数据生成过程中。通过结合从分布中抽样和应用规则,您可以开始创建反映真实数据集中可能存在的简单模式和特点的数值人工数据。下一节将介绍生成分类数据的类似技术。