假设我们有以下网络访问日志。
timestamp page_visted======================================2017-01-02 10:00:02 /xxx/a.html2017-01-02 10:00:06 /xxx/b.html2017-01-02 10:01:03 /xxx/c.html2017-01-02 10:02:02 /xxx/d.html2017-01-02 15:00:02 /xxx/a.html2017-01-02 15:01:10 /xxx/b.html2017-01-02 15:03:05 /xxx/c.html
用户访问了我们的网站2次,浏览了7个页面。我的问题是“如何最佳地知道他访问了我们网站多少次,而不是他浏览了多少个页面?”
因为用户可能每次访问浏览的页面数量和花费的时间不同,很难设定一个固定的数字或时间间隔来分组这些记录。是否有任何算法可以根据它们的访问时间戳来分组(聚类)这些记录?谢谢。
回答:
会话开始/结束
一种简单的方法是选择一个数字来表示会话已经结束,我见过使用20分钟的无活动时间来表示会话已经结束。
更robust的方法是将这个问题视为一个概率问题,因为会话的长度没有固定,或者会话之间的时间间隔也没有固定。
你需要做的第一件事是查看数据。特别是到达时间间隔。你有一系列的页面访问事件。你需要绘制到达时间间隔的分布图(页面访问之间的时间间隔,以秒为单位)。
一个合理的假设是分布看起来像泊松分布,或者如果会话间的时间确实是聚集的,那么分布会是泊松分布但有额外的峰值。
如果数据显示出一个很好的泊松分布,一个简单的方法就是直接使用访问时间的分布。
通过从到达时间间隔的分布中选择一个适合你用例的百分位数,你可以确定一个相当有用的阈值,超过这个阈值的到达时间间隔表明一个新会话已经开始。
或者,如果更有用的话,你可以使用分布来获取观察到到达时间间隔的概率,低概率表明新会话的开始/结束。
更复杂的情况是,如果分布是双峰的,比如因为人们倾向于以相似的方式安排他们的会话。如果是这样,可能更简单的是探索一个简单的聚类算法,如k-means,对到达时间间隔进行聚类,你期望有一个聚类用于会话内的访问,另一个聚类用于会话间的访问。
计算会话次数
一旦你找到了一个合适的方法来识别不同的会话,分配每个会话一个唯一的键,按用户分组并计算唯一键的数量就变得很简单了。