数据埋点:用户唯一标识
用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户。
01 为什么要建设用户唯一标识
如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情。因为如果做不到用户的唯一识别,那凡是涉及到用户的数据都将是错的(比如用户量、新增用户数、活跃用户数等等)。所以建设用户唯一标识,尤为重要。
02 基本概念
设计埋点字段的时候,有两个字段是一定要包括的,即设备ID和用户ID。这两个字段应该纳入通用字段,每个埋点的事件都必须要集成收集。
(1)设备ID
使用相应的算法,生成一个设备ID,以唯一识别用户的终端设备。不同终端的设备ID,其生成算法规则不一样,以下列举不同终端的设备ID的生成规则:
AndroidApp
安卓系统历经多次升级,对权限控制越来越严格,唯一识别手机的方法也在发生变化。下面整理一下安卓系统适合做设备唯一标识符的几个标识符,以及其特性:
从表格中看出,IMEI是最适合做设备唯一标识的,奈何获取IMEI需要授予权限且Android 10以后不再开放IMEI的权限。综合起来,安卓系统中,应该按照IMEI ->OAID -> ANDROID_ID的顺序生成设备ID。即先获取IMEI号,获取不到IMEI时获取OAID,获取不到OAID时,再获取ANDROID_ID,然后使用相关算法生成设备ID。
IOS App
苹果系统,可用于识别唯一设备的标识不多,如下图。综合起来,苹果系统生成设备ID的标识符顺序应该是IDFA -> IDFV ->UDID,即先获取IDFA,获取不到在获取IDFV,获取不到IDFV时,再获取UDID,然后使用相关算法生成一个设备ID。
Web网站
Web网站,使用cookie_id作为设备ID,并存储在浏览器的cookie中。
微信小程序
通常做法使用openid作为设备ID,当然也可以自己生产一个ID,作为设备ID。如果用过openid作为设备ID,需要注意微信小程序的冷启动问题(获取 openid 是一个异步的操作,所以会导致数据上报的时候,可能还没获取到openid,这就是导致设备ID为空)。
2)用户ID
用户ID,即用户在业务产品注册的用户账号。
收集到设备ID和用户ID后,就要想办法将设备ID和用户ID关联起来,也即用户唯一标识建模,详见下文。
03 用户唯一标识建设
设计一个字段,比如就叫distinct_id(设备ID命名为device_id,用户ID命名为user_id)这个字段用于识别唯一用户。凡是统计用户相关的数据时,都以distinct_id作为用户的唯一区别标识。下面,以具体案例进行阐述。
步骤说明:
- 小明在一部手机上启动了app。该手机的device_id为x1,此时生成一个dsitinct_id为d1;
- 小明在这个手机上用账号u1进行登录。此时device_id为x1,user_id为u1,dsitinct_id为d1;
- 小明继续在这手机上使用app。此时device_id为x1,user_id为u1,dsitinct_id为d1;
- 小明退出自己的账号,继续使用app。此时仍然device_id为x1,user_id为u1,dsitinct_id为d1;
- 小明把手机给了小花,小花用自己的账号u2登录app。此时u2去关联x1,因为x1已经与u1关联,故关联失败。所以重新生成一个distinct_id为d2来标识此用户(u2);
- 小花继续使用app。此时device_id为x1,user_id为u2,dsitinct_id为d2;
- 小明换了部新手机,使用app。此时device_id为一个新的x2,后台生成一个新的dsitinct_id为d3;
- 小明在新手机上,使用账号u1登录了app。此时u1去关联x2,因为x2之前没有与账号关联过,所以关联成功,但是u1已经有一个dsitinct_id为d1,所以此时的dsitinct_id仍然为d1;
- 小明继续在新手机上使用app。此时device_id为x2,user_id为u1,dsitinct_id为d1。
此时三个字段的映射关系为:
(1)后续修复
事件字段修复
小明换新手机后,在登录前,系统给分配的dsitinct_id为d3,不符合实际情况,故要将在新手机上登录前的dsitinct_id修复为d1。如下:
映射表修复
1)删除d3与x2的映射关系
2)将x2添加到d1的device_id_list字段
本文由 @如琴留音 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议
『新手机上登录前的dsitinct_id修复为d1』 确实在新的行为中能很好的识别为同一个用户。但是历史行为的数据要还要处理(在换新手机且未登录的情况下产生的行为数据),请问有没有好的办法?
请问一下,小明把手机给小红用了,但是小红是在没有登录的情况下使用,这时候的行为是算谁的行为数据
4、小明退出自己的账号,继续使用app。此时仍然device_id为x1,user_id为u1,dsitinct_id为d1;
我理解,同一部设备,原账号退出,只要在没有新账号登录的情况都是认为是上一个账号的行为。因为我们没有手段去确认是否换人了。我感觉可行的是利用行为分析,现在的行为和上个账号行为存在差异了认为是一个新账号,但是会误杀。一个技术的理解。
我请教个问题,按照你的举例,如果设备登录小明和小红的账号(设备X1被两个用户ID都绑定了),此时设备退出了登录的情况使用,设备是采用d1还是d2?
同问
最后一次的distinct_id吧,因为在最后一次用户登录的时候distinct_id已经被修正了;
d1是小明的话
d2是小红的话
设备退出了 就是d3
请问你们埋点是接的三方服务吗?
哎,这也不是您的原创。这是神策数据对用户标示的阐述啊。 你说的distinctid在大部分公司很难解决的。大部分使用的匿名ID和userID。
建设思路是参考神策的,之所以后面的例子也是用的它的例子,是因为人家神策这个例子很好,我没必要在另外写一套了。毕竟,最重要的是让大家知道怎么做嘛
没明白啊 最终的结果还是用户ID是唯一的表示啊 跟设备id没关系啊
表面上看起来,用户user_id作为唯一标识也没问题,因为user_id和dsitinct_id是一一对应的
但是如果将user_id作为唯一标识的话,会有什么为题呢?
1、不清楚登录前和登录后的行为是否是同一个用户,因为登录前的用户ID为空。而dsitinct_id则不会有这个问题
2、现实业务场景中,很多用户都不会登录账号,这个时候用user_id算用户量的话,就是不准确的,因为很多user_id为空
而使用device_id作为用户唯一标识符呢?
使用device_id作为唯一标识符的话,那自己产品的账号体系就完全失效了,明显就不符合业务需求了
同一个账号可登陆多个设备,同一个设备也可登陆多个账号,登录账号前和登录账号后,到底用设备ID还是用户ID作为用户唯一标识呢,问题就复杂了。而引入了distinct_id的概念后,统一用distinct_id作为用户标识符,就简单很多了。
怎么知道是小明换了把手机而不是另一个用户未登录使用呢
那请问一下,如果小名换的是一部旧手机,刚好这个旧手机也被其他人未登录使用过并且产生了使用数据,这时候小明再去进行使用并登录,那么小明更换后的手机未登录前的数据算谁的呢?
dsitinct_id 以什么样的规则生成呢? 应用卸载后,如果没有用户的情况下,将如何?
记录的是用户数据,即使卸载了,也不影响数据库里的数据啊
不错 学到了
您的d1 d2 最后就是u1 u2呢 hhh
记了设备id
您好,方便加一下联系方式吗?
能方便透露一下,是什么事吗?
大概是想扩列吧
扩列,这是00后才懂的交友方式