计算化侦查之犯罪团伙挖掘
摘要:想知道如何从过去的犯罪信息中发掘犯罪团伙吗?本文以“某地”犯罪记录为例,手把手地教你如何利用智能计算的方法挖掘犯罪团伙,我们公布了程序代码(每行都有注释)和测试数据。
问题描述:某地长期盘踞着169个小的犯罪团伙,警方对他们的犯罪记录进行了整理,发现团伙成员一共作案9830次。有时是1个犯罪小团伙单独作案,有时是多个犯罪小团伙联合作案。如何根据这些记录来挖掘出大的犯罪团伙呢?
方法原理:我们对上述数据进行仔细分析,发现小团伙“泰和”参加的案件一共160次(占比160/9830=0.0163),“良奥”参加的案件共1072次(占比0.1091),“泰和”和“良奥”共同参加的案件69次(占比0.0070)。可以看出“泰和”和“良奥”共同作案的比例比较低,那么是否可以得出“泰和”和“良奥”不属于一个大的犯罪团伙的结论呢?我们看,如果“泰和”参加了案件,那么“良奥”也会参加的概率是多少呢?就是:
“泰和”和“良奥”共同参加案件数/“泰和”参加案件数=69/160=0.43125
也就是说“良奥”参加了“泰和”所涉及的43.125%的案件。显然,“泰和”和“良奥”联系非常紧密,应该属于一个大的犯罪团伙。
继续深入挖掘,“泰和”对“良奥”的影响有多大呢?现在我们知道如果“泰和”参加了案件,那么“良奥”也会参加的概率是0.43125;整体而言,“良奥”参加案件的概率是0.1091(1072次/9830次)。“泰和”的参加使得“良奥”参加的概率提升了0.43125/0.1091=3.95倍。现在,我们可以肯定,“泰和”和“良奥”属于同一个大犯罪团伙的可能性非常非常大。
现在我们对上述例子中出现的关键数据进行专业化的包装(很专业!很别扭!但是很重要!)。在数据挖掘中有3个关键的名称—支持度(support)、置信度(confidence)和提升度(lift),这里我们就不给出严格的定义了,给了也不好理解。直接给出在上述例子中他们是什么。
支持度(support):“泰和”参加的案件的支持度为support(泰和)= p(泰和)=160/9830=0.0163;“良奥”参加的案件的支持度为support(良奥)= p(良奥)=1072/9830=0.1091;“泰和”和“良奥”共同作案的支持度为support(良奥, 泰和)= p(良奥, 泰和)=69/9830=0.0070。
置信度(confidence):如果“泰和”参加了案件,那么“良奥”也会参加的概率是0.43125,这个0.43125就是我们挖掘出的关联规则“泰和”=> “良奥”的置信度,置信度是对挖掘出的关联规则的预测能力(或者准确度)的度量。confidence(泰和=>良奥)=p(泰和,良奥)/p(泰和)=support(良奥, 泰和)/ support(泰和)=69/160=0.43125
提升度(lift):“泰和”的参加使得“良奥”参加的概率提升了0.43125/0.1091=3.95倍,这个3.95就是关联规则“泰和”=> “良奥”的提升度。lift(泰和=>良奥)=p(泰和,良奥)/p(泰和)=support(良奥, 泰和)/ [support(泰和)* support(良奥)]=confidence(泰和=>良奥)/ support(良奥)=0.43125/0.1091=3.95
以上例子只是为了帮助大家理解我们的方法原理,实际的执行中还是比较复杂的。最麻烦的是要对所有可能的关联规则进行遍历,遍历的计算复杂度太高,当我们的数据量非常大的时候计算机的计算是非常缓慢的。后来,有学者提出了Apriori算法,该算法大大地减少了关联规则的搜索空间。其关键思想我们以后再介绍。这里,我们只需知道如何使用它就可以了。大家可以下载我们的数据和程序代码进行学习。
方法步骤:
第1步,收集数据。我们共收集了169个小犯罪团伙的9830次犯罪数据。所有数据存放在“犯罪团伙数据集.csv”文件中(本文最后提供了下载地址)。数据中的每一行包括一次犯罪活动所涉及的小犯罪团伙的名字(注:数据进行了脱敏处理,这里使用的是化名)。数据集的样子如下图所示:
第2步,探索准备数据。
注,这里我们使用的是R语言,这是一种免费的、非常容易掌握、非常适合数据挖掘的编程语言。如果你没有编程基础,只需要安装Rstudio软件(是一款免费的编程软件)并执行我们的代码就可以看到结果;如果你已经有一些编程基础,你只需要3个小时左右的时间就能基本掌握它。
(2.1) 为数据集创建一个稀疏矩阵
为了表示每一次犯罪活动都涉及到了哪些犯罪小团伙,我用read.transactions函数构建一个稀疏的犯罪矩阵。稀疏矩阵的每一行代表一次犯罪活动(一共9835行),每一列代表该犯罪小团伙是否参与了犯罪活动(一共169列)。稀疏的犯罪矩阵的样子如下图所示:
(2.2)可视化犯罪小团伙的支持度
利用命令itemFrequencyPlot(犯罪矩阵,support=0.1)画出支持度超过0.1的犯罪小团伙的频次图,如下图所示:
利用命令itemFrequencyPlot(犯罪矩阵,topN=20)画出支持度最高的前20个犯罪小团伙的频次图,如下图所示:
第3步 基于数据训练模型
这里我们用apriori算法来挖掘符合条件的关联规则命令为:
犯罪关联规则<-apriori(犯罪矩阵,parameter=list(support=0.006,confidence=0.25,minlen=2))
该命令挖掘出符合(support=0.006,confidence=0.25)的关联规则。minlen=2用来消除包含少于2个犯罪小团伙的规则。
第4步 评估模型的性能
用summary(犯罪关联规则)命令来观看发现的规则情况,以及支持度、置信度和提升度。结果如下图所示。从图中可以看出,共挖掘出关联规则483条,含有2个小团伙的152条、3个小团伙的311条、4个小团伙的20条。
另外,我们可以利用命令inspect(犯罪关联规则[1:N])查看发掘的前N条规则。
第5步 提高模型的性能
(5.1) 对关联规则集合排序
利用命令inspect(sort(犯罪关联规则,by="lift")[1:7])实现根据提升度,显示最好的7个规则,如下图所示:
(5.2)提取关联规则的子集
我们使用命令泰和Rules<-subset(犯罪关联规则,items%in% "泰和")寻找那些包含“泰和”的所有规则,并用命令inspect(泰和Rules)显示这些规则,如下图所示:
(5.3) 将关联规则保存到文件
执行3个命令:犯罪关联规则_DF=as(犯罪关联规则,"data.frame")
犯罪关联规则_DF<-犯罪关联规则_DF[order(犯罪关联规则_DF$lift,decreasing= TRUE),]
write.table(犯罪关联规则,file="犯罪关联规则.csv",sep= ",",row.names = FALSE)