投资机构或电商公司积累的客户交易数据复杂。需要根据用户过往的消费记录,分析不同用户群体的特点和价值,进而针对不同的群体提供不同的营销策略。用户分析指标根据美国数据库营销研究院ArthurHughes的研究,客户数据库中存在三个神奇的元素,这三个元素构成了数据分析的最佳指标R-近期消费(Recency)F-消费频率(Frequency)M-消费金额(Monetary)通过这张图对用户进行分类:R,F,M都是高,重要价值客户(VIP客户)F,M高,R不高,重要客户R,F,和M都很低,流失的客户M高,R和F不高,重要的是留住客户重要的开发客户,哪些是流失的客户等流程介绍使用R,F,三个核心指标以M为维度进行聚类分析使用K-means聚类分析对用户进行分类根据R、F、M指标,标记用户准备工作:数据:某电商企业客户最近购买的数据。包含客户注册日期、最后一次购买日期、总购买金额参数:R-求最后一次投资时间到提款日期的天数F-月平均投资次数M-月平均投资金额目标:分析客户交易数据,用户群体特征和价值,进行精准营销,降低营销成本,提高销售业绩。1分析数据得到RFMR-找出最后一次投资时间到提款日的天数,确定一个提款日,减去用户最近一次投资日F-月平均投资乘以总投资次数/总月数M-每月平均投资金额totalinvestmentAmount/总月数处理数据获取R-F-MdefdataChange(data):deadline_time=datetime(2016,7,20)print(deadline_time)#减去时间得到天数checktimedelta64类型diff_R=deadline_time-data["lastinvestmenttime"]#ChannelSpecificDays#days=diff_R[0].daysR=[]foriindiff_R:days=i.daysR.append(days)print(R)‘''用户投票的时长(月)Python没有直接获取月数差值的功能1.获取用户投资天数2.月=投资天数/30,汇总'''diff=deadline_time-data["firstinvestmenttime"]print(diff)#使用向上舍入Wholefunctionmonths=[]foriindiff:month=ceil(i.days/30)months.append(month)print(months)#每月平均投资次数month_ave=data["总出价"]/monthsF=month_ave.valuesprint(F)#月平均投资金额M=(data["总投资金额"]/months).valuesprint(M)returnR,M,F2要训练KMeans模型,先转换数据,然后通过K-Means模型训练,生产模型defanaly_data(data,R,M,F):cdata=DataFrame([R,list(F),list(M)]).T#指定cdata的索引和列cdata.在dex=data.indexcdata.columns=["R-最后一次投资时间到取款日期的天数","F-每月平均投资次数","平均每月投资金额"]print("cdata_info:\n",cdata)print("cdata:\n",cdata.describe())#K-Means聚类分析#01数据标准化均值:cdata.mean()标准差:cdata.std()#对应位置先相减然后除zcdata=(cdata-cdata.mean())/cdata.std()print("zcdata:\n",zcdata)#n_clusters:类别数n_jobs:计算分配资源max_iter:最大迭代次数random_state:随机数种子,相同种子,固定参数kModel=KMeans(n_clusters=4,n_jobs=4,max_iter=100,random_state=0)kModel.fit(zcdata)print(kModel.labels_)3通过模型给用户打标签#统计每个类别的频率value_counts=Series(kModel.labels_).value_counts()print(value_counts)#将类别标签赋值回原始数据cdata_rst=pd.concat([cdata,Series(kModel.labels_,index=cdata.index)],axis=1)print(cdata_rst)#将最后一列命名为类别cdata_rst.columns=list(cdata.columns)+["category"]print(cdata_rst)#按类别对R、F、M指标进行分组统计user_ret=cdata_rst.groupby(cdata_rst["category"]).mean()print(user_ret)通过模型标注新用户1,获取新用户数据2,获得RFM3通过对原始数据进行处理,通过训练模型user_classes(cdata,user_info):'''#模拟一段用户数据1,获取当前时间作为deadline2.计算:RFM'''R,M,F=user_info_change(user_info)user_data_info=DataFrame([[R],[F],[M]]).Tprint(user_data_info)#user_data_info=DataFrame([[12.5],[18.0],[20000.0]]).Tuser_data_info.index=["lily"]user_data_info.columns=cdata.列print("cdata_info:\n",user_data_info)new_zcdata=(user_data_info-cdata.mean())/cdata.std()print("new_zcdata",new_zcdata)kModel=load_model("user_classes.pkl")ret=kModel.预测(new_zcdata)打印(“new_zcdata_ret:”,ret)#new_zcdata_ret:[3]
