Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析

写在前面✍

  1. 本系列笔记基于天池平台上“资金流入流出预测-挑战Baseline”学习赛,记录如何完整的打一次数据挖掘类比赛。同时,该比赛属于序列建模问题,希望学习完成这个任务,可以对序列问题的处理有一定的独立思考能力和实践操作能力,可以将所学理论,用编码的形式和实际的问题得到深入。
  2. 第一篇,EDA,初步了解以及处理的基本步骤
  3. 学习前先提问:
    A. 【数据处理】对于一般的数据挖掘类任务,拿到数据之后,首先要对数据集进行处理,那么需要考虑什么情况呢?比如,异常值、冗余项…
    B. 【数据分析】数据分析需要分析哪些性质?比如,对于序列问题而言,将数据集可视化展示,需要看时间维度有没有周期性(是不是和周几有关系、以及月份、突发性事件、节日等)…数据分析的步骤是什么?
    C. 【可视化工具】一般可视化使用matplotlib或者seaborn进行,要学会如何分析可视化图表。

Content:

  1. 初步了解赛题及数据
    1.1 任务
    1.2 用户基本信息数据
    1.3 用户申购赎回数据
    1.4 收益率表
    1.5 银行间拆借利率表
    1.6 提交格式
    1.7 评分指标
  2. EDA
    2.1 初步数据探索和准备步骤
  3. 工具的使用~seaborn

1 初步了解赛题及数据

1.1 任务:

赛题地址
场景:蚂蚁金服每天需要处理大量的资金流入和流出
条件:为了资金流动的风险达到最低,同时保证每天的正常业务运转
目标:精准预测未来每日的资金流入流出情况

完整赛题:蚂蚁金服拥有上亿会员并且业务场景中每天都涉及大量的资金流入和流出,面对如此庞大的用户群,资金管理压力会非常大。在既保证资金流动性风险最小,又满足日常业务运转的情况下,精准地预测资金的流入流出情况变得尤为重要。此届大赛以《资金流入流出预测》为题,期望参赛者能够通过对例如余额宝用户的申购、赎回数据的把握。对货币基金而言,资金流入意味着申购行为,资金流出为赎回行为 。

数据:竞赛中使用的数据主要包含四个部分,分别为:

  • 用户基本信息数据、
  • 用户申购赎回数据、
  • 收益率表、
  • 银行间拆借利率表

任务定位

  • 时间序列分析
  • 需要统计每天的申购总额和赎回总额

1.2 用户基本信息数据

用户信息表:user_profile_table。总共随机抽取了约 3 万用户,其中部分用户在 2014 年 9 月份第一次出现,这部分用户只在测试数据中 。因此用户信息表是约 2.8 万个用户(28041)的基本数据,在原始数据的基础上处理后,主要包含了用户的性别、城市和星座。具体的字段如下表 1 :

字段:user_id, sex(0/1), city_id(7所城市), constellation(星座)
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第1张图片

1.3 用户申购赎回数据

用户申购赎回数据表:user_balance_table。里面有 2013070120140831 申购和赎回信息、以及所有的子类目信息,总共2840421条记录。数据经过脱敏处理,脱敏之后的数据,基本保持了原数据趋势。数据主要包括用户操作时间和操作记录,其中操作记录包括申购和赎回两个部分。金额的单位是分,即 0.01元人民币。 如果用户今日消费总量为0,即consume_amt=0,则四个字类目为空。

  • 注 1 :上述的数据都是经过脱敏处理的,收益为重新计算得到的,计算方法按照简化后的计算方式处理,具体计算方式在下节余额宝收益计算方式中描述。
  • 注 2 :脱敏后的数据保证了今日余额 = 昨日余额 + 今日申购 - 今日赎回,不会出现负值。
    Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第2张图片

1.4 收益率表

收益表为余额宝在 14 个月内的收益率表: mfd_day_share_interest
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第3张图片

1.5 银行间拆借利率表(Shibor)

银行间拆借利率表是 14 个月期间银行之间的拆借利率(皆为年化利率): mfd_bank_shibor
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第4张图片

1.6 选手需要提交的结果表:

提交结果表: tc_comp_predict_table。每一行数据是一天对申购、赎回总额的预测值, 2014 年 9 月每天一行数据,共 30 行数据。 Purchaseredeem 都是金额数据,精确到分。
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第5张图片
评分数据格式要求与“选手结果数据样例文件”一致, 字段之间以逗号为分隔符,结果表命名为:tc_comp_predict_table
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第6张图片

余额宝收益:
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第7张图片

1.7 评估指标

赛题任务:利用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)

Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第8张图片

评估指标的设计:

  • 主要期望选手对未来 30 天内每一天申购和赎回的总量数据预测的越准越好,同时考虑到可能存在的多种情况。譬如有些选手在 30 天中 29 天预测都是非常精准的但是某一天预测的结果可能误差很大,而有些选手在 30 天中每天的预测都不是很精准误差较大,如果采用绝对误差则可能导致前者的成绩比后者差,而在实际业务中可能更倾向于前者。
  • 所以最终选用积分式的计算方法:每天的误差选用相对误差来计算,然后根据用户预测申购和赎回的相对误差,通过得分函数映射得到一个每天预测结果的得分,将 30 天内的得分汇总,然后结合实际业务的倾向,对申购赎回总量预测的得分情况进行加权求和,得到最终评分。具体的操作如下:
  1. 计算所有用户在测试集上每天的申购及赎回总额与实际情况总额的误差。
    Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第9张图片
  2. 申购预测得分与 Purchasei 相关,赎回预测得分与 Redeemi 相关 , 误差与得分之间的计算公式不公布,但保证该计算公式为单调递减的,即误差越小,得分越高,误差与大,得分越低。当第 i 天的申购误差 Purchase =0 ,这一天的得分为 10 分;当 Purchasei > 0.3 ,其得分为 0 。
  3. 最后公布总积分 = 申购预测得分 *45%+ 赎回预测得分 *55% 。

方案:
o 基准方法:临近数据、中位数等
o 时间序列规则与模型
o 抽取特征、利用机器学习方法建模

2 EDA

2.1 数据探索和准备步骤:

首先对于数据的缺失值重复值进行探索:

# 查看缺失值
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有较大的波动,之后就开始交错出现,趋于平稳。
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第10张图片
所以接下来查看4月的序列显示,可以发现仍然互相交错。
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第11张图片继续对每一个月进行单独的序列分析,可以发现purchaseredeem的变化趋势大致相同,是有相关性的。
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第12张图片

对于13年的几个月的序列数据而言,也有一定的趋势相关性,purchase几乎始终高于redeem,了解到余额宝是蚂蚁金服旗下的余额增值服务和活期资金管理服务产品,于2013年6月推出,产品处于体验期,因此和14年的相关性相比差一些。
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第13张图片
2.1.2 数据分布可视化
直方图、密度曲线图(概率分布)、箱体图(可以查看异常值、中位数等统计信息)、小提琴图等。
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第14张图片
基于对序列分布的分析,一个月的购买和赎回是有很强的相关性的。一般而言,时间序列问题一般会以为单位,我们想知道和周几的分布,因此将时间数据按照聚合数据,绘制小提琴图、直方图、中位数分布图以及箱体图。与余额宝收益计算方式有关。
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第15张图片
2.1.3 变量间相关性分析和独立性分析

  1. 相关性:
    • 定类变量:名义型变量;性别
    • 定序变量:不仅分类,还按某种特性排序;两值的差无意义;教育程度
    • 定距变量:可比较大小、差有意义的变量
- 定类 定序 定距
定类 卡方检测 卡方检测 Eta系数
定序 Spearman相关系数/同序-异序对测量 Spearman相关系数
定距 Spearman相关系数
  1. 独立性:
    独立性检验:变量间无线性相关性,还可能存在非线性关联
    • 假设X为连续型变量,Y为离散型变量(有R种取值)
    • 定义 F ( X ) = P ( X < = x ) F(X) = P(X<=x) F(X)=P(X<=x) F r ( X ) = P ( X < = x ∣ Y = y r ) F_r(X) = P(X<=x|Y=y_r) Fr(X)=P(X<=xY=yr)
    • 0:X与Y独立,即对于所有的 X X X都满足 F ( X ) = F r ( X ) F(X)=F_r(X) F(X)=Fr(X)
    • 1:X与Y不独立,即存在 X X X满足 F ( X ) ≠ F r ( X ) F(X) \neq F_r(X) F(X)=Fr(X)
    MVTest??
2.2 资金流入流出预测的数据探索

2.2.1 工具包和数据导入
seabornmatplotlib.pyplotnumpypandasdatetimeMVTest
2.2.2 统计申购总量和赎回总量

  • 添加时间数据
  • 统计以为单位的序列变化(时序图,可以看出大体上申购赎回是有关联的)
  • 观察每个月的时序图
    Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第16张图片
  • 周几进行统计分析(和余额宝收益计算方式有关):分别展示了小提琴图、箱体图、直方图、中位数柱状图;spearman coleration分析相关性(线性相关性弱)
    Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第17张图片

2.2.3 利用时序图观察数据特点
2.2.4 分析周一到周日申购总量和赎回总量的差异
2.2.5 每月申购总额与赎回总额的分布特点

如下图,以2014.8为例,查看一个月中day,是否受一个月中天数位置的影响,可以发现,二者的波动基本吻合
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第18张图片
而2013年9月的差别较大,1、2、16(中秋前三天,买入较多)号,11和25号赎出较多,都是周三,19、20二者都很低
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第19张图片

2.2.6 按天分析申购总额与赎回总额

中间有一些异常点,比如第4周周日,第12周周二。Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第20张图片

2.2.7 分析节假日及特殊日期

以端午节为例,可以发现,节假日都处于低谷
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第21张图片

2.2.8 分析大额交易

由于异常点2e8的影响,导致总数据集的箱体图显示所有的点串到一起了。接下来我们需要分析一下这个大额交易,了解它对整个序列的影响
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第22张图片
这里对异常值点对应的用户的账户记录进行了分析
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第23张图片
然后查看了大额消费近几日的总消费值分布:
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第24张图片
分析了所有数据每一天的最大交易的时序图
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第25张图片
每个月的大额值的频次分布直方图:
Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第26张图片Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析_第27张图片

2.2.9 分析银行拆解利率与余额宝利率

2.2.10 分析用户信息

序列问题EDA的步骤:

  1. 序列问题:为数据添加时间戳,年、月、周、日。预测任务以为单位,将训练集数据按照将流入量和流出量进行加和汇聚。训练集的时间范围:2013.7.1~2017.8.31(427天);待预测的时间范围:2014.9.1~2014.10.1(30天);将已知和未知序列数据进行拼接。
  2. 序列分析:数据可视化,观察序列的变化趋势;可以看出来在2013.4之间的几个月,purchase>redeem;之后两个指标交错出现;对后几个月进行可视化,然后对每一个月可视化,查看以为周期的序列是否有周期性。可以发现,5-8月的redeem在月中和月末分别有一次高峰期。
  3. 为周期,将数据进行聚合,研究是否和周几、几号有关。
  4. 对数据的各个特征进行分析,如银行利率的影响、用户性别、星座、交易城市

3 工具

3.1 pandas中一些不熟悉的用法:

1.df.reset_index():将原来的index作为df的一列,然后为df重置索引

3.2 seaborn数据可视化学习:如何分析
  • [violinplot] 小提琴图,分析数据分布
  • [distplot] 直方图+概率曲线
  • [kdeplot] 概率密度图,分析序列趋势
  • [lineplot] 折线图,分析趋势
  • [barplot] 柱状图,分析趋势
  • [boxplot] 分析异常值点
  • [heatmap] 热力图,找到异常值

写在最后:

  1. 关于数据预处理,本次给定的数据集经过脱敏处理,异常值需要分析;因为是序列预测问题,因此给数据集添加时间信息,方便后续可视化的处理。
  2. 学习完本次内容,学会了如何可视化数据,如何对各种统计图进行分析,哪些是需要分析的量。

你可能感兴趣的:(#,可视化,数据分析,机器学习,数据挖掘,python)