2022泰迪杯数据分析技能赛B题方案及赛后总结:银行客户忠诚度分析
Posted Pluto_Ct
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022泰迪杯数据分析技能赛B题方案及赛后总结:银行客户忠诚度分析相关的知识,希望对你有一定的参考价值。
第五届“泰迪杯”数据分析技能赛(B题)『一等奖』,@队友:东可在编程、好同志歪歪
B题题目为“银行客户忠诚度分析”,题目给出了短期客户产品购买数据“short-customer-data.csv”和长期客户资源信息数据的训练集“long-customer-train.csv”,需要进行数据清洗和预处理,从中分析挖掘和可视化呈现。
代码见“八、”中的链接。
目录
竞赛官网
第五届“泰迪杯”数据分析技能赛 赛题https://www.tipdm.org:10010/#/competition/1557899215680741376/question
一、背景
目前银行产品存在同质化现象,客户选择产品和服务的途径越来越多,对产品的忠诚度越来越低。为了提高客户对银行的忠诚度和银行营销量,商业银行迫切需要转变经营理念,从“产品销售导向”业务模式向“以客户为中心”转变,为客户带来极致体验和价值成长,形成路径依赖,进而实现价值共赢。
客户忠诚度主要体现为客户的行为和态度。客户行为主要表现为产品重复购买的频率,而客户态度主要表现为情感的倾向。为了有效挖掘客户忠诚度,需要从短期客户产品购买数据和长期客户资源信息中分析客户需求指标。其中,短期客户忠诚度分析是通过产品的购买数据,分析不同指标客户对银行产品的购买依赖度从而提供更好的销售服务;长期客户忠诚度分析则是从客户资源信息数据中挖掘客户流失因素、预测可能流失的客户,尽可能留住高价值客户。
二、目标
(1) 对客户数据进行预处理,并对字符型数据进行特征编码。
(2) 基于短期客户产品购买数据,分析不同指标客户对银行产品的购买依赖度,并进行可视化呈现。
(3) 基于长期客户资源信息数据,分析客户流失因素,并进行可视化呈现。
(4) 依据长期客户资源信息数据的分析结果构建相关指标,对银行客户长期忠诚度进行预测。
三、任务1:数据探索与清洗
分别对短期客户产品购买数据“short-customer-data.csv”(简称短期数据)和长期客户资源信息数据的训练集“long-customer-train.csv”(简称长期数据)进行数据探索与清洗。
任务 1.1 数据探索与预处理
(1) 探索短期数据各指标数据的缺失值和“user_id”列重复值,删除缺失值、重复值所在行数据。请在报告中给出处理过程及必要结果,完整的结果保存到文件“result1_1.xlsx”中。
(2) 长期数据中的客户年龄“Age”列存在数值为-1、0 和“-”的异常值,删除存在该情况的行数据;“Age”列存在空格和“岁”等异常字符,删除这些异常字符但须保留年龄数值,将处理后的数值存于“Age”列。请在报告中给出处理过程及必要结果,完整的结果保存到文件“result1_2.xlsx”中。
任务 1.2 对短期数据中的字符型数据进行特征编码,如将信用违约情况‘否’,‘是’编码为0,1。请在报告中给出处理思路、过程及必要结果,完整的结果保存到文件“result1_3.xlsx”中。
3.1 任务1.1的解决方案和结果
3.1.1 短期数据缺失值处理
数据中存在部分缺失值,可能对后续任务产生影响,需要对数据进行清洗。根据题目要求,包含缺失值的记录全部删去。为最大程度保留有效数据,缺失值处理在重复值处理之前进行。
短期客户产品购买数据集共有41176条记录,使用DataFrame的count()方法统计各列的非空数据量,统计结果如下表所示。
数据列 | 非空数据量 |
user_id | 41176 |
age | 41176 |
job | 40846 |
marital | 41096 |
education | 39446 |
default | 32580 |
housing | 40186 |
loan | 40186 |
contact | 41176 |
month | 41176 |
day_of_week | 41176 |
duration | 41176 |
poutcome | 41176 |
y | 41176 |
使用DataFrame的dropna()方法去除数据中包含空值的行,共剩余30478条记录。
3.1.2 短期数据重复值处理
数据中存在部分重复值,可能对后续任务产生影响,需要对数据进行清洗。根据题目要求,user_id列重复值只保留一个。
以“BA2200001”为例,去除空值的数据中存在如下图所示的重复数据。
对此,本文仅保留在数据集中第一次出现的数据。使用drop_duplicates(subset=['user_id'])方法去除“user_id”列重复值,默认只保留第一条记录,处理后的记录数为30445条,部分结果如下图所示,完整结果保存到“result1_1.xlsx”。
3.1.3 长期数据异常值处理
使用unique()方法对长期数据进行探索,发现“Age”列值如下图所示,存在“-”“0”以及包含文本“岁”等异常值。
其中,在数据分析过程中,发现有18条年龄为1的记录,其中16条记录中的账号户龄超过年龄,与现实生活中的情况不相符合,且由于银行账户不可过户,同时我国银行规定办理银行卡需年满10周岁,因此本文将这些数据也视为异常值。
因此,本文对“Age”列异常值处理方法如下:首先对文本数据进行处理。使用正则表达式“(\\d+)”提取其中的数值部分,未匹配到数值或数值小于10的数据按缺失值处理,予以剔除,并将剩余数据转为数值类型。处理后剩余9180条数据,部分数据如下图所示,完整结果保存到“result1_2.xlsx”。
3.2 任务1.2的解决方案和结果
3.2.1 短期数据特征编码
对字符型数据进行特征编码,可以减小数据冗余,也为后续的数据分析处理提供便利。本题需要进行特征编码的列共有“job”、“marital”、“education”、“default”、“housing”、“loan”、“contact”、“month”、“day_of_week”、“poutcome”、“y”共11列,如下表所示。
列名 | 全部数据值 |
job | housemaid, services, admin., technician, blue-collar, unemployed, retired, entrepreneur, management, student, self-employed |
marital | married, single, divorced |
education | postgraduate, high school, junior college, undergraduate, illiterate |
default | no, yes |
housing | no, yes |
loan | no, yes |
contact | telephone, cellular |
month | may, jun, jul, aug, oct, nov, dec, mar, apr, sep |
day_of_week | mon, tue, wed, thu, fri |
poutcome | nonexistent, failure, success |
y | no, yes |
可以将这11列分为3种类型,具体分类如下图所示。
针对3种类型的数据列,采用3种不同的编码方法:
(1)对于逻辑型变量,取值范围为no和yes,分别编号为0和1;
(2)对于顺序型变量,例如“month”,按其月份顺序(may, jun, jul, aug, oct...)进行编码;
(3)对于无序分类型变量,例如“marital”,取值范围为(married, single, divorced),可进行随机编码,并保存编码表备查。
3.2.2 编码过程及结果
各列的编码表如下所示。
逻辑型
列名 | 编码 | 属性值 |
default housing loan y | 0 | no |
1 | yes |
顺序型
列名 | 编码 | 属性值 |
education | 1 | illiterate |
2 | high school | |
3 | junior college | |
4 | undergraduate | |
5 | postgraduate | |
month | 1 | jan |
2 | feb | |
3 | mar | |
4 | apr | |
5 | may | |
6 | jun | |
7 | jul | |
8 | aug | |
9 | sep | |
10 | oct | |
11 | nov | |
12 | dec | |
day_of_week | 1 | mon |
2 | tue | |
3 | wed | |
4 | thu | |
5 | fri |
无序分类型
列名 | 编码 | 属性值 |
job | 1 | housemaid |
2 | services | |
3 | admin. | |
4 | technician | |
5 | blue-collar | |
6 | unemployed | |
7 | retired | |
8 | entrepreneur | |
9 | management | |
10 | student | |
11 | self-employed | |
marital | 1 | married |
2 | single | |
3 | divorced | |
contact | 1 | telephone |
2 | cellular | |
poutcome | 1 | nonexistent |
2 | failure | |
3 | success |
将各列属性值替换为编码,部分结果如下所示,完整结果保存到“result1_3.xlsx”。
四、任务2:产品营销数据可视化分析
基于短期数据分析不同指标客户与购买银行产品行为的关联性,挖掘短期客户对银行的忠诚度。
任务 2.1 计算短期数据所有指标之间的相关性,绘制相关系数热力图,并在报告中对结果进行必要分析。
任务 2.2 在同一画布中,绘制反映两种产品购买结果下不同年龄客户量占比的分组柱状图,x 轴为年龄,y 轴为占比数值,并在报告中对结果进行必要分析。
任务 2.3 在同一画布中,绘制蓝领(blue-collar)与学生(student)的产品购买情况饼图,并设定饼图的标签,显示产品购买情况的占比。
任务 2.4 以产品购买结果为 x 轴、拜访客户的通话时长为 y 轴,绘制拜访客户的通话时长箱线图,并在报告中对结果进行必要分析。
4.1 短期数据指标相关性分析
导入任务1.2编码后的短期数据,使用DataFrame的corr()方法计算各指标间的相关性系数,并使用seaborn绘制热力图如下所示。
如图所示,短期数据中的大部分指标两两之间的相关度小于0.3,相关程度极弱,可视为不相关,其中,duration和y的相关系数为0.39,可视为低度相关。此外,duration、poutcome和contact对y的相关系数相对而言较大,可以推断最近一次拜访客户的通话时长、上一次银行活动,以及联系人通信类型对本次银行活动客户购买产品的影响较大。
4.2 两种产品客户量年龄分析
为方便绘图解释,使用任务1.1的编码前数据。由短期客户产品购买数据指标说明可知,两种购买结果分别为no和yes。对客户年龄列进行描述统计,可知客户最大年龄为95岁,最小年龄为17岁。
使用pd.cut()分箱统计方法,将年龄列按16-96等距分为8组,步长为10。使用groupby方法按不同的年龄层分组,统计不同产品购买结果下的客户量,并使用seaborn库绘制柱状图对数据进行可视化展现,如下图所示。
进一步对不同产品购买结果下的客户量占比情况进行描述统计和分析,结果如下表和下图所示。
age_group | no | yes | 该年龄段no占全年龄段比 | 该年龄段yes占全年龄段比 | 年龄段内 no占比 | 年龄段内yes占比 |
16-25 | 1088 | 273 | 0.040919177 | 0.070798755 | 0.799412197 | 0.20058780 |
26-35 | 10798 | 1552 | 0.406107789 | 0.402489627 | 0.874331984 | 0.12566801 |
36-45 | 8288 | 886 | 0.311707849 | 0.229771784 | 0.903422716 | 0.09657728 |
46-55 | 4688 | 565 | 0.176313513 | 0.146524896 | 0.892442414 | 0.10755758 |
56-65 | 1459 | 352 | 0.054872316 | 0.091286307 | 0.805632247 | 0.19436775 |
66-75 | 176 | 135 | 0.006619279 | 0.035010373 | 0.565916399 | 0.43408360 |
76-85 | 74 | 79 | 0.002783106 | 0.020487552 | 0.483660131 | 0.51633986 |
86-95 | 18 | 14 | 0.000676972 | 0.003630705 | 0.5625 | 0.4375 |
通过对柱状图及统计数据进行分析可知,26-35岁年龄层的客户量最大,其次是36-45岁年龄层。
通过对柱状图及统计数据进行分析可知,年龄在36-45岁区间内的,其90.34%的客户都在本次银行活动中选择no(即不购买产品),是各年龄层中忠诚度最低的;年龄在46-55岁和26-35岁区间内的,分别有89.24%和87.43%的客户在本次银行活动中选择不购买产品,表明忠诚度较低;年龄在56-65岁区间内的,有87.43%的客户在本次银行活动中选择不购买产品,忠诚度同样不高。而在66-95岁划分出的三个年龄层内,选择购买(yes)和不购买(no)的客户数占比数值基本持平,说明这三个年龄层的客户对于银行产品有一定的购买依赖。
4.3 蓝领与学生的产品购买情况分析
为方便绘图解释,使用任务1.1的编码前数据。使用value_count()方法分别统计蓝领和学生不同购买情况的数量,如下表所示。
no | yes | |
blue-collar | 5218 | 452 |
student | 406 | 203 |
使用matplotlib的subplot将2个饼图绘制在同一画布上,如下图所示。
4.4 产品购买结果和拜访客户的通话时长分析
为方便绘图解释,使用任务1.1的编码前数据。以产品购买结果为 x 轴、拜访客户的通话时长为 y 轴,使用seaborn绘制箱线图,如下图所示。
从上图可以看出,购买产品的客户的拜访客户的通话时长的平均值要高于未购买的客户。从离散程度来看,未购买产品客户的通话时长比较集中,而购买产品的客户的通话时长比较分散;从分布形状来看,两种产品购买结果的客户的通话时长均为右偏分布。可以推断出,拜访客户的通话时长对产品购买结果有积极作用。
五、任务3:客户流失因素可视化分析
基于长期数据分析导致银行客户流失的因素,并进行可视化呈现。
任务 3.1 在同一画布中,绘制反映两种流失情况下不同年龄客户量占比的折线图,x轴为年龄,y轴为占比数值。
任务 3.2 在同一画布中,绘制反映两种流失情况下客户信用资格与年龄分布的散点图,x轴为年龄,y轴为信用资格。
任务 3.3 构造包含各账号户龄在不同流失情况下的客户量占比透视表(详见表4),并在同一画布中绘制反映两种流失情况的客户各账号户龄占比量的堆叠柱状图,x轴为客户的户龄,y轴为占比量。表4 透视表
Exited\\Tenure 0 1 2 3 4 5 6 7 8 9 10
0
1注:Tenure 中的 0,…,10 表示客户的户龄,而 Exited 中的 0 表示客户未流失,1 表示已流失。
任务 3.4 新老客户各资产阶段的客户流失情况分析。
(1) 按照表 5 和表 6 对账号户龄和客户金融资产进行划分,并分别进行特征编码作为新的客户特征,其中客户状态存于“Status”列,资产阶段存于“AssetStage”列,编码结果保存到文件“result3.xlsx”中。表 5 账号户龄划分情况
账号户龄区间 客户状态
[0, 3] 新客户
(3, 6] 稳定客户
>6 老客户表 5 账号户龄划分情况
账号户龄区间 客户状态
[0, 3] 新客户
(3, 6] 稳定客户
>6 老客户
(2) 统计新、老客户在各资产阶段中流失的客户量,在同一画布中绘制热力图,热力图颜色的最大和最小取值设为 1300 和 100,并在报告中对结果进行必要分析。
5.1 年龄
由长期客户资源信息数据指标说明可知,两种流失情况分别为1(已流失)和0(未流失)。同理任务2.2,对客户年龄列进行统计,且对两种流失情况下不同年龄客户量占比情况进行分析,部分结果如下图所示。
使用matplotlib绘图工具来绘制折线图对数据进行可视化展现。
由折线图可知,30-40岁年龄区间内,未流失客户量最大,在区间左端随年龄的减小,未流失客户量递减,在区间右端随年龄增大,未流失客户量递增。40-50岁年龄区间内,流失客户量最多,在区间左端随年龄的减小,流失客户量递减,在区间右端随年龄增大,流失客户量递增。
本文进一步对两种流失情况下不同年龄客户量占比情况进行描述统计和分析,结果如下图所示。
如图所示,青壮年人(18-45岁左右)和老年人(65-92岁左右)这两个年龄段的客户未流失占比较高,客户流失占比较低,说明从长期来看忠诚度较高;而中年人(45-65岁左右)的客户流失和未流失占比几乎持平,说明对银行产品的购买依赖不强。
5.2 客户信用资格和年龄
对客户CreditScore (信用资格)列进行统计分析,可知客户的信用资格数值区间为350-850,数值越大表示信用越高。对客户Age(年龄)列进行统计,客户年龄在18-92岁之间。
使用seaborn库的scatterplot()方法绘制散点图,如下图所示。
为方便对散点图进行进一步的分析,使用seaborn库的jointplot()方法绘制带有分布图的散点图,如下图所示。
通过分析可得,信用资格处于中上游(500-850)且年龄段在40-55岁左右的中年群体的客户流失量是最大的。
5.3 账号户龄
使用value_counts()分别统计Exited=0和Exited=1的客户数量进行统计,合并为DataFrame,形成透视表,如下所示。
Exited\\Tenure | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 299 | 740 | 774 | 730 | 728 | 742 | 712 | 788 | 760 | 712 |
1 | 85 | 212 | 180 | 187 | 186 | 196 | 178 | 149 | 178 | 197 |
注:Tenure 中的 0,…,10 表示客户的户龄,而 Exited 中的 0 表示客户未流失,1 表示已流失。
使用matplotlib绘制堆叠柱状图,如下所示。
第十届“泰迪杯”数据挖掘挑战赛B题:电力系统负荷预测分析 31页省一等奖论文及代码
相关链接
(1)【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题一Baseline方案
(2)【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题一ARIMA、AutoARIMA、LSTM、Prophet 多方案实现
(3【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题二 时间突变分析 Python实现
1 题目
一、问题背景
电力系统负荷(电力需求量,即有功功率)预测是指充分考虑历史的系统负荷、经济状况、气象条件和社会事件等因素的影响,对未来一段时间的系统负荷做出预测。负荷预测是电力系统规划与调度的一项重要内容。短期(两周以内)预测是电网内部机组启停、调度和运营计划制定的基础;中期(未来数月)预测可为保障企业生产和社会生活用电,合理安排电网的运营与检修决策提供支持;长期(未来数年)预测可为电网改造、扩建等计划的制定提供参考,以提高电力系统的经济效益和社会效益。
复杂多变的气象条件和社会事件等不确定因素都会对电力系统负荷造成一定的影响,使得传统负荷预测模型的应用存在一定的局限性。同时,随着电力系统负荷结构的多元化,也使得模型应用的效果有所降低,因此电力系统负荷预测问题亟待进一步研究。
二、解决问题
1.地区负荷的中短期预测分析
根据附件中提供的某地区电网间隔15分钟的负荷数据,建立中短期负荷预测模型:
(1)给出该地区电网未来10天间隔15分钟的负荷预测结果,并分析其预测精度;
(2)给出该地区电网未来3个月日负荷的最大值和最小值预测结果,以及相应达到负荷最大值和最小值的时间,并分析其预测精度。
2.行业负荷的中期预测分析
对不同行业的用电负荷进行中期预测分析,能够为电网运营与调度决策提供重要依据。特别是在新冠疫情、国家“双碳”目标等背景下,通过对大工业、非普工业、普通工业和商业等行业的用电负荷进行预测,有助于掌握各行业的生产和经营状况、复工复产和后续发展走势,进而指导和辅助行业的发展决策。请根据附件中提供的各行业每天用电负荷相关数据,建立数学模型研究下面问题:
(1)挖掘分析各行业用电负荷突变的时间、量级和可能的原因。
(2)给出该地区各行业未来3个月日负荷最大值和最小值的预测结果,并对其预测精度做出分析。
(3)根据各行业的实际情况,研究国家“双碳”目标对各行业未来用电负荷可能产生的影响,并对相关行业提出有针对性的建议。
2 31页论文
https://www.betterbench.top/#/35/detail
摘要: 电力系统负荷预测是根据电力负荷的历史数据,搜集历史天气数据、降水量等天气影响,经济对的繁荣和萧条,社会现状等基础数据,并作为预测支撑,搜寻负荷与其他相关因素的内在联系,从而达到精准预测负荷的目的。利用机器学习模型对电力负荷进行了数据挖掘。首先对样例数据集进行了常规的缺失值、异常值、标准化等数据处理,运用K折交叉验证方法验证并挑选了最优的模型和方法。随后,使用了SPSS分析相关性热图提取特征。最终利用Auto TS模型,以MAE,SMAPE为评价指标,实现了电力系统负荷的预测。
关键词:电力系统;负荷预测;Auto TS模型;数据挖掘
以上是关于2022泰迪杯数据分析技能赛B题方案及赛后总结:银行客户忠诚度分析的主要内容,如果未能解决你的问题,请参考以下文章
第十届“泰迪杯”数据挖掘挑战赛B题:电力系统负荷预测分析 31页省一等奖论文及代码
第十届“泰迪杯”数据挖掘挑战赛B题:电力系统负荷预测分析 31页省一等奖论文及代码
2022高教社杯数学建模C题:古代玻璃制品的成分分析与鉴别 赛后总结 39页论文及代码