通过在相邻几周之间具有某种连续性来对每周数据进行聚类以检测爆发

数据挖掘 r 聚类
2022-02-11 08:12:07

我有一些健康机构的数据集。数据包含有关 52 周范围内的疟疾病例的信息。该数据集有 52 列,每周一列,每家医院大约 16 行,报告该医院在特定周内诊断出的病例数。包含 9 周条目的数据集示例:-

SAD Lakhwar 0   0   0   0   0   1   4   3   1
Rural Health Center 2   0   0   6   0   2   0   2   2
Herbertpur Christian Hospital   1   0   1   0   2   0   1   0   1

我已经使用分层和 K-Means 聚类来确定医院集群以及几周的集群,但我的真正目标是以这样的方式进行集群,即可以使用连续几周的数据检测爆发,同时使用集群还发现了发现爆发的医院。

到目前为止,我使用的技术发现我的集群在某些情况下是相互远离的,例如第 7 周和第 37 周属于同一个集群,如下面的输出所示,但我希望在几周内实现连续性因为爆发跨越几周,我理解我得到结果的原因,但如果有人可以提供帮助,我希望保持连续性。

尝试使用 k 均值将周聚类为 4 个聚类的结果

Week No x
1   2
2   4
3   4
4   2
5   4
6   2
7   1
8   2
9   2
10  2
11  2
12  4
13  1
14  4
15  4
16  4
17  1
18  4
19  1
20  4
21  1
22  1
23  1
24  1
25  1
26  1
27  1
28  1
29  1
30  1
31  1
32  3
33  1
34  1
35  1
36  1
37  1
38  3
39  3
40  3
41  3
42  3
43  3
44  3
45  3
46  3
47  3
48  3
49  3
50  1
51  4
52  4

数据输出

structure(list(V1 = structure(c(13L, 15L, 6L, 10L, 3L, 17L, 12L, 
1L, 2L, 11L, 4L, 14L, 8L, 9L, 7L, 5L), .Label = c("CHC Sahaspur", 
"Comb. Hosp. Premnagar", "Doon Hospital", "FRI Hospital", "Herbertpur                     Christian Hospital", 
"HIHT Jollygrant", "Kalindi Hospital", "MAX Hospital", "PHC Herbatpur ", 
"PHC Kalsi", "PHC Rajawala", "Rural Health Center", "SAD Lakhwar", 
"Shubharti Hospital", "SPS Rishikesh", "Total", "Vaish Nursing Home"
), class = "factor"), V2 = c(0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 
0, 0, 0, 0, 0), V3 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0), V4 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0), V5 = c(0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0), V6 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), V7 = c(1, 0, 0, 
0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0), V8 = c(4, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0), V9 = c(3, 0, 0, 0, 0, 0, 2, 
0, 0, 0, 0, 0, 1, 0, 0, 0), V10 = c(1, 0, 0, 0, 0, 1, 2, 0, 0, 
0, 0, 0, 0, 0, 0, 0), V11 = c(0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 
0, 0, 0, 0, 0), V12 = c(0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 
0, 0, 0), V13 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0), V14 = c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), 
V15 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V16 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V17 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V18 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), 
V19 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V20 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), 
V21 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V22 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2), 
V23 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0), 
V24 = c(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), 
V25 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0), 
V26 = c(0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1), 
V27 = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V28 = c(0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0), 
V29 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), 
V30 = c(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), 
V31 = c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V32 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), 
V33 = c(0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), 
V34 = c(5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0), 
V35 = c(1, 0, 22, 0, 1, 1, 0, 0, 0, 0, 0, 38, 0, 2, 0, 0), 
V36 = c(0, 2, 4, 2, 1, 0, 0, 0, 0, 0, 0, 23, 0, 2, 0, 1), 
V37 = c(0, 0, 10, 0, 2, 0, 0, 0, 0, 0, 0, 10, 0, 2, 0, 7), 
V38 = c(1, 2, 2, 1, 2, 0, 0, 0, 0, 0, 0, 16, 2, 2, 0, 7), 
V39 = c(0, 1, 9, 0, 28, 2, 0, 0, 0, 0, 8, 12, 0, 1, 0, 2), 
V40 = c(1, 0, 2, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V41 = c(0, 0, 3, 0, 10, 0, 0, 0, 1, 0, 0, 18, 0, 0, 0, 1), 
V42 = c(0, 0, 1, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), 
V43 = c(0, 1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V44 = c(1, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V45 = c(0, 0, 9, 0, 6, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1), 
V46 = c(0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V47 = c(0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V48 = c(0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), 
V49 = c(0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V50 = c(0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V51 = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V52 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
V53 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names =                 c("V1", 
"V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", 
"V12", "V13", "V14", "V15", "V16", "V17", "V18", "V19", "V20", 
"V21", "V22", "V23", "V24", "V25", "V26", "V27", "V28", "V29", 
"V30", "V31", "V32", "V33", "V34", "V35", "V36", "V37", "V38", 
"V39", "V40", "V41", "V42", "V43", "V44", "V45", "V46", "V47", 
"V48", "V49", "V50", "V51", "V52", "V53"), row.names = c(NA, 
16L), class = "data.frame")
3个回答

聚类允许您找到类似医院的聚类。在您的情况下,同一集群中的医院将拥有

  • 大约相同数量的患者
  • 大约在同一时间

但根据您指定的集群数量和数据,您可能无法获得令人满意的结果。此外,聚类为您提供了答案,但它可能不是您想要回答的问题的答案。


示例 1:第 1 周的医院 1 可能与第 1 周的医院 2 分组,同时分别有 0 和 5 名患者。这在模型中可能有意义,但在现实生活中可能没有意义,其中 0 或 5 个患者可能会有很大差异。

为了解决这个问题,您可能需要标准化您的患者人数。它将帮助模型理解0 和 5 名患者的差异。


示例 2:第 1 周的医院 1 可能与第 12 周的医院 3 分组,如果他们是唯一一个有 23 名患者的医院,而每家医院从不超过 10 名。

这是集群面临的另一个问题;它可以帮助您找到相似之处,但相似之处可能没有帮助。K-means 不能充分利用第 2 周的数据依赖于第 1 周的数据这一事实。它只是试图找出两个点在该周数和该周患者数形成的二维空间中的接近程度。


所以你要

  • 检测爆发
  • 找到发生疫情的医院

Anony-Mousse 提出了一种非常简单的查找“爆发”的方法;计算每周患者的差异。这是一种详细说明的方法:

  • 将第 1 周设置为 0 和周i在(每周的患者人数i 每周患者人数i1)
  • 计算过去一周所有医院的变化总和,并使用阈值来确定爆发。如果那一周有10个或更多的新病人,那就是“爆发”
  • 使用检测到爆发当周每家医院的初始患者人数来确定接触了哪家医院。对(高/低)使用 2 均值,对(高/中/低)使用 3 均值,依此类推。

这只是一个简单的示例,但应该会提示您下一步要搜索的位置。


额外的

  • 什么是爆发如果您可以更清楚地定义要搜索的内容,最终您将获得更好的结果。聚类试图在数据中找到结构,爆发可能是该结构的一部分,但您应该专注于专门针对它的方法。
  • 如果您想将数据科学/机器学习技术应用于问题,请尝试用该语言来表述问题。它是一个对数据进行推理的框架,但其中很大一部分工作是以可以处理的方式翻译您的问题。
  • 了解专门设计用于处理此类问题的方法。正如 Anony-Mousse 所指出的,一个好的起点是变更检测。

你真的想在这里聚集吗?

相反,我会看分段变化检测

例如,您可以计算从一行到另一行的绝对(或相对)变化,并在最大变化点处分段。

如果您试图同时找到几周的集群和发生爆发的医院集群,那么您可能会更成功地使用

1)对周进行简单的移动平均过滤器,使用您平均的周数 - 尝试 3-5 周作为平均窗口。
2) 现在寻找在同一周内具有高移动平均线的医院