7、python多种方式进行成单回归预测

多种方案成单预测比较 

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.日期

 

 

 

你可能感兴趣的:(神经网络)