通过 useragent、ip、session_id 对唯一访问者进行聚类

数据挖掘 聚类
2021-10-11 01:46:57

给定表单中的网站访问数据session_id, ip, user_agent,以及可选的时间戳,遵循以下条件,您如何最好地将会话聚集成唯一访问者?

session_id: 是给每个新访客的 ID。它不会过期,但是如果用户不接受cookies/清除cookies/更改浏览器/更改设备,他将不再被识别

IP 可以在不同用户之间共享(想象一个免费的 Wi-Fi 咖啡馆,或者您的 ISP 重新分配 IP),他们通常至少有 2 个家庭和工作场所。

User_agent是浏览器+操作系统版本,允许区分设备。例如,用户可能同时使用手机和笔记本电脑,但不太可能使用 windows+apple 笔记本电脑。同一个会话 ID 不太可能有多个用户代理。

数据可能看起来像这里的小提琴: http ://sqlfiddle.com/#!2/c4de40/1

当然,我们谈论的是假设,但它是关于尽可能接近现实。例如,如果我们在有限的时间范围内遇到具有不同 session_id 的相同 ip 和 useragent,则可以公平地假设它是同一用户,但有一些极端情况例外。

编辑:解决问题的语言是无关紧要的,它主要是关于逻辑而不是实现。伪代码很好。

编辑:由于小提琴的缓慢性质,您可以选择读取/运行 mysql:

select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id
from 
    (select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr
    from
        (select 1 as nr union all select 2 union all select 3   union all select 4 union all select 5
        union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a
    join
        (select 1 as nr union all select 2 union all select 3   union all select 4 union all select 5
        union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b
        order by 1
    )d
inner join
    (select 1 as nr union all select 2 union all select 3   union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8 union all select 9 )e
    on d.nr>=e.nr
2个回答

这里的一种可能性(这实际上是 Sean Owen 发布的内容的扩展)是定义一个“稳定用户”。

对于给定的信息,您可以想象创建一个 user_id,它是 ip 的哈希值和一些用户代理信息(伪代码):

uid = MD5Hash(ip + UA.device + UA.model)

然后,根据您为用户观察到的使用启发式方法,将这些 id 标记为“稳定”或“不稳定”。这可以是给定时间窗口内访问次数的阈值、cookie 持续存在的时间长度、您网站上的某些最终操作(我意识到这在您的原始日志中没有说明)等等......

这里的想法是将不丢弃 cookie 的用户与那些丢弃 cookie 的用户分开。

从这里您可以将 session_ids 归因于日志中的稳定 uid。然后,对于您相对不确定的不稳定用户,您将拥有“剩余”的 session_id。您可能对会话计数过多或过少,当只有一个人时将行为归因于多个人,等等……但这至少仅限于您现在“不太确定”的用户。

然后,您对稳定组执行分析并将其投影到不稳定组。以用户数为例,您知道会话总数,但您不确定有多少用户生成了这些会话。您可以找到 # 个会话 / 唯一稳定用户,并使用它来预测不稳定组中唯一用户的“估计”数量,因为您知道归属于该组的会话数。

projected_num_unstable_users = num_sess_unstable / num_sess_per_stable_uid

这对针对不稳定用户的每个用户级别的调查没有帮助,但您至少可以从一组持续一段时间的稳定用户中获得一些里程。您可以通过各种方法将行为和计数归入不稳定组。以上是您可能想知道的一个简单示例。总体思路是再次定义一组您有信心坚持的用户,衡量您想要衡量的内容,并使用某些基本事实(搜索次数、访问次数、点击次数等)来投射到未知的用户空间并进行估计对他们很重要。

对于不需要登录的服务,这是唯一用户计数、日志记录等中长期存在的问题。

仅凭这些数据您无能为力,但您能做的微不足道并不依赖于机器学习。

是的,来自相同 IP 但不同用户代理的会话几乎可以肯定是不同的用户。具有相同 IP 和 User-Agent 的会话通常是相同的用户,除了代理/wi-fi 接入点。您可以通过查看每个 IP 的会话计数分布来识别可能的“聚合”IP。来自同一 IP / User-Agent 在时间上重叠的会话几乎肯定是不同的。

为了进一步区分用户,您需要更多信息。例如,用户连接的站点或 IP 地址将是区分会话的非常有力的基础。然后,您可以进行更复杂的学习,以确定会话何时是相同或不同的用户。