写在前面✍
- 本系列笔记基于天池平台上“资金流入流出预测-挑战Baseline”学习赛,记录如何完整的打一次数据挖掘类比赛。同时,该比赛属于序列建模问题,希望学习完成这个任务,可以对序列问题的处理有一定的独立思考能力和实践操作能力,可以将所学理论,用编码的形式和实际的问题得到深入。
- 第一篇,EDA,初步了解以及处理的基本步骤
- 学习前先提问:
A. 【数据处理】对于一般的数据挖掘类任务,拿到数据之后,首先要对数据集进行处理,那么需要考虑什么情况呢?比如,异常值、冗余项…
B. 【数据分析】数据分析需要分析哪些性质?比如,对于序列问题而言,将数据集可视化展示,需要看时间维度有没有周期性(是不是和周几有关系、以及月份、突发性事件、节日等)…数据分析的步骤是什么?
C. 【可视化工具】一般可视化使用matplotlib
或者seaborn
进行,要学会如何分析可视化图表。
Content:
seaborn
赛题地址
场景:蚂蚁金服每天需要处理大量的资金流入和流出
条件:为了资金流动的风险达到最低,同时保证每天的正常业务运转
目标:精准预测未来每日的资金流入流出情况
完整赛题:蚂蚁金服拥有上亿会员并且业务场景中每天都涉及大量的资金流入和流出,面对如此庞大的用户群,资金管理压力会非常大。在既保证资金流动性风险最小,又满足日常业务运转的情况下,精准地预测资金的流入流出情况变得尤为重要。此届大赛以《资金流入流出预测》为题,期望参赛者能够通过对例如余额宝用户的申购、赎回数据的把握。对货币基金而言,资金流入意味着申购行为,资金流出为赎回行为 。
数据:竞赛中使用的数据主要包含四个部分,分别为:
任务定位:
用户信息表:user_profile_table
。总共随机抽取了约 3 万用户,其中部分用户在 2014 年 9 月份第一次出现,这部分用户只在测试数据中 。因此用户信息表是约 2.8 万个用户(28041)的基本数据,在原始数据的基础上处理后,主要包含了用户的性别、城市和星座。具体的字段如下表 1 :
字段:user_id, sex(0/1), city_id(7所城市), constellation(星座)
用户申购赎回数据表:user_balance_table
。里面有 20130701
至 20140831
申购和赎回信息、以及所有的子类目信息,总共2840421条记录。数据经过脱敏处理,脱敏之后的数据,基本保持了原数据趋势。数据主要包括用户操作时间和操作记录,其中操作记录包括申购和赎回两个部分。金额的单位是分,即 0.01
元人民币。 如果用户今日消费总量为0
,即consume_amt=0
,则四个字类目为空。
今日余额 = 昨日余额 + 今日申购 - 今日赎回
,不会出现负值。收益表为余额宝在 14
个月内的收益率表: mfd_day_share_interest
。
银行间拆借利率表是 14
个月期间银行之间的拆借利率(皆为年化利率): mfd_bank_shibor
。
提交结果表: tc_comp_predict_table
。每一行数据是一天对申购、赎回总额的预测值, 2014 年 9 月每天一行数据,共 30 行数据。 Purchase
和 redeem
都是金额数据,精确到分。
评分数据格式要求与“选手结果数据样例文件”一致, 字段之间以逗号为分隔符,结果表命名为:tc_comp_predict_table
,
余额宝收益:
赛题任务:利用2013年7月~2014年8月
的数据,预测2014年9月
每一天申购和赎回的总量
传统评估指标:
MSE
(均方误差)、MAE
(平均绝对误差)、MAPE
(平均绝对相对误差)等为评价指标调用sklearn
实现:
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
import numpy as np
# MAE
mean_absolute_error(y_test, y_predict)
# MSE
mean_squared_error(y_test, y_predict)
# MAPE
np.mean((y_test - y_predict) / y_predict)
评估指标的设计:
方案:
o 基准方法:临近数据、中位数等
o 时间序列规则与模型
o 抽取特征、利用机器学习方法建模
首先对于数据的缺失值
、重复值
进行探索:
# 查看缺失值
data_balance.isna().sum()
# 重复值
data_balance.duplicated().sum()
然后查看数据的时序分布(图示结果如2.1.1所示):
import matplotlib.pyplot as plt
plt.plot(total_balance['date'], total_balance['total_purchase_amt'],label='purchase') # 当日的流入
plt.plot(total_balance['date'], total_balance['total_redeem_amt'],label='redeem') # 当日的流出
2.1.1 时间序列图
将数据集按照时间轴用折线图进行可视化,查看序列数据是否有周期性
,以及震动幅度
等。从下图可以看出,4月以前,基本上呈现purchase>redeem的趋势,2014.2有较大的波动,之后就开始交错出现,趋于平稳。
所以接下来查看4月的序列显示,可以发现仍然互相交错。
继续对每一个月进行单独的序列分析,可以发现purchase
和redeem
的变化趋势大致相同,是有相关性的。
对于13年的几个月的序列数据而言,也有一定的趋势相关性,purchase
几乎始终高于redeem
,了解到余额宝是蚂蚁金服旗下的余额增值服务和活期资金管理服务产品,于2013年6月推出
,产品处于体验期,因此和14年的相关性相比差一些。
2.1.2 数据分布可视化
直方图、密度曲线图(概率分布)、箱体图(可以查看异常值、中位数等统计信息)、小提琴图等。
基于对序列分布的分析,一个月的购买和赎回是有很强的相关性的。一般而言,时间序列问题一般会以周
为单位,我们想知道和周几
的分布,因此将时间数据按照周
聚合数据,绘制小提琴图、直方图、中位数分布图以及箱体图。与余额宝收益计算方式有关。
2.1.3 变量间相关性分析和独立性分析
- | 定类 | 定序 | 定距 |
---|---|---|---|
定类 | 卡方检测 | 卡方检测 | Eta系数 |
定序 | Spearman相关系数/同序-异序对测量 | Spearman相关系数 | |
定距 | Spearman相关系数 |
2.2.1 工具包和数据导入
seaborn
、matplotlib.pyplot
、numpy
、pandas
、datetime
、MVTest
2.2.2 统计申购总量和赎回总量
2.2.3 利用时序图观察数据特点
2.2.4 分析周一到周日申购总量和赎回总量的差异
2.2.5 每月申购总额与赎回总额的分布特点
如下图,以2014.8为例,查看一个月中
day
,是否受一个月中天数位置的影响,可以发现,二者的波动基本吻合
而2013年9月的差别较大,1、2、16(中秋前三天,买入较多)号,11和25号赎出较多,都是周三,19、20二者都很低
2.2.6 按天分析申购总额与赎回总额
2.2.7 分析节假日及特殊日期
2.2.8 分析大额交易
由于异常点2e8的影响,导致总数据集的箱体图显示所有的点串到一起了。接下来我们需要分析一下这个大额交易,了解它对整个序列的影响
这里对异常值点对应的用户的账户记录进行了分析
然后查看了大额消费近几日的总消费值分布:
分析了所有数据每一天的最大交易的时序图
每个月的大额值的频次分布直方图:
2.2.9 分析银行拆解利率与余额宝利率
2.2.10 分析用户信息
序列问题EDA的步骤:
- 序列问题:为数据添加时间戳,年、月、周、日。预测任务以
天
为单位,将训练集数据按照天
将流入量和流出量进行加和汇聚。训练集的时间范围:2013.7.1~2017.8.31
(427天);待预测的时间范围:2014.9.1~2014.10.1
(30天);将已知和未知序列数据进行拼接。- 序列分析:数据可视化,观察序列的变化趋势;可以看出来在2013.4之间的几个月,purchase>redeem;之后两个指标交错出现;对后几个月进行可视化,然后对每一个月可视化,查看以
月
为周期的序列是否有周期性。可以发现,5-8月的redeem在月中和月末分别有一次高峰期。- 以
周
、月
为周期,将数据进行聚合,研究是否和周几、几号有关。- 对数据的各个特征进行分析,如银行利率的影响、用户性别、星座、交易城市
1.df.reset_index():将原来的index作为df的一列,然后为df重置索引
写在最后:
- 关于数据预处理,本次给定的数据集经过脱敏处理,异常值需要分析;因为是序列预测问题,因此给数据集添加时间信息,方便后续可视化的处理。
- 学习完本次内容,学会了如何可视化数据,如何对各种统计图进行分析,哪些是需要分析的量。