Python 3.x 生成分类计数正态分布的分类变量列表

Python 3.x 生成分类计数正态分布的分类变量列表,python-3.x,pandas,statistics,normal-distribution,Python 3.x,Pandas,Statistics,Normal Distribution,我的目标是生成1000行的合成数据(在pd.DataFrameobject中表示),并填充一组分类变量 假设我有一个dict对象,它包含所有可能存在的分类变量 列表按优先级顺序排序,'Aaa'为最高优先级,'NR' 处于最低优先级 credit_score_types = { 'Aaa':0, 'Aa1':1, 'Aa2':2, 'Aa3':3, 'A1':4, 'A2':5, 'A3':6, 'Baa1':7, 'Baa2

我的目标是生成1000行的合成数据(在
pd.DataFrame
object中表示),并填充一组分类变量

假设我有一个dict对象,它包含所有可能存在的分类变量

列表按优先级顺序排序,
'Aaa'
为最高优先级,
'NR'
处于最低优先级

credit_score_types = {
    'Aaa':0,
    'Aa1':1,
    'Aa2':2,
    'Aa3':3,
    'A1':4,
    'A2':5,
    'A3':6,
    'Baa1':7,
    'Baa2':8,
    'Baa3':9,
    'Ba1':10,
    'Ba2':11,
    'Ba3':12,
    'B1':13,
    'B2':14,
    'B3':15,
    'Caa':16,
    'Ca':17,
    'C':18,
    'e, p':19,
    'WR':20,
    'unsolicited':21,
    'NR':22
}
带有中值
值的
dict
对象
将代表正态分布的“峰值”

在这种情况下,
“Ba2”
将是正态分布的“峰值”

预期结果:

使用上述
dict
对象中的分类变量,随机分配一个包含1000行的
pd.DataFrame
(或长度为1000的填充
列表)。分类变量的分配将遵循正态分布

“Baa2”
将具有最高计数

如果一个条形图是用每个分类事件的计数绘制的,我会观察到一个正态分布的图形(类似于下面)


正态分布是连续的,而不是分类的。您可以考虑用宽度为1的间隔对正态分布数据进行分组:即,具有11的峰值的“Baa2”实际上会计算区间[10.5,11.5 ]中所有正态分布的值,“Baa1”将计算区间[9.5,10.5 ]…的所有值。Aaa'将计算区间[-0.5,0.5]中的所有值,依此类推

import numpy as np 
import matplotlib.pyplot as plt

credit_score_types = {
    'Aaa':0,
    'Aa1':1,
    'Aa2':2,
    'Aa3':3,
    'A1':4,
    'A2':5,
    'A3':6,
    'Baa1':7,
    'Baa2':8,
    'Baa3':9,
    'Ba1':10,
    'Ba2':11,
    'Ba3':12,
    'B1':13,
    'B2':14,
    'B3':15,
    'Caa':16,
    'Ca':17,
    'C':18,
    'e, p':19,
    'WR':20,
    'unsolicited':21,
    'NR':22
}

# generate normally distributed data, fix random state 
np.random.seed(42)
mu, sigma = credit_score_types['Ba2'], 5
X = np.random.normal(mu, sigma, 1000)

fig, ax = plt.subplots()

counts, bins = np.histogram(X, bins = np.linspace(-0.5, 22.5, 23))

# create a new dictionary of category names and counts
data = dict(zip(credit_score_types.keys(), counts))
ax.bar(data.keys(), data.values())
plt.xticks(rotation = 'vertical')

plt.show()

你能解释一下你是如何估计sigma=5的吗?谢谢:)我任意选择了sigma=5,这是为了保证每个类别都有一些计数。为了得到一个更像直方图的分布,在均值/中位数周围聚集了更多的值,你需要一个较小的sigma-我猜大约2的sigma将近似于你提供的分布。估计西格玛的一个好方法是使用这样一个事实,即大约68%的数据应该是平均值的±1个标准偏差。