生成分类计数呈正态分布的分类变量列表
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
}
具有中值value
的dict
对象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()
我的目标是生成一些 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
}
具有中值value
的dict
对象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()