确定时间序列是否遵循模式

数据挖掘 机器学习 时间序列
2022-02-09 21:32:40

我想知道是否有人知道如何解决这个问题。

所以基本上我有一个数据集,其中有人大约每隔一段时间就会出现,我不知道那个时间间隔是多少。我需要确定此人是否以大约固定的时间间隔进来,不一定是间隔的具体值是多少。例如,如果某个人在一段时间内来我家送牛奶,比如说

第 1 周:周一、周三、周五、

第 2 周:周一、周三、周五

第 3 周:周一、周四、周五

第 4 周:周一、周三、周五

第 5 周:周一、周三、周五

第 6 周:周一、周三、周五

第 7 周:周一、周三、周五

第 8 周:周一、周四、周五

因此,正如我们在这 8 周中仅在 2 周内看到的那样,该人没有在星期三来,而是在星期四来,这可能是因为前一天可能是假期。因此,此示例的解决方案是该人确实遵循常规模式。

同样,这是另一个例子。说那个人来了——

周一、周四、周日、周三、周六、周二、周五、周一、周三、周日

这个人遵循常规模式,因​​为除了最后一个星期三,他每四天来一次。

这是一个人不遵循模式的例子,比如说这个人来了

周一,周三,周六,周五,周四,周五,周三,周五,太阳,太阳,周六

我必须为数百个不同的人做这件事。

另一个等效的问题是,如果我知道某个人在一段时间内(比如一个月)的哪几天到达,我需要确定他们是否遵循某种模式

我曾想过尝试将数据拟合成正弦曲线,但我不确定当我有一个人来时是否会起作用月等

我对任何方法都持开放态度,只要它具有良好的准确性。此外,根据您认为最好的算法,如果可能的话,您能否分享一些解决类似问题的代码的链接,以便我可以大致了解我应该如何实现我的算法。我对机器学习/数据科学很陌生。谢谢你!

2个回答

首先,以比最短假设周期更短的时间增量定期将您的数据数字化。例如,在送奶工的情况下,您可以创建一个表,其中每天有一条记录,如果该人来,则值为 1,如果不来,则值为 0。该表看起来像一个常规时间序列:

day, presence
  1, 1 
  2, 0
  3, 1
  4, 0

然后对您的时间序列执行自相关分析。这是信号处理中经常使用的数学工具,正如@MichelGrogan 在他的评论中所建议的那样,计算原始系列和延迟不同时间增量(1 天、2 天、... )。结果可以绘制为滞后值函数的相关值,称为自相关谱。阅读自相关了解更多详情。

频谱的最大值将为您提供在数据中观察到的最重要频率的值,并确认该模式存在。如果您没有看到明确的最大值,则可以断定您的数据中没有模式。

这是来自您的数据的 Python 示例:

import numpy as np
import matplotlib.pyplot as plt

day =['mon','tue','wed','thi','fri','sat','sun', 'mon','tue','wed','thi','fri','sat','sun', 'mon','tue','wed','thi','fri','sat','sun' ]
num =[    1,    2,    3,    4,    5,    6,    7,     8,    9,   10,   11,   12,   13,   14,    15,   16,   17,  18,    19,   20,   21]
pres=[    1.,    0.,   1.,   0.,   1.,   0.,  0.,    1.,   0.,   1.,   0.,    1.,  0.,    0.,   1.,    0.,  0.,    1.,   1.,    0.,   0.]

corr=np.correlate(pres,pres,'full')
lag=[i-(len(corr)/2) for i in range(len(corr))] 
plt.plot(lag,corr/np.max(corr))

和频谱图: 光谱

正如你所看到的,在 2 天和 7 天的滞后中有明显的最大值。

似乎您正试图确定此时间序列中是否存在季节性,即定期重复的过程。

在这方面,分解您的时间序列并检查是否存在季节性趋势可能是一个好主意。

例如,R 中的这张图表显示了不同季节天气的清晰季节性模式:

季节性

通过分解该系列,这可能会提供视觉线索,说明在特定时间个人访问之间是否存在季节性。