下午學習了python數據分析的應用案例---金融營銷活動中欺詐用戶行為分析。數據來源於DC競賽數據:https://www.dcjingsai.com/common/cmpt/2018%E5%B9%B4%E7%94%9C%E6%A9%99%E9%87%91%E8%9E%8D%E6%9D%AF%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1%E5%A4%A7%E8%B5%9B_%E7%AB%9E%E8%B5%9B%E4%BF%A1%E6%81%AF.html,詳細數據信息可去網站查看,標簽為1表“羊毛黨”,0表“正常用戶”
首先,數據導入
1 import numpy as np 2 import pandas as pd 3 from collections import Counter 4 import matplotlib.pyplot as plt 5 from pymining import itemmining,assocrules,perftesting,seqmining 6 import pyecharts as pe 7 rt=pd.read_csv(r"E:\transaction_train_new.csv",sep=",") 8 ro=pd.read_csv(r"E:\operation_train_new.csv",sep=",") 9 rtt=pd.read_csv(r"E:\tag_train_new.csv",sep=",")
然后,數據預處理與簡單統計
1 #數據處理與簡單統計 2 rt=pd.merge(rt,rtt) 3 ro=pd.merge(ro,rtt)#把標簽與行為合並方便結合標簽分析行為 4 z1=ro.day.astype(np.str) 5 z2=rt.day.astype(np.str)#把day轉為字符串 6 ro.time=pd.to_datetime("2018-01-"+z1+" "+ro.time) 7 rt.time=pd.to_datetime("2018-01-"+z2+" "+rt.time)#把time下面單純的小時改為標准模式的時間 8 #統計用戶總數,羊毛黨數量,交易行為數,操作行為數 9 print(len(rtt.UID.values),len(rtt[rtt.Tag==1].UID.values),len(rt),len(ro))
其次,欺詐用戶的一般特征分析。
從兩個方面1,羊毛黨通常事務性操作很少,交易性操作較多。2、羊毛黨,通常會多個用戶共用銀行賬戶、各種設備等信息
1、#行為時序分析
plt.plot(ro[ro.Tag==1].groupby("day").size())
plt.plot(ro[ro.Tag==0].groupby("day").size())#查看兩類用戶的事務性數據操作
圖中,藍色為“羊毛黨”,黃色為“普通用戶。可見,羊毛黨的事務操作較少,而交易性操作較多,即以盡可能少的成本獲取盡可能多的利益
plt.plot(rt[rt.Tag==1].groupby("day").size())
plt.plot(rt[rt.Tag==0].groupby("day").size())#查看兩類用戶的交易性操作
2、多賬戶羊毛黨行為分析
1 #多賬號羊毛,多個賬號公用銀行帳號、各種設備號、手機 2 def cl(x): 3 return set(x.UID.values) 4 z2=rt[rt.acc_id2.notnull()].groupby("acc_id2").apply(cl)#統計各轉出賬號acc_id2下的用戶 5 p2=Counter(z2.apply(len).values)#acc_id2用戶數量類別的計數 6 plt.loglog(p2.keys(),p2.values(),"o")#近似為冪函數曲線,數據明顯存在問題
1 #記錄各acc_id2下用戶數大於3的用戶ID,疑似為羊毛黨ID 2 z4=set([]) 3 for i in z2.values: 4 if len(i)>3: 5 z4=z4|i 6 z5=set(rt[rt.Tag==1].UID.values) 7 print(len(z4),len(z5),len(z4&z5))#查看預測的羊毛黨數量,實際的羊毛黨數量,預測對的羊毛黨數量
845 3993 725
1 #同理分析某一標簽x0下的用戶,>x1的為疑似羊毛黨 2 def u1(x0,x1): 3 def cl(x): 4 return set(x.UID.values) 5 z2=rt.groupby(x0).apply(cl) 6 p2=Counter(z2.apply(len).values) 7 plt.loglog(p2.keys(),p2.values(),"o") 8 z4=set([]) 9 for i in z2.values: 10 if len(i)>x1: 11 z4=z4|i 12 return [z4,len(z4),len(z5),len(z4&z5)]
定義函數u1(x0,x1)分析x0標簽下,疑似為用戶共用情況,共用用戶數>x1則認為是羊毛黨
在"acc_id1"”acc_id2“"acc_id3""device_code1""device_code2"下分析羊毛黨行為
1 y1=u1("acc_id1",3)#以ip作為分析指標 2 y1[1:4] 3 [845, 3993, 725] 4 y2=u1("acc_id2",2) 5 y2[1:4] 6 [333, 3993, 322] 7 y3=u1("acc_id3",3)#以ip作為分析指標 8 y3[1:4] 9 [298, 3993, 287] 10 de1=u1("device_code1",4)#以同-設備號上有>4個用戶,疑似為羊毛黨 11 de1[1:4] 12 [1338, 3993, 809] 13 de2=u1("device_code2",4)#手機品牌標簽下的羊毛黨分析 14 de2[1:4] 15 [1023, 3993, 805]
最后,匯總分析這5個指標的篩選結果
1 w=y1[0]|y2[0]|y3[0]|de1[0]|de2[0] 2 print(len(w),len(z5),len(w&z5)) 3 f0=len(w&z5)/len(w) 4 f1=len(w&z5)/len(z5) 5 f2=f0*f1*2/(f0+f1) 6 print(f0,f1,f2)#僅僅用簡單的條件就能達到0.4以上
1967 3993 1282
0.6517539400101677 0.3210618582519409 0.4302013422818792