如何识别执行某项操作 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
属性 :
我们如何获得至少访问过 3 次 url 并且完成另一个事件 "purchases" 的唯一身份用户的数量?
我们如何提取那些人?是否可以使用 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 基于 次 操作已完成。你的标准的这一部分有多重要?您能否改为识别具有以下特征的用户:
漏斗步骤
- 已查看
/keen.io/
和
- 已查看
/keen.io/products
和
- 购买了商品
这种简化会立即使您的问题在一个 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
}
}
有了这种数据,您可以再次使用带过滤器的简单漏斗来识别符合您条件的用户
漏斗步骤
- 已查看页面“https://keen.io”,其中
product_views_this_session
gt
4
- 购买了商品
解决方案 4:使用 S3 Streaming + AWS Lambda + RDS 或 DynamoDB 实现计数器
如果您还没有打开它,请启用将所有原始 Keen 数据流式传输到 Amazon S3。一旦它在那里,您就可以对传入数据和静态数据执行各种额外的步骤。
您的流程可能是这样的:
- 开启Keen IO Streaming to S3
- 写一个 AWS Lambda job 来审查传入的数据和
- 计算每个用户执行每个操作的次数
- 查找 RDS 中的每个用户 table
- 增加该用户和该操作的计数
- 在同一个 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 中所述的标准漏斗:
漏斗步骤
- 在
user_product_view_enriched
中有事件的用户,产品 "A45" 和 lifetime_views
> X
- 进行了购买的用户
此方法的局限性在于您不能任意更改计数器的时间和方式"start"。例如,您可能稍后决定只计算过去 3 周内的观看次数,而不是整个生命周期内的观看次数。您必须查询 S3 中的原始数据才能得出这样的新计数,但您已经有了数据,所以这没什么大不了的。
解决方案 5: 使用 EMR and/or Athena
对原始 S3 数据实施更复杂的查询
编写一个常规批处理作业来查询您的原始 S3 数据并确定您感兴趣的用户。这里有多种选项,我不是专家,但我知道是可能的。
我们计划使用 Keen 作为我们的跟踪核心,但是合并请求和提取数据对我们来说是一个大问题。
例如,如果我们有一个名为 pageviews
的集合,其中一个用户是 属性(例如:{"name": "pageviews", "properties":{"user":{"id":"4242"},"url":"https://keen.io/"}}
),另一个集合名为 purchases
里面有相同的 user
属性 :
我们如何获得至少访问过 3 次 url 并且完成另一个事件 "purchases" 的唯一身份用户的数量?
我们如何提取那些人?是否可以使用 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 基于 次 操作已完成。你的标准的这一部分有多重要?您能否改为识别具有以下特征的用户:
漏斗步骤
- 已查看
/keen.io/
和 - 已查看
/keen.io/products
和 - 购买了商品
这种简化会立即使您的问题在一个 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
}
}
有了这种数据,您可以再次使用带过滤器的简单漏斗来识别符合您条件的用户
漏斗步骤
- 已查看页面“https://keen.io”,其中
product_views_this_session
gt
4
- 购买了商品
解决方案 4:使用 S3 Streaming + AWS Lambda + RDS 或 DynamoDB 实现计数器
如果您还没有打开它,请启用将所有原始 Keen 数据流式传输到 Amazon S3。一旦它在那里,您就可以对传入数据和静态数据执行各种额外的步骤。
您的流程可能是这样的:
- 开启Keen IO Streaming to S3
- 写一个 AWS Lambda job 来审查传入的数据和
- 计算每个用户执行每个操作的次数
- 查找 RDS 中的每个用户 table
- 增加该用户和该操作的计数
- 在同一个 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 中所述的标准漏斗:
漏斗步骤
- 在
user_product_view_enriched
中有事件的用户,产品 "A45" 和lifetime_views
> X - 进行了购买的用户
此方法的局限性在于您不能任意更改计数器的时间和方式"start"。例如,您可能稍后决定只计算过去 3 周内的观看次数,而不是整个生命周期内的观看次数。您必须查询 S3 中的原始数据才能得出这样的新计数,但您已经有了数据,所以这没什么大不了的。
解决方案 5: 使用 EMR and/or Athena
对原始 S3 数据实施更复杂的查询编写一个常规批处理作业来查询您的原始 S3 数据并确定您感兴趣的用户。这里有多种选项,我不是专家,但我知道是可能的。