楼主: CDA网校
1567 7

[CDA数据分析师学习之路] 行业案例 | 数据分析在银行业应用之欺诈检测 [推广有奖]

管理员

大师

65%

还不是VIP/贵宾

-

威望
3
论坛币
35173 个
通用积分
3109.7053
学术水平
260 点
热心指数
268 点
信用等级
235 点
经验
195960 点
帖子
5195
精华
19
在线时间
3735 小时
注册时间
2019-9-13
最后登录
2024-6-14

初级热心勋章

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
CDA数据分析师 出品   作者:Elena Kosourova  编译:Mika

在本文中我们将通过探索一个很常见的用例——欺诈检测,从而了解数据分析在银行业是如何运用的。

背景介绍

银行业是最早应用数据科学技术的领域之一,收集了大量结构化数据。

那么,数据分析是如何应用于银行业的呢?

如今,数据已经成为银行业最宝贵的资产,不仅可以帮助银行吸引更多的客户,提高现有客户的忠诚度,做出更有效的数据驱动的决策,还可以增强业务能力,提高运营效率,改善现有的服务,加强安全性,并通过所有这些行动获得更多的收入等等。

因此,当下大部分数据相关工作需求来自银行业,这并不令人惊讶。

数据分析使银行业能够成功地执行众多任务,包括:

  • 投资风险分析
  • 客户终身价值预测
  • 客户细分
  • 客户流失率预测
  • 个性化营销
  • 客户情绪分析
  • 虚拟助理和聊天机器人

……

下面,我们将仔细看看银行业中最常见的数据分析用例之一。

数据分析在银行业应用案例:欺诈检测

除了银行业,欺诈活动还存在于许多领域。在政府、保险、公共部门、销售和医疗保健等领域,这都是一个具有挑战性的问题。也就是说,任何处理大量在线交易的企业都会面临欺诈风险。

金融犯罪的形式多种多样,包括欺诈性信用卡交易、伪造银行支票、逃税、网络攻击、客户账户盗窃、合成身份、诈骗等。

欺诈检测是为识别和防止欺诈活动和财务损失而采取的一种主动措施。

其主要分析技术可分为两组:
  • 统计学:统计参数计算、回归、概率分布、数据匹配
  • 人工智能(AI):数据挖掘、机器学习、深度学习


机器学习是欺诈检测的重要支柱,其工具包提供了两种方法:
  • 监督方法:K-近邻、逻辑回归、支持向量机、决策树、随机森林、时间序列分析、神经网络等。
  • 无监督方法:聚类分析、链接分析、自组织地图、主成分分析、异常识别等。


目前还没有通用的机器学习算法用于欺诈检测。相反,对于现实世界的数据科学用例,通常会测试几种技术或其组合,计算模型的预测准确性,并选择最佳方法。

欺诈检测系统的主要挑战是迅速适应不断变化的欺诈模式和欺诈者的策略,并及时发现新的和日益复杂的方案。欺诈案件总是占少数,并且很好地隐藏在真实的交易中。

下面来探讨一下使用Python进行信用卡欺诈检测。

我们将用到 creditcard_data 数据集。

Credit Card Fraud Detection | Kaggle数据集:

https://www.kaggle.com/mlg-ulb/creditcardfraud

该数据集是Kaggle信用卡欺诈检测数据集的一个修改样本。原始数据代表了2013年9月两天内欧洲持卡人拥有信用卡的交易情况。

让我们读入数据并快速浏览一下。
  1. import pandas as pd
  2. creditcard_data = pd.read_csv('creditcard_data.csv', index_col=0)
  3. print(creditcard_data.info())
  4. print('\n')
  5. pd.options.display.max_columns = len(creditcard_data)
  6. print(creditcard_data.head(3))
复制代码
  1. <class 'pandas.core.frame.DataFrame'>
  2. Int64Index: 5050 entries, 0 to 5049
  3. Data columns (total 30 columns):
  4. #   Column  Non-Null Count  Dtype
  5. ---  ------  --------------  -----
  6. 0   V1      5050 non-null   float64
  7. 1   V2      5050 non-null   float64
  8. 2   V3      5050 non-null   float64
  9. 3   V4      5050 non-null   float64
  10. 4   V5      5050 non-null   float64
  11. 5   V6      5050 non-null   float64
  12. 6   V7      5050 non-null   float64
  13. 7   V8      5050 non-null   float64
  14. 8   V9      5050 non-null   float64
  15. 9   V10     5050 non-null   float64
  16. 10  V11     5050 non-null   float64
  17. 11  V12     5050 non-null   float64
  18. 12  V13     5050 non-null   float64
  19. 13  V14     5050 non-null   float64
  20. 14  V15     5050 non-null   float64
  21. 15  V16     5050 non-null   float64
  22. 16  V17     5050 non-null   float64
  23. 17  V18     5050 non-null   float64
  24. 18  V19     5050 non-null   float64
  25. 19  V20     5050 non-null   float64
  26. 20  V21     5050 non-null   float64
  27. 21  V22     5050 non-null   float64
  28. 22  V23     5050 non-null   float64
  29. 23  V24     5050 non-null   float64
  30. 24  V25     5050 non-null   float64
  31. 25  V26     5050 non-null   float64
  32. 26  V27     5050 non-null   float64
  33. 27  V28     5050 non-null   float64
  34. 28  Amount  5050 non-null   float64
  35. 29  Class   5050 non-null   int64
  36. dtypes: float64(29), int64(1)
  37. memory usage: 1.2 MB
复制代码
  1.         V1        V2        V3        V4        V5        V6        V7  \
  2. 0  1.725265 -1.337256 -1.012687 -0.361656 -1.431611 -1.098681 -0.842274
  3. 1  0.683254 -1.681875  0.533349 -0.326064 -1.455603  0.101832 -0.520590
  4. 2  1.067973 -0.656667  1.029738  0.253899 -1.172715  0.073232 -0.745771

  5.         V8        V9       V10       V11       V12       V13       V14  \
  6. 0 -0.026594 -0.032409  0.215113  1.618952 -0.654046 -1.442665 -1.546538
  7. 1  0.114036 -0.601760  0.444011  1.521570  0.499202 -0.127849 -0.237253
  8. 2  0.249803  1.383057 -0.483771 -0.782780  0.005242 -1.273288 -0.269260

  9.         V15       V16       V17       V18       V19       V20       V21  \
  10. 0 -0.230008  1.785539  1.419793  0.071666  0.233031  0.275911  0.414524
  11. 1 -0.752351  0.667190  0.724785 -1.736615  0.702088  0.638186  0.116898
  12. 2  0.091287 -0.347973  0.495328 -0.925949  0.099138 -0.083859 -0.189315

  13.         V22       V23       V24       V25       V26       V27       V28  \
  14. 0  0.793434  0.028887  0.419421 -0.367529 -0.155634 -0.015768  0.010790
  15. 1 -0.304605 -0.125547  0.244848  0.069163 -0.460712 -0.017068  0.063542
  16. 2 -0.426743  0.079539  0.129692  0.002778  0.970498 -0.035056  0.017313
复制代码
  1.   Amount  Class
  2. 0  189.00      0
  3. 1  315.17      0
  4. 2   59.98      0
复制代码

数据集包含以下变量

数值编码的变量V1到V28是从PCA变换中获得的主分量。由于保密问题,未提供有关原始功能的背景信息。
Amount变量表示交易金额。

Class变量显示交易是否为欺诈(1)或非欺诈(0)。

幸运的是,就其性质而言,欺诈事件在任何交易列表中都是极少数。然而,当数据集中包含的不同类别或多或少存在时,机器学习算法通常效果最好。否则,就没有什么数据可供借鉴,这个问题被称为类别不均。

接着计算欺诈交易占数据集中交易总数的百分比:

  1. round(creditcard_data['Class'].value_counts()*100/len(creditcard_data)).convert_dtypes()
复制代码
  1. 0    99
  2. 1     1
  3. Name: Class, dtype: Int64
复制代码

并创建一个图表,将欺诈与非欺诈的数据点可视化。

  1. import matplotlib.pyplot as plt
  2. import numpy as np

  3. def prep_data(df):
  4.     X = df.iloc[:, 1:28]
  5.     X = np.array(X).astype(float)
  6.     y = df.iloc[:, 29]
  7.     y = np.array(y).astype(float)
  8.     return X, y

  9. def plot_data(X, y):
  10.     plt.scatter(X[y==0, 0], X[y==0, 1], label='Class #0', alpha=0.5, linewidth=0.15)
  11.     plt.scatter(X[y==1, 0], X[y==1, 1], label='Class #1', alpha=0.5, linewidth=0.15, c='r')
  12.     plt.legend()
  13.     return plt.show()

  14. X, y = prep_data(creditcard_data)
  15. plot_data(X, y)
复制代码
640 (6).png

可以确认的是,欺诈性交易的比例非常低,当中存在一个类别不平衡问题的案例。

为了解决这个问题,我们可以使用合成少数人超抽样技术(SMOTE)来重新平衡数据。与随机超额取样不同,SMOTE稍微复杂一些,因为它不只是创建观察值的精确副本。

相反,它使用欺诈案件的最近邻居的特征来创建新的、合成的样本,这些样本与少数人类别中的现有观察值相当相似,让我们把SMOTE应用于该信用卡数据。

  1. from imblearn.over_sampling import SMOTE

  2. method = SMOTE()
  3. X_resampled, y_resampled = method.fit_resample(X, y)
  4. plot_data(X_resampled, y_resampled)
复制代码
640 (7).png
正如所看到的,使用SMOTE突然提供了更多的少数类别的观察结果。为了更好地看到这种方法的结果,这里将把其与原始数据进行比较。
  1. def compare_plot(X, y, X_resampled, y_resampled, method):
  2.     f, (ax1, ax2) = plt.subplots(1, 2)
  3.     c0 = ax1.scatter(X[y==0, 0], X[y==0, 1], label='Class #0',alpha=0.5)
  4.     c1 = ax1.scatter(X[y==1, 0], X[y==1, 1], label='Class #1',alpha=0.5, c='r')
  5.     ax1.set_title('Original set')
  6.     ax2.scatter(X_resampled[y_resampled==0, 0], X_resampled[y_resampled==0, 1], label='Class #0', alpha=.5)
  7.     ax2.scatter(X_resampled[y_resampled==1, 0], X_resampled[y_resampled==1, 1], label='Class #1', alpha=.5,c='r')
  8.     ax2.set_title(method)
  9.     plt.figlegend((c0, c1), ('Class #0', 'Class #1'), loc='lower center', ncol=2, labelspacing=0.)
  10.     plt.tight_layout(pad=3)
  11.     return plt.show()

  12. print(f'Original set:\n'
  13.       f'{pd.value_counts(pd.Series(y))}\n\n'
  14.       f'SMOTE:\n'
  15.       f'{pd.value_counts(pd.Series(y_resampled))}\n')

  16. compare_plot(X, y, X_resampled, y_resampled, method='SMOTE')
复制代码
  1. Original set:
  2. 0.0    5000
  3. 1.0      50
  4. dtype: int64

  5. SMOTE:
  6. 0.0    5000
  7. 1.0    5000
  8. dtype: int64
复制代码
640 (8).png
因此,SMOTE方法已经完全平衡了数据,少数群体现在与多数群体的规模相等。

接着让我们回到原始数据,并尝试检测欺诈案件。按照这类传统的方式,我们必须制定一些规则来识别欺诈行为。

例如,此类规则可能涉及不寻常的交易地点或可疑的频繁交易。其想法是基于常见的统计数据定义阈值,通常是基于观察值的平均值,并在功能上使用这些阈值来检测欺诈。
  1. print(creditcard_data.groupby('Class').mean().round(3)[['V1', 'V3']])

  2. V1     V3
  3. Class            
  4. 0      0.035  0.037
  5. 1     -4.985 -7.294
复制代码
在特殊情况下,可以应用以下条件:V1<-3和V3<-5。然后,为了评估这种方法的性能,我们将把标记的欺诈案例与实际案例进行比较:
  1. creditcard_data['flag_as_fraud'] = np.where(np.logical_and(creditcard_data['V1']<-3, creditcard_data['V3']<-5), 1, 0)
  2. print(pd.crosstab(creditcard_data['Class'], creditcard_data['flag_as_fraud'], rownames=['Actual Fraud'], colnames=['Flagged Fraud']))
复制代码
  1. Flagged Fraud     0   1
  2. Actual Fraud         
  3. 0              4984  16
  4. 1                28  22
复制代码

我们发现,在50个欺诈案件中能识别其中的22个,但无法检测出其他28个,并得到16个误报。让我们看看使用机器学习技术是否能解决这个问题。

现在要在信用卡数据上实现一个简单的逻辑回归分类算法,从而来识别欺诈行为,然后在混淆矩阵上将结果可视化。
  1. from sklearn.model_selection import train_test_split
  2. from sklearn.linear_model import LogisticRegression

  3. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

  4. lr = LogisticRegression()
  5. lr.fit(X_train, y_train)
  6. predictions = lr.predict(X_test)
  7. print(pd.crosstab(y_test, predictions, rownames=['Actual Fraud'], colnames=['Flagged Fraud']))

  8. Flagged Fraud   0.0  1.0
  9. Actual Fraud           
  10. 0.0            1504    1
  11. 1.0             1      9
复制代码
需要注意的是,在混淆矩阵中要查看的观测值较少,因为我们只使用测试集来计算模型结果,即仅占整个数据集的30%。

结果是发现了更高比例的欺诈案件:90%(9/10),而之前的结果是44%(22/50),得到的误报也比以前少了很多,这是一个进步。

现在让我们回到前面讨论的类不平衡问题,并探索是否可以通过将逻辑回归模型与SMOTE重采样方法相结合来进一步提高预测结果。为了高效、一次性地完成这项工作,我们需要定义一个管道,并在数据上运行:
  1. from imblearn.pipeline import Pipeline

  2. # Defining which resampling method and which ML model to use in the pipeline
  3. resampling = SMOTE()
  4. lr = LogisticRegression()

  5. pipeline = Pipeline([('SMOTE', resampling), ('Logistic Regression', lr)])
  6. pipeline.fit(X_train, y_train)
  7. predictions = pipeline.predict(X_test)
  8. print(pd.crosstab(y_test, predictions, rownames=['Actual Fraud'], colnames=['Flagged Fraud']))

  9. Flagged Fraud   0.0  1.0
  10. Actual Fraud           
  11. 0.0            1496    9
  12. 1.0               1    9
复制代码
可以看到,在案例中,SMOTE并没有带来任何改进:仍然捕获了90%的欺诈事件,而且假阳性数量略高。

这里的解释是,重新取样不一定在所有情况下都能带来更好的结果。当欺诈案件在数据中非常分散时,其最近的不一定也是欺诈案件,所以使用SMOTE会引入偏见问题。

为了提高逻辑回归模型的准确性,我们可以调整一些算法参数,也可以考虑采用K-fold交叉验证法,而不是直接将数据集分成两部分。
cda
最后,还想了解更多关于银行业务的知识内容,可以点击下方链接:https://edu.cda.cn/search?q=%E9%93%B6%E8%A1%8C%E4%B8%9A

CDA网校数据分析试听课


参考链接:https://www.datacamp.com/blog/data-science-in-banking


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:行业应用 数据分析 银行业 Matplotlib detection

已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
np84 + 100 精彩帖子
etoy + 1 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

沙发
Studio-R 在职认证  发表于 2022-4-11 13:58:42 |只看作者 |坛友微信交流群
数据分析使银行业能够成功地执行众多任务,包括:

投资风险分析
客户终身价值预测
客户细分
客户流失率预测
个性化营销
客户情绪分析
虚拟助理和聊天机器人

使用道具

藤椅
Studio-R 在职认证  发表于 2022-4-11 13:59:03 |只看作者 |坛友微信交流群
可以看到,在案例中,SMOTE并没有带来任何改进:仍然捕获了90%的欺诈事件,而且假阳性数量略高。

这里的解释是,重新取样不一定在所有情况下都能带来更好的结果。当欺诈案件在数据中非常分散时,其最近的不一定也是欺诈案件,所以使用SMOTE会引入偏见问题。

使用道具

板凳
Studio-R 在职认证  发表于 2022-4-11 14:00:09 |只看作者 |坛友微信交流群
银行业务数据分析的知识内容,可以点击下方链接:https://edu.cda.cn/search?q=%E9%93%B6%E8%A1%8C%E4%B8%9A

使用道具

报纸
Studio-R 在职认证  发表于 2022-4-11 14:04:00 |只看作者 |坛友微信交流群

使用道具

地板
512661101 发表于 2022-4-12 08:46:55 |只看作者 |坛友微信交流群

使用道具

7
myazure 发表于 2022-4-13 07:42:23 |只看作者 |坛友微信交流群

使用道具

8
zgs3721 发表于 2022-4-13 08:40:30 |只看作者 |坛友微信交流群
谢谢分享

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-14 17:42