本文纯属复现和鲸社区大佬Phoenix的分析过程,及大部分代码,此处贴上地址:
原文地址
s26 = s25_data2[s25_data2['月新老客户']=='新客户'].groupby('month').agg(新用户数量=('月新老客户','count'),新用户销量=('buy_count','sum'),新用户销售额=('amount','sum'))
s26['新用户数量环比增长'] = s26['新用户数量'].diff()
s26['新用户数量环比增长率%'] = s26['新用户数量'].pct_change() * 100
s26['新用户销量环比增长'] = s26['新用户销量'].diff()
s26['新用户销量环比增长率%'] = s26['新用户销量'].pct_change() * 100
s26['新用户销售额环比增长'] = s26['新用户销售额'].diff()
s26['新用户销售额环比增长率%'] = s26['新用户销售额'].pct_change() * 100
s26
R:最近一次消费(Recency)
F:消费频率(Frequency)
M:消费金额(Monetary)
RFM分析:
此处建议一步一停,手动查看数据
rfm_0 = df.groupby(['user_id','date']).agg(消费金额=('amount','sum')).reset_index()
rfm_1=rfm_0.groupby('user_id').agg(最后消费日期=('date','max'),F=('date','count'),M=('消费金额','sum'))
rfm_1['最后消费日期'] = pd.to_datetime(rfm_1['最后消费日期'])
rfm['R'] = (rfm['最后消费日期'].apply(lambda x:rfm['最后消费日期'].max()-x)).dt.days
rfm = rfm.reset_index()
rfm['user_id']=rfm['user_id'].astype('object')
rfm['R']=rfm['R'].astype('int64')
rfm
rfm2 = rfm[['R','F','M']].reset_index(drop=True)
rfm2
定义RFM模型:
‘111’:‘重要价值客户’, ‘011’:‘重要保持客户’, ‘101’:‘重要挽留客户’
‘001’:‘重要发展客户’, ‘110’:‘一般价值客户’, ‘010’:‘一般保持客户’
‘100’:‘一般挽留客户’, ‘000’:‘一般发展客户’ 高于平均值则即为1
def rfm_func(x):
level = x.map(lambda x :'1' if x >= 0 else '0')
label = level.R + level.F + level.M
d = {
'111':'重要价值客户',
'011':'重要保持客户',
'101':'重要挽留客户',
'001':'重要发展客户',
'110':'一般价值客户',
'010':'一般保持客户',
'100':'一般挽留客户',
'000':'一般发展客户'
}
result = d[label]
return result
rfm2['label'] = rfm2.apply(lambda x : x - x.mean()).apply(rfm_func, axis = 1)
rfm2
rfm2.to_csv('RFM.csv')
# 保存数据
rfm2['label'].value_counts()
用户画像:
# 统计用户购买频率最高的时间、类别、品牌
user_p1=df.groupby('user_id')['week'].agg(lambda x:x.mode().values[0])
user_p2=df.groupby('user_id')['hour'].agg(lambda x:x.mode().values[0])
user_p3=df.groupby('user_id')['category_code'].agg(lambda x:x.mode().values[0])
user_p4=df.groupby('user_id')['brand'].agg(lambda x:x.mode().values[0])
user_p5=df.groupby('user_id').agg(buy_count=('buy_count','sum'))
user_p6=df.groupby('user_id').agg(amount=('amount','sum'))
user_p=pd.concat([user_p1,user_p2,user_p3,user_p4,user_p5,user_p6], axis=1).reset_index()
user_p
user_p['age']=df.age
user_p['sex']=df.sex
user_p['local']=df.local
user_p=pd.merge(user_p,rfm,how='inner')
bins1=[0,3,10,20,200]
labels=['低频消费者','中频消费者','高频消费者','超高频狂热消费者']
user_p['消费频次']=pd.cut(x=user_p.F,bins=bins1,labels=labels)
user_p.head()
bins2=[0,150,500,2500,200000]
labels2=['低消费用户','中消费用户','高消费用户','超高狂热消费者']
user_p['消费金额']=pd.cut(x=user_p.M,bins=bins2,labels=labels2)
user_p['周消费喜好']=user_p['week'].apply(lambda x: '喜欢在周' + str(x) + '购物')
user_p['小时消费喜好']=user_p['hour'].apply(lambda x: '喜欢在' + str(x) + '点购物')
user_p['喜欢购买类别']=user_p['category_code'].apply(lambda x: '购买过' + str(x))
user_p['品牌偏好']=user_p['brand'].apply(lambda x: '喜欢' + str(x)+'品牌')
user_p['年龄']=user_p['age'].apply(lambda x: str(x) + '岁')
user_p['最近购买时间']=user_p['R'].apply(lambda x: '最后消费在' + str(x) + '天前')
随机取个例子
user_p.iloc[80180]
user_p.to_csv('./profile.csv',index=False)
# 保存数据,养成有成果就保存的习惯!!!
text = user_p.iloc[80180].to_list()[14:]
text
# 为了设置云图,随机zip数据
dic=dict(zip(text,[15,40,18,266,254,55,77,4]))
from pyecharts import options as opts
from pyecharts.charts import WordCloud
x=[z for z in dic.items()]
def charts_user_p():
p_user_p=(
WordCloud(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add("",x, word_size_range=[12, 55])
.set_global_opts(title_opts=opts.TitleOpts(title="用户画像"))
)
return p_user_p
charts_user_p().render_notebook()
本次数据分析到此结束,注释较少,思路不够清晰,希望读者可以重新捋一遍思路
最后,非常感谢原作者Phoenix的授权,非常感谢!