交互数据分析从 Excel 到 SPL:基本营销分析
订单数据表记录了近几年的销售订单信息。
员工信息表记录了所有员工的基本信息。
1. 汇总并关联成宽表
将原始的订单数据汇总到年。然后再和员工信息表进行关联,做成这样一张表格,用于进一步的数据分析。
Excel 要手工操作多步。
(1)汇总每位销售人员的年销售额。
订单的原始数据中没有年份,只有订单日期,用 YEAR() 函数提取出年份。
然后使用数据透视表功能,汇总每个人的年销售额,如下图。
但是这样的显示方式无法进行下一步计算,还要设置报表布局,调整显示方式。大概要 3 到 4 步的菜单操作调整成下图格式。
后面还要进行很多分析计算,在数据透视表上是无法直接操作的,还得手动将数据复制粘贴出来。
(2)将汇总后的数据与员工表的相关信息进行关联
Excel 要用 VLOOKUP 关联,
D1 格填入:
=VLOOKUP($A2,employee.xlsx!$A$1:$I$501,MATCH(D$1,employee.xlsx!$A$1:$I$1,0))
然后拖动公式。
Excel 公式写法有点复杂,拖动公式要考虑参数锁行或锁列,容易出错。
VLOOKUP 只能做单列关联,如果要按照 SELLERID 和 YEAR 去关联,用 VLOOKUP 就会麻烦很多。
SPL 代码也有多步,但过程要清晰很多:
A |
B |
|
1 |
=file("sales.csv").import@t() |
=file("employee.csv").import@t() |
2 |
=A1.groups(SELLERID,year(ORDERDATE):YEAR;sum(AMOUNT):AMOUNT) |
|
3 |
=A2.join(SELLERID,B1:EID,NAME,GENDER,STATE,BIRTHDAY) |
SPL 是一种程序语言,但它的代码看起来和 Excel 很像,也是在格子写公式,且可以引用格子的值。
A1 格和 B1 格导入两份数据订单表和员工信息表。
SPL 有很强的交互性,可以实时查看每一步的计算结果。点击 A1 格,界面右边就可以看到 A1 格中数据。
A2 格按照 SELLERID 和 YEAR,分类汇总销售额,得到每个销售员每年的销售额。groups 为分类汇总函数。
A3 将员工表关联到汇总后的订单数据上,按照 ID 号进行关联。join 为关联函数,写法简单,填入关联条件和要返回的列名即可。一次关联可以返回多个列值, 也支持多列关联。
写成程序代码后,源数据变化时只要再执行一遍即可,避免重复操作。
2. 找出 40 岁以下女销售并统计她们当年的平均销售额
原始数据里没有年龄,要根据出生日期计算年龄。
Excel 可以用函数 DATEDIF 计算当前日期和出生日期的差值,得到年龄。
然后用筛选菜单,选出 2024 年 40 岁以下女性销售数据
统计平均销售额时,还不能在筛选数据上直接计算,要复制出来统计。
SPL 在前面基础上继续处理:
A |
|
… |
…… |
4 |
=A3.select(YEAR==2024 && age(date(BIRTHDAY))<=40 && GENDER=="F") |
5 |
=A4.avg(AMOUNT) |
A4 用 select 函数过滤,写上条件,筛选出 2024 年且 40 岁以下的女销售完成的订单,年龄可以临时计算。
A5 统计平均销售额
SPL IDE 支持单独执行一条语句。前 3 句代码已经执行过了,这里只要单独执行 A4 和 A5 就可以了。
3. 找出近几年的销售冠军
用 Excel 将数据按年和销售额排序,就可以看到每年的销售冠军。但是取出这些人却不太容易,要么手动复制,要么再加一个组内计数列再过滤,都比较麻烦,碰到有并列冠军时就更复杂。
SPL 的 maxp 函数可以取出销售额最大值所在整条数据,按年分组就可以得到每年的销售冠军,可以在任务 1 完成的 A3 基础上继续计算:
A |
|
… |
…… |
4 |
=A3.groups(YEAR;maxp(AMOUNT):m) |
5 |
=A4.(m) |
SPL 里有更丰富的聚合运算,比如 max() 取最大值,pmax 取最大值的位置,maxp 取最大值所在的整行数据。这些在 Excel 是没有的。
然后 A5 取出每组的聚合结果就可以了。
如果考虑到可能有人并列销售冠军,则可以在 maxp 上增加选项 @a 返回所有最大值所在行的数据。
A |
|
… |
…… |
4 |
=A3.groups(YEAR;maxp@a(AMOUNT):m) |
5 |
=A4.conj(m) |
map@a 会返回一个集合,在 A5 中要用 conj 函数合并。
4. 找出当年每个州的销售前三名
用 Excel 先选出 2024 年数据
然后和前一个任务类似,按 STATE 和 AMOUTN 排序,得到每个州的销售排名
每个州的前 3 名都能看到了,但通常还是要手动复制出来,数据量较大时就只能加辅助计数列了,不然过于繁琐。
SPL 还是继续在任务 1 的 A3 基础上计算,和任务 3 类似,只是换一个聚合函数:
A |
|
… |
…… |
4 |
=A3.select(YEAR==2024).groups(STATE;top(-3;AMOUNT):top3).conj(top3) |
用 select 选出 2024 年数据,再用 groups() 函数按照省份分组,每个组内取销售额前 3 的数据即可。
这里的 top 也是一个聚合函数,它会返回一个小集合,即前三名成员。类似地,这里要用 conj 函数合并。
演示数据