Python 3.x 生成分类计数正态分布的分类变量列表
我的目标是生成1000行的合成数据(在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
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个标准偏差。