《R语言侦测欺诈交易.doc》由会员分享,可在线阅读,更多相关《R语言侦测欺诈交易.doc(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、R语言侦测欺诈交易背景考虑到在经济和社会领域中经常存在欺诈交易等非法活动,因此欺诈检验是数据挖掘技术的一个重要应用领域。从数据分析的角度,欺诈行为通常和异常的观测值相关联,因为这些欺诈行为是偏离常规的。在多个数据分析领域,这些偏离常规的行为经常成为离群值。数据挖掘的结果有助于公司的事后检查活动,能够提供某种欺诈概率排序作为输出结果,可以使公司以最佳方式来利用其事后检查资源。目的侦测欺诈交易的目的是找到“奇怪的”交易记录报告,它可能指出某些销售员涉嫌欺诈。这里用的数据是一个较短时期内的销售数据,销售员可按照自己的策略和公司情况来自由设置销售价格。我们的目的是根据公司过去发现的交易报告中的错误和欺
2、诈企图,帮助公司完成核实这些销售报告真实性的工作。1.加载数据:共401 146行数据,每一行包括来自销售员报告的信息。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号产品卖出最多,可
3、以看到产品销售的数量和总价值的四分位数据,公司已检查承认有效的数据有14462,已发现欺诈的数据有1270,未经过审查的有385414,说明大量数据还未经过审核,需要接下来的数据分析来检查其中的欺诈数据。数据中有大量缺失值,当重要产品销售数和销售总价值同时缺失时,就无法进行分析,这样的数据有888条,在40万组数据中可以忽略不计。判断数据框中每个变量的属性:str(sales)data.frame: 401146 obs. of 5 variables: $ ID : Factor w/ 6016 levels v1,v2,v3,.: 1 2 3 4 3 5 6 7 8 9 . $ Prod
4、: Factor w/ 4548 levels p1,p2,p3,.: 1 1 1 1 1 2 2 2 2 2 . $ Quant: int 182 3072 20393 112 6164 104 350 200 233 118 . $ Val : num 1665 8780 76990 1100 20260 . $ Insp : Factor w/ 3 levels ok,unkn,fraud: 2 2 2 2 2 2 2 2 2 2 .可以看到ID,Prod,Insp是因子型变量, Quant整数型,Val数值型。table(sales$Insp)/nrow(sales)*100 ok u
5、nkn fraud 3.6124200 96.0702847 0.3172953在只考虑已检查过的销售记录,看到欺诈比例较小。绘制每个交易人员的交易数量和每个产品的交易数量图形totS - table(sales$ID)totP - table(sales$Prod)barplot(totS,main=Transactions per salespeople,names.arg=,xlab=Salespeople, ylab=Amount)barplot(totP,main=Transactions per product,names.arg=,xlab=Products, ylab=Amou
6、nt)看到所有销售人员的数据相当不同,对于每个产品,波动性较大。sales$Uprice - sales$Val/sales$Quantsummary(sales$Uprice) Min. 1st Qu. Median Mean 3rd Qu. Max. NAs 0.00 8.46 11.89 20.30 19.11 26460.00 13248检查产品单位价格的分布,看到有明显的变动性。out totS totP nas propS propSorder(propS,decreasing=T)1:10 v1237 v4254 v4038 v5248 v3666 v4433 v4170 13.
7、793103 9.523810 8.333333 8.333333 6.666667 6.250000 5.555556 v4926 v4664 v4642 5.555556 5.494505 4.761905可以考虑直接剔除同时在两个变量有缺失值的交易sales nnasQp propNAsQp propNAsQporder(propNAsQp,decreasing=T)1:10 p2442 p2443 p1653 p4101 p4243 p903 p3678 1.0000000 1.0000000 0.9090909 0.8571429 0.6842105 0.6666667 0.6666
8、667 p4061 p3955 p4313 0.6666667 0.6428571 0.6363636P2442和p2443两个产品所有的交易数量是缺失的,因此我们无法计算其标准价格,所以这些产品的交易信息不可能进行任何分析。一共54份报告,标记为ok的报告,意味着检查员掌握了比这个数据集更多的信息,或者我们得到的数据有输入错误,因为从这些交易中似乎不可能得到任何结论,基于此,将删除这些交易报告: sales nlevels(sales$Prod)1 4548 sales$Prod nlevels(sales$Prod)1 4546观察是否有销售人员的所有交易数量为缺失值: nnasQs pr
9、opNAsQs propNAsQsorder(propNAsQs,decreasing=T)1:10 v2925 v5537 v5836 v6058 v6065 v4368 v2923 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 0.8888889 0.8750000 v2970 v4910 v4542 0.8571429 0.8333333 0.8095238从结果上看,有几个销售人员没有在报告中填写交易的数量信息。我们只要有其他销售人员报告的相同产品的交易,就可以尝试使用此信息来填补那些缺失值,所以不删除这些交易。对剩余的交易,用每个
10、产品单位价格的中位数作为产品的标准价格:tPrice-tapply(salessales$Insp!=fraud,Uprice,list(salessales$Insp!=fraud,Prod),median,na.rm=T)用标准单价计算缺失值Quant和Val,填补所有缺失值noQuant-which(is.na(sales$Quant)salesnoQuant,Quant-ceiling(salesnoQuant,Val/tPricesalesnoQuant,Prod)noVal-which(is.na(sales$Val)salesnoVal,Val-salesnoVal,Quant*
11、tPricesalesnoVal,Prod重新计算Uprice列的值来填充先前未知的单位价格sales$Uprice notF ms-tapply(UpricenotF,list(Prod=ProdnotF),function(x)+ bp ms head(ms) median iqrp1 11.346154 8.575599p2 10.877863 5.609731p3 10.000000 4.809092p4 9.911243 5.998530p5 10.957447 7.136601p6 13.223684 6.685185上面的代码使用函数boxplot()获得中位数、第一个四分位数和
12、第三个四分位数。对每个产品的所有交易,计算这些统计量,从分析中剔除有欺诈的交易。有了这些统计量以后,得到含有每个产品的中位数和四分位距的一个矩阵。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(mssmalls,1),log(mssmalls,2),pch=+)许多产品的中位数和IQR大致相同,我们可以看到,那些有少数交易的产品中有
13、很多和其他产品很相似。但是难以判断这些产品是否为欺诈交易。对于交易数量少于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,lengt
14、h(smalls),7,dimnames=list(names(smalls), c(Simil,ks.stat,ks.p,medP,iqrP,medS,iqrS)for(i in seq(along=smalls) d - scale(dms,dmssmallsi,FALSE) d - sqrt(drop(d2 %*% rep(1,ncol(d) stat - ks.test(prodssmallsi,prodsorder(d)2) similari, = 0.9)1 117对于这117个产品,我们可以把更多的交易纳入决策,提高检验的统计显著水平。4.用无监督技术进行数据挖掘:我们面临的不是
15、预测任务,而是一个描述性的数据挖掘任务。对于未被检验的报告,Insp列没有任何信息,所以它对分析没有影响。对于这些观测值,我们只有对交易的描述。这意味着这些销售报告仅仅有描述他的自变量,这种类型的数据适用于非监督学习技术。聚类方法师徒对一组观测值形成多个聚类,一个聚类内的个案相似,从而找到这些观测值的“自然”组别。相似性概念通常要求由描述观测值的变量所定义的空间给出一个距离定义,这个距离定义是衡量一个观测值和其他观测值之间距离的函数,距离靠近的个案通常认为属于同一个自然组。有些异常值检验方法假定数据的预期分布,把背离这一分布的任何标记值记为异常值。另一个常见的异常值检验策略是假定一个变量空间的
16、距离度量,然后把距离其他观测值“太远”的观测值标记为异常观测值,我们的目标是得到一组观测值的异常值排序,这个排序作为公司内检验决策的基础。5.评价准则library(ROCR)data(ROCR.simple)pred-prediction(ROCR.simple$predictions,ROCR.simple$labels)perf-performance(pred,prec,rec)plot(perf)PRcurve - function(preds,trues,.) require(ROCR,quietly=T) pd - prediction(preds,trues) pf - per
17、formance(pd,prec,rec) pfy.values - lapply(pfy.values,function(x) rev(cummax(rev(x) plot(pf,.)PRcurve(ROCR.simple$predictions,ROCR.simple$labels)标准价格的标准化距离:为了避免不同价格对异常值排名的影响,对单位价格和标准价格之间的距离进行标准化。 是产品p的标准单位价格,是该产品交易的单位价格的中位数,是该产品单位价格的四分位距avgNDTP - function(toInsp,train,stats) if (missing(train) & miss
18、ing(stats) stop(Provide either the training data or the product stats) if (missing(stats) notF - which(train$Insp != fraud) stats - tapply(train$UpricenotF, list(Prod=train$ProdnotF), function(x) bp - boxplot.stats(x)$stats c(median=bp3,iqr=bp4-bp2) ) stats - matrix(unlist(stats), length(stats),2,by
19、row=T, dimnames=list(names(stats),c(median,iqr) statswhich(stats,iqr=0),iqr - statswhich(stats,iqr=0),median mdtp - mean(abs(toInsp$Uprice-statstoInsp$Prod,median)/ statstoInsp$Prod,iqr) return(mdtp)6.计算离群值排序:这里用局部离群值因子系统。ho.LOF-function(form,train,test,k,.)ntr-nrow(train)all-rbind(train,test)N-nrow
20、(all)ups-split(all$Uprice,all$Prod)r-list(length=ups)for(u in seq(along=ups)ru3)lofactor(upsu,min(k,NROW(upsu)%2)else if (NROW(upsu) rep(0,NROW(upsu)else NULLall$lof-vector(length=N)split(all$lof,all$Prod)-rall$lofwhich(!(is.infinite(all$lof)|is.nan(all$lof)-SoftMax(all$lofwhich!(is.infinite(all$lof
21、)|is.nan(all$lof)structure(evalOutlierRanking(test,order(all(ntr+1):N,lof,decreasing=T,.),itInfo=list(preds=all(ntr+1):N,lof,trues=ifelse(test$Insp=fraud,1,0)通过合并训练集和测试集,用LOF方法对合并后的所有报告排序,选择属于测试集个案的排列分数。lof.res-holdOut(learner(ho.LOF,pars=list(k=7,Threshold=0.1,statsProds=globalStats),dataset(Insp.,
22、sales),hldSettings(3,0.3,1234,T),itsInfo=TRUE)对于10%的检验限制,回溯精确值有69%,NDTP平均值有2.4610诈交 值 ,%有溯限检0 ) , ) , ) .0 , ( 。数的集测选排告的对方 试和训)0 = = ( =). ,:+ ( ( ( $( ) ()$ .) .( -) ( = ( ( - ) = , - ( -). , 统统值局序值离 , ) , - = , - )=, ) ( ) ) - , ( $ ) ) $ = $ - ) ( ( ) & 量数品性分格检以,著% , 应行 阵 . . 0 0 . 0 . . 0 0 0 .
23、. . . . . 0 0 . 0 00 0 , . , )( , ) , % - ) ) , ) , , - , ( 0 ( ( 数格位产个面保 象息的个的0少这存矩 矩一来代似似意否产两检检 后然似最分位与寻,的 数易诈为品断以。似品和中的数少到可我相 数中 , ) 0 ( - =, , , =, ) (阵阵的分数中每含后量这。交有中从计这,交品产。四三数个一数获 使 . 0 0 . .000 . ) ( = ) , ( - = $ . - ) , - = - 。量标离) 距用量统量作中用势趋势集性两分续。计些布较是布两。异找,行一并交相它考们产的类发以,些其推似之价品过通但信关品缺。个避
24、析一品产可况这定出下显的求,太,易极品据个这的面 存保 $ 价价未充值 算 - ) $ . - , ( , ) $ - 失有填 和 值算 ., ) $ ( = 格价品作中价品每,的易些删所失些填此使可易品相的售其有息量易填报没售几, 0 0 00 . .000 000000 00 00 ( $ ( / )( ( )$ ( ( - 值失为有员人有 $ ( $ $ $ 品, ( % $ - 告易些将,论任能乎易这因错输的们或息更数比掌检意报 标报 一何任不信品这所准其无我因是数有所 0 0 0 . 0 00000 00 0 0 = ( ( - ) .( ) $ 个 显易失有数种一易值缺上者量的,)
25、 交值缺个时剔虑0 . 0 0 . . 0 ) $ *0- ) ,)$ ( ) ( $ ( -人售比很易缺时 变 量理值 .交相易群离认 00 ( := ( )$ . ( ) , , 性变明到,格单 00 00 . $ / - 大性,个于,据的售 . $ ( 图数交品和交的交小较诈到记销检 0 00) / $ ( 型型 数整 量型 ,到. : , , . 00 0 : . 0 0 . :, . :. 性属变中据计略以中0在条据样析行就时同总和售要,缺大据诈的查析数接,审还量说 的审未 据诈发 效认查,位的价量销到以多品产 多数录号 看可初计 ) ( & (. 索索核审过未表 诈为现示 ;易交易了司示 因能有值价的告:量数品该 量量一 明 量子个 销息信员自包一数行 据数作的性售这核完帮诈和中报现过司根目我销设来公策自按销据售时个据用这嫌员某指,录易怪“的易诈目源查检利式以司可出为序概种提动检事助有挖。离为行常些域分个在常是行些为关测常通行度角数域用重术掘数检欺活非交在中领社经背
限制150内