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.25
41+0.75 *40 = 40.25.
四分位距IQR=Q3-Q1 = 27.25,
那么上限=Q3+1.5IQR = 81.125
下限 = Q1-1.5IQR = -27.875
那么不在上限与下限之间的数被称之为异常值

最后,总结一下就是,箱型图是是一种显示一组数据分散情况的统计图。

小提琴图

在这里插入图片描述

关于小提琴图可以这样简单理解,箱线图展示了分位数的位置,小提琴图则展示了任意位置的密度,通过小提琴图可以知道哪些位置的密度较高。

而关于95%置信区间的介绍,这篇回答很不错。95%置信区间的理解

变量间的相关性与独立性分析

首先我们需要了解一下在统计学上有以下几种变量

  1. 定类变量 Norminal Data 可以分类 ( = 和 ≠ )

  2. 定序变量 Ordinal Data:可以分类( = 和 ≠ ),可以排序(> 和 <),但不能(+ 和 - )
    例如文化程度可以分为大学、高中、初中、小学、文盲

  3. 定距变量 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_idreport_datetBalanceyBalancetotal_purchase_amtdirect_purchase_amtpurchase_bal_amtpurchase_bank_amttotal_redeem_amtconsume_amttransfer_amttftobal_amttftocard_amtshare_amtcategory1category2category3category4
012014080520385203832000000002NaNNaNNaNNaN
112014080820391203892000000002NaNNaNNaNNaN
212014081120397203952000000002NaNNaNNaNNaN
312014081420403204012000000002NaNNaNNaNNaN
412014081720409204072000000002NaNNaNNaNNaN
# 为数据集添加时间戳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()

时间序列


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部