交互数据分析从 Excel 到 SPL:高级营销分析

有销售数据表,记录了销售员每年的销售金额。

..

1. 找出 5 号销售员销售额实现增长的年份

用 Excel 先筛选出 SELLERID 为 5 的数据,然后再判断每年销售额是否增长。

筛选出 SELLERID 为 5 的数据,并复制出来。

..

判断是否增长在菜单功能里不好直接实现,可以增加一个辅助列来表示增长情况,然后再次筛选。

增加辅助列,H2 格输入公式:
=IF(C2>C1,1,0)

拖动公式,得到下图结果,1 表示增长。

..

筛选出销售额实现增长的年份

..

SPL 可以引用相邻行进行筛选。


A

1

=T("Sales_year.csv").select(SELLERID==5)

2

=A1.select(AMOUNT>AMOUNT[-1])

3

=A2.to(2,)

SPL 是一种程序语言,但它的代码看起来和 Excel 很像,也是在格子写公式,且可以引用格子的值。

A1 读出数据并选出 SELLERID 为 5 的数据。

SPL 有很强的交互性,可以实时查看每一步的计算结果。例如点击 A1 格,在界面右边就可以看到 A1 格中数据。

..

SPL 可以一次执行所有代码,也可以单步执行每个格子里的代码。执行过的代码都可以在右边界面查看结果。

A2 选出增长的年份,也就是当前行 AMOUNT 比上一行大的数据,这里可以用 [-1] 引用上一行。

..

A3 去掉第一行。

2. 计算 3 号销售额实现连续增长的年份区间

Excel 提取连续增长的区间要添加两个辅助列。一个表示连涨行数,另一个表示每次上涨区间的长度。

先筛选出 SELLERID=3 的销售员数据。

..

增加辅助列 UP,H2 格写入函数公式:

=IF(C2>C1,H1+1,1),拖动公式。

..

增加辅助列 UP_len,I2 格写入公式:

=IF(C3>C2,I3,H2),拖动公式。

..

筛选出 UP_len 大于 2 的数据,就是销售额实现连续增长的区间。

..

当然 Excel 也还有别的方法可以实现,但实现起来都比较复杂。

SPL 就容易多了。

在 SPL 里有分组函数 group(),可以直接连涨区间分到一组。


A

1

=T("Sales_year.csv").select(SELLERID==3)

2

=A1.group@i(AMOUNT<=AMOUNT[-1])

3

=A2.select(~.len()>2).conj()

A1 读入数据,筛选出 SELLERID 等于 3 的数据。

A2 group()是分组函数,@i 是一种分组方式。group@i() 表示当括号里的表达式 AMOUNT<=AMOUNT[-1] 为真时,产生新的分组,即当销售额下降时就开始新的分组。这样连续增长的销售数据就被分到了一组。结果如下图,数据被分成了多个组。双击某个组,就可以看该组的成员数据。如双击第 1 组,可以看到该组详情。

..

A3 筛选出区间长度大于 2 的组,就是实现连续增长的区间。

Excel 里的分类(分组)总是强制汇总,对于这种只分类不汇总的问题实现起来就比较绕。而 SPL 不仅有分类汇总函数 groups(),也有只分类不汇总的函数 group()。对于这种计算连续增长的问题 group() 用起来很方便。

@后面的选项表示分组方式,多种分组方式的支持也是 SPL 分组函数的一大优势,比如下图这种按照空行隔开为一组的数据,用 group@i(~[-1]==null),遇到空行分组就很方便。SPL 里还有更多的分组方式选项,详情可查阅函数参考文档。

..

3. 找出曾经连续三年获得州销售前三名的销售员名单

这个问题有点复杂,需要先找出每个州每年的前 3 名,然后再判断获得前 3 名的年份是否连续。

按年,州和销售额排序,得到每年各个州的销售排名数据,这对于 Excel 并不难。但是要取出前 3 年名就有些麻烦,要么手动复制取出,要么增加辅助列标记名次再次筛选。

..

得到了每州每年的 3 名,还要找到连续 3 年都进入前三的销售员,Excel 的操作步骤就更繁琐,这里就不再写了。

..

SPL 的 group(),可以保留分组子集,解决这个问题就很容易了。


A

1

=T("Sales_year.csv")

2

=A1.group(YEAR,STATE).(~.top(-3;AMOUNT)).conj()

3

=A2.group(SELLERID)

4

=A3.(~.group@i(YEAR-YEAR[-1]!=1).select(~.len()>=3))

5

=A4.conj().new(STATE,SELLERID,NAME)

A2 按照年和州分组,取出每年各州的前 3 名,然后再合并起来

A3 按照 SELLERID 分组。分组后保留了每个分组子集,如左图。双击每个子集,可以看到每个组内的数据情况,如右图,为 1 号员工进入前 3 的年份情况。

..

A4 针对每个销售员的子集,将子集内连续的年份分为一组,然后选出连续年数 >=3 的数据。经过两次分组后,结果是一个三层的数据集。第一层是每个进入前 3 销售员的数据,一个销售员一组,如左图;第二层是销售员进入前 3 的连续年份,并选出连续年数 >=3 的数据,如中图是 1 号销售员连续 3 年以上进入前 3 的组;第三层则是组内数据详情,如右图。层次化的数据结果展示,可以清楚的理解每句代码的结果。

..

A5 取出满足条件的销售名字。三层的结果不好取,先用 conj() 函数,将结果变成两层如下图。然后再用 new 函数去每组成员里取对应的销售名字和州,就得到了目标名单。

..

..

熟练之后,可以把 conj 合并到之前的操作上,代码更简单些:


A

1

=T("Sales_year.csv")

2

=A1.group(YEAR,STATE).conj(~.top(-3;AMOUNT))

3

=A2.group(SELLERID)

4

=A3.conj(~.group@i(YEAR-YEAR[-1]!=1).select(~.len()>=3))

5

=A4.new(STATE,SELLERID,NAME)