使用每日访问量确定网站是否处于活动状态

机器算法验证 时间序列 预测
2022-01-21 14:53:13

语境:

我有一组网站,每天记录访问次数:

W0 = { 30, 34, 28, 30, 16, 13, 8, 4, 0, 5, 2, 2, 1, 2, .. } 
W1 = { 1, 3, 21, 12, 10, 20, 15, 43, 22, 25, .. }
W2 = { 0, 0, 4, 2, 2, 5, 3, 30, 50, 30, 30, 25, 40, .. } 
...
Wn 

一般问题:

  • 如何确定哪些网站最活跃?

我的意思是在过去几天内接受更多访问或访问量突然增加。出于说明目的,在上面的小例子中,W0 最初很受欢迎,但开始表现出放弃,W1 显示出稳定的受欢迎程度(有一些孤立的高峰),而 W3 在安静的开始之后是一个重要的提升)。

初步想法:

在 SO 上找到了这个线程,其中描述了一个简单的公式:

// pageviews for most recent day
y2 = pageviews[-1]
// pageviews for previous day
y1 = pageviews[-2]
// Simple baseline trend algorithm
slope = y2 - y1
trend = slope * log(1.0 +int(total_pageviews))
error = 1.0/sqrt(int(total_pageviews))
return trend, error

这看起来很好也很容易,但我遇到了问题。

计算基于斜率。这很好,是我感兴趣的功能之一,但恕我直言,它对于非单调系列有问题。想象一下,在某些日子里,我们的访问次数是恒定的(所以斜率 = 0),那么上述趋势将为零。

问题:

  • 如何处理这两种情况(单调增加/减少)和大量点击?
  • 我应该使用单独的公式吗?
3个回答

听起来您正在寻找“在线变更点检测方法”。(这对谷歌搜索很有用。)最近一些有用的(和可访问的)论文是Adams & MacKay(一种贝叶斯方法)和Keogh 等人。 您也许可以将 R 的监视程序包投入使用。使用统计过程控制方法可以找到孤立的大量命中

肯定有越来越多复杂的方法来解决这类问题。从事情的声音开始,您从一个相当简单的解决方案开始(您在 SO 上找到的公式)。考虑到这种简单性,我想我会重新审视您在帖子(当前版本)中提出的几个关键点。

到目前为止,您已经说过希望您对“网站活动”的测量能够捕获:

  • “过去几天”中访问量/天的斜率变化
  • “过去几天”每天访问量的变化幅度

正如@jan-galkowski 指出的那样,您似乎(至少默认地)对这些站点相对于彼此的排名感兴趣。

如果该描述是准确的,我会建议探索最简单的可能解决方案,将这三个度量(变化、大小、等级)合并为单独的组件。例如,您可以抓取:

  • 捕获斜率变化的 SO 解决方案的结果(尽管我会合并 3 或 4 天的数据)
  • 每个站点的最近访问/天值的大小(y2)除以该站点的平均访问/天 ( Y):

y2 / mean(Y)

对于 W0、W1 和 W2,分别产生 0.16、1.45 和 2.35。(为了解释起见,考虑一个站点,其最近的每日访问量值等于它的平均每日访问量将产生 1 的结果)。请注意,您还可以调整此度量以捕获最近 2(或更多)天:

y2 + y1 / 2 * mean(Y)

这为您的三个示例站点产生:0.12、1.33、1.91。

如果你这样做,事实上,使用每个站点的访问/天分布的平均值来衡量这种度量,我也会查看分布的标准差以了解其相对波动性。每个站点的访问/天分布的标准差为:12.69、12.12 和 17.62。考虑y2/mean(Y)相对于标准偏差的度量是有帮助的,因为它可以让您保持最近在站点 W2 上的活动幅度(较大的标准偏差 = 整体稳定性/一致性较差)。

最后,如果你对排名感兴趣,你也可以在这个方向上扩展这些方法。例如,我认为根据每天的最近访问次数值以及每个站点每天的平均访问次数的排名(mean (Y)每个Win的排名Wn)来了解站点的排名可能很有用。同样,您可以根据自己的需要进行定制。

您可以将所有这些计算的结果显示为表格,或者创建定期更新的可视化来每天跟踪它们。

请注意,网站用户的到达率是令人讨厌的系列,往往是过度分散的(从泊松的角度来看),因此请考虑负二项式分布来查看到达率及其拟合。此外,您可能希望检查网站每天的订单统计数据,而不是它们的数量。