月度归档:2017 年九月

如何在Tableau中更好的呈现和计算工作日收入

介绍

不同行业用户活跃的时间分布会各有不同,像酒店行业,周末的入住会明显高于平时,而像项目协作类产品,我们的用户付费主要集中在工作日。这个时候当我们在讨论:平均每天有多少收入时,其实关心的是工作日的表现,那么如何在Tableau中更好的计算和呈现这样的数据呢?

首先我们来看一个例子数据,这是8,9月份的每日收入报表,从图表上我们可以看出:工作日的收入会明细高于周末,最高可以到每日400多万,最低则只有90几万,如果直接取平均,如图上的平均线所示,则有200多万,这显然不是我们需要的。

为了算工作日的平均收入,最简单的办法是从图表上排除掉周末,这个可以用计算字段来判断:

字段名:is_weekend
DATEPART('weekday', [Date]) = 1 or DATEPART('weekday', [Date]) = 7

通过判断一周的第几天来判断是否为周末,为了验证,我们在图上把是否是周末,用不同的颜色来区分。

然后在图表上排除掉周末的数据,这时的平均值就符合我们的预期了。

这样虽然可以满足需要,但还不够好,我们还是希望既能够看到完整的每天的数据,又能有一条工作日的收入平均值。这时的做法是这样的,添加一个新的计算字段:

字段名:weekday_income
if [is_weekend] then 
    null 
else 
    [income] 
end

在这个计算字段里,如果是周末的收入就为null,因为null是不参与平均值计算的,所以这也正是我们需要的工作日收入。

然后把这个字段加到报表的 Detail 里:

然后修改平均线的属性,将Value从 SUM(incomde) 切换到 SUM(weekday_income)

这时的平均线就是工作日收入的平均了。

如果还想做的更好,我们可以直接把这儿的平均值在标题里显示,做法是在Detail里,加一个整个报表范围的平均值计算字段:

TOTAL(AVG([weekday_income]))

然后把这个字段加到标题的说明里:

这时看报表的人只要看标题和备注就可以很快的知道工作日的平均收入了。

这儿的整个操作会有些复杂,但最终的呈现对于看报表的人却非常清晰。这有点像一位作家说过的话: “很抱歉,我写了如此长的一封信,我实在没有时间给你写一封短信了。” 如果大家时间来得及,不妨多尝试更好的呈现方式。

报表我发布在这儿了,大家可以下载源文件,看如何实现:

[https://public.tableau.com/profile/jiyang#!/vizhome/workday_income/]

最后Python大法好,放一下如何用代码来生成这儿的测试数据:

import datetime
import random

day_seed = [1.3, 1.2, 1, 1, 1.2, 0.4, 0.35]

d = datetime.date(2017, 6, 12)

print('date\tincome')
while d <= datetime.date.today():
    d += datetime.timedelta(days=1)
    day_index = d.weekday()
    print( str(d) + 
           '\t' + 
           str(int(3000000 * random.uniform(0.8 * day_seed[day_index],
                                  1.2 * day_seed[day_index]))))

代码的逻辑是先分配下一周7天中每日的比例,这时我们可以看到工作日的周一周二比较高,周末最低,然后用random来生成随机的每日收入。