暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Tableau—函数与表计算函数

数据分析干货 2021-06-11
8675

                                       第4节:基础函数与表计算函数

    导读:本节内容具体包括如下知识点

        1.基础函数的使用:

    (1)常用简单计算函数:ABS、SQRT、square

    (2)常用字符串函数:contains、startswith、endswith、find、left、mid、right、len

                      lower、upper、replace、split

    (3)常用日期函数:isdate、dateadd、datediff、year、month、day、now、today

    (4)常用聚合函数:count、countd、sum、avg、median、max、min

    (5)常用的两类逻辑句式:if…else…end 和case…when…end

    2.表计算函数的使用

    (1)index、size、rank函数

    (2)running类函数

    (3)window类函数

    (4)详细级别表达式:数据的聚合度和颗粒度层次不同

    (一)Tableau的函数从哪看得到


    创建字段——弹出的计算字段设置框中选择向右的箭头,就可看到,然后,在“全部”的下面输入搜索文本,即可找到各种函数的含义及用法,如下图所示

    而点击“全部”,会看到函数的分类,如下图所示

    (二)常用简单计算函数

    1、ABS:取绝对值,如ABS(-7)=7

    2、SQRT:取平方根,如SQRT(25)=5

    3、square:求平方,如square(5)=25

     

    在“行”或“列”内双击两下,即可进里面写入函数进行计算。这里写入

    SQRT(ABS(-7)+SQUARE(25-6))

    然后点击倒三角,选择“维度”,得到计算结果为19.1833

    (二)常用字符串函数

    1、contains:若字符串包含子字符串返回true,如contains(“calculation”,”alcu”)为true

               true也显示为1,而false则显示为0

    2、startswith:字符串以子字符串开头返回true,如startswith(“calculation”,”ca”)为true

    3、find:返回子字符串在字符串中的位置,如果没找到,则返回值为0,若定义了起始

    数字,则从给定的起始数字开始算。示例find(“calculation”,”a”)=2,表示首个a位于第2个位置;find(“calculation”,”a”,4),表示从第4个字符开始找,找到的a位于第7个位置

    4、left:返回字符串从左开始,指定个数的字符,如left(“calculation”,2)=”ca”

    5、mid:返回指定的从第几个字符开始截取,截取多少个字符的字符串,若未指定截取

    多长,则截取从指定字符开始至字符串结束的所有字符

    示例,如mid(“calculation”,2,4)=”alcu”

    6、right:返回从结尾起指定数量的字符。如right(“calculation”,4)=”tion”

    7、len:返回字符长度。如len(“calculation”)=11

    8、lower:返回小写,如lower(“CALCULATION”)= “calculation”

    9、upper:返回大写,如upper(“calculation”)= “CALCULATION”

    10、replace:将字符串中某些字符替换为另外的字符

    如replace(“calculation”,”ion”,”ed”)=”calculated”

    11、split:返回字符串中的子字符串,具体返回的是哪个字符串,由从字符串开头(正数)还是结尾(负数)的第几个分隔符决定。如split("a-bcde-ffe-kkf","-",2)=“bcde” 

    split("a-bcde-ffe-kkf","-",-2)=“ffe”

    例2,找出“产品名称”中包含“蓝色的”的产品并统计含有“蓝色”的产品与其他产品的利润占比

          第一步:计算字段

    第二步:制作饼图

    将“包含蓝色的产品名称”字段拖入“行”,将“利润”拖入列,智能显示中选择“饼图”,

    并将“利润”再次拖入标签内,选择拖入标签内的“利润”的倒三角-快速表计算-合计

    百分比,于是得到利润百分比,再次将“包含蓝色的产品名称”拖拽至标签,得到其

    产品是否包括“蓝色”的真伪标签,见下图

    例3:从订单ID中拆分出第三部分(即最后一个“-”后面的数字),该部分为订单号,请统计

    订单号前两位为“58”的订单销售额占比

    第一步,拆分订单ID,拆分方法见第一节讲义

    第二步:创建计算字段,见下图所示

    第三步,制作饼图,制作方法同上,制作结果见下图

    例4:使用split,从订单ID中截取出订单(即最后一个“-”后面的数字),生成“订单号”

    的新字段

    创建新字段,如下图所示

    (三)常用日期函数

    1、isdate:判断一个数据是否为有效日期,如isdate(“2004-04-15”)=True

    2、dateadd:向指定日期添加增量,形成新的日期

               如dateadd(“month”,3,#2004-04-15#)=2004-07-15

    3、datediff:返回第二个日期减去第一个日期的差,单位为最先给定的间隔模式

              如datediff(“month”,#2004-07-15#,#2004-04-15#)=-3

    4、year:返回日期所在的年,如year(#2004-04-15#)=2004

    5、month:返回日期所在的月,如month(#2004-04-15#)=4

    6、day:返回日期所在的天,如day(#2004-04-15#)=15

    7、now:返回当前时间,如now()=2020-2-11 17:48:12 pm

    8、 today: 返回当前日期,如today()=2020-2-11

    例5:对原有的每个订单日期都增加3个月,得到“调整后的订单日期”新字段

    创建字段,如下图所示

    例6:返回当前时间

    即在行中双击两下,然后输入“now()”,回车后即可得到当前时间

     

    例7:返回当前日期

    即在行中双击两下,然后输入“today()”,回车后即可得到当前日期

    (四)常用聚合函数

       对一组数据进行聚合运算。Tableau自带聚合功能,比如将类别和销售额拖拽至行和列,则自动计算各类别的销售额合计

    1、 count:计数,返回组的项数,如count([Customer ID])

    2、 countd:不重复计数,返回组中不同项的数量,每个唯一值仅计数一次,NULL不计入

            如countd([region])

    3、 sum:求和   avg:平均值    median:中位数   max:最大值  min:最小值例8:对地区进行计数和不重复计数,并对两个数值进行对比,制作线柱图

    第一步:创建两个字段“地区出现的次数(不重复计数)”和“地区出现的次数(重复计数)”

    第二步:制作线柱图

    将“地区出现的次数(重复计数)”和“地区出现的次数(不重复计数)”依次拖拽至行,将“地区“拖拽至列,选择“地区出现的次数(不重复计数)”的下三角中的“双轴“,并将该字段的坐标轴的刻度改为”0-100“之间,将该字段的左侧”标记“下的”条形图“改为”线“

    由此得到下图

     例9:计算利润的合计、平均值、中位数和最大值、最小值,并形成数据表

     第一步:双击行,在行里输入“sum([利润])”,按回车,同理双击行,计算利润的平均值avg([利润])、中位数median([利润])、最大值max([利润])和最小值min([利润])

     第二步:选择右上角的“智能显示”中的第一行第一个“工作表”,于是,得到利润在这五项指标上的数值

       见下图

    (五)常用的两类逻辑句式

    1. a)     if…else…end

    例10,对城市进行分类

    北上广深作为一类,起名为“一线城市“,

    其他城市作为一类,起名为“其他城市“

    操作:创建字段,字段设置如下:

    例11,对城市进行分类

    北上广深作为一类,起名为“一线城市“,

    哈尔滨作为一类,起名为“我的家乡”

    其他城市作为一类,起名为“其他城市“

    操作:创建字段,字段设置如下:

    b)     case…when…end

    例12,对城市进行分类

    (1)需求:同样的城市分类

    (2)操作:创建字段

    二、表计算函数的使用

    (一)函数介绍


    1、index()与size():返回分区中当前行的索引与分区中的总行数

    (1)需求:计算客户人数累计占比

    (2)操作:详见第4节中帕累托图的制作

    2、rank:竞争排名

     例1:对各地区销售额进行排名

    操作:从创建字段的rank函数查询可知,rank是为分区中的当前行返回标准竞争排名,它适用于函数的聚合,比如rank(avg[LapTime])

    创建字段,进行如下设置:

    确定后,于是新增了“排名”字段。

    在工作表中显示排名:

    把“地区”拖拽至行

    把“销售额”拖拽至文本,再把“排名”也拖拽至文本,

    于是可以看到rank就是对各地区销售额总计的排名,得到结果是降序排列,换句话说rank默认为降序(由高到低,排名为1表示销售额最高,desc)排列

    这是一般的理解,表现越好排名越靠前,但从显示来看,排名第1的并没有在前面显示,故选择菜单栏下的快捷键一栏中的按度量值升序排序,见下图

    于是,得到显示结果如下

    当然,也可以将排序设置为由低到高,即排名为1的表示销售额最小,从该函数的语法中可以见,使用“asc”即可,因为”asc”表示升序,排名越大销售额越高

    例如,将排名字段编辑如下:

    于是,排序结果如下(由低到高,最低的销售额排名为1,排名值越大表明销售额越高):

     

    3、running类函数

    包括running_avg、running_count、running_max、running_min、running_sum,

    返回给定表达式从分区中的第一行到当前行的运行结果(平均值/计数/最大值/最小值/和)

    显然,如果当前行是最后一行,那么得到的就是所有行的运行结果。

     所以,avg、count、max、min、sum是running类相应函数的特殊形式。

     running类函数适用于计算累计

    4、window类函数

      包括window_avg、window_count、window_max、window_min、window_sum等等,

    表示返回窗口中表达式的值,窗口定义为与当前行的偏移

    写作window_avg(聚合值,开始行,结束行)

    使用first()+n或last()-n则表示与分区中第一行或最后一行偏移n行

    如果省略了开始行和结束行,则表示整个分区。

      例如,window_avg(sum[利润],-2,0)表示求出当前行前两行至当前行的sum[利润]的平均值所以,avg、count、max、min、sum也是window类相应函数的特殊形式。总之window类函数可以定义行的起止点;running函数能定义行的止点,到当前行,而普通函数则包括所有行,起止点都不定义。

    (二)函数区别:sum、running_sum、window_sum、total

     例2:创建4个工作表,分别命名为sum、running_sum、window_sum和total,并分别在这四个工作表中分别计算分子类别、分地区的销售额sum、销售额running_sum、销售额window_sum和销售额total,理解这四个函数计算结果的区别

    1、sum:返回给定表达式中所有值的总计

    只要把一个度量字段,比如“销售额”拖拽到文本,就可以得到sum。见下图

       或者我们创建新字段“销售额sum”,创建如下图,也可以得到sum值

    新建一个工作表,在该工作表中,将“地区”拖拽至行,“子类别”拖拽至列,将销售额拖拽至文本,于是得到表格,从该表格中可见,在表格中使用sum所求出的销售额是对应某地区某子类别的销售额。

    2、total:返回给定表达式的总计

    同理创建销售额total的字段,并在新的工作表构造不同子类别、不同地区的销售额total表

    建立各地区、各子类别的销售额表格后发现,total所计算的是所选定的区域(比如本例中选的是横穿,也就是所选区域为行)的合计,因此会发现同一个地区内,所有子类别的销售额都是相同的,是各地区汇总的结果

    比对各地区汇总结果

    同理,选择标记下的“销售额”的下三角的计算依据为“表(向下)”就会得到列(即子类别)上的汇总,见下图

    同理,选择标记下的“销售额”的下三角的计算依据为“表(横穿然后向下)”或者是“表(向下然后横穿)”就会得到总计,见下图

    因此,total就是求指定区域的合计的,有三种可能的值:行汇总、列汇总和全部汇总

    3、window_sum:返回窗口中表达式的总计。窗口用与当前行的偏移定义。使用first()+n和last()-n表示与分区中第一行或最后一行的偏移

    首先创建销售额window_sum,如下图所示

     

    于是得到销售额window_sum的字段,在创建过程中该函数,可见该函数返回的是窗口表达式总和,如果省略了开头和结尾,就是使用了整个分区。

    在这里销售额window_sum就省略了开头和结尾,接下来检验一下是否得到的结果就是整个分区的合计。

    将“子类别”和“地区”分别拖拽至“列”和“行”,然后将销售额拖拽至“文本”,销售额下三角处选择表(横穿),于是得到结果与销售额total 在表(横穿)的一样,而如果下三角处选择表(向下)或表(横穿然后向下)或表(向下然后横穿)得到的都与销售额total一致,即都有三种可能结果:行汇总、列汇总和全部汇总

    但window_sum与total不同的是,total对该分区中所包括的起止计算元素不能设置,而window_sum则可以。

    例如对销售额window_sum的字段进行改写,使之从第二项开始计算(即分区中第一行设为first()+1),一直加到最后一项(即分区中的最后一行设为last()),见下图,且下三角处选择的是表(横穿),于是得到的结果如下

    可以看到计算结果虽然也是沿行汇总,但数值变小,比如东北地区的汇总值2695741,比行合计2711223少了15482,由前可知,15482正是第1项“标签”的销售额,由此知,window_sum对分区的合计是可以指定起止点的,要比total更为灵活

     

     

    4、running_sum:返回给定表达式从分区中第一行到当前行的运行总计,该数值是一个逐渐累加的过程。我们通过以下操作来理解:

    首先,创建“销售额running_sum”字段

    将“子类别”和“地区”分别拖拽至“列”和“行”,然后将销售额拖拽至“文本”,销售额下三角处选择表(横穿),于是得到如下结果:

    把这个结果,和使用sum计算的各子类别在各地区上的销售额的表现数值(见下图)比较

    以东北地区为例,两者在第一项“标签”上的销售额是相同的,都是15482,但“电话”的实际销售额为281308,而running_sum计算的结果却是296790,两者差刚好是15482,“标签”的销售额,由此可知running_sum是在指定的区域内逐渐实现累加的,比如第二项“电话”的running_sum就是标签和电话的销售额的累计,第三项”复印机”的running_sum则是“标签“、

    ”电话“和”复印机“销售额累计。

    由此可知区别如下:

    Sum:计算合计,会根据对比维度来进行相应的调整,比如计算了销售额sum,若比较地区,得到的结果就是某地区销售额合计,和其他地区销售额合计的对比Running_sum:计算的是某个指定区域内第一行到当前行的逐渐累加

    Total:计算的是某个指定区域内的合计,只有三种情况:行汇总、列汇总、全部汇总,不能对合计的起始点进行设置Window_sum: 计算的是某个指定区域内的合计,可以对合计的起始点进行设置。

    (三)详细级别表达式

    1、数据的聚合度和颗粒度

    所谓详细级别表达式就是LOD(level of detail)表达式,数据聚合度和颗粒度层次不同。

    什么是数据聚合度和颗粒度呢?聚合度反映的是汇总程度,而颗粒度反映的是细节程度

    举个例子:

    例如,现在求销售额的合计,即你把销售额sum拖拽至文本,得到所有产品的销售额合计为15984292 。这个数值把不同时间、不同子类别、不同地区的销售额都汇聚到了一个数值点上,所以它的聚合度很高。但相应的,由于这个数值只有一个数值点,反映的信息太少了,不能反映细节,因此颗粒度很小。但是如果现在统计的是分地区的销售额,显然聚合度降低了,因为没有各地区销售额合计的汇总程度高,但是它却能反映各地区销售额差异的细节,所以颗粒度升高了。

    换句话说,聚合度和颗粒度是反向的,聚合度越高则表明综合性越强,那么细节反映就差,颗粒度就小。再比如,大家想我现在统计这个超市的销售额,按年统计,和按天统计,两者的数据聚合度和颗粒度有何区别呢?和按天统计相比,按年统计的综合性,所以数据聚合度更高,但却无法像按天统计那样可以反映销售额的细节变化,因此颗粒度较低。

    2、fixed函数的涵义

    从创建字段里查找fixed函数,会得到该函数的作用是——使用指定的维度计算聚合。它的语法是{Fixed [指定的维度1],[指定的维度2],…,[指定的维度n]:聚合函数[聚合对象]},其中:{}反映的是数组概念,因为如果指定维度,最后聚合出来的结果不是一个数值,而是一组数值。

    例如,想求分年份、分地区、分产品的销售额合计,就可以写成:{Fixed [year],[area],[products]:sum[sales]}再比如,想求分年份、分地区的销售额合计,就可以写成:{Fixed [year],[area]:sum[sales]}再比如,想求分年份的销售额合计,就可以写成{Fixed [year]:sum[sales]}而如果不指定维度,就只想求全局的销售额合计,就可以写成{Fixed:sum[sales]}:可简写为{sum[sales]}

    3、fixed函数操作与效果对比

    例3:按照订单日期字段中的年的维度和地区维度来聚合销售额的总计

    第一步:创建字段,创建方法见下图

    第二步:把“计算1“这个字段拖拽到”文本“中,即可得出销售额合计15984292

    第三步:继续把“类别“拖到行,发现不管是哪个类别,得到的结果都是销售额合计15984292。这个数值把不同时间、不同子类别、不同地区的销售额都汇聚到了一个数值行统计。这是因为我们在fixed函数中并没有把“类别“作为其指定维度

    那么如果按照fixed指定维度进行统计会是什么样,因此来做第四步。

    第四步:去掉“类别“,将”地区“拖拽至行,于是得到下表

    可以看到,此时销售额就按照地区的不同做计算了

    由此得出,fixed函数得到的结果,只会按照fixed函数中的指定维度进行自动分区

    例4:计算不同客户的销售贡献

    第一步:创建字段,如下图所示

    第二步:将“客户贡献销售额“拖拽至文本,将”客户ID“(若在维度中看不到,右键空白区域“显示“隐藏字段,然后点击”客户ID“后面的下三角,选择”取消隐藏“)拖拽至行,于是得到按客户ID统计的销售额。见下图

    Fixed函数的意义在于计算出指定维度的字段,为后续统计分析奠定基础。

    例5:计算客户最近一次下单的时间距离当前时间的间隔R

    第一步:创建计算字段 #当前时间#={fixed:max([订单日期])}+1,+1是为了避免0值的出现

    第二步:创建计算字段#客户最近一次下单时间#={fixed[客户ID]:max([订单日期])}

    第三步:计算新近度R值:

    #新进度R#=DATEDIFF(“day”,#客户最近一次下单时间#, #当前时间#)

    第四步:将“客户ID“拖拽至行,将”新近度“拖拽至文本,于是得到不同的客户最后一次购物时间距离当前时间的间隔,显然间隔越长,表明该客户越久没有光顾了,该客户就越有可能成为流失客户




● SQL从入门到精通

 想成为数据分析师,这些书必看!

 不用敲代码,利用它就可以轻松爬取数据

发现更多精彩

关注公众号

你点的每个在看,我都认真当成了喜欢



笔记链接:https://pan.baidu.com/s/1sYW1BUO9GrLYJyz7SGPG1w

提取码:a0fh

文章转载自数据分析干货,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论