2020/07/09

阿里云-日志服务-数据分析


[TOC]

需要如何分析

参考研究了数数科技thinkingdata后台,梳理我们常规分析数据,进行抽象成几种我认为必要的核心分析模板。

  • 实时分析
  • 路径分析
  • 事件分析
  • 留存分析

以往我们做数据统计做法,是运营同学需要什么样,技术就开始编写代码统计出结果,然后制作后台页面把数据呈现出来。而且每个产品都有不同玩法数据需要统计展示。长期下去只会增加技术人员冗余工作,重复代码多,维护成本高。所以必须要对这块进行抽象,整个分析过程都应该由使用者进行操作,使用者需要哪些数据,需要如何分析,通过抽象出来的几个模板配置完毕,利用阿里云日志服务的实时查询分析把结果呈现出来。做到数据能实时统计呈现,使用者自由度,又彻底解放技术同学。

实时分析

用于实时查看某事件发生详情。例如我要查看当天内,充值成功事件,大于300元的所有订单情况。

  • 分析时间:今天
  • 分析对象:充值成功
  • 分析条件:充值金额 大于 300

计算出结果

日志上报时间 订单创建时间 用户id 订单号 充值金额 充值商品
2020-07-09 16:22:00 2020-07-09 16:20:15 10001001 wx202007090003 648 10002
2020-07-09 16:21:00 2020-07-09 16:19:15 10001001 wx202007090002 328 10001
2020-07-09 16:20:00 2020-07-09 16:18:15 10001001 wx202007090001 328 10001

_event_id_:1002 | SELECT * WHERE amount > 300

路径分析

指定分析条件,无需规定分析对象,进行升序检索。通常用于检索某角色在某段时间的行为动作。排查角色异常。例如我要查看1001这个用户在今天16点后做了哪些操作。

  • 分析时间:今天
  • 分析条件:用户id 等于 1001
  • 分析条件:事件创建时间 大于 2020-07-09 16:00

计算出结果

日志上报时间 创建时间 事件id 事件名称 操作详情
2020-07-09 16:20:00 2020-07-09 16:18:15 1001 登录游戏 {role_id:1001}
2020-07-09 16:21:00 2020-07-09 16:19:15 1002 聊天 {role_id:1001, msg:'你什么时候进团的?'}
2020-07-09 16:22:00 2020-07-09 16:20:15 1003 登出游戏 {role_id:1001}

* | SELECT * WHERE role_id=1001 AND ctime>=1594281600 ORDER BY ctime asc

事件分析

事件分析分为以下几种

  • 事件发生总次数
  • 事件下某个属性发生的总次数、去重数、最大值、最小值
  • A事件属性发生的总次数、去重数、最大值、最小值 +-*/ B事件属性发生的总次数、去重数、最大值、最小值、总和

统计每天注册用户数

分析对象: 用户注册
分析属性: 总次数
分组项: 总体

_event_id_ :1002 |
select date_format(_create_time_, '%Y-%m-%d') as cday, count(1) as num from log
group by cday
order by cday desc

统计每天注册并升级的用户数

分析对象: 用户注册
分析属性: role_id.去重数
分析条件: 且事件
    - 分析对象: 用户升级
    - 属性关联: role_id
    - 分析条件: level>=2
分组项: 总体

_event_id_ :1002 or _event_id_ :1007 |
select cday,count(1) as num from (
  (select date_format(_create_time_, '%Y-%m-%d') as cday, role_id from log where _event_id_=1002 group by cday,role_id) as reg
    join
  (select date_format(_create_time_, '%Y-%m-%d') as cday1, role_id as role_id1 from log where _event_id_=1007 and role_level>=2 group by cday1,role_id1) as level
    on reg.cday=level.cday1 and reg.role_id = level.role_id1
)
group by cday
order by cday desc

活跃ARPU:付费金额 / 活跃用户

分析别名: ARPU
分析类型: 编辑公式

分析对象: 用户充值
分析属性: amount.总和
分析条件: 无

除于

分析对象: 用户登录
分析属性: role_id.去重数
分析条件: 无

交集方式: join

分组项: 分游戏服server_id

注意,涉及多事件运算,默认只会取交集部分进行,即 inner join 。我们可以手动修改交集方式 left join 、 right join 、 full join

_event_id_ :1023 or _event_id_ :1004 |
select cday1, cday2, server_id1, server_id2, amount1, num2, round(amount1/num2, 2) as arpu from (
  (select date_format(ctime, '%Y-%m-%d') as cday1,server_id as server_id1,sum(amount) as amount1 from log where _event_id_=1023 group by cday1,server_id1) as tbl1
  join
  (select date_format(ctime, '%Y-%m-%d') as cday2, server_id as server_id2, count(distinct role_id) as num2 from log where _event_id_=1004 group by cday2, server_id2) as tbl2
  on tbl1.cday1=tbl2.cday2 and tbl1.server_id1=tbl2.server_id2
)

统计每天活跃

分析对象: 用户登录
分析属性: role_id.去重数
分析条件: 且事件
    - 分析对象: 用户升级
    - 属性关联: role_id
    - 分析条件: level>=2
分组项: 总体

_event_id_ :1002 or _event_id_ :1007 |
select cday,count(1) as num from (
  (select date_format(_create_time_, '%Y-%m-%d') as cday, role_id from log where _event_id_=1002 group by cday,role_id) as reg
    join
  (select date_format(_create_time_, '%Y-%m-%d') as cday1, role_id as role_id1 from log where _event_id_=1007 and role_level>=2 group by cday1,role_id1) as level
    on reg.cday=level.cday1 and reg.role_id = level.role_id1
)
group by cday
order by cday desc

留存分析

_event_id_:1002 or _event_id_:1004 |
select register_day, login_day, (date_diff('day', register_day,login_day)+1) AS dayn, count(*) as num
from (
  (select date_format(ctime, '%Y-%m-%d') as register_day,role_id from log where _event_id_=1002) as reg
    join
  (select date_format(ctime, '%Y-%m-%d') as login_day,role_id from log where _event_id_=1004 group by login_day,role_id) as login
    on reg.role_id = login.role_id
)
group by register_day, login_day
order by register_day,dayn asc
limit 1000