数学建模竞赛 - tongji...

31
1 数学建模竞赛 “拍照赚钱”任务定价方案研究 本文研究了“拍照赚钱”这一新型自助服务模式的任务定价方案,并在原有 模型基础上不断优化改进。 问题 1,为了研究任务定价规律,我们首先利用 Python 画出图形,选择了 四个自变量,以价格为因变量用 SAS进行多元线性回归,得到了对数据拟合程度 很高的回归模型。然后,为了分析任务未被完成的原因,我们采用逻辑回归模型, 探究任务定价、任务经纬度和半径 7km圆形区域内会员数量对任务完成比例的影 响,以此为依据进行分析。 问题 2,我们以任务完成比例为切入点,希望通过修改任务定价,在其他条 件不变的情况下,能使任务完成比例变高。因此我们利用程序,将附件一中各个 价格水平分别带入多元 Logistic 回归模型,求得当 logit(success)大于零时 的最小价格,以此作为该任务的新定价,然后进行多元线性回归,得到定价模型。 问题 3,我们使用 SPSS,用聚类分析方法将任务打包,并定义了任务包完成 比例这一评价标准,基于此标准设计定价方案。对于定价方案使用问题一中的逻 辑回归模型进行评估。 问题 4,基于问题 1 的逻辑回归模型,并考虑附件三中任务分布情况,我们 设计了新的定价方案,能使任务完成比例达到最高。又考虑将任务打包之后的情 况,为了提高任务包完成比例,进一步调整定价方案,使得在打包情况下的任务 包完成比例也能达到较高的水平。 关键词:任务定价 多元线性回归 逻辑回归 聚类分析

Upload: others

Post on 12-Jun-2020

37 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

1

数学建模竞赛

题 目 “拍照赚钱”任务定价方案研究

摘 要

本文研究了“拍照赚钱”这一新型自助服务模式的任务定价方案,并在原有

模型基础上不断优化改进。

问题 1,为了研究任务定价规律,我们首先利用 Python 画出图形,选择了

四个自变量,以价格为因变量用 SAS进行多元线性回归,得到了对数据拟合程度

很高的回归模型。然后,为了分析任务未被完成的原因,我们采用逻辑回归模型,

探究任务定价、任务经纬度和半径 7km圆形区域内会员数量对任务完成比例的影

响,以此为依据进行分析。

问题 2,我们以任务完成比例为切入点,希望通过修改任务定价,在其他条

件不变的情况下,能使任务完成比例变高。因此我们利用程序,将附件一中各个

价格水平分别带入多元 Logistic回归模型,求得当 logit(success)大于零时

的最小价格,以此作为该任务的新定价,然后进行多元线性回归,得到定价模型。

问题 3,我们使用 SPSS,用聚类分析方法将任务打包,并定义了任务包完成

比例这一评价标准,基于此标准设计定价方案。对于定价方案使用问题一中的逻

辑回归模型进行评估。

问题 4,基于问题 1的逻辑回归模型,并考虑附件三中任务分布情况,我们

设计了新的定价方案,能使任务完成比例达到最高。又考虑将任务打包之后的情

况,为了提高任务包完成比例,进一步调整定价方案,使得在打包情况下的任务

包完成比例也能达到较高的水平。

关键词:任务定价 多元线性回归 逻辑回归 聚类分析

Page 2: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

2

1.问题重述

“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

来赚取任务被标定的相应酬金,因此任务定价极为关键。不同的任务处在不同的

位置,每个会员也有各自的位置信息、信誉值以及参考其信誉给出的任务开始预

订时间和预订限额,原则上会员信誉越高,越优先开始挑选任务,其配额也就越

大。我们对表中的数据进行计算、处理,简化问题后适当进行筛选,提取出相应

的指标进行分析,建立数学模型。

现在需要解决以下四个问题:

1、研究附件一中项目的任务定价规律,分析任务没有被完成的原因。

2、为附件一中的项目设计新的任务定价方案,并和原方案进行比较。

3、若将位置集中的任务联合在一起打包分布,则如何修改前面的定价模型,

对最终的任务完成情况又有什么影响?

4、为附件三中的新项目给出任务定价方案并评价该方案的实施效果。

2.问题假设

1、假设会员是理性人,即会优先选择定价高并且任务位置距离自己近的任务;

2、假设任务价格确定之后不会随着周围会员信息的变动而更改;

3、不考虑交通等额外因素对会员选择任务和执行任务的影响;

3.符号说明

符号 意义 符号 意义

第 个任务 第 名会员

每一任务周围7km半径范

围内的会员信誉值总和的

自然对数值

每一任务周围7km半径范围内

的会员数目

任务所在经度 任务所在纬度

4.问题分析

2.1 问题 1 分析

问题 1首先需要研究附件一中项目的任务定价规律。我们以任务的定价作为

因变量,选择任务所在的经度、纬度、以 7km为半径的圆形区域内的会员数目和

Pi i M jj

crd _density mem_density

Lng Lat

Page 3: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

3

以 7km 为半径的圆形区域内的会员信誉值总和的自然对数值作为自变量,利用

SAS进行多元线性回归分析,求得附件一中项目的任务定价规律。接着,为了分

析任务未完成的原因,我们将任务完成情况作为因变量,选择任务的定价、经度、

纬度、以7km为半径的圆形区域内的会员数目为自变量,利用 SAS进行逻辑回归,

并根据回归结果进行分析。

2.2 问题 2 分析

我们以任务完成比例作为切入点,希望通过改变定价方式,使该比例提高。

根据附件一,全部任务共有 22种定价的可能性,因此我们利用 Python编写程序,

依次将这 22种价格代入问题 1中求得的多元 Logistic回归模型,从而可以得到

使任务在该模型下能够完成的最低价格,以此作为该任务的新定价。然后,我们

以新定价为因变量,利用 SAS进行多元线性回归,得出新定价公式。并利用新定

价计算附件一中项目的完成度,与原定价方案进行比较。

2.3 问题 3 分析

问题 3要求我们将位置比较集中的任务联合在一起打包发布。我们首先以任

务的经纬度为指标,利用 SPSS 进行聚类分析,将共 835 个任务分成 200 个包。

通过确定每个任务包内任务的平均价格来确定任务包完成比例。然后,从实际情

况出发,构造定价函数,计算根据新定价模型下任务包完成比例,与原有定价时

的任务包完成比例进行比较。

2.4 问题 4 分析

基于问题 1 的逻辑回归模型,我们建立了针对附件三的新定价方案,该方案

可使得附件三中的 2065 个任务的整体完成度达到最高。进而考虑将任务打包之

后的情况,将 2065 个任务分成 500 个包,并调整定价方案,使得在打包情况下

的任务包完成比例也能达到较高的水平。

5. 问题 1

5.1 任务定价影响因素分析

为了寻找任务价格的影响因素,我们首先用 Python 画出了任务的地理分布

情况,如下图(其中不同的颜色代表不同的价格):

Page 4: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

4

由上图可以看出,地理位置对于价格分布有着较大影响,所以我们选择经度

和纬度作为影响任务价格的自变量。

然后,我们用 Python画出了会员的分布情况,如下图:

接着,我们将两张图合成一张图:

从上图我们可以直观看出,会员分布密集的地区任务定价稍低,因此我们选

择第 个任务附近会员数量作为影响该任务定价的自变量之一,用

表示。

此外,我们画出了会员的信誉值分布图(由于信誉值超过 100的会员人数较

少,因此为了便于观察,我们在图上仅绘制了信誉值处于 0-100 之间的会员):

接着我们将任务的分布加入会员信誉值分布图中:

i mem_density

Page 5: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

5

我们可以直观看出,任务的定价与其附近会员的信誉值有关,因此我们选择

第 个任务附近会员的信誉值总和的自然对数值作为影响该任务定价的自变量

之一,用 表示。

为了确定上述分析中“附近”的定量含义,我们利用 Python 编程,枚举了

从 1km 到 10km 的 和 值。通过比对不同半径下的

和 的值对于定价区分的准确度,我们发现 7km 是最合

适的距离范围,并将 7km 的 和 的值应用在了线性回归

分析中。

5.2 多元线性回归模型

由 5.1 我们已经分析出了影响任务定价的因素,为了得出具体的定价规律,

我们以任务的定价作为因变量,选择任务所在的经度、纬度、以 7km为半径的圆

形区域内的会员数目和以 7km 为半径的圆形区域内的会员信誉值的总和的自然

对数值作为自变量,利用 SAS 进行多元线性回归(具体代码见附录),所得结果

如下:

i

crd _density

mem_density crd _density

mem_density crd _density

mem_density crd _density

Page 6: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

6

通过第一张图可看出,可决系数 R2=0.9972,调整的可决系数为 0.9971,

而 R2最大值为 1,因此样本回归方程对样本观测值拟合程度很好,方程通过拟合

优度检验。此外,F检验的 p值小于 0.0001,因此可认为方程总体上的线性关系

显著成立。

根据第二张图,全部解释变量的系数均通过了显著性水平为 1%的 t 检验,

可以认为其系数显著不为 0。

综上,我们得到附件一中项目的任务定价方程为:

5.3 任务未完成原因分析

5.3.1 逻辑回归算法介绍

5.3.1.1 logit 变换

设因变量 y为一个二分类事件,该事件发生时赋值 y=1,否则 y=0。用 p=p(y=1)

表示事件发生的概率,则 q=p(y=0)=1-p为事件不发生的概率,做以下变换:

)1

ln()(logitp

pp

式中的 ln 是以 e 为底的自然对数,上式称为 logit 变换。当 p=1 时

logit(p)=+∞,当 p=0.5 时 logit(p)=0,当 p=0 时 logit(p)=-∞,故 Logit(p)

的取值范围是(-∞,+∞)。

5.3.1.2 多元 Logistic回归模型

设有 m个自变量 ,用 logit(p)与 建立起回归关系为:

mmxxxp

pp

22110)

1ln()(logit

然后利用最大似然法进行参数估计,得出回归模型。

M =1.875Lat + 0.297Lng- 0.021mem_density- 0.819crd_density

xi xi

Page 7: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

7

5.3.2 逻辑回归算法具体实现

基于上述原理,我们选定一个了一个评价标准 来表示任务完成

情况,并规定 大于等于 0 时即可看作该任务完成, 小

于 0时代表该任务不能完成。同时,任务本身有经度、纬度、定价几个特征,同

时又受到会员分布的影响,我们决定选择任务的定价、经度、纬度、以 7km为半

径的圆形区域内的会员数目和以 7km 为半径的圆形区域内的会员信誉值的总和

的自然对数值为自变量,利用 SAS 进行逻辑回归,得到结果后仍发现,自变量

的 t 检验的 p值达到了 0.5164,即该自变量前的系数有很大的可能

性为 0,因此我们选择舍去该自变量,再次进行逻辑回归,结果如下:

由上图可看出,除了任务定价之外,其余自变量均通过了显著性水平为 5%

的 t检验,因此我们可以认为此模型通过了检验,结论如下:

5.3.3 原因分析

为了简化模型,我们简单地认为 的取值大于等于 0时,任务是

成功完成的。因而,对于 的取值小于 0的任务,若要使其能够被完

成,根据逻辑回归模型,应调高任务的价格,从而有可能使其对应的

的取值大于等于 0。

并且,通过分析数据我们可以知道,当任务定价大于等于 70 时,被完成的

任务占价格大于等于 70 的任务总数的 75.69%,而当任务定价小于 70 时,该比

例仅为 54.12%,因此可得出结论,部分任务定价过低导致了该任务未被完成。

此外,根据上式,在其他自变量取值不变的前提下,任务周边以 7km为半径

的圆形区域内的会员数目越大,该任务被完成的可能性越低,因此任务附近的人

logit(success)

logit(success) logit(success)

crd _density

logit(success) = -119.3+ 0.034Money+ 2.448Lat + 0.546Lng- 0.012men_density

logit(success)

logit(success)

logit(success)

Page 8: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

8

口密度也影响了任务的完成比例。

最后,通过观察任务完成情况分布图,我们可以直观的看到任务是否完成具

有密集性,即某些区域的任务完成或失败具有一定程度上的统一性,并且通过逻

辑回归模型验证了我们的猜想。所以任务的完成情况与其经纬度有相关性。

综合以上,当某个任务定价过低、任务附近人口密度过大时,该任务的

会小于 0,也就反映了该任务不能被完成。

6. 问题 2

6.1 新定价的模型确立

我们以任务完成度为切入点,希望通过修改任务的定价,能使原本未被完成

的任务有更大的可能性被完成。

问题 1中利用逻辑回归给出了多元 Logistic回归模型,即

附件一中任务共有 22 种定价,下限为 65,上限为 85。我们利用 python 编

写程序,对于未完成任务,分别将这 22 种定价代入上式,找到令 logit(success)

取值大于零的最低价格,以此作为该任务的新定价。

6.2 多元线性回归模型

根据 6.1,我们已经求出了能使附件一中项目有至少 50%的概率被完成时的

最低定价(具体见附件表格 end.csv),于是我们以新定价为自变量,采用逐步

回归法,利用 SAS 进行多元线性回归:

step1:选择 、 、 、 为自变量,结

果如下:

logit(success)

logit(success) = -119.3+ 0.034Money+ 2.448Lat + 0.546Lng- 0.012men_density

Lng Lat mem_density_7 crd _density_ln7

Page 9: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

9

可看出,可决系数 R2只有 0.05,常数项和 的 p 值都过高,

因此我们去掉常数项再进行一次回归;

step2: 选择 、 、 、 为自变量,且

不包括常数项,结果如下:

此时可决系数 R2达到 0.9941,但是 的 p 值为 0.8298,因此

我们

去掉会员密度这一自变量后再次回归;

step3: 选择 、 、 为自变量,结果如下:

mem_density_7

Lng Lat mem_density_7 crd _density_ln7

mem_density_7

Lng Lat crd _density_ln7

Page 10: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

10

此时可决系数 R2仍为 0.9941,但是自变量 、 、 均

通过了显著性水平为 1%的 t 检验,且根据 F 值,方程通过了 F 检验,由此我们

得到了定价公式为:

6.3 与原方案分析对比

问题 1中求得的任务定价方程为:

问题 2中新的任务定价方程为:

在原定价方案下,任务完成比例为 62.51%,在新定价方案下,任务完成比

例提高到了 94.25%,由此可见,新的定价方案在价格变动情况较小的前提下,

可以较大地提升任务完成比例。同时,原先任务总价为 57707.5 元,而在新定价

方案下,任务总价为 57892.0元。可见,在并未严重影响公司支出成本的前提下,

定价方案得到有效的改善。

7. 问题 3

7.1 系统聚类法算法介绍及其应用

聚类分析是将相同属性样品分为一类的统计学方法。在处理大数据的过程中,

将数据类似的样本分在一起更有利于我们分析和处理数据。层次聚类主要包括系

统聚类法。系统聚类法首先会确定距离的基本定义,以及类间距离的计算方式,

随后按照距离的远近,通过把距离接近的数据一步一步归为一类,直到数据完全

归为一个类别为止,或者是首先认为所有的数据都是一个类别,然后通过把距离

Lng Lat crd _density_ln7

Money = -1.80Lat +1.01Lng- 0.49crd _density_ln7

M =1.875Lat + 0.297Lng- 0.021mem_density- 0.819crd_density

Money = -1.80Lat +1.01Lng- 0.49crd _density_ln7

Page 11: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

11

远的数据一步一步分离开来,直到所有的数据各自成为一类为止。

在本题中,我们选取任务的经度和纬度作为分类指标,利用 SPSS 软件对其

进行系统聚类分析,共将附件一中 835 个任务点按照相互之间距离的远近分为

200类,具体结果见支持材料。

7.2 打包任务定价模型的建立与求解

7.2.1 变量定义

1.打包后未修改价格时,按照附件一原始定价计算每个包的平均价格,记为

;

2.将每个包中原本就被完成的任务数除以包内总任务数,得到每个包被完成

的可能性,记为 .若 ,我们认为该包能够被完成,则该包中原本未完成

的任务因为打包也能被完成,其完成情况记为 1;若 ,我们认为该包不能

被完成,则该包中原本被完成的任务因为打包也不能被完成,其完成情况记为

0;

3.经过第 2 步修改后,我们用现在被完成的任务数除以总任务数,得到任务

包的完成比例,记为 ;

4. 修改价格之后每个包的平均价格,记为 ;

5. 修改价格之后,用被完成的任务数除以总任务数,得到任务包的完成比

例,记为 。

7.2.2 函数定义

根据数据可看出,当任务定价越高时,该任务被完成的可能性越大,打包同

理。所以,若要让未被完成的包有更大的可能性被完成,我们需要提高其定价;

同时为了节约成本,可以适当降低被完成包的定价。并且要保证完成可能性大的

任务价格变动较小,完成可能性小的任务价格变动较大,所以我们构造定价函数

如下:

由此我们可以得到任务打包之后的新的任务包的平均价格。

7.2.3 对任务完成情况的影响

打包之后未修改任务定价之前,任务的完成度 的值为 67.4%,而在修改任

务定价之后,任务的完成度 上升了 9%,达到了 76.4%。由此可以看出,按照

P1

w w > 0.5

w < 0.5

C1

P2

C2

P2 = P1 -w- 0.5

w+ 0.5´ ew

C1

C2

Page 12: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

12

我们的定价模型,任务的完成度有显著上升。这是因为,修改定价之后,价格对

于会员更具有吸引力,这使得他们会因为想要获得完成一个任务包的报酬,而去

完成那些不打包时不愿意做的任务,由此改善了任务的完成情况。

8. 问题 4

8.1 不打包情况下定价方案

首先我们画出了 2065个任务在地图上的分布和会员的分布情况,如上图。

考虑到任务分布非常集中,且周围会员比较密集,同问题 1较相似,因此我

们参考问题 1中的定价模型,并结合问题 2中的新定价模型的特点,构造了一个

适用于附件三中任务的定价模型。

我们首先使用了问题 2中的定价模型,生成了一组定价,再利用问题 1中的

逻辑回归模型进行验证,预测发现任务执行情况较差,于是我们再次使用逻辑回

归模型对定价进行修正,求出使得 logit(success)大于零的最小价格,以此作

为该任务的定价,发现任务整体完成度较高,达到了 83.92%,而且任务价格全

部集中在 67元以上,总价格约为 148059 元。

接着,利用 SAS 进行多元线性回归,以价格为因变量, 、 、

、 为自变量,去除常数项,得到结果如下:

Lng Lat

mem_density_7 crd _density_ln7

Page 13: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

13

可见,可决系数达到 99.47%,且全部自变量通过了显著性水平为 1%的 t 检

验,因此该回归模型对数据的拟合程度较高

8.2 打包情况下定价方案

首先我们画出了 2065个任务在地图上的分布,如下图:

可以很直观的看出,除了少数任务零星散落在外之外,大部分任务有很强的

位置密集性,因此在考虑到任务打包情况下,我们根据问题 3 的过程和模型对之

前的定价模型进行了修改。过程如下:

step1:使用 SPSS进行聚类分析,将 2065个任务根据经纬度划分成 500个任

务包。

step2:计算出这 500个任务包各自包含的任务的平均价格。

step3:通过与问题三相同的方式,计算出每个任务包被完成的可能性,并由此计

算出任务包的完成度。

step4:使用问题三中的定价函数修改任务的平均价格,并重新计算每个任务的完

成概率。

step5:由每个任务在新价格下的完成概率,重新计算任务包的完成概率,并依此

对该模型进行评价。

最终,任务包的预测完成比例达到了 79.00%,单个任务价格集中在 66元以

上,总花销约为 146817元。

8.3 方案实施效果评价

对于不打包情况下的定价方案,因为附件三中任务分布的周围会员数量不是

非常多,可能使得任务完成比例很低,而该方案的价格可以有效地利用任务分布

区域周围的会员,使得在较少会员的情况下仍然达到较高的任务完成比例。

对于打包情况下的定价方案,打包将完成度高和完成度低的任务联系在一起,

例如按照原本不打包方案,会员会选择优先完成回报高且付出劳动少的任务,因

此有些任务可能无人问津。但是通过将多个任务打包,为了完成报酬较高的任务

Money = -11.64Lat + 2.91Lng+ 0.05mem_density_7 + 0.45crd _density_ln7

Page 14: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

14

包,会员只能完成任务包中原本并不想完成的任务,使得该单独任务得以完成,

由此就提高了任务的完成比例。所以此定价方案也就实现了将不能完成的单个任

务转换为可以完成的任务包的分支。

9.模型评价

本文以任务和会员的信息为依据,研究“拍照赚钱”这一自助式服务模式的

定价模式。

问题 1:根据所给信息研究附件一中项目的定价规律并分析任务未完成的原

因。难点在于寻找影响任务价格的自变量。但是通过 python 编程我们找到了比

较准确的自变量,并且回归之后模型对数据的拟合程度高达 99.71%,因此可认

为模型较为准确。

问题 2:从任务完成角度出发,通过改变定价来使任务的完成率提高。但是

我们修改后的价格仍是附件一中 22 个价格之一,并没有产生新的价格,因此我

们认为模型在这一问有改进的空间。

问题 3:我们首先通过聚类分析将 835个任务点打包成 200 类,并定义了任

务包完成比例这一评价标准,基于此标准设计定价方案,此模型富有创造性。

问题 4:我们分别计算了任务不打包和打包两种情况下的最优定价方案,并

分析比较两种模型,考虑较为全面。

10.参考文献

[1]黎珍惜,黎家勋.《基于经纬度快速计算两点间距离及测量误差》.测绘与空

间地理信息,2013 年

[2]麦金尼,《利用 Python进行数据分析》,机械工业出版社,2014年

[3]王骏,王士同.《聚类分析研究中的若干问题》.控制欲决策,2012年

[4]王力宾主编.《多元统计分析:模型、案例及 SPSS应用》.北京:经济科学出

版社,2010 年

Page 15: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

15

附录

1、 问题 1 中程序

1, 绘制任务及会员分布的散点图

import matplotlib.pyplot as plt

import pandas as pd

data = pd.read_csv('.\B\end.csv')

data0 = data[(True ^ data['Success'].isin([1]))] # 未完成的任

务的数据

data1 = data[(True ^ data['Success'].isin([0]))] # 完成的任务

的数据

member = pd.read_csv('.\B\member.csv')

member = member[(member['Lng'] >= 112.65) & (member['Lng'] <=

114.70) &

(member['Lat'] <= 24.5) & (member['Lat'] >=

22.5)]

fig = plt.figure()

plt.subplot(311)

plt.xlabel('Lng')

plt.ylabel('Lat')

x0 = data0[['Lng']]

y0 = data0[['Lat']]

x1 = data1[['Lng']]

y1 = data1[['Lat']]

s1 = plt.scatter(x0, y0, s=5, marker='.', c='red')

s2 = plt.scatter(x1, y1, s=5, marker='.', c='blue')

plt.legend(handles=[s1, s2], labels=['failure', 'success'])

plt.subplot(312)

plt.xlabel('Lng')

Page 16: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

16

plt.ylabel('Lat')

x2 = member[['Lng']]

y2 = member[['Lat']]

s3 = plt.scatter(x2, y2, s=5, marker='.', c='black')

plt.legend(handles=[s3], labels=['member'])

plt.subplot(313)

plt.xlabel('Lng')

plt.ylabel('Lat')

x0 = data0[['Lng']]

y0 = data0[['Lat']]

x1 = data1[['Lng']]

y1 = data1[['Lat']]

x2 = member[['Lng']]

y2 = member[['Lat']]

s3 = plt.scatter(x2, y2, s=5, marker='.', c='black')

s1 = plt.scatter(x0, y0, s=5, marker='.', c='red')

s2 = plt.scatter(x1, y1, s=5, marker='.', c='blue')

plt.legend(handles=[s1, s2, s3], labels=['failure', 'success',

'member'])

plt.show()

2, 绘制价格及会员分布的散点图

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

data = pd.read_csv('.\B\end.csv')

# data0 = data[(True ̂ data['Success'].isin([1]))] # 未完成

的任务的数据

# data1 = data[(True ̂ data['Success'].isin([0]))] # 完成的

Page 17: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

17

任务的数据

member = pd.read_csv('.\B\member.csv')

member = member[(member['Lng'] >= 112.70) & (member['Lng'] <=

114.70) &

(member['Lat'] <= 24.5) & (member['Lat'] >=

22.5)]

fig = plt.figure()

cm = plt.cm.get_cmap('rainbow')

plt.subplot(211)

plt.xlabel('Lng')

plt.ylabel('Lat')

x = data[['Lng']]

y = data[['Lat']]

s1 = plt.scatter(x, y, s=5, marker='.', c=data[['Money']],

cmap=cm)

plt.colorbar(s1)

plt.subplot(212)

plt.xlabel('Lng')

plt.ylabel('Lat')

x = data[['Lng']]

y = data[['Lat']]

x2 = member[['Lng']]

y2 = member[['Lat']]

s2 = plt.scatter(x2, y2, s=5, marker='.', c='black',

alpha=0.5)

s1 = plt.scatter(x, y, s=5, marker='.', c=data[['Money']],

cmap=cm)

plt.legend(handles=[s2], labels=['member'])

plt.colorbar(s1)

Page 18: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

18

plt.show()

3, 绘制会员信誉及任务分布的散点图

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

data = pd.read_csv('.\B\end.csv')

# data0 = data[(True ̂ data['Success'].isin([1]))] # 未完成

的任务的数据

# data1 = data[(True ̂ data['Success'].isin([0]))] # 完成的

任务的数据

member = pd.read_csv('.\B\member.csv')

member = member[(member['Lng'] >= 112.60) & (member['Lng'] <=

114.70) &

(member['Lat'] <= 24.5) & (member['Lat'] >=

22.5) &

(member['Crd'] <= 100)]

fig = plt.figure()

cm = plt.cm.get_cmap('rainbow')

plt.subplot(211)

plt.xlabel('Lng')

plt.ylabel('Lat')

x2 = member[['Lng']]

y2 = member[['Lat']]

s2 = plt.scatter(x2, y2, s=5, marker='.', c=member[['Crd']],

cmap=cm)

plt.colorbar(s2)

plt.subplot(212)

plt.xlabel('Lng')

Page 19: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

19

plt.ylabel('Lat')

x = data[['Lng']]

y = data[['Lat']]

x2 = member[['Lng']]

y2 = member[['Lat']]

s2 = plt.scatter(x2, y2, s=5, marker='.', c=member[['Crd']],

cmap=cm)

s1 = plt.scatter(x, y, s=5, marker='.', c='black')

plt.legend(handles=[s1], labels=['mission'])

plt.colorbar(s2)

plt.show()

4, 计算一定范围内信誉度自然对数值

'''

公式来源

http://blog.sina.com.cn/s/blog_658a93570101hynw.html

'''

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

import math

data = pd.read_csv('.\B\sEnd.csv')

# data0 = data[(True ̂ data['Success'].isin([1]))] # 未完成

的任务的数据

# data1 = data[(True ̂ data['Success'].isin([0]))] # 完成的

任务的数据

member = pd.read_csv('.\B\member.csv')

crd_den6 = []

crd_den7 = []

Page 20: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

20

crd_den8 = []

crd_den9 = []

for num in data.iterrows():

crd_dens6 = 0

crd_dens7 = 0

crd_dens8 = 0

crd_dens9 = 0

for mem in member.iterrows():

latA = num[1].Lat / 180 * math.pi

latB = mem[1].Lat / 180 * math.pi

lngA = num[1].Lng / 180 * math.pi

lngB = mem[1].Lng / 180 * math.pi

c = math.acos(math.sin(latA) * math.sin(latB) +

math.cos(latA) * math.cos(latB) *

math.cos(lngA - lngB))

s = c * 6378140

if s <= 6000:

crd_dens6 += mem[1].Crd

if s <= 7000:

crd_dens7 += mem[1].Crd

if s <= 8000:

crd_dens8 += mem[1].Crd

if s <= 9000:

crd_dens9 += mem[1].Crd

crd_dens6 = math.log(crd_dens6+1, math.e)

crd_dens7 = math.log(crd_dens7+1, math.e)

crd_dens8 = math.log(crd_dens8+1, math.e)

crd_dens9 = math.log(crd_dens9+1, math.e)

crd_den6.append(crd_dens6)

crd_den7.append(crd_dens7)

crd_den8.append(crd_dens8)

crd_den9.append(crd_dens9)

print(len(crd_den6))

Page 21: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

21

df1 = pd.Series(crd_den6)

df2 = pd.Series(crd_den7)

df3 = pd.Series(crd_den8)

df4 = pd.Series(crd_den9)

data['crd_density_ln6'] = df1

data['crd_density_ln7'] = df2

data['crd_density_ln8'] = df3

data['crd_density_ln9'] = df4

data.to_csv('.\B\sEnd.csv')

5, 计算一定范围内会员人数

'''

公式来源

http://blog.sina.com.cn/s/blog_658a93570101hynw.html

'''

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

import math

data = pd.read_csv('.\B\sEnd.csv')

member = pd.read_csv('.\B\member.csv')

mem_den6 = []

mem_den7 = []

mem_den8 = []

mem_den9 = []

mem_den10 = []

for num in data.iterrows():

mem_dens6 = 0

mem_dens7 = 0

Page 22: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

22

mem_dens8 = 0

mem_dens9 = 0

mem_dens10 = 0

for mem in member.iterrows():

latA = num[1].Lat / 180 * math.pi

latB = mem[1].Lat / 180 * math.pi

lngA = num[1].Lng / 180 * math.pi

lngB = mem[1].Lng / 180 * math.pi

c = math.acos(math.sin(latA) * math.sin(latB) +

math.cos(latA) * math.cos(latB) *

math.cos(lngA - lngB))

s = c * 6378140

if s <= 6000:

mem_dens6 += 1

if s <= 7000:

mem_dens7 += 1

if s <= 8000:

mem_dens8 += 1

if s <= 9000:

mem_dens9 += 1

if s <= 10000:

mem_dens10 += 1

mem_den6.append(mem_dens6)

mem_den7.append(mem_dens7)

mem_den8.append(mem_dens8)

mem_den9.append(mem_dens9)

mem_den10.append(mem_dens10)

print(len(mem_den6))

df6 = pd.Series(mem_den6)

df7 = pd.Series(mem_den7)

df8 = pd.Series(mem_den8)

df9 = pd.Series(mem_den9)

Page 23: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

23

df10 = pd.Series(mem_den10)

data['mem_density_6'] = df6

data['mem_density_7'] = df7

data['mem_density_8'] = df8

data['mem_density_9'] = df9

data['mem_density_10'] = df10

data.to_csv('.\B\sEnd.csv')

6, 试验最佳范围

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

import math

data = pd.read_csv('.\B\end.csv')

# data0 = data[(True ̂ data['Success'].isin([1]))] # 未完成

的任务的数据

# data1 = data[(True ̂ data['Success'].isin([0]))] # 完成的

任务的数据

percent = 0

best = 0

for i in range(0, 200):

failure = 0

success = 0

for num in data.iterrows():

if num[1].Money >= 70:

factor = num[1].mem_density_7 *

num[1].crd_density_ln7 * num[1].crd_density_ln7

if (factor > i and num[1].Money <= 72.5) | (factor

<= i and num[1].Money > 72.5):

success += 1

else:

Page 24: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

24

failure += 1

if success / 325 > percent:

percent = success / 325

best = i

print(best)

print(best)

print(percent)

7, sas多元线性回归程序

proc reg data=b;

model money=lat lng mem_density_7 crd_density_ln7/noint;

run;

8, 逻辑回归程序

proc logistic data=a;

model success=money lat lng mem_density_7 /influence;

run;

2、 问题 2 中程序

1,确定新方案

import pandas as pd

def calLog(money, lat, lng, mem):

logit = -119.3 + 0.0338 * money + 2.4478 * lat + 0.5456 *

lng - 0.0122 * mem

return logit

data = pd.read_csv('.\B\end.csv')

data0 = data[(True ̂ data['Success'].isin([1]))] # 未完成的

任务的数据

data1 = data[(True ̂ data['Success'].isin([0]))] # 完成的任

务的数据

money = 1.87532 * data['Lat'] + 0.29739 * data['Lng'] - \

Page 25: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

25

0.02098 * data['mem_density_7'] - 0.81862 *

data['crd_density_ln7']

money0 = 1.87532 * data0['Lat'] + 0.29739 * data0['Lng'] - \

0.02098 * data0['mem_density_7'] - 0.81862 *

data0['crd_density_ln7']

money1 = 1.87532 * data1['Lat'] + 0.29739 * data1['Lng'] - \

0.02098 * data1['mem_density_7'] - 0.81862 *

data1['crd_density_ln7']

logit = 119.3 - 0.0338 * money - 2.4478 * data['Lat'] - 0.5456

* data['Lng'] + 0.0122 * data['mem_density_7']

logit0 = 119.3 - 0.0338 * money - 2.4478 * data0['Lat'] - 0.5456

* data0['Lng'] + 0.0122 * data0['mem_density_7']

logit1 = 119.3 - 0.0338 * money - 2.4478 * data1['Lat'] - 0.5456

* data1['Lng'] + 0.0122 * data1['mem_density_7']

moneyList = [65, 65.5, 66, 66.5, 67, 67.5, 68, 68.5, 69, 69.5,

70, 70.5, 71, 71.5, 72, 72.5, 73, 73.5, 74.5, 75, 80, 85]

newMoney = []

for num in data.iterrows():

if num[1].Success == 0: # 处理未完成的任务

flag = 0

for money in moneyList:

if calLog(money, num[1].Lat, num[1].Lng,

num[1].mem_density_7) > 0:

newMoney.append(money)

flag = 1

break

if flag == 0: # 未找到合适的价格

newMoney.append(num[1].Money)

else:

newMoney.append(num[1].Money)

Page 26: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

26

print(len(newMoney))

df = pd.Series(newMoney)

print(df)

data['new_money'] = df

data.to_csv('.\B\end.csv')

2,成功执行的任务比例统计

import pandas as pd

data = pd.read_csv('.\B\end.csv')

count = 0

success = 0

for num in data.iterrows():

if num[1].Money < 70:

count += 1

if num[1].Success == 1:

success += 1

print(count)

print(success)

print(success/count)

3,sas 回归程序

step1:

proc reg data=a;

model money=lat lng mem_density_7 crd_density_ln7;

run;

step2:

proc reg data=a;

model money=lat lng mem_density_7 crd_density_ln7/noint;

run;

Page 27: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

27

step3:

proc reg data=a;

model money=lat lng crd_density_ln7/noint;

run;

3、 问题 3 中程序

1,计算聚类分析的各项特征值

import pandas as pd

data = pd.read_csv('.\B\sEnd.csv')

julei = pd.read_csv('.\B\Q4.csv')

juleiList = []

juleiAver = []

juleiCount = []

juleiSuccess = []

group = 1

money = 0

count = 0

successCount = 0

for num in julei.iterrows():

if num[1].group != group:

group += 1

juleiList.append(money)

juleiAver.append(money / count)

juleiCount.append(count)

juleiSuccess.append(successCount / count)

count = 0

successCount = 0

print(len(juleiList))

money = 0

for iter in data.iterrows():

if iter[1].ID == num[1].ID:

Page 28: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

28

money += iter[1].new_money

count += 1

if iter[1].logSuccess == 1:

successCount += 1

break

else:

for iter in data.iterrows():

if iter[1].ID == num[1].ID:

money += iter[1].new_money

count += 1

if iter[1].logSuccess == 1:

successCount += 1

break

juleiList.append(money)

juleiAver.append(money / count)

juleiCount.append(count)

juleiSuccess.append(successCount / count)

juleiLabel = []

for i in range(1, 501):

juleiLabel.append(i)

dfList = pd.Series(juleiList)

dfLabel = pd.Series(juleiLabel)

dfAver = pd.Series(juleiAver)

dfCount = pd.Series(juleiCount)

dfSuccess = pd.Series(juleiSuccess)

julei['juleiList'] = dfList

julei['juleiLabel'] = dfLabel

julei['juleiAver'] = dfAver

julei['juleiCount'] = dfCount

julei['juleiSuccess'] = dfSuccess

Page 29: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

29

julei.to_csv('.\B\Q4.csv')

2,预测聚类后的任务价格

import pandas as pd

juleiGroup = pd.read_csv('.\B\Q4Group.csv')

julei = pd.read_csv('.\B\Q4.csv')

juleiNewMoney = []

for iter in julei.iterrows():

for num in juleiGroup.iterrows():

if iter[1].group == num[1].juleiLabel:

juleiNewMoney.append(num[1].new_aver)

print(len(juleiNewMoney))

break

df = pd.Series(juleiNewMoney)

julei['juleiNewMoney'] = df

julei.to_csv('.\B\Q4.csv')

3,检查任务成功的概率

import pandas as pd

data = pd.read_csv('.\B\juleiGroup.csv')

count = 0

success = 0

for num in data.iterrows():

count += num[1].juleiCount

if num[1].juleiNewSuccess >= 0.5:

success += num[1].juleiCount

print(count)

print(success)

Page 30: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

30

print(success/count)

4、 问题 4 中程序

1,新任务的分布散点图

import matplotlib.pyplot as plt

import pandas as pd

data = pd.read_csv('.\B\sEnd.csv')

member = pd.read_csv('.\B\member.csv')

member = member[(member['Lng'] >= 112.65) & (member['Lng'] <=

114.70) &

(member['Lat'] <= 24.5) & (member['Lat'] >=

22.5)]

fig = plt.figure()

plt.subplot(211)

plt.xlabel('Lng')

plt.ylabel('Lat')

x = data[['Lng']]

y = data[['Lat']]

s1 = plt.scatter(x, y, s=5, marker='.', c='blue')

plt.subplot(212)

plt.xlabel('Lng')

plt.ylabel('Lat')

x2 = member[['Lng']]

y2 = member[['Lat']]

s2 = plt.scatter(x2, y2, s=5, marker='.', c='black')

s1 = plt.scatter(x, y, s=5, marker='.', c='blue')

plt.legend(handles=[s1, s2], labels=['mission', 'member'])

plt.show()

2,sas 回归程序

Page 31: 数学建模竞赛 - Tongji Universitymath.tongji.edu.cn/model/docs/cumcm2017B-gsy.pdf“拍照赚钱” 是移动互联网下的一种自助式服务模式。会员通过领取任务

31

proc reg data=a;

model Y=X1-X4/noint;

run;