多种方案成单预测比较
1 背景和挖掘目标
基于关键的业务指标进行成单预测,对影响成单的因子了解
2 分析步骤
01 基于关键特征数据底表的分组处理
02 关于机会、名片表的处理 基于业务逻辑或者数据表现进行分组,查看
03 处理成单跨期导致的名片-成单的数据对应问题
04 观察各关键指标对结果的影响大小,并选择有显著影响的特征
05 利用均值原理计算成单
06 Sequential 神经网络进行调参和预测
07 LinearRegression多项式线性回归预测和验证
08 Lasso套索回归预测
09 贝叶斯岭回归
010 核岭回归预测
011 画出结果
3、代码案例
# 目的,基于业务预测成单
import numpy
import pandas
# 1 关于订单表的处理
data = pandas.read_csv(
'D:\\DATA\\pycase\\number2\\project\\pretice\\XZIT.csv' ,
encoding='gbk'
)
data.columns
# 提取关键字段
Data=data[['周','日期','星期','军团','咨询师','学费金额','成单周期','报名人数','机会时间']]
# 根据业务的而需求将成单周期分为以下几个阶段,研究对象为军团
# 查看成单的分布情况
aggResult=Data.groupby(
by=['成单周期']
)['报名人数'].agg({
'成单单数':numpy.sum
})
# 根据分组的情况对成单进行分组有查看
# bins划分数据
bins=[-1,0,1,2,3,6,13,30,1000] # 范围,让标签小于bins
# 分组的自定义标签
labels=['当天成单','1天成单','2天成单','3天成单','4-6天成单',
'7-13天成单','14-30天成单','30以上成单'
]
Data['成单周期分层']=pandas.cut(
Data.成单周期,
bins,
labels=labels
)
# 根据成单分层进行分布分析
AggResult=Data.groupby(
by=['成单周期分层']
)['报名人数'].agg({
'成单单数':numpy.sum
})
# 使用百分比的形式进行数据的直观展现
pAggResult=round(
AggResult/AggResult.sum(),
2
)*100
# 百分数格式设置
pAggResult['成单单数'].map('{:,.2f}%'.format)
# 2、关于机会、名片表的处理 基于业务逻辑或者数据表现进行分组
data2 = pandas.read_csv('D:\\DATA\\pycase\\number2\\project\\pretice\\XZIT2.csv')
data2.dtypes
# 对机会进行分组
aggResult2=data2.groupby(
by=['日期']
)['销售机会数'].agg({
'机会数': numpy.sum
})
## 机会匹配Vlook
DataAgg=pandas.merge(
Data,
aggResult2,
left_on='机会时间',
right_index=True,
how='left'
)
# 由于某些时间段没有对应的数据,所以删除缺失值啊对应的相关数据。
DataAgg=DataAgg.dropna()
# 再次进行分布分析
DaggResult=DataAgg.groupby(
by=['成单周期']
)['报名人数'].agg({
'成单单数':numpy.sum
})
# 根据分组的情况对成单进行分组有查看
# bins划分数据
bins=[-1,0,1,2,3,6,13,30,1000] # 范围,让标签小于bins
# 分组的自定义标签
labels=['当天成单','1天成单','2天成单','3天成单','4-6天成单',
'7-13天成单','14-30天成单','30以上成单'
]
DataAgg['成单周期分层']=pandas.cut(
DataAgg.成单周期,
bins,
labels=labels
)
# 根据成单分层进行分布分析
DataAggResult=DataAgg.groupby(
by=['成单周期分层']
)['报名人数'].agg({
'成单单数':numpy.sum
})
# 使用百分比的形式进行数据的直观展现
pDataAggResult=round(
DataAggResult/DataAggResult.sum(),
2
)*100
pDataAggResult['成单单数'].map('{:,.2f}%'.format)
# 3、两表alphaB匹配,机会匹配成单
DataAggResult['销售机会数']=DataAggResult['成单单数']
# 序列转化时间格式
data2['日期']= pandas.to_datetime(data2['日期'],format='%Y/%m/%d')
# 转化为字符窜格式
data2['日期']=data2.日期.dt.strftime('%Y/%m/%d')
DataAggResult.iloc[0,1]=data2.销售机会数.sum()
DataAggResult.iloc[1,1]=data2[data2.日期<'2018/12/10']['销售机会数'].sum()
DataAggResult.iloc[2,1]=data2[data2.日期<'2018/12/09']['销售机会数'].sum()
DataAggResult.iloc[3,1]=data2[data2.日期<'2018/12/08']['销售机会数'].sum()
DataAggResult.iloc[4,1]=data2[data2.日期<'2018/12/07']['销售机会数'].sum()*159 # 162-3=159
DataAggResult.iloc[5,1]=data2[data2.日期<'2018/12/04']['销售机会数'].sum()*156 # 162-6=156
DataAggResult.iloc[6,1]=data2[data2.日期<'2018/11/27']['销售机会数'].sum()*149 # 162-13=149
DataAggResult.iloc[7,1]=data2[data2.日期<'2018/11/09']['销售机会数'].sum()*132 # 162-30=132天的日军机会(因为报名就总数)
DataAggResult['平均销转']=DataAggResult['成单单数']/DataAggResult['销售机会数']
### 3.2 新增观察成单数量日期
# 对成单数量进行分布分析
DaggResult3=DataAgg.groupby(
by=['日期']
)['报名人数'].agg({
'成单单数':numpy.sum
})
# 数据框排序
# DaggResult3.columns
DaggResult3=DaggResult3.sort_values( ['成单单数'],axis = 0,ascending =False)
# 看分布
# 根据分组的情况对成单进行分组有查看
# bins划分数据
bins=[-1,25,50,300] # 范围,让标签小于bins
# 分组的自定义标签
labels=['普通','小促','大促']
DaggResult3['成单分级查看']=pandas.cut(
DaggResult3.成单单数,
bins,
labels=labels
)
# 根据成单分层进行分布分析
DaggAGGResult3=DaggResult3.groupby(
by=['成单分级查看']
)['成单单数'].agg({
'成单分层数':numpy.sum
})
# 使用百分比的形式进行数据的直观展现
DaggAGGResult3=round(
DaggAGGResult3/DaggAGGResult3.sum(),
2
)*100
DaggAGGResult3['成单分层数'].map('{:,.2f}%'.format)
### 4 观察不同司龄的咨询师的销转
Data2=data2[['咨询师','司龄']]
Data2=Data2.drop_duplicates()
## 人员司龄匹配
DataAgg=pandas.merge(
DataAgg,
Data2,
left_on='咨询师',
right_on='咨询师',
how='left'
)
ptresult=DataAgg.pivot_table(
values=['咨询师','机会数','报名人数'],
index='司龄',
aggfunc=numpy.sum
)
ptresult['司龄销转']=ptresult['报名人数']/ptresult['机会数']*100
'''
1-3个月:1
3-6个月:2
6-12个月:3
一个月以内:4
一年以上:5
未知:6
ActiveDict={
'1-3个月':1,
'3-6个月':2,
'6-12个月':3,
'一个月以内':4,
'一年以上':5,
'未知':6
}
''' # 研究方向的以天为单位,所以在这里不需要字典处理
ptresult2=data2.pivot_table(
values='咨询师',
index='日期',
columns='司龄',
aggfunc=numpy.size
)
ptresult2=ptresult2.fillna(0)
# 虚拟变量的转化
# 星期时间段的虚拟化,在后边
# 有比较的虚拟变量准话
"""
普通:1
小促:2
大促:3
"""
activeDict={
'普通':1,
'小促':2,
'大促':3}
# 增加虚拟变量
DaggResult3['Map']=DaggResult3[
'成单分级查看'
].map(activeDict)
# 4、新建基于时间的机会数量
# 1 创建一维数组12.10号对应的周期名片
from pandas import DataFrame
labels2=['当天机会','1天机会','2天机会','3天机会','4-6天机会',
'7-13天机会','14-30天机会','30以上机会'
]
Mp=DataFrame({
'日期':[],
'当天机会':[],
'1天机会':[],
'2天机会':[],
'3天机会':[],
'4-6天机会':[],
'7-13天机会':[],
'14-30天机会':[],
'30以上机会':[]
})
# 定义测试的时间序列,并且删除重复数据
from pandas import Series
date=Series(data.日期).drop_duplicates()
# 将序列赋值给Mp
Mp['日期']=date
Mp.dtypes
# 序列转化时间格式
Mp['日期']= pandas.to_datetime(Mp['日期'],format='%Y/%m/%d')
# 转化为字符窜格式
Mp['日期']=Mp.日期.dt.strftime('%Y/%m/%d')
# 日期格式的转换,此处不需要
## Mp['日期']=pandas.to_datetime(Mp.日期,format='%Y/%m/%d')
# 查看数据列的格式
data2.columns
data2.dtypes
# 类和函数定义:
import datetime
class date:
# initialisation method with internal data 初始化
def _init_(self,time):
self.time=time
def status(self):
t0=datetime.datetime.strptime(self.time,'%Y/%m/%d')
t1=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=1)
t2=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=2)
t3=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=3)
t4=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=4)
t5=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=6)
t6=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=7)
t7=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=13)
t8=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=14)
t9=datetime.datetime.strptime(self.time,'%Y/%m/%d')-datetime.timedelta(days=30)
# data[(data.date>=dt1)&(data.date<=dt2)]
t1=t1.strftime('%Y/%m/%d') # 将日期格式转化为需要的字符串格式
t0=t0.strftime('%Y/%m/%d')
t2=t2.strftime('%Y/%m/%d')
t3=t3.strftime('%Y/%m/%d')
t4=t4.strftime('%Y/%m/%d')
t5=t5.strftime('%Y/%m/%d')
t6=t6.strftime('%Y/%m/%d')
t7=t7.strftime('%Y/%m/%d')
t8=t8.strftime('%Y/%m/%d')
t9=t9.strftime('%Y/%m/%d')
Mp.iloc[i,1]=data2[data2.日期==t0]['销售机会数'].sum()
Mp.iloc[i,2]=data2[data2.日期==t1]['销售机会数'].sum()
Mp.iloc[i,3]=data2[data2.日期==t2]['销售机会数'].sum()
Mp.iloc[i,4]=data2[data2.日期==t3]['销售机会数'].sum()
Mp.iloc[i,5]=data2[(data2.日期>=t5)&(data2.日期<=t4)]['销售机会数'].sum()
Mp.iloc[i,6]=data2[(data2.日期>=t7)&(data2.日期<=t6)]['销售机会数'].sum()
Mp.iloc[i,7]=data2[(data2.日期>=t9)&(data2.日期<=t8)]['销售机会数'].sum()
Mp.iloc[i,8]=data2[data2.日期