数据埋点:用户唯一标识

24 评论 32493 浏览 185 收藏 7 分钟

用户唯一标识,是用户唯一的身份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作为用户的唯一区别标识。下面,以具体案例进行阐述。

数据埋点-用户唯一标识

步骤说明:

  1. 小明在一部手机上启动了app。该手机的device_id为x1,此时生成一个dsitinct_id为d1;
  2. 小明在这个手机上用账号u1进行登录。此时device_id为x1,user_id为u1,dsitinct_id为d1;
  3. 小明继续在这手机上使用app。此时device_id为x1,user_id为u1,dsitinct_id为d1;
  4. 小明退出自己的账号,继续使用app。此时仍然device_id为x1,user_id为u1,dsitinct_id为d1;
  5. 小明把手机给了小花,小花用自己的账号u2登录app。此时u2去关联x1,因为x1已经与u1关联,故关联失败。所以重新生成一个distinct_id为d2来标识此用户(u2);
  6. 小花继续使用app。此时device_id为x1,user_id为u2,dsitinct_id为d2;
  7. 小明换了部新手机,使用app。此时device_id为一个新的x2,后台生成一个新的dsitinct_id为d3;
  8. 小明在新手机上,使用账号u1登录了app。此时u1去关联x2,因为x2之前没有与账号关联过,所以关联成功,但是u1已经有一个dsitinct_id为d1,所以此时的dsitinct_id仍然为d1;
  9. 小明继续在新手机上使用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协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 『新手机上登录前的dsitinct_id修复为d1』 确实在新的行为中能很好的识别为同一个用户。但是历史行为的数据要还要处理(在换新手机且未登录的情况下产生的行为数据),请问有没有好的办法?

    来自北京 回复
  2. 请问一下,小明把手机给小红用了,但是小红是在没有登录的情况下使用,这时候的行为是算谁的行为数据

    回复
    1. 4、小明退出自己的账号,继续使用app。此时仍然device_id为x1,user_id为u1,dsitinct_id为d1;

      来自浙江 回复
    2. 我理解,同一部设备,原账号退出,只要在没有新账号登录的情况都是认为是上一个账号的行为。因为我们没有手段去确认是否换人了。我感觉可行的是利用行为分析,现在的行为和上个账号行为存在差异了认为是一个新账号,但是会误杀。一个技术的理解。

      来自北京 回复
  3. 我请教个问题,按照你的举例,如果设备登录小明和小红的账号(设备X1被两个用户ID都绑定了),此时设备退出了登录的情况使用,设备是采用d1还是d2?

    来自广东 回复
    1. 同问

      来自广东 回复
    2. 最后一次的distinct_id吧,因为在最后一次用户登录的时候distinct_id已经被修正了;

      来自上海 回复
    3. d1是小明的话
      d2是小红的话
      设备退出了 就是d3

      来自浙江 回复
  4. 请问你们埋点是接的三方服务吗?

    来自北京 回复
  5. 哎,这也不是您的原创。这是神策数据对用户标示的阐述啊。 你说的distinctid在大部分公司很难解决的。大部分使用的匿名ID和userID。

    回复
    1. 建设思路是参考神策的,之所以后面的例子也是用的它的例子,是因为人家神策这个例子很好,我没必要在另外写一套了。毕竟,最重要的是让大家知道怎么做嘛

      回复
  6. 没明白啊 最终的结果还是用户ID是唯一的表示啊 跟设备id没关系啊

    来自浙江 回复
    1. 表面上看起来,用户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作为用户标识符,就简单很多了。

      来自广东 回复
    2. 怎么知道是小明换了把手机而不是另一个用户未登录使用呢

      来自福建 回复
    3. 那请问一下,如果小名换的是一部旧手机,刚好这个旧手机也被其他人未登录使用过并且产生了使用数据,这时候小明再去进行使用并登录,那么小明更换后的手机未登录前的数据算谁的呢?

      来自广东 回复
  7. dsitinct_id 以什么样的规则生成呢? 应用卸载后,如果没有用户的情况下,将如何?

    来自浙江 回复
    1. 记录的是用户数据,即使卸载了,也不影响数据库里的数据啊

      来自浙江 回复
  8. 不错 学到了

    回复
  9. 您的d1 d2 最后就是u1 u2呢 hhh

    来自上海 回复
    1. 记了设备id

      回复
  10. 您好,方便加一下联系方式吗?

    来自河北 回复
    1. 能方便透露一下,是什么事吗?

      来自广东 回复
    2. 大概是想扩列吧

      来自浙江 回复
    3. 扩列,这是00后才懂的交友方式

      来自上海 回复