如何识别执行某项操作 X 次的用户? [敏锐]

How can I identify users who have a performed an action X times? [keen-io]

我们计划使用 Keen 作为我们的跟踪核心,但是合并请求和提取数据对我们来说是一个大问题。

例如,如果我们有一个名为 pageviews 的集合,其中一个用户是 属性(例如:{"name": "pageviews", "properties":{"user":{"id":"4242"},"url":"https://keen.io/"}}),另一个集合名为 purchases 里面有相同的 user 属性 :

  1. 我们如何获得至少访问过 3 次 url 并且完成另一个事件 "purchases" 的唯一身份用户的数量?

  2. 我们如何提取那些人?是否可以使用 Amazon S3 数据复制来做到这一点? (与亚马逊雅典娜?)。 "extraction" 功能似乎无法满足我们的提取问题,因为我们无法应用 "group by" 语句,也无法组合多个事件进行提取(我错了吗?)。

我们的目标是不仅将 Keen 用作统计分析器,而且还用作我们 segmentation/extraction 使用的强大数据支持。

这里有多种方案可以解决这个问题:

解决方案 1:您可以使用更简单的条件集吗? Keen 的 funnel analysis type has a natural syntax for a identifying a specific inventory of users who have done (or not done) action A, B, C, etc. It doesn't, however, have the ability to quickly filter 基于 操作已完成。你的标准的这一部分有多重要?您能否改为识别具有以下特征的用户:

漏斗步骤

  1. 已查看 /keen.io/
  2. 已查看 /keen.io/products
  3. 购买了商品

这种简化会立即使您的问题在一个 funnel query 中得到回答。

方案二:两步查询流程。 在此解决方案中,我们将 运行 两个单独的查询来得出结果。首先,我们将使用 select_unique to identify the users who have performed the more rare action (purchase). In the next query, we'll count all the views of that particular page and group_by user.id 来计算每个用户查看该页面的次数。我们将使用查询 1 的结果作为查询 2 中过滤器的一部分,这样我们就只查询进行了购买的相关用户。然后,我们可以找出哪些用户已经购买并查看了该页面 3 次或更多次。

var client = new Keen({
  projectId: "PROJECT_ID",
  readKey: "READ_KEY"
}); 

var usersWhoPurchased = []

// Query 1
var usersWhoPurchasedQuery = new Keen.Query("select_unique", {
  event_collection: "purchases",
  target_property: "user.id",
  timeframe: "this_7_days"
});

// Get Query 1 Results
client.run(usersWhoPurchasedQuery, function(err, response){
  usersWhoPurchased = response['result']
});


// Query 2
var activityCountsByUserQuery = new Keen.Query("count", {
  event_collection: "pageviews",
  group_by: "user.id",
  timeframe: "this_7_days",
  filters: [
   {
     property_name: "url",
     operator: "eq",
     property_value: https://keen.io/
   },
   {
     property_name: "user.id",
     operator: "in",
     property_value: usersWhoPurchased
   }
  ]
});
    
// Get Query 2 Results
client.run(activityCountsByUserQuery, function(err, response){
  console.log(response)
  var countsByUser = response['result']
});


// countsByUser = [
//   {
//     "user.id": "A",
//     "result": 1
//   },
//   {
//     "user.id": "B",
//     "result": 0
//   },
//   {
//     "user.id": "C",
//     "result": 3
//   }
// ]
// Sort countsByUser to identfy those with >3

当您扩展并开始最大化您可以包含在过滤器中的用户数量(数百或数千取决于 ID 长度)时,此方法有一些注意事项。可以细分,批量查询。

解决方案 3: 包括事件计数。 此方法并非在所有情况下都有效,但一旦适用,它就会非常强大和优雅。这个想法是 运行 在客户端计数,并将它们作为用户属性包含在您的事件中。例如,您的网页浏览事件中的用户对象可能包含 属性,例如:

{  
   "collection_name":"pageviews",
   "properties":{  
      "user":{  
         "id":"4242"
      },
      "url":"https://keen.io/",
      "product_views_this_session":4
   }
}

有了这种数据,您可以再次使用带过滤器的简单漏斗来识别符合您条件的用户

漏斗步骤

  1. 已查看页面“https://keen.io”,其中 product_views_this_session gt 4
  2. 购买了商品

解决方案 4:使用 S3 Streaming + AWS Lambda + RDS 或 DynamoDB 实现计数器

如果您还没有打开它,请启用将所有原始 Keen 数据流式传输到 Amazon S3。一旦它在那里,您就可以对传入数据和静态数据执行各种额外的步骤。

您的流程可能是这样的:

  1. 开启Keen IO Streaming to S3
  2. 写一个 AWS Lambda job 来审查传入的数据和
  3. 计算每个用户执行每个操作的次数
  4. 查找 RDS 中的每个用户 table
  5. 增加该用户和该操作的计数
  6. 在同一个 Lambda 作业中,重新 post 将事件返回到新集合中的 Keen,并使用新的 属性,如下所示。

新活动:

{  
   "collection_name":"user_product_view_enriched",
   "properties":{  
      "user":{  
         "id":"4242"
      },
      "url":"https://store.io/productA45",
      "view_history":{  
         "product":"A45",
         "lifetime_views":5,
         "counting_since":"<timestamp>"
      }
   }
}

以这种格式将数据放回 Keen,您可以使用解决方案 3 中所述的标准漏斗:

漏斗步骤

  1. user_product_view_enriched 中有事件的用户,产品 "A45" 和 lifetime_views > X
  2. 进行了购买的用户

此方法的局限性在于您不能任意更改计数器的时间和方式"start"。例如,您可能稍后决定只计算过去 3 周内的观看次数,而不是整个生命周期内的观看次数。您必须查询 S3 中的原始数据才能得出这样的新计数,但您已经有了数据,所以这没什么大不了的。

解决方案 5: 使用 EMR and/or Athena

对原始 S3 数据实施更复杂的查询

编写一个常规批处理作业来查询您的原始 S3 数据并确定您感兴趣的用户。这里有多种选项,我不是专家,但我知道是可能的。