案例1:11月销售额为什么减少
我们以王者荣耀这款游戏为例。
现状
11月该游戏的销售额相比上月,下降了10%
预期
由于之前该游戏的销售额一直保持着稳定增长,而且从市场环境和游戏本身状态来看,该游戏还未到达衰退期。
也就是说下降是不符合预期的,销售额应当保持增长才对,这个就构成了问题。
寻找可能的因素
在下手做数据分析之前,需要先去跟业务了解本月和上月有哪些不同,寻找解决问题的线索,而不是闷头去捞数据、做分析。
假设,市场人员告知我们,广告投放费用有减少,运营告知我们,每月开展的促销活动并没有发生变化,那么我们就可以做初步假设:
由于广告投放减少,导致新用户注册减少,进而导致销售额下降;可以通过恢复广告投放水平,恢复销售额。
数据采集和加工
接下来,我们就要收集数据,查看两个月销售额的构成,即按照新老用户的维度下钻拆解销售额:10月老用户销售额、新用户销售额,11月老用户销售额、新用户销售额。
目标表
因此,我们得到了下面的目标表👇
月份 | 新老用户 | 销售额 |
---|---|---|
2018-10 | 新用户 | .. |
2018-10 | 老用户 | .. |
2018-10 | 新用户 | .. |
2018-10 | 老用户 | .. |
一行是一条消费记录;
第一列,是销售额的最小单元消费金额,其他列为该列的属性,哪个月份产生的、是新用户还是老用户
消费金额 | 月份 | 新老用户 |
---|---|---|
20 | 2018-10 | 新用户 |
50 | 2018-10 | 新用户 |
40 | 2018-10 | 老用户 |
70 | 2018-10 | 老用户 |
100 | 2018-10 | 老用户 |
... | ... | ... |
20 | 2018-11 | 新用户 |
40 | 2018-11 | 老用户 |
70 | 2018-11 | 老用户 |
100 | 2018-11 | 老用户 |
... | ... | ... |
对表-2中的月份、新老用户字段进行Group,对消费金额进行sum操作,就可以获得表-1
明确字段
为了得到表-2,我们需要到数据库查询基础数据,此时我们需要明确所需字段
用户ID | user_id | 联表查询的主键 |
---|---|---|
用户注册时间 | register_date | 判断老用户(新用户:当月注册用户;老用户:当月之前注册的用户) |
消费日期 | cost_date | 判断消费月份 |
消费金额 | cost | 统计销售额 |
采集
熟悉mysql数据库的话,会知道,上面的字段,分布在下面2个数据表中
用户表 users
id | register_date |
---|---|
1 | 2018-01-01 |
2 | 2018-05-01 |
3 | 2018-10-01 |
... | ... |
99 | 2018-11-01 |
100 | 2018-11-01 |
... | ... |
消费记录表 cost_recods
id | user_id | cost | cost_date |
---|---|---|---|
1 | 1 | 10 | 2018-01-01 |
2 | 1 | 20 | 2018-02-01 |
3 | 3 | 60 | 2018-10-01 |
... | ... | ... | ... |
140 | 4 | 50 | 2018-11-01 |
141 | 5 | 20 | 2018-11-01 |
... | ... | ... | ... |
在sql中,将消费记录表、用户表,通过主键user_id联合起来,并对相应字段进行加工,就组成了所需的数据表-2,sql如下:
SELECT
cr.cost,
DATE_FOORMAT(cr.cost_date, '%Y-%m') AS '月份',
DATE_FOORMAT(u.register_date , '%Y-%m') = DATE_FOORMAT(cr.cost_date, '%Y-%m') AS '新老用户'
FROM
cost_recods AS cr LEFT JOIN users AS u ON cr.user_id = u.id
WHERE
cr.cost_date >= '2018-10-01'
AND cr.cost_date < '2018-12-01'
对上面的sql通过子查询的方式添加group、sum操作,就得到了表-1
SELECT
SUM(cost) '销售额',
month '月份',
newOldUser '新老用户'
FORM
(SELECT
cr.cost,
DATE_FORMAT(cr.cost_date, '%Y-%m') month,
CASE WHEN DATE_FORMAT(u.register_date , '%Y-%m') = DATE_FORMAT(cr.cost_date, '%Y-%m') THEN '新用户' ELSE '老用户' END newOldUser
FROM
cost_recods cr LEFT JOIN users u ON cr.user_id = u.id
WHERE
cr.cost_date >= '2018-10-01'
AND cr.cost_date < '2018-12-01') temp
GROUP BY month, newOldUser
月份 | 新老用户 | 销售额 |
---|---|---|
2018-10 | 新用户 | 30, 000 |
2018-10 | 老用户 | 150, 000 |
2018-10 | 新用户 | 14, 000 |
2018-10 | 老用户 | 149, 000 |
绘制个柱状图看一下
显然,的确是新用户销售额明显减少导致的。那么可以通过获取新客,来恢复销售额。