Data mining-资金流入流出预测(一)
文章目录
- 介绍
- 赛题简介
- 数据准备与探索
- 时间序列图
- 数据分布可视化
- 箱型图
- 小提琴图
- 变量间的相关性与独立性分析
- 相关性分析
- 变量的独立性检验
- 代码实战
- 时间序列分析
介绍
此数据挖掘项目基于阿里云天池赛题:赛题链接
参考github项目进行学习:github项目链接
赛题简介
具体的赛题介绍可去官网查看,这里只简单总结一下。官方提供了2013年7月~2014年8月28041位用户余额宝的申购赎回信息,我们需要通过数据挖掘的手段从这些数据中挖掘出有效信息,并预测2014年9月的每一天申购和赎回的总量。
理解了大概是个什么任务之后,我们的目标就很明确,要尽可能提高预测精度。
数据准备与探索
这是数据挖掘的第一步,我们需要整理好我们的数据,并做一些简单的分析。大概有以下三个步骤:
1. 时间序列图
2. 数据分布可视化
3. 数据的相关性及独立性分析
时间序列图
这个很好理解,通过时间序列图可以很好的看到我们要观察的数据的趋势。
在python中,我们有很好的封装库画出时间序列图。比如,matplotlib,seaborn。而Seaborn其实是在matplotlib的基础上进行了更高级的API封装,使得作图更加的简单,漂亮。因为是时间序列图,有需要的话还可以借助datatime库构造时间戳。
数据分布可视化
主要还是用到上面提到的库。这里简单介绍一下会用到一些的图。除了常见的直方图,密度曲线图之外。还有箱型图,小提琴图。
箱型图
箱型图包含五个要素,分别是上限,上四分位数,中位数,下四分位数,下限。其中上四分位数是指 把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。同理,那么下四分位数就是处于第一个分割点位置的数值。而第二个分割点显然就是中位数。这三个分割点也可以记做Q1,Q2,Q3。

确定四分位数有两种方法,分别是基于(N+1)的方法, 一种是基于(N-1)的方法。这里举一个用N+1计算四分数的例子:
数据一共有六项: 7, 15, 36, 39, 40, 83。
1*(n+1)/4= 7/4 =1.75,Q1在第一与第二个数字之间,
2*(n+1)/4 = 3.5 Q2在第三个和第四个数字中间,
3*(n+1)/4= 21/4 =5.25, Q3在第五与第六个数字之间,
所以:
Q1 = 0.75 *15+0.25 7 = 13,
Q2 = (36+39)/2= 37.5,
Q3 = 0.2541+0.75 *40 = 40.25.
四分位距IQR=Q3-Q1 = 27.25,
那么上限=Q3+1.5IQR = 81.125
下限 = Q1-1.5IQR = -27.875
那么不在上限与下限之间的数被称之为异常值
最后,总结一下就是,箱型图是是一种显示一组数据分散情况的统计图。
小提琴图

关于小提琴图可以这样简单理解,箱线图展示了分位数的位置,小提琴图则展示了任意位置的密度,通过小提琴图可以知道哪些位置的密度较高。
而关于95%置信区间的介绍,这篇回答很不错。95%置信区间的理解
变量间的相关性与独立性分析
首先我们需要了解一下在统计学上有以下几种变量
-
定类变量 Norminal Data 可以分类 ( = 和 ≠ )
-
定序变量 Ordinal Data:可以分类( = 和 ≠ ),可以排序(> 和 <),但不能(+ 和 - )
例如文化程度可以分为大学、高中、初中、小学、文盲 -
定距变量 Interval Data :可以分类( = 和 ≠ ),可以排序(> 和 <),可以(+ 和 - )
注意:定距变量没有绝对零点。例如华氏温度:10,20,30,华氏度40不是20的两倍热
相关性分析
对于不同变量之间的相关性分析有以下方法。

变量的独立性检验
占个坑,之后填。
代码实战
官方提供了五张表,分别是:用户信息表( user_profile_table ),用户申购赎回数据表(user_balance_table ),余额宝在 14 个月内的收益率表, (mfd_day_share_interest ),上海银行间同业拆放利率(Shibor)表。
我们先看一下用户申购赎回数据表。
import pandas as pd
import numpy as np
import warnings
import datetime
import seaborn as sns
import matplotlib.pyplot as plt
import datetime
from scipy import stats# 忽略警告信息
import warnings
warnings.filterwarnings('ignore')# 查看当前目录
import os
os.getcwd()
# 设置数据集路径dataset_path = r'D:/jupyter/数据分析与挖掘/tianchi_camptition data/'
# 读取数据
data_balance = pd.read_csv(dataset_path+'user_balance_table.csv')
data_balance.head()
| user_id | report_date | tBalance | yBalance | total_purchase_amt | direct_purchase_amt | purchase_bal_amt | purchase_bank_amt | total_redeem_amt | consume_amt | transfer_amt | tftobal_amt | tftocard_amt | share_amt | category1 | category2 | category3 | category4 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 20140805 | 20385 | 20383 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | NaN | NaN | NaN | NaN |
| 1 | 1 | 20140808 | 20391 | 20389 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | NaN | NaN | NaN | NaN |
| 2 | 1 | 20140811 | 20397 | 20395 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | NaN | NaN | NaN | NaN |
| 3 | 1 | 20140814 | 20403 | 20401 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | NaN | NaN | NaN | NaN |
| 4 | 1 | 20140817 | 20409 | 20407 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | NaN | NaN | NaN | NaN |
# 为数据集添加时间戳data_balance['date'] = pd.to_datetime(data_balance['report_date'], format= "%Y%m%d")
data_balance['day'] = data_balance['date'].dt.day
data_balance['month'] = data_balance['date'].dt.month
data_balance['year'] = data_balance['date'].dt.year
data_balance['week'] = data_balance['date'].dt.week
data_balance['weekday'] = data_balance['date'].dt.weekday
时间序列分析
# 聚合时间数据total_balance = data_balance.groupby(['date'])['total_purchase_amt','total_redeem_amt'].sum().reset_index()
# 生成测试集区段数据start = datetime.datetime(2014,9,1)
testdata = []
while start != datetime.datetime(2014,10,1):temp = [start, np.nan, np.nan]testdata.append(temp)start += datetime.timedelta(days = 1)
testdata = pd.DataFrame(testdata)
testdata.columns = total_balance.columns
# 拼接数据集total_balance = pd.concat([total_balance, testdata], axis = 0)
# 为数据集添加时间戳total_balance['day'] = total_balance['date'].dt.day
total_balance['month'] = total_balance['date'].dt.month
total_balance['year'] = total_balance['date'].dt.year
total_balance['week'] = total_balance['date'].dt.week
total_balance['weekday'] = total_balance['date'].dt.weekday
# 画出每日总购买与赎回量的时间序列图fig = plt.figure(figsize=(20,6))
plt.plot(total_balance['date'], total_balance['total_purchase_amt'],label='purchase')
plt.plot(total_balance['date'], total_balance['total_redeem_amt'],label='redeem')plt.legend(loc='best')
plt.title("The lineplot of total amount of Purchase and Redeem from July.13 to Sep.14")
plt.xlabel("Time")
plt.ylabel("Amount")
plt.show()

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
