2018年国赛高教杯数学建模
C题 大型百货商场会员画像描绘
原题再现
在零售行业中,会员价值体现在持续不断地为零售运营商带来稳定的销售额和利润,同时也为零售运营商策略的制定提供数据支持。零售行业会采取各种不同方法来吸引更多的人成为会员,并且尽可能提高会员的忠诚度。当前电商的发展使商场会员不断流失,给零售运营商带来了严重损失。此时,运营商需要有针对性地实施营销策略来加强与会员的良好关系。比如,商家针对会员采取一系列的促销活动,以此来维系会员的忠诚度。有人认为对老会员的维系成本太高,事实上,发展新会员的资金投入远比采取一定措施来维系现有会员要高。完善会员画像描绘,加强对现有会员的精细化管理,定期向其推送产品和服务,与会员建立稳定的关系是实体零售行业得以更好发展的有效途径。
附件中的数据给出了某大型百货商场会员的相关信息:附件1是会员信息数据;附件2是近几年的销售流水表;附件3是会员消费明细表;附件4是商品信息表,一般来说,商品价格越高,盈利越高;附件5是数据字典。请建立数学模型解决以下问题:
(1) 分析该商场会员的消费特征,比较会员与非会员群体的差异,并说明会员群体给商场带来的价值。
(2) 针对会员的消费情况建立能够刻画每一位会员购买力的数学模型,以便能够对每个会员的价值进行识别。
(3) 作为零售行业的重要资源,会员具有生命周期(会员从入会到退出的整个过程),会员的状态(比如活跃和非活跃)也会发生变化。试在某个时间窗口,建立会员生命周期和状态划分的数学模型,使商场管理者能够更有效地对会员进行管理。
(4) 建立数学模型计算会员生命周期中非活跃会员的激活率,即从非活跃会员转化为活跃会员的可能性,并从实际销售数据出发,确定激活率和商场促销活动之间的关系模型。
(5) 连带消费是购物中心经营的核心,如果商家将策划某次促销活动,如何根据会员的喜好和商品的连带率来策划此次促销活动?
整体求解过程概述(摘要)
电商的快速发展给零售运营商带来了较大的冲击,为了持续获取稳定的销售额和利润,零售运营商需完成对会员的管理与维系工作。完善会员画像,加强会员管理,维持会员稳定将使得零售业更好地发展。
本文利用该大型百货商场提供的会员信息以及消费明细,完善该商场的会员画像。本文从购买力、购买时间偏好、消费偏好三个维度分析会员的消费特征。以会员消费总金额、消费次数、商品购买数量代表会员购买力,同时按季节对会员消费行为进行分析,随后以特价商品、高价商品消费金额在会员总消费金额的占比分析会员的消费偏好。
为进一步说明会员群体给商场带来的价值,本文对比了会员与非会员的购买力。会员群体的消费总金额和商品购买数量略低于非会员群体,原因或是非会员群体人数较多。但是绘制两类群体的日消费金额曲线后可知,与非会员群体相比,会员的单日消费总金额增幅较大。
为刻画会员的购买力,本文建立了RFMT模型。分别选取会员最后一次消费的时间间隔、消费频率、总金额、单次购买最高金额作为指标,结合层次分析法得到相应指标的权重,并计算出每个会员的得分,会员得分则代表着会员的个人价值。利用K-means聚类的方法,根据会员得分进行聚类,得分较高的会员群体则为商场需要维护的会员群体。
为了合理地判断会员所处的生命周期,本文利用已构建的RFMT模型中的相关指标,再次使用K-means聚类的方法对该商场的会员进行聚类,将现有会员划分为活跃会员、沉默会员、流失会员三类,以便商场管理者对会员进行管理。在会员的生命周期中,会员状态处于动态变化的过程。为了增加商场的利润,与发展新会员相比,促进非活跃会员转化为活跃会员会大大降低商场的成本。本文通过构建非活跃会员的相关指标,使用因子分析法,可计算得各非活跃会员激活率,激活率越高,则其被激活的可能性则越大。同时,本文以非活跃会员的特价商品消费金额在总消费金额中的占比作为非活跃会员对促销活动敏感度的反映,构建线性回归模型分析非活跃会员的激活率与促销活动之间的关系,结果表明,一定的促销活动有助于提升非活跃会员的激活率。
连带消费是商场经营的核心,本文选取销售数量排名前十的商品作为最受欢迎的商品,根据会员消费明细表,利用Matlab软件构建商品关联表,并使用Clementine 建立商品的关联规则。商场可对热门商品及其关联商品推出相应促销活动,同时通过广告投放、邮件推送等方式对促销活动进行推广。
模型假设:
为了使得问题更易于理解,我们作出以下合理假设:
假设销售数据录入系统时不存在时间差;
假设销售流水表和会员消费明细表中的一条记录代表一次消费,即不存在同一次消费产生多条记录的情况;
假设会员的会员卡自开卡日起,除了自行退出外不存在会员卡过期导致会员退会的情况。
问题分析:
对于问题一,我们运用数据统计分析的方法来对会员信息进行分析。问题中需要根据会员消费明细表分析会员的消费特征,主要从三个维度来分析:购买力、时间偏好、消费偏好,具体分析指标如下图所示:
而对于会员与非会员群体之间的差异,我们从购买力以及购买数量的角度深入分析会员与非会员带给商场的价值差异,进而分析会员给商场带来的价值。
对于问题二,需要建立一个能够刻画会员购买力的数学模型,并通过此模型来识别每一位会员的价值,就是要将每一位会员进行价值分析。在众多的用户价值分析模型中,RFM模型是衡量客户价值和增益能力的重要工具,考虑到本文研究对象为大型百货商场,相对消费会较为高端,可以增加一个反映会员一次性消费的最高能力的指标,故我们引入改进的RFM模型–RFMT 模型,对会员购买力进行刻画,并通过RFMT模型的会员得分对每个会员进行价值等级划分,最终可得知每一位会员对于商场的价值。
商场会员从入会到退出的过程称为会员的生命周期,在整个生命周期内会员的状态会随着会员的消费行为改变而改变,这个动态的过程对于商场对会员的管理造成了困扰,因此我们需要建立一个模型以判别会员处于生命周期内的状态。对于问题三,基于问题二中的RFMT模型,选取R(会员最近一次购买商品的时间间隔天数)和F(会员在限定时间内购买商品的频率)指标作为聚类依据,应用K-means聚类法对有消费记录的会员进行状态聚类,最终可知每个会员所处的生命周期状态。
问题四中要求计算非活跃会员的激活率和确定激活率和商场促销活动之间的关系模型。从问题三的聚类结果中可筛选出非活跃状态的会员,给非活跃会员构建分析指标:R、F、M、T指标,针对非活跃会员的RFMT指标进行因子分析,可得到相应指标的因子得分,以每个公因子的方差贡献率作为权重系数,对每个因子进行加权求和,从而计算得到各非活跃会员的激活率。对于非活跃会员激活率和商场促销活动之间的关系模型,考虑到商场促销活动与特价商品有关,结合非活跃会员的激活率和特价商品消费总金额在商品消费总金额中的占比,利用SAS软件做相关性分析,得到激活率和商场促销活动之间的关系模型。
连带消费是商场经营的核心,例如经典的“尿布与啤酒”的故事。连带消费是商品与商品之间具有的某种特定的关系导致的,根据会员的消费情况,对购买的商品进行关联规则挖掘;同时筛选出会员消费记录中的购买数量前十的商品作为会员的喜爱商品,结合商品之间的关联规则,开展促销活动。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
clc,clear,format rat
a=xlsread('C:\Users\yang\Desktop\C 题\活跃状态矩阵.xlsx');
[r,c]=size(a);
a=a';a=a(:)'; %把矩阵a逐行展开成一个行向量
for i=1:2
for j=1:2
f(i,j)=length(findstr([i,j],a)); %统计子字符串'ij'的个数
end
end
ni=sum(f,2); %计算矩阵f的行和
phat=f./repmat(ni,1,size(f,2)); %求状态转移的频率
format %恢复到短小数的显示格式
import fp_growth_py3 as fpg
import pandas as pd
import datetime
itemName='商品名称'
start=datetime.datetime.now()
data=pd.read_excel('C:/Users/yang/Desktop/C 题/fpgrowth 建模数
据.xlsx')
dataSet,itemSet=[],[]
itemSet.append(data[itemName][0])
for i in range(1,len(data)):
if data['会员消费编码'][i]==data['会员消费编码'][i-1]:
itemSet.append(data[itemName][i])
if i==len(data)-1:
dataSet.append(itemSet)
else:
dataSet.append(itemSet)
itemSet=[]
itemSet.append(data[itemName][i])
if i==len(data)-1:
dataSet.append(itemSet)
end=datetime.datetime.now()
readDataTs=(end-start).seconds
if __name__ == '__main__':
start=datetime.datetime.now()
'''
调用find_frequent_itemsets()生成频繁项
@:param minimum_support 表示设置的最小支持度,即若支持度大于等于
inimum_support,保存此频繁项,否则删除
@:param include_support 表 示 返 回 结 果 是 否 包 含 支 持 度 , 若
include_support=True,返回结果中包含 itemset 和 support,否则只返回
itemset
'''
frequent_itemsets
=
fpg.find_frequent_itemsets(dataSet,
minimum_support=49, include_support=True)
#
print(type(frequent_itemsets)) # print type
result,itemNum=[],[]
for itemset, support in frequent_itemsets:
入list
result.append((itemset, support))
itemNum.append(len(itemset))
# 将generator 结果存
result = sorted(result, key=lambda i: i[0]) # 排序后输出
itemNum=pd.Series(itemNum)
itemNumMax=itemNum.max()
result2=[]
for i in range(itemNumMax):#
result2.append([])
for itemset, support in result:
result2[len(itemset)-1].append((itemset, support))
result3=[]
for i in range(1,itemNumMax):
for j in range(len(result2[i])):
for k in range(i+1):
y=result2[i][j][0][k]
x=''
xx=[]
n=0
for item in result2[i][j][0]:
if item!=y:
xx.append(item)
x+=item+','
n+=1
x=x[:-1]
for t in range(len(result2[i-1])):
if xx==result2[i-1][t][0]:
confidence=result2[i][j][1]/result2[i-1][t][1]
supportCountX=result2[i-1][t][1]
supportCountY=result2[i][j][1]
supportX=result2[i-1][t][1]/len(dataSet)
supportY=result2[i][j][1]/len(dataSet)
result3.append((x,y,n,supportCountX,supportCountY,supportX,supportY,c
onfidence))
break
result3=pd.DataFrame(list(result3))
result3.columns = ['X','Y','X 商品个数
','supportCountX','supportCountY','supportX','supportY','confidence']
result3.to_excel('C:/Users/yang/Desktop/fpgrowthResult.xlsx')
end=datetime.datetime.now()
calTs=(end-start).seconds