用于分析的数据来源于某CD网站的商品销售统计,主要分为网络订单数据和用户信息两部分,包含用户ID,购买日期,购买产品数,购买金额等四项基本数据。
数据来源链接:https://pan.baidu.com/s/15apDL4TQxPkSYcQm_Exngg
提取码:6cbb
分析目的:为平台创造更多利润,合理辨别广告投放人群,对平台商品销售数据进行分析,根据复购率、回购率、高额消费用户等指标以及消费模型得到高价值的用户,从而进行有针对的客户管理和维护。
1、数据准备
2、按月对用户消费趋势进行分析
3、用户的个体消费分析
4、用户消费行为分析
1、数据准备
导入常用数据库,进行基本设置
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline #可视化图形直接显示在页面中
plt.style.use('ggplot') #更改设计风格为gglot
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
导入数据
columns=['user_id','order_dt','order_products','order_amount']
df=pd.read_table('C:/Users/Duffy/Desktop/DATA/WEB_CD.txt',names=columns,sep='\s+') #‘\s+'表示匹配任意空格符
查看表头可知
user_id对应用户ID
order_dt对应购买日期
order_products对应购买产品数
order_amount对应购买金额
df.head()
检查数据完备性
df.info()
可知数据无缺失值,无需对缺失值处理,但order_dt的数据类型是int,为方便数据处理,在这将其转化为datetime格式。
df.order_dt=pd.to_datetime(df.order_dt,format='%Y%m%d')
到这里,数据的导入和预处理就结束了。
1、按月对用户消费趋势进行分析
用户月消费趋势分成以下三部分:
- 每月的产品购买量
- 每月消费的总金额
- 每月的消费人数
将订购日期(order_dt)提取出月份信息,通过数据透视表数据按月分组,分别求出每月的购买量、消费总金额以及消费人数
df['month']=df.order_dt.values.astype('datetime64[M]')
month_grouped=df.pivot_table(index='month',
values=['order_products','order_amount','user_id'],
aggfunc={'order_products':'sum','order_amount':'sum','user_id':'count'})
对每项数据做直方图:
import pylab
%pylab inline
pylab.rcParams['figure.figsize']=(16,20)
fig,axes = plt.subplots(3,1)
axes0,axes1,axes2 = axes.flatten()
axes0.bar(month_grouped.index,month_grouped.order_products,width=20)
axes0.set_title('每月的产品购买量')
axes1.bar(month_grouped.index,month_grouped.order_amount,width=20)
axes1.set_title('每月消费的总金额')
axes2.bar(month_grouped.index,month_grouped.user_id,width=20)
axes2.set_title('每月的消费人数')
通过以上数据可知
- 销量增长主要集中在前三个月,从第四个月起,产品购买量、消费金额、消费用户数量呈断崖式下跌,之后走向趋于平稳起伏不大。
- 新用户的购买行为主要集中在前三月,后面的消费主要是由前三月用户的回购行为产生,说明用户忠诚度不高,用户粘性不足。
3、用户的个体消费分析
分为以下三个方面:
- 用户消费金额、消费次数的描述统计
- 用户消费金额和消费次数的相关性
- 用户累计消费金额占比(百分之多少的用户占了百分多少的消费额)
3.1描述统计
按用户id进行数据透视,将透视结果做一个描述统计分析
user_grouped = df.groupby('user_id').agg({'user_id':'count',
'order_products':'sum',
'order_amount':'sum'})
user_grouped.describe()
用户的平均消费频次约为3次,但最小值、四分位数、中位数均为1,说明大部分用户仅消费一次。
消费金额与产品购买数的平均值与三分之四分位数相等,说明了有少量的用户购买了大量的商品。
3.2消费金额和消费次数的相关性
绘制散点图
grouped_user=df.groupby('user_id')
grouped_user.sum().plot.scatter(x='order_amount',y='order_products')
可见有部分极值拉大了图形区域,不利于观察
可用query函数去除极值
grouped_user.sum().query('order_amount < 6000').plot.scatter(x='order_amount',y='order_products')
由图可知消费金额与消费次数呈现较大相关性
说明CD产品单一,单价稳定
3.3用户累计消费金额占比
按用户消费金额从低到高进行升序排列,然后逐个累加,求出每一个累加值的所占百分比
user_cumsum=grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/ x.sum())
user_cumsum.reset_index().order_amount.plot()
可以得知,50%的客户仅贡献了15%左右的销售额,少量客户贡献了更多的销售额。
4、用户消费行为分析
主要分为以下几个方面分析:
- 用户首购和用户最后一次消费
- 新老客户消费比
- 用户分层(RFM)
4.1
用户首购
grouped_user.min().order_dt.value_counts().plot()
由图可知,用户首次消费行为基本上集中在最开始的三个月,1997年4月之后几乎没有新用户产生。
用户最后一次消费
grouped_user.max().order_dt.value_counts().plot()
由图可知,用户最后一次的购买行为基本集中在前三月,三月之后折线图呈断崖式下跌,说明很多客户仅发生一次购买行为。
4.2新老客户消费比
求出用户购买产品日期的最大值和最小值,若该日期的最大值等于其最小值,说明这个用户只消费了一次。
use_life=grouped_user.order_dt.agg(['min','max'])
(use_life['min']==use_life['max']).value_counts()
判别条件为True的用户数量为12054,占总数的51.1%,说明这部分客户仅消费过一次。
4.3用户分层
RFM模型是衡量客户价值和客户创利能力的重要工具和手段。通过客户的购买时间、购买金额、购买频率三项指标,来描述该客户的价值状况。
先对数据做预处理,让每个日期减去最大日期获得间隔天数(该数为负数),当数值越大时,说明日期越近。
df.reset_index(inplace=True)
df['period']=(df.order_dt - df.order_dt.max())/np.timedelta64(1,'D')#计算时间差,并转换为float类型
使用数据透视表,求出各用户的最近消费时间(R),消费频次(F),消费总金额(M)。
user_rfm = df.pivot_table(values=['period','order_products','order_amount'],
index='user_id',aggfunc={'period':'max',
'order_products':'count',
'order_amount':'sum' })
user_rfm = user_rfm.rename(columns = {'order_amount':'M','order_products':'F','period':'R'})
将用户在R、F、M三个维度上,按照高于平均值和低于平均值进行划分,高于平均值则赋值为1,低于平均值则赋值为0,最后根据RFM分层模型给所有用户分层。
def level_label(data):#定义分层函数
level = data.apply(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
user_rfm['label'] = (user_rfm - user_rfm.mean()).apply(level_label,axis=1)
对用户分层结果计数:
user_rfm.pivot_table(values=['R','F','M'],
index='label',
aggfunc={'R':'count','F':'count','M':'count'}).head(10)
作饼图
label_count = user_rfm.groupby('label').count()
%pylab.rcParams['figure.figsize']=(15,15)
labels = ['一般价值客户','一般保持客户','一般发展客户','潜在客户','重点保持客户','重点发展客户','重点挽留客户','高价值客户']
plt.pie(label_count['M'],labels=labels,autopct = '%3.1f%%',startangle = 90,radius=2)
从用户分层结果可知,不活跃用户占较大的比重,为57.7%,高价值用户占比第二,19.6%,这是该CD网站的消费主力军,需重点保持。
而重点挽留客户、重点发展客户、重点保持客户占比较低,分别为2.5%,1.1%,1.9%。