生成分类计数呈正态分布的分类变量列表

Generating a list of categorical variables where categorical count is normally distributed

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

假设我有一个包含所有可能存在的分类变量的字典对象。

列表按优先级排序,'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
}

具有中值valuedict对象key将代表的"peak"正态分布.

在这种情况下,'Ba2' 将是 正态分布 的 "peak"。

预期结果:

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

'Baa2' 的计数最高。

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

正态分布是连续的而不是分类的。您可能会考虑使用宽度为 1.0 的区间对正态分布数据进行装箱:即 'Baa2' 的峰值为 11 实际上将计算区间 [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()