查看原文
其他

计算化侦查之犯罪团伙挖掘

2016-09-20 田教授 丁爸


摘要:想知道如何从过去的犯罪信息中发掘犯罪团伙吗?本文以某地犯罪记录为例,手把手地教你如何利用智能计算的方法挖掘犯罪团伙,我们公布了程序代码(每行都有注释)和测试数据。

 


 

问题描述:某地长期盘踞着169个小的犯罪团伙,警方对他们的犯罪记录进行了整理,发现团伙成员一共作案9830次。有时是1个犯罪小团伙单独作案,有时是多个犯罪小团伙联合作案。如何根据这些记录来挖掘出大的犯罪团伙呢?

 

方法原理:我们对上述数据进行仔细分析,发现小团伙泰和参加的案件一共160次(占比160/9830=0.0163),良奥参加的案件共1072次(占比0.1091),泰和良奥共同参加的案件69次(占比0.0070)。可以看出泰和良奥共同作案的比例比较低,那么是否可以得出泰和良奥不属于一个大的犯罪团伙的结论呢?我们看,如果泰和参加了案件,那么良奥也会参加的概率是多少呢?就是:

泰和良奥共同参加案件数/“泰和参加案件数=69/160=0.43125

也就是说良奥参加了泰和所涉及的43.125%的案件。显然,泰和良奥联系非常紧密,应该属于一个大的犯罪团伙。

继续深入挖掘,泰和良奥的影响有多大呢?现在我们知道如果泰和参加了案件,那么良奥也会参加的概率是0.43125;整体而言,良奥参加案件的概率是0.10911072/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)


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存