【问题标题】:comapring compressed distribution per cohort比较每个群组的压缩分布
【发布时间】:2019-08-30 01:51:40
【问题描述】:

如何轻松比较多个同类群组的分布?

通常,https://seaborn.pydata.org/generated/seaborn.distplot.html 将是直观地比较分布的好工具。但是,由于我的数据集的大小,我需要对其进行压缩并只保留计数。

它被创建为:

SELECT age, gender, compress_distributionUDF(collect_list(struct(target_y_n, count, distribution_value))) GROUP BY age, gender

其中compress_distributionUDF 只需获取一个元组列表并返回每个组的计数。

这给我留下了一个列表

Row(distribution_value=60.0, count=314251, target_y_n=0)

嵌套在 pandas.Series 中,但每个 chohort 一个。

基本上类似于:

pd.DataFrame({'foo':[1,2], 'bar':['first', 'second'], 'baz':[{'target_y_n': 0, 'value': 0.5, 'count':1000},{'target_y_n': 1, 'value': 1, 'count':10000}]})

我想知道如何比较分布:

  • 01target_y_n 的群组内
  • 多个同类群组

以一种视觉上仍然可以理解的方式,而不仅仅是一团糟。

编辑

对于单个群组Plotting pre aggregated data in python 可能是答案,但是如何比较多个群组(不仅仅是在循环中),因为这会导致太多地块无法比较?

【问题讨论】:

  • 您能否添加另一个代表您预期输出的数据框。
  • 不,这个想法不是拥有另一个数据框,而是分布的视觉比较。 IE。类似于stackoverflow.com/questions/46045750/…,但使用压缩分布而不是原始值
  • qqplot会做吗?您基本上想检查组之间的分布差异:target==0target==1 并且对于每个组,您都有值和每个值的计数,对吗?
  • 确实我有这些值,需要检查。
  • seaborn 有一个简单的方法来实现这一点吗?

标签: pandas matplotlib seaborn distribution


【解决方案1】:

我仍然很困惑,但我们可以从这个开始,看看它的发展方向。从您的示例中,我专注于 baz,因为我不清楚 foobar 是什么(我假设是同类群组)。
所以让我们关注baz,根据target_y_n绘制不同的分布。

sns.catplot('value','count',data=df, kind='bar',hue='target_y_n',dodge=False,ci=None)

sns.catplot('value','count',data=df, kind='box',hue='target_y_n',dodge=False)

plt.bar(df[df['target_y_n']==0]['value'],df[df['target_y_n']==0]['count'],width=1)
plt.bar(df[df['target_y_n']==1]['value'],df[df['target_y_n']==1]['count'],width=1)
plt.legend(['Target=0','Target=1'])

sns.barplot('value','count',data=df, hue = 'target_y_n',dodge=False,ci=None)

最后尝试查看FacetGrid 类以扩展您的比较(参见here)。

g=sns.FacetGrid(df,col='target_y_n',hue = 'target_y_n')
g=g.map(sns.barplot,'value','count',ci=None)

在你的情况下,你会有类似的东西:

g=sns.FacetGrid(df,col='target_y_n',row='cohort',hue = 'target_y_n')
g=g.map(sns.barplot,'value','count',ci=None)

还有一个qqplot选项:

from scipy import stats
def qqplot(x, y, **kwargs):
     _, xr = stats.probplot(x, fit=False)
     _, yr = stats.probplot(y, fit=False)
 plt.scatter(xr, yr, **kwargs)

g=sns.FacetGrid(df,col='cohort',hue = 'target_y_n')
g=g.map(qqplot,'value','count')

【讨论】:

  • 但这仅适用于单个队列,即我将为每个队列设置n 这样的图。
  • @GeorgHeiler 我给了你 7 个选项。哪个是“那个”?
  • @GeorgHeiler 同样,您可以简单地根据cohort 而不是target 进行区分,但是如果您在一个图中绘制n 不同的分布,它可能会非常混乱
猜你喜欢
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多