2018年第八届MathorCup高校数学建模挑战赛
A题 品牌手机目标用户的精准营销
原题再现:
随着我国电子商务和移动支付的快速发展,手机已经成为人们必不可少的工具。除了常规的通讯功能外, 手机还可以进行购物、支付、娱乐、学习和交流等。因此, 选择一个什么样的手机已经成为广大消费者注重要考虑的问题。
手机的选择是因人而异, 除了产品价格、外观、性能等产品因素之外, 个人的基本属性特征(性别、年龄、学历、职业或未来职业) 以及个人偏好(如网购热度、网购倾向、娱乐喜好等线上行为路径) 也尤为重要。
某品牌手机(命名为 Surpass ) 销售总部希望能够了解消费者对 Surpass 手机的购买意愿, 以便能够进行精准营销。为此, 他们进行了相关的调查, 得到了附件的数据。
附件 “附件 l surpass 目标用户数据” 是一份网上关注 (包括在网上搜索、浏览、购买过该品牌三种行为) Surpass 手机的目标用户行为数据。数据包括用户基本特征、行为标签、电商行为、视频行为、触媒行为以及 Surpass 手机基本参数等 7 个数据表格。所有数据表格的用户编号是一致的, 同一个编号指的是同一个用户。
基于这份数据(并不限于这份数据, 也可以在互联网上搜集一些数据加以补充) , 请你通过建立数学模型, 回答以下问题。
问题 1: 对附件 l 的数据进行预处理, 并进行描述性统计分析。
问题 2: 在目标用户中, 已经有部分用户在调研期间购买了 Surpass 手机, 但更多的用户并没有购买。作为销售部门很想了解用户的基本行为特征对Surpass 手机的购买有否影响? 如何影响? 请你帮助他们解决这个问题。
问题 3: 一般来讲, 不同的网络关注会体现出不同的手机消费个人偏好, 导致每个人购买手机的主要动机并不相同。而不同的手机也有着不同的性能。销售部门也很想了解消费者的个人偏好对 Surpass 手机的购买有否影响? 如何影响? 同样请你帮助他们解决这一问题。
问题 4: 目前, 很多目标用户并没有下单购买 Surpass 手机, 但他们中很有可能有一些是潜在的购买用户。请结合前面的研究,建立一个潜在客户挖掘模型, 对附件 2 的 50 位目标用户进行客户潜力界定 (需要在正文中展示结果) 。运用你建立的挖掘模型, 针对附件 l 中所有未购买该手机的目标用户, 挖掘出 100 名最有潜力购买 Surpass 手机的目标用户 (需要在正文中展示目标用户编号) , 并提供建议阐述如何进行精准营销, 包括广告投放。
整体求解过程概述(摘要)
随着我国电子商务和移动支付的快速发展,手机已经成为人们必不可少的工具。在考虑用户的基本行为特征和个人偏好的基础上,本文对影响手机的销售情况的指标进了统计和分析,建立了基于粗糙集改进的决策树模型,最终实现精准营销。
针对问题一,我们对附件中所给的数据进行了预处理,删除了重复值,缺失值。然后我们对附件中每一个表格的数据都进行了描述性统计分析,将附件中所给的数据整合成我们需要的指标,对这些指标进行归一化,以便于后续建模和计算使用。
针对问题二,结合用户基本行为信息,我们选取了网络活跃指数,网络购物指数,在线视频指数,出行指数,理财指数作为用户行为的基本特征。筛选出已购买该手机用户的这几项指标值,由于指标之间基本无共线性,而购买该手机用户的这些指标可能有趋同性,趋同性越大,则该指标的影响越显著。我们采用方差分析法对指标进行了选取。以用户是否购买该手机为因变量,以筛选后的指标为自变量建立了二分类的𝒍𝒐𝒈𝒊𝒔𝒕𝒊𝒄回归模型,得到用户是否购买该手机与用户基本行为特征之间的函数关系。为探究这些指标的具体影响,我们每次对其中一个指标微小变化,其他指标不变,将变化前后的回归值进行对比,得到每个指标的因子影响率。因子影响率越大,则该指标对用户是否购买该手机的影响越大。最终我们得到因子影响率较大的指标是网络购物指数和出行指数。
针对问题三,结合电商分类,视频行为,触媒行为,我们定义并选取了浏览视频总时长,购买欲望指数,浏览次数比,网页影响度四个指标,筛选出已购买该手机用户的这几项指标值,考虑到指标之间可能存在共线性,我们用主成分分析的方法对指标进行筛选。以用户是否购买该手机为因变量,以筛选后的指标为自变量,同样建立二分类的logistic回归模型,得到用户是否购买该手机与用户偏好之间的函数关系,用与第二问相同的方法得到每个指标的因子影响率。最终我们得到因子影响率较大的指标是浏览视频总时长和浏览次数比。
针对问题四,对潜在客户行为属性进行约简化处理后,我们构造基于粗糙集的改进决策树挖掘模型。在决策树中每个叶节点代表一条规则,即这个规则的左边条件表示根节点开始到达叶节点路径上的全部中间节点组成的一个判断,规则的右边表示叶节点的类型。综合用户各方面信息,我们采用网络活跃指数、网络购物指数、购买欲望指数、浏览次数之比和性别来判定用户是否会购买 Surpass手机。为了验证树状图的准确性,我们随机抽取 100 名已购买该手机的用户数据进行检验,检验正确率达 89%,说明我们的模型判别正确率还比较高。
运用建立的基于粗糙集的改进树挖掘模型,对附件二中给出的 50 名客户进行了潜力界定。利用改进树挖掘模型,我们对附件一中的用户进行潜力度进行分析,选出了前 100 名潜在客户,具体结果见正文。
结合二、三问,我们知道在基本行为方面,影响度较大的指标有网络购物指数和出行指数,在用户偏好方面,影响度较大的指标有浏览视频总时长和浏览次数比。当用户这些指标较大时,我们可向用户推广𝑠𝑢𝑟𝑝𝑎𝑠𝑠手机,以实现精准营销。在广告投放方面,我们综合网页影响度和各大网页的用户浏览次数两个指标,得到广告转化率这个指标,广告转化率指标越大,我们对该网站投资也越大。
模型假设:
假设1:假设一个用户编号即代表一个用户,不存在多个用户使用同一部手机浏览网页的情况。
原 因:精准营销要做的是根据每一位用户的浏览喜好和内容对其进行推荐营销,因此针对的直接对象是用户,即该手机的使用者。并且考虑实际情况,基本是每个人都会使用自己的手机。
假设2:假设用户所浏览的网页,内容和时间都是用户有意为之,不存在误操作的情况。
原 因:只有用户在有意的情况下所浏览的网页和内容才能反映用户的个人偏好和基本特征,而这种情况在实际情况下又比较少,所以在建模时我们对这种情况不予考虑。
假设3:假设附件中所给的用户基本信息都是准确无误的。
原 因:对用户的分析和分类都是建立在用户基本信息基础上进行的,只有在信息无误的情况下,我们对问题所做的讨论和建立的模型才合理。
问题分析(在这里只展示部分):
由于本题附件中所给的数据量较大,为了得到更加直观系统的数据,我们首先对数据进行了预处理。处理的内容包括重复值的剔除,缺失值的增添,异常值的筛选和删除等。为了直观反映数据和在大量的数据中提取出有效数据,我们对附件中的每一个表都进行了统计分析,得出了可直接用于建模和计算的数据。
对于问题二,首先我们从目标用户中筛选出购买该手机的用户,同时我们选取了网络活跃指数,网络购物指数,在线视频指数,母婴指数,出行指数,理财指数作为用户行为的基本特征。初步考虑这六个指标间的共线性可能比较小,因此我们对选取的 6 个指标做方差分析,筛选出对是否购买该手机影响显著的前 4 个指标。再以用户是否该手机为因变量,筛选出的指标为自变量建立了二分类的𝑙𝑜𝑔𝑖𝑠𝑡𝑖𝑐回归模型,得出用户是否购买该手机与用户基本行为特征之间的关系。为分析每个指标是如何影响用户是否购买该手机,我们每次给其中一个指标一个微小的变化,将对应的𝑙𝑜𝑔𝑖𝑠𝑡𝑖𝑐回归值作比,得到该指标对用户是否购买该手机的影响的灵敏度大小,从而得到各个指标是如何影响用户是否购买该手机的。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
The actual procedure is shown in the screenshot
from sklearn import tree #决策树模型
from sklearn.model_selection import train_test_split #训练集与测试集划分
import pandas as pd
import numpy as np
data=pd.read_csv('hea.csv')
data.info()
#对五个名义变量进行映射
data['ChestPainType'].value_counts() #统计变量值类型
ChestPainType_Map={'ASY':1,'NAP':2,'ATA':3,'TA':4} #建立 变量值类型:映射数值 的字典,就比如'ASY'这里映射成1.
data['ChestPainType']=data['ChestPainType'].map(ChestPainType_Map) #进行 变量值替换
data['Sex'].value_counts()
Sex_Map={'M':0,'F':1}
data['Sex']=data['Sex'].map(Sex_Map)
data['RestingECG'].value_counts()
RestingECG_Map={'Normal':0,'LVH':1,'ST':2}
data['RestingECG']=data['RestingECG'].map(RestingECG_Map)
data['ExerciseAngina'].value_counts()
ExerciseAngina_Map={'N':0,'Y':1}
data['ExerciseAngina']=data['ExerciseAngina'].map(ExerciseAngina_Map)
data['ST_Slope'].value_counts()
Flat_Map={'Flat':0,'Up':1,'Down':2}
data['ST_Slope']=data['ST_Slope'].map(Flat_Map)
data=data.drop(data['RestingBP'][data['RestingBP']==0].index)
def apply_Resting(RestingBP):#小于90,返回0,大于140,返回2,中间为1
if RestingBP<90:
return 0
elif RestingBP>140:
return 2
else:return 1
data['RestingBP']=data['RestingBP'].apply(apply_Resting)
#划分年龄,成熟期40及以下为0,40到65之间为1,大于65为2
def apply_Age(Age):
if Age<=40:
return 0
elif Age>40 and Age<=65:
return 1
else:return 2
data['Age']=data['Age'].apply(apply_Age)