сжатое распределение по когорте - PullRequest
0 голосов
/ 08 апреля 2019

Как можно легко сравнить распределения нескольких когорт?

Обычно 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, но по одному на каждую выборку.

В основном, это похоже на:

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}]})

, и мне интересно, как сравнить распределения:

  • в когорте 0 против 1 из target_y_n
  • по нескольким когортам

способом, который визуально все еще понятен, а не только беспорядок.

edit

Для одной когорты PlottingПредварительно агрегированные данные в python могут быть ответом, но как можно сравнивать несколько когорт (не только в цикле), поскольку это приводит к слишком большому количеству графиков для сравнения?

1 Ответ

1 голос
/ 09 апреля 2019

Я все еще в замешательстве, но мы можем начать с этого и посмотреть, к чему это приведет.Из вашего примера я сосредотачиваюсь на baz, так как мне не ясно, что такое foo и bar (я полагаю, когорты).
Итак, давайте сосредоточимся на baz и нанесем на график различные распределения в соответствии сtarget_y_n.

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

bars

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

box

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'])

bar

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

barplot

Наконец, попробуйте взглянуть на класс FacetGrid, чтобы расширить сравнение (см. здесь ).

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

facetgrid

В вашем случае у вас будет что-то вроде:

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

barcohorttarget

И опция 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')

qqplot

...