如何结合两张联合概率表生成符合分布的模拟数据集?
解决方案:结合两个联合概率表生成模拟数据集
要同时满足表1(教育-薪资)和表2(年龄-薪资)的分布规则生成数据,核心是构建教育、年龄、薪资三者的联合概率分布,通过薪资这个共同变量,用条件概率分解来组合两个表的信息。
第一步:校验边缘分布一致性
先确认两个表的薪资边缘概率无冲突:
- 表1计算:$10k总概率=0.1+0.3+0.2=0.6;$20k总概率=0.2+0.1+0.1=0.4
- 表2计算:$10k总概率=0.2+0.2+0.2=0.6;$20k总概率=0.1+0.1+0.2=0.4
两者完全一致,可直接组合。
第二步:推导条件概率
基于薪资的条件概率是组合的关键:
教育的条件概率(给定薪资):
Education\Salary $10,000 (P(E S)) $20,000 (P(E S)) None 0.1/0.6 ≈ 0.1667 0.2/0.4 = 0.5 Hs 0.3/0.6 = 0.5 0.1/0.4 = 0.25 College 0.2/0.6 ≈ 0.3333 0.1/0.4 = 0.25 年龄的条件概率(给定薪资):
Age\Salary $10,000 (P(A S)) $20,000 (P(A S)) 30 0.2/0.6 ≈ 0.3333 0.1/0.4 = 0.25 40 0.2/0.6 ≈ 0.3333 0.1/0.4 = 0.25 50 0.2/0.6 ≈ 0.3333 0.2/0.4 = 0.5
第三步:分步抽样逻辑
按以下顺序抽样,确保同时满足两个表的分布:
- 先抽薪资:按P(S=$10k)=0.6、P(S=$20k)=0.4的概率抽取
- 给定抽到的薪资,按对应教育条件概率抽教育背景
- 同样给定抽到的薪资,按对应年龄条件概率抽年龄
代码实现示例(Python)
import numpy as np import pandas as pd # 定义概率分布 salary_probs = {"$10,000": 0.6, "$20,000": 0.4} edu_cond_probs = { "$10,000": {"None": 1/6, "Hs": 0.5, "College": 1/3}, "$20,000": {"None": 0.5, "Hs": 0.25, "College": 0.25} } age_cond_probs = { "$10,000": {30: 1/3, 40: 1/3, 50: 1/3}, "$20,000": {30: 0.25, 40: 0.25, 50: 0.5} } # 生成模拟数据集函数 def generate_sample(n_samples): samples = [] for _ in range(n_samples): # 第一步:抽薪资 salary = np.random.choice(list(salary_probs.keys()), p=list(salary_probs.values())) # 第二步:抽教育背景 edu = np.random.choice(list(edu_cond_probs[salary].keys()), p=list(edu_cond_probs[salary].values())) # 第三步:抽年龄 age = np.random.choice(list(age_cond_probs[salary].keys()), p=list(age_cond_probs[salary].values())) samples.append({"Education": edu, "Age": age, "Salary": salary}) return pd.DataFrame(samples) # 生成10000条样本并验证分布 df = generate_sample(10000) # 验证表1的联合分布 print("教育-薪资联合分布(百分比):") print(pd.crosstab(df["Education"], df["Salary"], normalize="all") * 100) # 验证表2的联合分布 print("\n年龄-薪资联合分布(百分比):") print(pd.crosstab(df["Age"], df["Salary"], normalize="all") * 100)
运行后生成的数据集会近似符合两个联合概率表的规则。
注意事项
如果两个表的薪资边缘概率不一致,需要先调整其中一个表的概率(比如按权重合并),或者明确额外约束条件,否则无法生成同时满足两个分布的数据集。
内容的提问来源于stack exchange,提问作者tech_boy_r_
相关产品推荐
相关产品推荐

