一、分析背景
为了提高店铺的收益,进行准确的客户运营策略,使用店铺201910至202002的销售数据进行分析,根据客户的消费趋势、消费习惯把握客户的消费现状和心理,挖掘出高价值用户群体,完善销售运营策略。
简单说明一下,客户分析包括基本属性、交易行为、浏览行为、服务体验、社交分享这几个方面的分析,主要应用场景是客户画像、客户忠诚度提升策略设计、客户数增长、精准运营。
这里只进行客户消费行为分析,主要来了解是客户在总体和个体上的消费情况以及客户的消费习惯,能对目前客户的消费现状以及销售指标变化背后原因有一个更深的认识,并进行新老顾客划分以及基于RFM模型的客户分群,利于后续的精准运营策略设计。
二、客户消费行为分析思路
2.1思路
数据分析最重要的是思路,思路通了,一切变得清晰明了。
首先学会描述行为:时间、地点、人物、动作、对象
2.2描述
消费行为就是:客户(人物)在什么时间在什么地点购买了什么特性的产品(对象)
这里主要是了解客户,就是通过购买时间、购买地点、购买产品这三大维度去了解客户
消费行为的类型:
1、复杂的购买行为。
2、减少失调感的购买行为。
3、寻求多样化的购买行为。
4、习惯性的购买行为。
三、分析步骤
四、数据预处理
数据来源:这里采用了Kaggle上面的eCommerce Events History in Cosmetics Shop的数据集,此数据集包含一家中型化妆品在线商店5个月(2019年10月至2020年2月)的行为数据。数据网址
一共有五个文件
2019-Oct.csv
2019-Nov.csv
2019-Dec.csv
2020-Jan.csv
2020-Feb.csv
4.1读取数据-只需要event_type为purchase的数据
data_all=[]
years=[2019,2020]
filenames=['Oct','Nov','Dec','Jan','Feb']
for year in years:
for filename in filenames:
filepath=r'%d-%s.csv' %(year,filename)
try:
data=pd.read_csv(filepath)
except:
continue
data_all.append(data)
data_alls=pd.concat(data_all,ignore_index=True)
data_alls_purchase=data_alls[data_alls.event_type=='purchase']
4.2查看数据情况
查看数据类型、数据长度、数据大小
data_alls_purchase.info() #查看数据类型、数据长度、数据大小
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1286880 entries, 0 to 1286879
Data columns (total 9 columns):
event_time 1286880 non-null object
event_type 1286880 non-null object
product_id 1286880 non-null int64
category_id 1286880 non-null int64
category_code 17214 non-null object
brand 737314 non-null object
price 1286880 non-null float64
user_id 1286880 non-null int64
user_session 1286880 non-null object
dtypes: float64(1), int64(3), object(8)
memory usage: 117.8+ MB
查看各列缺失情况
有brand、category_code两列值缺失
data_alls_purchase.isnull().any()#查看各列缺失情况
event_time False
event_type False
product_id False
category_id False
category_code True
brand True
price False
user_id False
user_session False
dtype: bool
查看缺失列的缺失情况
这两列缺失严重,在消费产品维度上分析受到了影响
data_alls_purchase.brand.isnull().value_counts()
False 737314
True 549566
Name: brand, dtype: int64
data_alls_purchase.category_code.isnull().value_counts()
True 1269666
False 17214
Name: category_code, dtype: int64
查看数据有效性并转换
price的取值范围应是>0
data_alls_purchase=data_alls_purchase[data_alls_purchase.price>0]
event_time的时间范围应是
2019-10-01 00:00:00至
2020-02-29 23:59:59
通过pd.to_datetime函数进行转换,转换成功说明没有问题
data_alls_purchase.iloc[0]
event_time 2019-10-01 00:06:35 UTC
event_type purchase
product_id 5619862
category_id 1487580006895846315
category_code NaN
brand runail
price 5.32
user_id 474232307
user_session 445f2b74-5e4c-427e-b7fa-6e0a28b156fe
Name: 0, dtype: object
查看重复值
没有重复项
data_alls_purchase.duplicated().value_counts()
False 1286880
dtype: int64
把时间转换成合理的格式
def get_datetime(data):
datetime= ' '.join((data.split(' ')[0],data.split(' ')[1]))
return (pd.to_datetime(datetime)).strftime('%Y-%m-%d %H:%M:%S')
data_alls_purchase.event_time=data_alls_purchase.event_time.map(get_datetime)
由于后续需要进行按月分组和时间段的操作,这里进行提取月份、日期、时间、小时
data_alls_purchase['year_month']=data_alls_purchase.event_time.apply(lambda x:'-'.join((x.split('-')[0],x.split('-')[1])))
data_alls_purchase['time']=data_alls_purchase.event_time.apply(lambda x:x.split(' ')[1])
data_alls_purchase['date']=data_alls_purchase.event_time.apply(lambda x:x.split(' ')[0])
data_alls_purchase['hour']=data_alls_purchase.event_time.apply(lambda x:(x.split(' ')[1]).split(':')[0])
五、客户总体消费情况分析
5.1五个月的销售总体指标
#求出销售总金额、总单数、总人数
all_amount=data_alls_purchase.price.sum()
all_count=data_alls_purchase.price.count()
all_customers=len(data_alls_purchase.user_id.drop_duplicates())
print('{:*^30}'.format('销售总指标'))
print('销售总金额:',all_amount)
print('销售总单数:',all_count)
print('购买总人数:',all_customers)
************销售总指标*************
销售总金额: 6351830.290000002
销售总单数: 1286880
购买总人数: 110518
5.2客户每月消费趋势
#求出销售总金额、总单数、总人数的月趋势
month_amount=data_alls_purchase.price.sum()/5
month_count=data_alls_purchase.price.count()/5
month_customers=len(data_alls_purchase.user_id.drop_duplicates())/5
print('{:*^30}'.format('月均销售指标'))
print('月均销售总金额:',month_amount)
print('月均销售总单数:',month_count)
print('月均购买总人数:',month_customers)
************月均销售指标************
月均销售总金额: 1270366.0580000004
月均销售总单数: 257376.0
月均购买总人数: 22103.6
fig,axes=plt.subplots(1,3,figsize=(12,6))
ax1=axes[0]
ax2=axes[1]
ax3=axes[2]
#作出客户每月消费金额趋势图
data_alls_purchase.groupby('year_month').price.sum().plot(ax=ax1)
ax1.set_title('每月消费总金额趋势图')
#作出客户每月消费次数趋势图
data_alls_purchase.groupby('year_month').event_time.count().plot(ax=ax2)
ax2.text('每月消费次数趋势图')
#查看消费金额与消费次数的相关系数
(pd.concat([purchase_amount,purchase_count],axis=1)).corr()
price user_id
price 1.000000 0.996054
user_id 0.996054 1.000000
#求出每个月不重复user_id的数量
def get_month_unique(data):
a=data.duplicated()
return a.value_counts()
data_month_unique_user=data_alls_purchase.groupby(['year_month']).user_id.apply(get_month_unique)
#False表示不重复的ID数
data_month_unique_user=data_month_unique_user.unstack()
True False
year_month
2019-10 219842 25762
2019-11 290876 31524
2019-12 187545 25613
2020-01 235540 28220
2020-02 216199 25759
#作出每月消费人数的趋势图
data_month_unique_user.iloc[:,0].plot(ax=ax3)
#
5.3结论
从这几方面的数据来看,2019-10到2020-02这五个月消费情况变化较大是在2019-11月中,首先推断是由于双11活动的影响,而获益于双11活动的影响,消费人数、消费总额都提高了,但人均消费最低,人均购买量最低,客单价最低要注意双11活动过后带来的影响,是增加客户还是流失了客户,而新增客户的消费情况如何?客户质量如何变化?这些需要在后续更深入的分析得出结论。
六、客户个体消费情况分析
6.1人均消费金额与次数情况
求出人均消费、人均购买量、人均每单消费
user_comsumption=data_alls_purchase.groupby('user_id').price.sum()
user_count=data_alls_purchase.groupby('user_id').price.count()
data_user_average=data_alls_purchase.pivot_table(index='user_id',values=['price','event_time'],aggfunc={'price':'sum','event_time':'count'})
data_user_average['amount']=data_user_average['price']/data_user_average['event_time']
data_user_average.describe()
event_time price amount
count 110518.000000 110518.000000 110518.000000
mean 11.644076 57.473265 8.098981
std 18.265277 88.639681 13.217872
min 1.000000 0.130000 0.130000
25% 3.000000 16.270000 3.256667
50% 6.000000 33.220000 4.871429
75% 13.000000 61.580000 7.940000
max 715.000000 3785.030000 299.810000
user_comsumption.plot.hist(bins=100)
user_count.plot.hist(bins=100)
客户个体消费金额和消费次数分布图
一共110518个客户,在消费次数上看,趋势是集中消费(少部分多消费),在消费金额上看,五个月总人均消费为57.573265,差不多75%的人低于平均值,而std、min和max的区别这里可以看到客户的个体差异非常大,逐步推断是二八法则,下面作出消费金额二八法则图。
data_user=user_comsumption.sort_values(ascending=False)
user_sort=data_user.cumsum()/data_user.sum()
index=user_sort.index/len(user_sort)
user_sort.index=index
user_sort.plot()
plt.text(user_sort.searchsorted(0.8)/len(user_sort),0.8,'The important dot 0.42',ha='center')
user_sort.searchsorted(0.8)/len(user_sort)
0.42410286107240447
人均消费趋势
fig,axes=plt.subplots(1,3,figsize=(12,6))
ax4=axes[0]
ax5=axes[1]
ax6=axes[2]
作出每月人均消费的趋势图
(data_alls_purchase.groupby('year_month').price.sum()/data_month_unique_user.iloc[:,0]).plot(ax=ax4)
#作出每月人均消费次数的趋势图
(data_alls_purchase.groupby('year_month').user_id.count()/data_month_unique_user.iloc[:,0]).plot(ax=ax5)
#作出每月客单价的趋势图
(data_alls_purchase.groupby('year_month').price.sum()/data_month_unique_user.iloc[:,0]).plot(ax=ax6)
6.2结论
从图上可以看到贡献80%消费金额的客户数是42%,购买力并不集中,每月人均消费是11.5dollar左右且每月人均购买次数是2次,都是非常低的,销售额受到人数流入流出的影响比较大,这样的商店需要更加关注新增人数和留存。
七、客户消费行为分析
这里以天为单位,从时间分布,重要购物行为以及 消费产品的特性去分析客户消费行为来了解客户
7.1购物时间分布情况
#查看客户消费金额在时间(每天)上的分布图
data_alls_date=data_alls_purchase.groupby('date').price.sum()
data_alls_date.plot()
#查看客户消费金额的描述统计情况
data_alls_date.describe()
count 152.000000
mean 41788.357171
std 13396.786525
min 6987.740000
25% 35638.750000
50% 39982.440000
75% 44989.647500
max 102854.760000
#查看消费金额最大值的日期
data_alls_date.idxmax()
'2019-11-22'
#查看消费金额最小值的日期
data_alls_date.idxmin()
'2019-12-31'
#查看消费金额前十名的日期
data_alls_date.sort_values(ascending=False)[:10]
date
2019-11-22 102854.76
2020-01-27 91467.28
2019-11-24 87953.90
2020-01-28 87725.65
2019-11-08 83522.43
2019-11-07 80731.96
2019-11-29 78182.87
2019-11-21 78108.62
2019-11-28 77470.54
2019-11-23 70471.66
Name: price, dtype: float64
#查看消费金额的最后十名的日期
data_alls_date.sort_values(ascending=False)[-10:]
date
2019-12-07 27908.62
2019-11-09 27384.52
2019-12-28 26363.85
2019-10-26 25359.18
2020-01-02 25067.09
2019-12-27 24575.93
2019-12-29 21391.92
2020-01-01 16765.95
2019-12-30 14237.95
2019-12-31 6987.74
Name: price, dtype: float64
消费金额的时间分布图
可以看到客户消费情况在均值附近波动,如有强大波动的因是运营活动作用的结果,而最大值的并不在2019-11-11日,且不在这个日期的附近,甚至消费金额前十名的日期没有2019-11-11,说明不是双11作用的结果,在11月份金额比较大的日期是2019-11-07和2019-11-08日以及2019-11-21到2019-11-30这段时间,这应该是平台某种运营的结果。
而金额最小值在2019-12-31日,且靠近该日期附近的一个星期的消费金额都下降了,这是因为圣诞节开始,人们都开始过节,这说明该数据集是西方国家(准确说是有西方习俗的国家)的化妆品商店平台的数据。
7.2重要消费行为分析
7.2.1首购与最后购
客户首购时间分布情况
user_first_buy=pd.DataFrame(data_alls_purchase.groupby('user_id').date.min().value_counts())
user_first_buy[:10]
date
2019-11-22 1685
2019-11-24 1471
2019-11-29 1468
2019-11-28 1355
2019-11-21 1211
2019-11-07 1195
2020-01-27 1177
2019-11-23 1153
2020-01-28 1153
2019-11-08 1152
user_first_buy.date.plot()
客户最后一次购物时间分布情况
user_last_buy=pd.DataFrame(data_alls_purchase.groupby('user_id').date.max().value_counts())
user_last_buy[:10]
2020-01-27 1577
2020-01-28 1567
2019-11-22 1542
2019-11-29 1378
2019-11-24 1372
2019-11-28 1299
2019-11-21 1105
2020-02-27 1100
2020-02-25 1064
2020-02-26 1060
user_last_buy.date.plot()
客户第一次购物时间分布图和最后一次购物时间分布图
第一次购物与最后一次购物时间分布图,两者对比图
在这里就可以发现首购与最后一次购物时间的分布图趋势几乎完全相似,这里面重叠了很多客户首购就是最后一次购买,这里把这些客户挑选出来,查看这些客户是否在那几个高峰点上
user_first=data_alls_purchase.groupby('user_id').date.min().reset_index()
user_last=data_alls_purchase.groupby('user_id').date.max().reset_index()
user_first_last=pd.merge(user_first,user_last,left_on='user_id',right_on='user_id',how='outer')
user_first_last.columns=['user_id','last','first']
comparison=[]
for i in np.arange(len(user_first_last)):
comparison.append(user_first_last['first'].iloc[i]==user_first_last['last'].iloc[i])
user_first_last['comparison']=comparison
#查看第一次购物时间跟最后一次购物时间相同的客户数情况
user_first_last['comparison'].value_counts()
True 87780
False 22738
#查看五个月时间里只购买一天就流失的客户占比情况
user_first_last.comparison.value_counts()/len(user_first_last)
True 0.79426
False 0.20574
可以看到客户流失情况比较严重,五个月的消费客户里,有接近80%的客户是一次性购物,虽然平台运营活动有效引流购物,但没能把顾客变成忠诚客户,接下来再看这些客户是在哪里流失的。把客户首购的时间分布图、客户最后一次购物的时间分布图、客户五个月一次性购物就流失的时间分布图绘制在一起。
这数据极其的相似,基本上流失的客户就是新增的客户,当天流入当天流失,流失比较严重,再看一天购买流失客户与不是一天购买流失客户的消费能力对比,稍微验证价格是不是导致客户流失的原因。
user_lost_ing=pd.merge(data_alls_purchase[['user_id','price']],user_first_last_True,left_on='user_id',right_on='user_id',how='outer')
user_lost=user_lost_ing[user_lost_ing.comparison==True]
user_lost_desc=user_lost.groupby('user_id').price.agg(['sum','count'])
user_lost_desc['amount']= user_lost_desc['sum']/ user_lost_desc['count']
user_lost_desc.describe()
#查看一天购买流失客户的消费能力情况
sum count amount
count 87856.000000 87856.000000 87856.000000
mean 37.693021 7.311202 8.664643
std 43.891940 8.852323 14.420857
min 0.030000 1.000000 0.004286
25% 14.200000 2.000000 3.226667
50% 25.700000 5.000000 4.975000
75% 45.880000 9.000000 8.573333
max 1566.810000 324.000000 299.810000
#查看不是一天购买流失客户的消费能力情况
user_ing=user_lost_ing[user_lost_ing.comparison!=True]
user_ing_desc=user_ing.groupby('user_id').price.agg(['sum','count'])
user_ing_desc['amount']= user_ing_desc['sum']/ user_ing_desc['count']
user_ing_desc.describe()
sum count amount
count 22646.000000 22646.000000 22646.000000
mean 134.085439 28.461229 5.886212
std 153.209712 31.121328 6.286503
min 0.800000 2.000000 0.275333
25% 49.405000 10.000000 3.343868
50% 89.890000 19.000000 4.556733
75% 160.647500 35.000000 6.459044
max 3785.030000 715.000000 194.440000
7.2.2复购与回购
#查看每月的复购率
user_month_count=data_alls_purchase.pivot_table(index='user_id',columns='year_month',values='event_time',aggfunc='count')
user_month_count=user_month_count.applymap(lambda x:0 if x==1 else 1 if x>1 else np.nan)
#查看每月的复购率情况
(user_month_count.sum()/user_month_count.count()).plot()
user_month_count.sum()/user_month_count.count()
year_month
2019-10 0.905364
2019-11 0.914288
2019-12 0.886386
2020-01 0.907123
2020-02 0.900268
(user_month_count.sum()/user_month_count.count()).mean()
0.9026856625239873
#查看回购率
user_month_counts=data_alls_purchase.pivot_table(index='user_id',columns='year_month',values='event_time',aggfunc='count').fillna(0)
user_monrh_counts.applymap(lambda x:1 if x>0 else 0,inplace=True)
def get_user_next_buy(data):
status=[]
#根据月个数写出循环次数
for i in range(5):
#对本月进行消费判断
#1.本月没有消费
if data[i]==0:
status.append(np.nan)
#2.本月有消费
else:
#下个月有消费
if data[i+1]>0:
status.append(1)
#下个月没有消费
else:
status.append(0)
data[i]=status[i]
return data
user_month_counts.apply(get_user_next_buy,axis=1,inplace=True)
(user_month_counts.sum()/user_month_counts.count()).plot()
客户每月复购率和回购率曲线图
7.2.3人均每次购买量
人均消费天数
user_consumption_days=data_alls_purchase.groupby('user_id').date.apply(get_month_unique).unstack()
average_consumption_days=user_consumption_days.iloc[:,0].sum()/all_customers
1.396741
每次购买量(以天为单位)
all_count/all_customers/average_consumption_days
8.33660362093253
7.2.4小结
店铺的运营活动成功引流,指标峰值明显。
价格不是导致客户流失的原因。
客户喜欢一次性购买多件产品。
7.3基于客户生命周期察看客户结构
客户生命周期—新老活跃流失,逻辑关系:
1.本月没有消费
1)这个月是首月,则这个月是未注册
2)上个月是未注册,则这个月是未注册
3)上个月是消费,则这个月是不活跃
4)上个月是不活跃,则这个是不活跃
2.本月有消费
1)上个月是未注册,则这个月是新客户
2)上个月是消费,则这个月是活跃
3)上个月是不活跃,则这个月是回流
#先以透视表查看客户在每个月的表现状态
user_active_counts = data_alls_purchase.pivot_table(index = 'user_id',
columns = 'year_month',
values = 'price',
aggfunc = 'count').fillna(0)
#再把每个月消费与不消费变成1与0,我们只需要知道该月消费是否
user_active_counts.applymap(lambda x:1 if x>0 else 0,inplace=True)
#根据上面的逻辑写出代码
def get_user_status(data):
status=[]
#根据月个数写出循环次数
for i in range(5):
#对本月进行消费判断
#1.本月没有消费
if data[i]==0:
#不是首月
if len(status)>0:
if status[i-1]=='unreg':
status.append('unreg')
else:
status.append('unactive')
#是首月
else:
status.append('unreg')
#2.本月有消费
else:
#不是首月
if len(status)>0:
if status[i-1]=='unreg':
status.append('new')
elif status[i-1]=='new':
status.append('active')
else:
status.append('return')
#是首月
else:
status.append('new')
data.iloc[0:]=status
return data
#将类型函数应用到数据中
user_purchase_stats =user_active_counts.apply(get_user_status,axis = 1)
#将未注册的客户调整为缺失值,便于对其他类型进行计数
purchase_stats_ct = user_purchase_stats.replace('unreg',np.NaN).apply(lambda x:pd.value_counts(x))
plt.style.use('ggplot')
purchase_stats_ct.fillna(0).T.plot.area() #制作面积图,可以更直观的观察走势
plt.title('每月客户活动状态')
plt.ylabel('客户人数')
#plt画图无法显示中文,需要进行如下设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#查看每个月各类客户的占比
purchase_stats_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis = 1)
active new return unactive
year_month
2019-10 0.000000 0.000000 0.000000 0.000000
2019-11 0.090684 0.509510 0.000000 0.399806
2019-12 0.060076 0.272786 0.021765 0.645372
2020-01 0.042870 0.220470 0.041240 0.695419
2020-02 0.040772 0.161657 0.030647 0.766925
每月客户活动状态图
从观看客户生命周期状态图可以知道活跃客户越来越少,流失客户越来越多,我们作为运营方,是希望流失客户变成未流失客户,未流失客户的活跃度大且消费金额贡献率能达到80%,这时候就需要用RFM对客户进行分群进行准确运营了。
7.4基于RFM模型的客户分群
RFM是比较常用的分析模型,这里先采用RFM以均值各分两层来进行分层
rfm = data_alls_purchase.pivot_table(index = 'user_id',
values = {'event_time','price','user_session'},
aggfunc = {'event_time':'max',
'price':'sum',
'user_session':'count'})
rfm['R'] = ( rfm.event_time.max()-rfm.event_time ).dt.days
rfm.rename(columns = {'user_session':'F','price':'M'},inplace = True)
#给每条数据新增标签
def rfm_label(x):
level = x.apply(lambda x:'1' if x>= 0 else '0')
#这里的level数据都是字符串,可以直接合并
label = level.R + level.F + level.M
Standard = {
'111':'重要价值客户',
'011':'重要保持客户',
'101':'重要挽留客户',
'001':'重要发展客户',
'110':'一般价值客户',
'010':'一般保持客户',
'100':'一般挽留客户',
'000':'一般发展客户'
}
result =label.map(Standard)
return result
#以均值作为RFM各值分层标准,大于均值为1,小于均值为0
rfm['label'] = rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(rfm_label,axis = 1)
rfm.loc[rfm.label=='重要价值客户','color'] = 'g'
rfm.loc[~(rfm.label == '重要价值客户'),'color'] = 'r'
rfm.plot.scatter('F','R',c=rfm.color)
#查看各层客户的RFM详细情况
rfm.groupby('label').sum()
M F R
label
一般价值客户 214481.44 86968 5.749283e+05
一般保持客户 188088.70 73580 1.422816e+05
一般发展客户 777379.45 148111 1.091436e+06
一般挽留客户 896918.04 170587 4.162576e+06
重要价值客户 1034382.55 227075 8.233316e+05
重要保持客户 2473275.56 530257 3.766459e+05
重要发展客户 384522.29 25363 1.333772e+05
重要挽留客户 382782.26 24939 4.491995e+05
#查看各层客户的人数占比情况
rfm.groupby('label').R.count()/rfm.groupby('label').R.count().sum()*100
label
一般价值客户 4.788360
一般保持客户 4.098880
一般发展客户 29.547223
一般挽留客户 34.521073
重要价值客户 7.123726
重要保持客户 12.426030
重要发展客户 3.736043
重要挽留客户 3.758664
一般的客户占比约73%,大多数客户都是价值度不高的客户,客户消费结构并不客观,这里应对最近流失的客户也就是重要挽留客户和一般挽留客户都需要多加关注,如果有其他信息如售后评价就能挖掘流失的原因,从80%的客户都是一次性购买,且购买客户大多数是因为运营活动(应类似店铺一些限时折扣、平台限时折扣等),关键是经过购买活动后,并没有进行回购,目前看到经过这些运营活动并不能带来长期收益,店铺运营方应改变客户运营策略。
7.5 消费产品维度看行为
我们都知道产品的价格是影响客户消费的主导因素,但前面已经分析客户不因为产品价格流失的,这里再通过客户喜爱的产品的一些特性去深度挖掘客户的消费习惯,同时挖掘出来客户流失的原因。
7.5.1消费产品总体情况
#求出不同产品的消费总金额和总次数
test_category=data_alls_purchase.groupby('category_id').price.agg(['sum','count'])
#再求出产品的单价
test_category['amount']=test_category['sum']/test_category['count']
#求出产品月均销售量
test_category['average_count']=test_category['count']/5
#查看消费产品的详细情况
test_category.describe()
sum count amount average_count
count 468.000000 468.00000 468.000000 468.000000
mean 13572.286944 2749.74359 8.666295 549.948718
std 35937.849183 6943.10112 16.070121 1388.620224
min 3.270000 1.00000 0.377921 0.200000
25% 682.485000 135.75000 3.239340 27.150000
50% 2749.910000 604.50000 5.295125 120.900000
75% 10076.055000 2333.75000 8.491927 466.750000
max 418363.330000 80137.00000 201.323333 16027.400000
7.5.2最喜爱产品的特征
#查看客户最喜爱消费前十的产品
test_category.sort_values(by='count',ascending=False)[:10]
sum count amount average_count
category_id
1487580007675986893 102743.07 80137 1.282093 16027.4
1487580006317032337 179969.53 50555 3.559876 10111.0
1487580005092295511 418363.33 44870 9.323899 8974.0
1487580005595612013 134047.48 44334 3.023582 8866.8
1487580005671109489 108903.93 43451 2.506362 8690.2
1602943681873052386 186388.51 36216 5.146579 7243.2
1487580009286598681 22963.82 33862 0.678159 6772.4
1487580005268456287 265312.54 30450 8.713056 6090.0
1487580005134238553 68459.20 25702 2.663575 5140.4
1487580009445982239 39901.74 24142 1.652793 4828.4
#查看客户最喜爱的前十产品的描述统计
test_category.sort_values(by='count',ascending=False)[:10].describe()
sum count amount average_count
count 10.000000 10.000000 10.000000 10.000000
mean 152705.315000 41371.900000 3.854997 8274.380000
std 118579.684934 16183.258575 2.995483 3236.651715
min 22963.820000 24142.000000 0.678159 4828.400000
25% 77030.167500 31303.000000 1.866186 6260.600000
50% 121475.705000 39833.500000 2.843578 7966.700000
75% 184783.765000 44736.000000 4.749903 8947.200000
max 418363.330000 80137.000000 9.323899 16027.400000
我们可以看到客户五个月以来产品销售情况是最倾向的产品单价均值在3.8dollar,比较低,顾客更青睐便宜实惠的产品,而月均销售量是8274,月均购买数是257376,月均每订单购买率是3.2%,约每下31个单有一个单是前十的产品, 月均客户数是27376,月均每客户购买率30.0%,约每四个月客户才会买一件销量前十的产品,说明热销产品并不热销。
7.5.3最有潜力的产品的特征
#查看每个月客户最喜爱的前十产品
def get_top10(data):
return data.sort_values(ascending=False)[:10]
data_sum=data_alls_purchase.groupby(['year_month','category_id']).price.sum().reset_index()
data_sum.index=data_sum.category_id
data_month_10=data_sum.groupby('year_month').price.apply(get_top10)
#再通过五个月内前十名的产品是否重复上榜情况
data_month_10.reset_index().category_id.value_counts()
1487580008246412266 5
1487580005268456287 5
1487580013950664926 5
1487580005092295511 5
1487580006350586771 5
1487580006300255120 5
1487580006317032337 5
1602943681873052386 4
1487580005595612013 3
1487580005754995573 3
1487580005671109489 2
1487580009051717646 2
1487580007675986893 1
Name: category_id, dtype: int64
len(data_month_10.reset_index().category_id.value_counts())
13
这13款产品是有潜力的产品,再查看这些产品的消费情况
hot_products=test_category[test_category.index.isin(data_month_10.reset_index().category_id.value_counts().index)]
hot_products
sum count amount average_count
category_id
1487580005092295511 418363.33 44870 9.323899 8974.0
1487580005268456287 265312.54 30450 8.713056 6090.0
1487580005595612013 134047.48 44334 3.023582 8866.8
1487580005671109489 108903.93 43451 2.506362 8690.2
1487580005754995573 94976.54 20449 4.644557 4089.8
1487580006300255120 351672.31 3810 92.302444 762.0
1487580006317032337 179969.53 50555 3.559876 10111.0
1487580006350586771 138623.97 4000 34.655993 800.0
1487580007675986893 102743.07 80137 1.282093 16027.4
1487580008246412266 139934.73 16571 8.444556 3314.2
1487580009051717646 114698.00 3137 36.562958 627.4
1487580013950664926 135893.36 5897 23.044490 1179.4
1602943681873052386 186388.51 36216 5.146579 7243.2
#再查看这些热卖消费产品的特点
test_category[test_category.index.isin(data_month_10.reset_index().category_id.value_counts().index)].describe()
sum count amount average_count
count 13.000000 13.000000 13.000000 13.000000
mean 182425.176923 29529.000000 17.939265 5905.800000
std 101415.769303 23301.904418 25.359114 4660.380884
min 94976.540000 3137.000000 1.282093 627.400000
25% 114698.000000 5897.000000 3.559876 1179.400000
50% 138623.970000 30450.000000 8.444556 6090.000000
75% 186388.510000 44334.000000 23.044490 8866.800000
max 418363.330000 80137.000000 92.302444 16027.400000
#查看热卖消费产品的人均消费
all_customers/hot_products['count'].describe()
count 8501.384615
mean 3.742694
std 4.742874
min 35.230475
25% 18.741394
50% 3.629491
75% 2.492850
max 1.379113
#查看消费产品购买次数的分布图
test_category['count'].plot.hist(bins=100)
人均消费产品种类数
average_category=data_alls_purchase.groupby('user_id').category_id.apply(get_month_unique).unstack()
( average_category.sum()/all_customers)[0]
5.823459
每次购买产品种类数
( average_category.sum()/all_customers)[0]/average_consumption_days
4.189538848920863
7.5.4小结
客户喜欢低价产品。
热销产品并不够热销,有潜力产品未能上升。
客户每次购买多种产品。
八、结论
我们在这里通过购买时间、购买产品这两大个维度上的消费金额、消费次数、复购率、回购率等指标来分析客户消费行为去了解客户消费习惯以及消费现状,我们可以得到以下结论:
1.总体上,该平台客户结构不稳定,销售额受新增客户的影响大。
在5个月内,从客户生命周期可以看到客户活跃越来越低,流失越来越多,且新客户越来越少,约80%客户当天流入当天流失,平台每天销售额受到新增客户数量波动比较大。
2.店铺运营活动即时有效,但留不住新客户。
客户购买受到活动运营活动影响比较大,购买总金额、总人数、总次数峰值都靠近这些活动时间附近,许多客户的首购都发生在这些时间段上,引流是有效果的,但一天购物就流失的客户达到总体客户80%,留不住新客户。
3.所有客户都喜欢一次性购买产品且买多种多样的产品,做好组合销售策略是增长销售额的一个好方法。
复购率月均90%,人均每次购买量8件,人均每次购买种类4种,说明客户在购买商品时是比较果断的,习惯要么不买要么买多点,做好组合销售策略是增长销售额的一个方法。
4.价格没问题可能产品品质不够是客户流失的原因。
当天流入当天流失的新客户的总体消费能力比能二次购买的客户的强,客户最喜爱的产品均单价是3.85dollar,价格不高,但客户每4个月才会购买一件,价格低但还是不够有吸引力,商家以低价引流的策略并不能奏效。而最有潜力的十三款产品的均单价是17.93dollar比起人均每件消费人均8.1dollar高,最低月均销量 627件, 月均消费人数27375.6,客户43个月才会买一件这样有潜力的产品,且13款最有潜力产品有6/13产品客户超过半年才会去购买,有4/13产品客户超过一年才会去购买。热销产品的冷销量和客户的热流失正说明产品本身质量有问题。