“拍照赚钱”的任务定价分析
“拍照赚钱” 是一种需要会员在APP上领取任务,完成后赚取对任务所标定的酬金的自助服务模式,这种APP中任务定价是其核心要素。通过对“拍照赚钱”的任务定价方案进行分析评价与改进及任务打包方案的优化,以达到节省成本并提高任务完成度的目的。
针对问题一,通过对附件一任务定价数据进行分析,可以看出任务评价的平均定价为69.11,任务定价范围为[65,85]。分析任务未完成原因时,首先,计算出未完成任务占比为37.9%。其次,画出任务完成情况与任务定价箱线图,未完成任务的定价低于完成任务的定价。最后,在地图上标出任务完成情况,可以看出,未完成任务主要集中在区域一,区域二的完成度最高。
针对问题二,筛选出附件一中任务已完成的数据作为训练集,任务未完成的作为测试集。通过经纬度把附件一和附件二联接起来,建立以任务定价为因变量的线性回归模型,用所建立的模型对原方案中未完成任务的定价进行预测分析,所得预测值就是新的定价方案。出新方案比原方案的完成率提高了11.87%。
针对问题三,根据任务位置和会员位置经纬度信息计算每个会员到每个任务点的距离,结合每个会员的任务限额,并参考会员的信誉度,对任务进行分配打包,
针对问题四,针对问题四,要对附件三的新项目制定任务定价方案,首先运用问题三得到的约束条件公式对附件三的数据进行打包发布,可以打包成300个,对这300组数据进行预测分析,得到的一组任务定价。为了得知方案的好坏,再做一组对比项。使用附件三的数据,不打包直接发布,套用问题二建立的模型进行预测分析,得到新的任务定价。对两次任务定价分别求总值,比较后发现打包发布的方案成本更低,所以这个结果更合理。
通过对“拍照赚钱”的任务定价进行分析得知打包发布任务成本更低方案更合理。
关键词:多元线性回归,任务定价,任务打包,R语言
一、问题重述
“拍照赚钱”是一种用户下载APP并成为会员,然后在APP上选择做任务赚取酬金的自助服务模式。这种基于互联网的自助式劳务平台以APP为运行的核心,而APP中的任务定价又是其核心要素。如果定价不合理,就会导致部分任务领取率低,从而使商品检查失败。这种平台比传统的市场调查方式更加有可取性,它更加便于调查,不仅可以节约成本,还能使数据更加的真实有效。但是该APP最为重要的是对任务的定价。如果定价不合理,有的任务就会无人问津,而导致商品检查的失败。根据附件所给数据完成下面问题:
- 研究任务定价规律,分析任务未完成的原因。
- 为项目设计新的任务定价方案,并和原方案进行比较。
- 对任务进行打包发布。并修改前面的定价模型,对最终的任务完成情况又有什么影响?
- 对附件三中的新项目给出你的任务定价方案,并评价该方案的实施效果。
二、问题分析
2.1问题一的分析
问题一主要分析两个方面,一是研究任务定价的规律,首先,利用附件一任务数据画出任务定价的分布图,可以直观地展现任务定价的分布情况,再计算出任务定价的均值和中位数,用来刻画定价规律。二是通过对完成和未完成任务的对比分析,找出未完成任务的原因,通过对任务完成情况与任务标价之间的关系进行统计描述,以及对任务标价与任务完成度之间的地理位置关系进行描述分析,分析出未完成任务的原因。
2.2问题二的分析
建立模型时,先根据附件一提取出任务已完成的数据作为训练集,然后结合附件一和附件二中任务完成情况为1的变量,结合附件二中的会员的数据,求出任务与会员之间的距离,得到任务距离小于5km的变量,结合附件一中的数据统计出已完成任务的变量,以任务定价为因变量,以其余变量为自变量,建立多元线性回归模型,针对已得到的数据运用R语言得出多元回归系数表。最后,用所建立的模型针对原方案中未完成任务的数据进行预测分析,这些预测得到的数据就是新的任务定价方案。要对新方案和原始方案进行比较,分析新的任务定价后的完成度与之前的任务完成度进行对比分析。。
2.3问题三的分析
对于问题三,根据附件一中的任务地理位置信息和附件二中会员的地理位置信息画出任务和会员位置分布的散点图,根据图中任务和会员之间的距离,探究任务打包的方案。也即是根据任务位置和会员位置经纬度信息计算每个会员到每个任务的距离,结合每个会员的任务限额,参考会员的信誉度,给出任务分配方案,最后,利用问题二的方法,给打包后的任务重新定价。
2.4问题四的分析
要对附件三的新项目制定任务定价方案,首先可以运用问题三得到的约束条件公式对附件三的数据进行打包发布,对打包后的数据进行预测分析,得到的预测值为任务定价。此时没有对比项,无法确定方案的好坏,针对这种情况,可以再做一组对比项。使用附件三的数据,不进行打包直接发布,套用问题二所建立的模型进行预测分析,得到新的任务定价。对两次的任务定价分别求总值并进行对比,得到更合理的方案。
三、模型假设
1.假设任务分布数小于5的城市不考虑。
2.假设不考虑一个任务分给几个人做。
四、符号说明
五、模型的建立与求解
5.1问题一的模型建立与求解
5.1.1任务定价规律
根据附件一的任务定价数据,计算出任务定价的均值和中位数,并画出任务标价分布直方图如下:
由上图可知任务定价的范围为[65,85],且已结束的任务中定价主要集中在65-75之间,而定价75以上的任务数量较少。
5.1.2 未完成因素分析
对附件一数据中任务执行情况进行统计分析,得到任务完成情况图如下:
由图5-2可以看出未完成任务占总任务的37.49%,为了更加分析未完成任务与完成任务在任务定价方面的差异,画出任务完成情况与任务定价的箱线图。
从图中可看出,未完成任务与已完成任务在任务定价上的差异较大,已完成的任务定价比未完成的任务定价更高。
为了观察任务定价与任务所中地理位置之间的关系,结合附件一中任务的经纬度数据,利用地图慧,将任务完成情况中地图中标记出来,如下分布图:
可以看出图表5-4中区域二中的任务完成度最高,区域三中的任务完成度最低。为了研究区域与任务完成度的关系,可以查找中国地图,结合经纬度确定任务分布城市,然后运用Excel得出与每个城市任务平均定价与该城市任务达成率之间的关系如下图:
从上图可以看出任务最多的城市为广州市,深圳、佛山和东莞任务数量差别不大;而在任务定价方面深圳的最低,佛山最高;在任务完成情况方面,深圳地区任务完成率最低,东莞的完成率较高。
综合上述分析,得出任务未完成的原因是任务定价太低,例如深圳市平均定价较低导致任务完成度低。
5.2问题二的模型建立与求解
5.2.1模型的建立
首先把附件一中已完成的任务数据作为训练集;未完成的数据作为测试集;对附件二的会员数据,计算出会员与任务的距离,将距离在5km以内的会员个数,会员占比,会员限额,和城市分布的变量值;建立以任务定价为因变量,以任务距离在5km以内的会员个数,会员占比,会员限额和城市分布为自变量的多元回归模型:
5.2.2模型的求解
将附件二会员信息数据的信誉值排名前20%的会员定义为VIP会员,后80%定义为普通会员。
考虑到每个任务点与所有会员的距离都不同,因此计算每个任务点到所有会员位置的距离。
根据会员与任务2个经纬度点,计算这2个经纬度点之间的距离:
其中:
其中: 为地球半径,可取平均值6371km; , 表示两点的纬度; 表示两点经度的差值。
得到任务距离小于5km的会员总人数和VIP会员人数与会员总人数之比。如下表:
将表格5-1中得到的变量与附件一中提取的已完成任务的数据进行合并,得到任务完成情况都为1的样本变量,然后进行多元线性回归的求解。
建立以任务价格为因变量与5km内会员个数、会员占比、会员限额、城市为自变量的多元线性回归模型。
由上表可得:会员个数的系数为负,说明会员个数越多,任务的定价越低,其他类似;城市以东莞为基础,佛山的系数为正,广州和深圳的系数为负,说明佛山的任务定价最高,深圳的定价最少。F统计量p值小于0.001,说明模型是显著的。调整后的可决系数为31.59%,说明所选择的自变量可以解释31.59%的Y。
5.2.3模型的预测
运用R语言利用建立的模型针对任务一中未完成任务的定价进行预测分析,得到一组预测值,这个预测值就是新的定价方案。
对原有方案与新的定价方案进一步比较,分别对附件一中未完成任务定价与新定价方案的预测数据进行统计整理,分别得到两种方案的任务定价分布:
图5-7 两种方案的任务定价分布对比
通过对两组分布图的对比,发现原始方案未完成任务定价普遍较低,而新的定价方案近似服从正态分布,基本上说明新的方案定价更加合理。再分别计算出两种方案的完成率和任务的成本均值,对两种方案进行比较。
通过比较得出新方案比原方案的完成率提高了11.87%。原方案的成本为57552.5,新方案的成本为57488.9,成本降低了63.6元
5.3问题三的模型建立与求解
5.3.1 制定打包规则
(1)根据附件一的任务位置信息和附件二中会员位置信息的分布情况如下:
图 5-8 任务位置与会员位置地理位置分布
从图可以看出,任务位置比较集中,且与会员位置与会员的重叠部分较多,这将会导致多个会员对同一个任务的竞争比较激烈,也会导致一个会员同时做多个任务,这都说明对任务进行打包是很有必要的。
(2) 计算每个会员到每个任务的距离, 表示第i个会员到第j个任务的距离。
(3) 结合每个会员任务限额相,构造任务分配系数:
若会员i的任务限额越大,且距离任务j的距离较小,第j个任务越可能分配给会员i。则此时的 较大。若 相同,任务则分配给信誉度高的会员。
结合附件二和附件一数据中会员任务限额和会员位置与任务位置之间的距离 带入打包系数得到下列表格(节选):
(4)打包的任务数不能大于任务限额,且对打包系数进行求和得最大值,由此建立约束条件:
通过约束条件可以将任务进行打包,但原有的定价不适合任务打包后的现状,所以需要建立新的定价模型。由于打包的任务数不同价格也不尽相同,对此建立如下模型:,其中:
5.4问题四的模型建立与求解
运用问题三打包原理对附件三的数据进行打包发布,并对打包后的任务定价进行预测分析。
5.4问题四的模型建立与求解
运用问题三打包原理对附件三的数据进行打包发布,并对打包后的任务定价进行预测分析。
将附件三的数据,按照不进行打包直接发布,和打包后再发布进行对比分析。
图表 5-9两次方案任务定价总值比较
完成度相同情况下,打包发布成本更低,因此对于企业来说,打包发布方案更加合理。
六、模型的评价,改进与推广
6.1模型的优缺点
6.1.1 模型的优点
(1)文章的原创性强,文章中的大部分模型都是自行推到建立的。
(2)解决问题二时选用已完成任务作为训练集,建立多元线性回归模型,针对未完成任务进行预测,得到预测值作为新的任务定价,从而大大提高了整体任务完成率。
(3)解决问题时,由于数据量过大,不便于统计分析,于是充分利用R语言和Excel对数据进行处理,减少了运算量,增加了结果的可信度。
(4)通过对问题的分析,合理地将问题进行模块化处理,使问题明朗化,并在一定程度上将其进行了简化。
6.1.2模型的缺点
(1)进行研究时,不能将所有的影响因素纳入计算,依然存在统计偏差。
七、参考文献
[1]薛薇,基于R的统计分析与数据挖掘,北京:中国人民大学出版社,2014.4
[2]王汉生,应用商务统计分析,北京大学出版社,2008.1
[3]叶其孝,姜启源等译,数学建模,北京机械工业出版社,2014.10
[6]马莉:MATLAB 数学实验与建模,清华大学出版社2010年版
[7]束金龙、闻人凯,柴俊:线性规划理论与模型应用,科学出版社2007年版
八、附录
问题一
1.任务定价规律
install.packages("readxl")
library(readxl)
task=read_xls("附件一:已结束项目任务数据.xls") ##读取附件一数据
summary(task)
hist(task$任务标价,ylim=c(0,350),ylab="任务数量",xlab="任务标价",main="",col="lightblue") ##直方图
2. 未完成因素分析
a=factor("未完成","完成")
boxplot(task$任务标价~task$任务执行情况,xaxt="n",ylab="任务标价",xlab="完成情况",col="lightblue")axis(1,at=c(1,2),labels=c("未完成","完成")) ##箱线图
问题二
1.衍生变量的生成
require(geosphere)
member=read_xlsx("附件二:会员信息数据.xlsx") ##读取附件二数据
###############################数据预处理######################
summary(member)
outliers=member[round(member$lon,2)==23.03,]
newmember=member[member$会员编号!="B1175",] ##删除异常值
summary(newmember)
#################################衍生变量######################
number=data.frame()
for(i in 1:dim(task)[1]){
show(i)
i=1
single_distance=data.frame()
for(a in 1:dim(newmember)[1]){
data=as.matrix(rbind(task[i,2:3],newmember[a,2:3]))
distance=distm(data,fun=distVincentyEllipsoid)
single_distance[a,1]=distance[1,2]
}
single=cbind(newmember,single_distance) ##附件一中某任务与所有会员的距离
a2=single[single$V1<5000,]
number[i,4]=nrow(a2) ##任务5km内会员数
number[i,5]=mean(a2[,7]) ##高级会员数
number[i,6]=sum(a2[,4]) ##任务配额总数
head(number)
write.csv(number,"衍生变量.csv",row.names=F)
R语言建立价格与5km内会员个数、5km会员占比、5km会员限额、城市的模型
getwd()
library(readxl)
data1=read_excel("F:/衍生变量全.xlsx")
data=data1
str(data)
data$城市=as.factor(data$城市)
data$会员占比=as.numeric(data$会员占比)
data[,1]=scale(data[,1],center=T,scale=T)
data[,2]=scale(data[,2],center=T,scale=T)
data[,3]=scale(data[,3],center=T,scale=T)
data[,4]=scale(data[,4],center=T,scale=T)
xunlian=data[data$任务执行情况=="1",]
ceshi=data[data$任务执行情况=="0",]
str(ceshi)
model=lm(任务标价~.-任务执行情况,data=xunlian)
summary(model)
yuce=predict(model,ceshi)
sd=sd(data1$任务标价)
mean=mean(data1$任务标价)
yuce=sd*yuce+mean
head(yuce)
ceshi_1=data1[data1$任务执行情况=="0",]
yuce=cbind(ceshi_1,yuce)
head(yuce)
sum(yuce$yuce)
sum(yuce$任务标价)
预测分析
hist(data$任务标价,xlab="原始任务定价",ylab="任务数量",col="lightblue",ylim=c(0,200),main="")
hist(yuce$yuce,xlab="预测任务定价",ylab="任务数量",col="lightblue",ylim=c(0,200),main="")
问题四
第四问任务与任务间的距离
install.packages("readxl")
library(readxl)
require(geosphere)
task=read_xls("附件三:新项目任务数据.xls")
dim(task)
task1=data.frame(task[,3],task[,2])
summary(task)
str(task1)
distance=distm(task1,fun=distVincentyEllipsoid)
head(distance)
write.csv(distance,"第四问任务与任务间的距离.csv",row.names=F)
打包
setwd("C:/Users/lenovo/Desktop/数学建模/B")
data1=read.csv("第四问任务与任务间的距离.csv")
data=data1
dim(data)
dabao=data.frame()
for(i in 1:15){
show(i)
a=data[data[,i]<1000,]
a1=nrow(a)
if(a1<=7){
a1=a1
a3=row.names(a)
} else {
a1=7
a2=paste(row.names(a[1:7,]),collapse=" ")
a3=row.names(a[1:7,])
}
dabao[i,1]=a1
dabao[i,2]=a2
a3=as.numeric(a3)
data=data[-a3,]
}
dim(dabao)
write.csv(dabao,"打包bucf.csv",row.names=F)
任务与会员间的距离
install.packages("readxl")
library(readxl)
require(geosphere)
task=read_xls("附件三:新项目任务数据.xls")
dim(task)
task1=data.frame(task[,3],task[,2])
summary(task)
str(task1)
member=read_xlsx("附件二:会员信息数据.xlsx") ##读取附件二数据
summary(member)
outliers=member[round(member$lon,2)==23.03,]
newmember=member[member$会员编号!="B1175",] ##删除异常值
summary(newmember)
number=data.frame()
names(task1)=c("lon","lat")
dim(task1)[1]
for(i in 1:2066){
show(i)
single_distance=data.frame()
for(a in 1:dim(newmember)[1]){
data=as.matrix(rbind(task1[i,1:2],newmember[a,2:3]))
distance=distm(data,fun=distVincentyEllipsoid)
single_distance[a,1]=distance[1,2]
}
head(single_distance$V1)
number[1:1876,i]=single_distance$V1
}
dim(number)
write.csv(number,".csv",row.names=F)