查看本案例完整的数据、代码和报告请登录数据酷客(http://cookdata.cn)案例板块。
本案例适合作为大数据专业数据清洗或Pandas数据分析课程的配套教学案例。通过本案例,能够达到以下教学效果:
- 培养学生对真实数据进行初步探索的能力。案例基于真实数据生成的移动金融支付模拟数据集,进行数据清洗以及描述性统计分析,使学生对金融诈骗问题有所了解。
- 帮助学生熟悉数据预处理的常用方法。例如:数据分组、描述性统计分析和可视化探索。
- 提高学生动手实践能力。案例中使用Pandas、NumPy和Matplotlib等常用库进行数据清洗、描述性统计分析和数据可视化操作,提高学生对工具的使用熟练程度。
随着金融科技的发展,移动支付已经在人们的生活中占据越来越重要的地位,而金融诈骗问题也日益成为一个严峻挑战。本案例基于真实交易数据生成的模拟交易数据集,使用Pandas、NumPy等库进行数据清洗以及描述性统计分析,并通过分析数据的特点发现了诈骗交易相对于正常交易的一些特殊之处,这些初步结果可为进一步建模分析提供依据,本案例的研究有利于加深对金融诈骗问题的认识,对帮助金融监管部门打击金融诈骗也有积极的促进作用。
1.金融欺诈问题介绍
1.1问题描述
随着金融科技的发展,移动支付已经在人们的生活中占据越来越重要的地位。大家在生活中肯定会经常用到支付宝、微信等移动支付方式。随着移动金融支付的普及,金融欺诈问题越来越成为一个严峻的挑战。不同于传统现金支付或者去银行柜台转账,移动金融支付往往只需要输入密码或者指纹,很容易发生客户被诈骗的事件。当前,电话诈骗、短信诈骗、互联网诈骗等层出不穷,给人们的生活带来了极大困扰。尽管金融监管部门正在多渠道对金融诈骗进行打击,对于银行、支付宝、微信等公司来说,有效的识别金融诈骗,从而阻止诈骗交易也是十分重要的!这不仅有利于维护客户财产安全,增加客户信任,对帮助金融监管部门打击金融诈骗也有积极作用。
1.2研究难点
该领域对于普通的数据科学研究者来说的难题是,一直以来缺少金融服务尤其是移动金融支付领域的公开数据集。最主要的原因是金融交易具有很强的隐私性。而我们今天介绍的Kaggle的一个用于研究金融诈骗的数据集。这个数据集是通过一个叫做PaySim的模拟器模拟出来的,以便应对隐私问题(客户肯定不希望自己的交易信息被其他人知晓)。PaySim使用真实的私人交易数据集来生成模拟数据集,从而完善的刻画了一些正常的交易操作,并且加入了一些欺诈行为,以便我们之后评估监测方法的表现。该数据集基于非洲某一个国家某月真实的金融交易记录,该交易记录由一家当前运行在全球14个国家的金融交易服务公司提供,因此该公司提供的数据具有代表性。本案例使用的数据集是基于真实的交易数据生成的模拟数据集,从而这个数据集较好地刻画了真实世界的状况,但是又不会产生隐私问题。因为该数据集过于庞大,因此我们只抽取其中一天的交易日作为样本,因为本案例的主要目的是数据清洗,因此不会产生非常大的影响。
2.数据导入与描述性统计
2.1数据导入
首先,我们将数据导入,并查看一下数据的基本信息(数据量和每一列的数据类型以及是否存在空值):
代码语言:javascript复制import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
data=pd.read_csv('./input/data_financial.csv')
data.info()
可以看到,该数据集有574255个样本,每一列都没有缺失数据,这意味着我们不需要进行缺失值处理,下面我们简单介绍一下每一列的含义:
2.2描述性统计
接下来,看一下数据的描述性统计:
代码语言:javascript复制data.describe()
3.金融诈骗相关问题分析
3.1金融交易时间分布状况分析
总体来看,数据不存在极端值。从上面的信息我们可以看到,大概有0.047%的交易是欺诈交易,也就是说每一万笔交易中有大概五笔交易是欺诈交易。这在现实生活中是一个可怕的现象,仅支付宝每天的交易规模都在上亿笔,如果0.047%的金融欺诈交易概率发生,会是一个非常可怕的数字,因此这是一个非常值得关注的问题。
接下来,我们逐列分析一下交易数据,来发现数字背后隐藏的规律,首先看一下 step
列,这一列的数据分布应该是从1-24,表示一天的24个小时,我们首先看一下step
列都有哪些值:
np.sort(data['step'].unique())
结果表明数据是符合我们的要求的,没有异常数据。接下来我们看一下客户的交易是否存在时间倾向,也就是每天各个时间段交易的笔数是否存在显著差异呢?
代码语言:javascript复制data['step'].value_counts(sort=False)
代码语言:javascript复制series_1=data['step'].value_counts(sort=False)
series_1.plot()
我们可以看到,凌晨交易的笔数相对较少,从上午8点左右开始增多一直到晚上22点开始下降,这是符合常理的。我们看到,交易的峰值出现在晚上18点-19点,共有51352笔交易数据,因为此时人们通常已经下班,相对有更加充足的时间进行网上购物、支付转账等交易。
接下来,我们看一下金融诈骗通常发生在什么时候呢?为了实现这个目标,我们需要对isFraud
列进行分组求和:
series_2=data.groupby(by=['step'])['isFraud'].sum()
series_2.plot()
3.2 金融诈骗时间分布状况分析
相比于金融交易,金融诈骗仿佛并不是那么有规律可循,而是类似于呈现波峰波谷的分布,表明金融诈骗每一天的各个时间段都有可能发生,如果考虑到凌晨12点到早晨七点相对较少的交易量,夜晚相对来说是否是金融诈骗的高发期呢?为了验证这个想法,我们再看一下一天各个时间段的金融诈骗发生率,这需要生成一个新的列作为各个时间段金融诈骗率的衡量,我们用每天各个时间段的金融交易诈骗数量除以该时段的金融交易总数:
代码语言:javascript复制df={'total_jiaoyi':series_1,
'total_zhapian':series_2}
df['rate_zhapian']=df['total_zhapian']/df['total_jiaoyi']
df['rate_zhapian'].plot()
我们可以发现,金融诈骗主要发生在夜间!也就是用户熟睡的时候,因为这个时候用户基本上没有什么防范能力。联想到之前发生的不法分子趁用户熟睡时进行金融诈骗的案例—— 吓人!凌晨手机信号从4G变2G,然后钱就被转空了… ,表明该数据是和现实情况一致的,这也提醒银行、支付宝等金融服务部门和金融监管部门在该时间段对此类问题给予更多的关注。
3.3 金融交易类型及金融诈骗金额分析
接下来,我们看一下交易数据的类型,也就是五种交易类型各占多少。我们使用groupby()
函数,以type
为分类,求每一类交易的总数量:
data.groupby(by=['type'])['step'].count()
我们可以看出,现金流出占交易比重最大,其次是支付。接下来我们看一下哪种交易类型最容易发生金融诈骗(实际上答案非常简单,但是我们还是通过数据来看一看):
代码语言:javascript复制data.groupby(by=['type'])['isFraud'].sum()
可以发现,金融诈骗只出现在两种交易中,一种是现金流出,另外一种是转账。因为诈骗一定涉及到财产的减少,也就是财产流出,所以诈骗交易只出现在现金流出CASH_OUT
和转账TRANSFER
两列。那么每次金融诈骗发生的时候,会转走用户多少钱呢?是会选择全部转走吗?这里,我们要查看涉及诈骗交易中,交易后用户账户余额newbalanceOrig
列为0的账户个数,首先我们找到所有涉及诈骗交易的账户,然后我们查看涉及到诈骗交易账户中交易后余额为0的账户数量。
df_zhapian=data[data["isFraud"]==1]
df_zhapian[df_zhapian["newbalanceOrig"]==0]["isFraud"].count()
代码语言:javascript复制#也可以使用下面的代码:
df_zhapian[df_zhapian["newbalanceOrig"]==0]["isFraud"].value_counts()
可以发现,一共只有271单诈骗交易,而选择全部将客户的钱转走占据了267单!这警示我们一旦诈骗得手,造成的会是非常严重的损失——有很大的概率转移走全部账户余额!那么金融诈骗的平均额度是多少呢?和总的平均交易规模相比如何呢?我们首先对金融诈骗账户的amount
列求均值,然后对所有涉及现金流出CASH_OUT
和转账TRANSFER
业务的正常交易的账户的amount
列求均值,最后对这两个值进行比较。
data[data["isFraud"]==1]['amount'].mean()
代码语言:javascript复制data[(data["isFraud"]==0)&(data["type"].isin(["CASH_OUT","TRANSFER"]))]['amount'].mean()
代码语言:javascript复制mean_fraud=data[data["isFraud"]==1]['amount'].mean()
mean_total=data[(data["isFraud"]==0)&(data["type"].isin(["CASH_OUT","TRANSFER"]))]['amount'].mean()
x=["mean_fraud","mean_total"]
y=[mean_fraud,mean_total]
df2={'name':x,
'meanvalue':y}
%matplotlib inline
sns.set_style("white")
sns.barplot(x=x,y=y)
可以发现,金融诈骗的平均交易金额远远大于正常的(现金流出CASH_OUT
和转账TRANSFER
业务)平均交易金额,因此金融监管部门在遇到超过正常平均交易金额很多的交易的时候,需要加以注意,判断其是否是金融诈骗。
4.总结
本案例使用了基于真实数据生成的移动金融支付模拟数据集,然后通过数据清洗和数据描述性统计等方法研究了何时为金融诈骗交易高发时段、金融诈骗交易诈骗金额以及相对于正常金融交易金额的大小。本案例研究发现,凌晨12点至早上7点是金融诈骗交易多发时段,因为此时用户防范意识最小;金融诈骗交易一旦得手,往往会全部转移走客户财产,造成巨额损失;金融诈骗交易平均金额相对于正常金融交易金额来说非常大,这给我们识别移动支付中的金融风险提供了借鉴意义。当然,想更加准确地识别金融欺诈交易,则需要更加复杂的机器学习算法。