我按年龄组,城市,收入和他们工作的行业,或者在这种情况下有四个维度的人数统计数据。
我希望从这些汇总计数中生成微观数据。例如,如果摘要表显示按性别,种族,年龄和行业分配的10,000人,我希望有10,000条记录,当汇总时,与原始的四维分布相匹配。所以简而言之,我想同时从四个发行版中抽样,取决于其他发行版的价值。
以下是我所拥有的:
## generate mock person data
N=500000
age = np.random.choice(['20-44','45-64','65+'], N)
ind = np.random.choice(['retail','construction','information','medical'], size=N,p=[.05,.15,.3,.5])
cty = np.random.choice(['cooltown','mountain pines'], N)
income = pd.cut(np.random.lognormal(mean=10,sigma=2,size=N),range(0,250000,50000)+[np.Inf])
## prep data frame
persons = pd.DataFrame({'industry':ind,'city':cty,'income':income,'age':age})
## group by the categoricals
persons_grouped = persons.groupby(['city','industry','age','income']).size()
df_persons_grouped=persons_grouped.reset_index(name='personcount')
df_persons_grouped['personcount']=df_persons_grouped.personcount.div(df_persons_grouped.personcount.sum(),axis=0)
df_persons_grouped.head()
现在可以通过相关维度对其进行总结。
要重新生成原始记录数,我希望如此:
newdf = df_persons_grouped.loc[np.random.choice(a=df_persons_grouped.index, size=N, p=df_persons_grouped.personcount.tolist())].groupby(['city','industry','age','income']).size()
## I expect the follwoing to produce near-1 values, but they sometimes vary
newdf.div( persons_grouped,axis=0)
但更大的问题是,这种方法是否适用于复制"原始"记录级数据。我只使用计数(作为份额)作为概率,这可能与从多变量分布中采样不同。建议欢迎。