原文出处:https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12281897.0.0.77c92b4abI9m56&postId=286067
代码摘抄:
import pandas as pd
import datetime
import matplotlib.pyplot as plt
获取数据
data=pd.read_excel('./工作/商品销售数据.xlsx')
data.head(10)#查看前十行
数据清洗
#查看数据基本信息
data.info()
#处理空值
data=data.dropna(subset=['用户 ID'])
#查看重复值
data[data.duplicated()]
#删除重复值
data=data.drop_duplicates()
#查看描述性信息
data.describe()
#处理异常值
data=data[data['数量']>0]
data.describe()
数据整理
data.head()
#数据整理
data['金额']=data['数量']*data['价格']
data.head()
pd.to_datetime(data['发货日期'])
today='2012-01-01'
#按照订单号和用户ID进行分组
grouped_data = data.groupby(['订单号', '用户 ID'], as_index=False).agg({'发货日期': 'max', '金额': 'sum'})
grouped_data
grouped_data['时间间隔']=(pd.to_datetime(today)-pd.to_datetime(grouped_data['发货日期'])).dt.days
grouped_data
计算R、F、M值
rfm_data= grouped_data.groupby('用户 ID', as_index=False).agg({'时间间隔': 'min', '订单号': 'count', '金额': 'sum'})
rfm_data.columns=['用户 ID','间隔天数','下单次数','金额']
rfm_data
数据分析
计算R值阈值
#计算R值
plt.figure(figsize=(10, 8))
x = rfm_data['间隔天数'].sort_values()
y =rfm_data.index
plt.plot(x, y)
计算用户R评分
# 定义函数按照区间划分 R 值
def caculate_r(s):
if s <= 100:
return 5
elif s <= 200:
return 4
elif s <= 300:
return 3
elif s <= 400:
return 2
else:
return 1
rfm_data['R评分'] = rfm_data['间隔天数'].agg(caculate_r)
rfm_data
计算F值阈值
#计算F值
plt.figure(figsize=[6,6])
x=rfm_data['下单次数'].sort_values()
y=rfm_data.index
plt.plot(x,y)
计算用户F评分
def caculate_f(s):
if s <= 5:
return 1
elif s <= 10:
return 2
elif s <= 15:
return 3
elif s <= 20:
return 4
else:
return 5
rfm_data['F评分'] = rfm_data['下单次数'].agg(caculate_f)
rfm_data
计算M值阈值
#计算m值
plt.figure(figsize=[6,6])
x=rfm_data['金额'].sort_values()
y=rfm_data.index
plt.plot(x,y)
计算用户M评分
# 定义函数按照区间划分 M 值
def caculate_m(s):
if s <= 2000:
return 1
elif s <= 4000:
return 2
elif s <= 6000:
return 3
elif s <= 8000:
return 4
else:
return 5
rfm_data['M评分']=rfm_data['金额'].agg(caculate_m)
rfm_data
计算 R评分、F评分、M评分的平均数
#分别计算RFM的平均分
r_avg = rfm_data['R评分'].mean()
f_avg = rfm_data['F评分'].mean()
m_avg = rfm_data['M评分'].mean()
print('R评分的均值为:{},F评分的均值为{},M评分的均值为{}'.format(r_avg, f_avg, m_avg))
标记用户RFM的高低
# 将R评分、F评分、M评分 的数据分别与对应的平均数做比较
rfm_data['R评分'] = (rfm_data['R评分'] > r_avg) * 1
rfm_data['F评分'] = (rfm_data['F评分'] > f_avg) * 1
rfm_data['M评分'] = (rfm_data['M评分'] > m_avg) * 1
rfm_data
# 拼接R评分、F评分、M评分
rfm_score = rfm_data['R评分'].astype(str) + rfm_data['F评分'].astype(str) + rfm_data['M评分'].astype(str)
rfm_score
标记用户类型
# 定义字典标记 RFM 评分档对应的用户分类名称
transform_label = {
'111':'重要价值用户',
'101':'重要发展用户',
'011':'重要保持用户',
'001':'重要挽留用户',
'110':'一般价值用户',
'100':'一般发展用户',
'010':'一般保持用户',
'000':'一般挽留用户'
}
# 将RFM评分替换成具体的客户类型
rfm_data['客户类型']=rfm_score.replace(transform_label)
rfm_data
## 按【客户类型】分组,统计用户的数量
customer_data =rfm_data.groupby('客户类型')['用户 ID'].count()
customer_data
数据展现
# 绘制柱状图
plt.rcParams['font.family']=['SimHei']
plt.figure(figsize=(12, 8))
plt.bar(customer_data.index, customer_data)
plt.xlabel('客户类型', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.title('不同客户的数量分布', fontsize=16)
# 绘制饼图
plt.figure(figsize=(14, 10))
plt.pie(customer_data, labels=customer_data.index, autopct='%0.1f%%')
plt.title('不同客户占比情况', fontsize=16)
结论和建议
可视化结果表明一般维持用户和流失用户的人数偏多,分别占比35.8%和38.3%,重要价值用户占比14%,其余各类型用户分别占比不到5%
对于一般维持用户较多(消费频率高,但最近未消费,消费金额也少)的情况,问题可能在于一般维持用户后续的复购转化不足。可以多通过短信、平台网站等渠道,在一般维持用户购买后的一段时间内可以领取复购券等策略,将这类用户转化为更高价值的用户类型。
对于流失用户较多的情况,问题可能在于平台的产品竞争力或者服务不足。可以多对比竞品公司的产品,对自身的产品进行提升。也可以发掘用户兴趣,使用推送等低成本手段进行挽留同时,可以采取赠送优惠券的策略,并收集用户对平台产品以及服务的评价。
对于重要价值用户,他们是平台GMV贡献最多的一部分用户。平台可以投入更多的资源提供VIP或个性化服务,比如:推荐用户办理VIP并提供一对一客服咨询,创建VIP社群定时发放福利,定期举办会员日等手段,提高这类用户的忠诚度
暂无数据