您好,欢迎访问三七文档
R语言侦测欺诈交易背景考虑到在经济和社会领域中经常存在欺诈交易等非法活动,因此欺诈检验是数据挖掘技术的一个重要应用领域。从数据分析的角度,欺诈行为通常和异常的观测值相关联,因为这些欺诈行为是偏离常规的。在多个数据分析领域,这些偏离常规的行为经常成为离群值。数据挖掘的结果有助于公司的事后检查活动,能够提供某种欺诈概率排序作为输出结果,可以使公司以最佳方式来利用其事后检查资源。目的侦测欺诈交易的目的是找到“奇怪的”交易记录报告,它可能指出某些销售员涉嫌欺诈。这里用的数据是一个较短时期内的销售数据,销售员可按照自己的策略和公司情况来自由设置销售价格。我们的目的是根据公司过去发现的交易报告中的错误和欺诈企图,帮助公司完成核实这些销售报告真实性的工作。1.加载数据:共401146行数据,每一行包括来自销售员报告的信息。ID:说明销售员ID的一个因子变量。Prod:说明销售产品ID号的一个因子变量。Quant:报告该产品销售的数量。Val:报告销售记录的总价值。Insp:有3个可能值的因子变量——ok表示公司检查了该交易并认为该交易有效;fraud表示发现该交易为欺诈;unkn表示该交易未经过公司审核。2.数据集探索:sum(is.na(sales$Quant)&is.na(sales$Val))[1]888从数据的统计特征初步可以看出v431号雇员录入的数据最多,p1125号产品卖出最多,可以看到产品销售的数量和总价值的四分位数据,公司已检查承认有效的数据有14462,已发现欺诈的数据有1270,未经过审查的有385414,说明大量数据还未经过审核,需要接下来的数据分析来检查其中的欺诈数据。数据中有大量缺失值,当重要产品销售数和销售总价值同时缺失时,就无法进行分析,这样的数据有888条,在40万组数据中可以忽略不计。判断数据框中每个变量的属性:str(sales)'data.frame':401146obs.of5variables:$ID:Factorw/6016levelsv1,v2,v3,..:1234356789...$Prod:Factorw/4548levelsp1,p2,p3,..:1111122222...$Quant:int1823072203931126164104350200233118...$Val:num1665878076990110020260...$Insp:Factorw/3levelsok,unkn,fraud:2222222222...可以看到ID,Prod,Insp是因子型变量,Quant整数型,Val数值型。table(sales$Insp)/nrow(sales)*100okunknfraud3.612420096.07028470.3172953在只考虑已检查过的销售记录,看到欺诈比例较小。绘制每个交易人员的交易数量和每个产品的交易数量图形totS-table(sales$ID)totP-table(sales$Prod)barplot(totS,main='Transactionspersalespeople',names.arg='',xlab='Salespeople',ylab='Amount')barplot(totP,main='Transactionsperproduct',names.arg='',xlab='Products',ylab='Amount')看到所有销售人员的数据相当不同,对于每个产品,波动性较大。sales$Uprice-sales$Val/sales$Quantsummary(sales$Uprice)Min.1stQu.MedianMean3rdQu.Max.NA's0.008.4611.8920.3019.1126460.0013248检查产品单位价格的分布,看到有明显的变动性。out-tapply(Uprice,list(Prod=Prod),function(x)length(boxplot.stats(x)$out))out[order(out,decreasing=T)[1:10]]sum(out)[1]29446sum(out)/nrow(sales)*100[1]7.34047初步找到29446个被认为是离群值的交易,相当于交易的7.3%3.缺失值处理:找出变量Quant和变量Val同时有缺失值的交易占很大比例的销售人员totS-table(sales$ID)totP-table(sales$Prod)nas-sales[which(is.na(sales$Quant)&is.na(sales$Val)),c(ID,Prod)]propS-100*table(nas$ID)/totSpropS[order(propS,decreasing=T)[1:10]]v1237v4254v4038v5248v3666v4433v417013.7931039.5238108.3333338.3333336.6666676.2500005.555556v4926v4664v46425.5555565.4945054.761905可以考虑直接剔除同时在两个变量有缺失值的交易sales-sales[-which(is.na(sales$Quant)&is.na(sales$Val)),]分析剩余的在数量或者价格变量上有缺失值的交易。计算每一种产品在数量上有缺失值的交易,显示前10个:nnasQp-tapply(sales$Quant,list(sales$Prod),function(x)sum(is.na(x)))propNAsQp-nnasQp/table(sales$Prod)propNAsQp[order(propNAsQp,decreasing=T)[1:10]]p2442p2443p1653p4101p4243p903p36781.00000001.00000000.90909090.85714290.68421050.66666670.6666667p4061p3955p43130.66666670.64285710.6363636P2442和p2443两个产品所有的交易数量是缺失的,因此我们无法计算其标准价格,所以这些产品的交易信息不可能进行任何分析。一共54份报告,标记为ok的报告,意味着检查员掌握了比这个数据集更多的信息,或者我们得到的数据有输入错误,因为从这些交易中似乎不可能得到任何结论,基于此,将删除这些交易报告:sales-sales[!sales$Prod%in%c('p2442','p2443'),]更新删除两种产品后的Prod:nlevels(sales$Prod)[1]4548sales$Prod-factor(sales$Prod)nlevels(sales$Prod)[1]4546观察是否有销售人员的所有交易数量为缺失值:nnasQs-tapply(sales$Quant,list(sales$ID),function(x)sum(is.na(x)))propNAsQs-nnasQs/table(sales$ID)propNAsQs[order(propNAsQs,decreasing=T)[1:10]]v2925v5537v5836v6058v6065v4368v29231.00000001.00000001.00000001.00000001.00000000.88888890.8750000v2970v4910v45420.85714290.83333330.8095238从结果上看,有几个销售人员没有在报告中填写交易的数量信息。我们只要有其他销售人员报告的相同产品的交易,就可以尝试使用此信息来填补那些缺失值,所以不删除这些交易。对剩余的交易,用每个产品单位价格的中位数作为产品的标准价格:tPrice-tapply(sales[sales$Insp!='fraud','Uprice'],list(sales[sales$Insp!='fraud','Prod']),median,na.rm=T)用标准单价计算缺失值Quant和Val,填补所有缺失值noQuant-which(is.na(sales$Quant))sales[noQuant,'Quant']-ceiling(sales[noQuant,'Val']/tPrice[sales[noQuant,'Prod']])noVal-which(is.na(sales$Val))sales[noVal,'Val']-sales[noVal,'Quant']*tPrice[sales[noVal,'Prod']]重新计算Uprice列的值来填充先前未知的单位价格sales$Uprice-sales$Val/sales$Quant填补缺失值之后保存为sales,后面分析的数据就用这个数据。有些产品只有极少的交易,因为太少的交易,在要求的统计学显著性下很难做出决定。这种情况下,可以和一些产品的交易一起分析来避免这个问题。尽管缺失产品之间关系的信息,但可以尝试通过观察产品单价分部之间的相似性来推断其中的一些关系,如果可以发现具有类似价格的产品,我们可以考虑合并它们相应的交易并对它们一起进行分析,从而找到异常值。比较两个分布的方法是比较总结分布的一些统计特性。连续变量分布的两个重要属性是集中趋势和离散趋势,这里使用中位数作为衡量中心的统计量,应用四分位距(IQR)作为离散指标的统计量。notF-which(Insp!=fraud)ms-tapply(Uprice[notF],list(Prod=Prod[notF]),function(x){+bp-boxplot.stats(x)$stats+c(median=bp[3],iqr=bp[4]-bp[2])+})ms-matrix(unlist(ms),length(ms),2,byrow=T,dimnames=list(names(ms),c('median','iqr')))head(ms)medianiqrp111.3461548.575599p210.8778635.609731p310.0000004.809092p49.9112435.998530p510.9574477.136601p613.2236846.685185上面的代码使用函数boxplot()获得中位数、第一个四分位数和第三个四分位数。对每个产品的所有交易,计算这些统计量,从分析中剔除有欺诈的交易。有了这些统计量以后,得到含有每个产品的中位数和四分位距的一个矩阵。par(mfrow=c(1,2))plot(ms[,1],ms[,2],xlab='Median',ylab='IQR',main='')plot(ms[,1],ms[,2],xlab='Median',ylab='IQR',main='',col='grey',log=xy)smalls-which(table(Prod)20)points(log(ms[smalls,1]),log(ms[smalls,2]),pch='+')许多产品的中位数和IQR大致相同,我们可以看到,那些有少数交易的产品中有很多和其他产品很相似。但是难以判断这些产品是否为欺诈交易。对于交易数量少于20的产品,我们将寻找与它的单位价格分布最相似的产品,然后用Kolmogorow-Smirnov检验来检查两个产品是否在统计意义上相似。下面的代码用来获得一个矩阵(similar)。矩阵中存储的事这种少于20个交易的每个产品的检查信息,用对象ms来保存前面获得的每个产品的单位价格的中位数和IQR。dms-scale(ms)smalls-which(table(Prod)20)prods-tapply(sales$Uprice,sales$Prod,list)similar-matrix(NA,leng
本文标题:R语言侦测欺诈交易
链接地址:https://www.777doc.com/doc-5576036 .html