电商数据分析实战第一篇——客户消费行为分析

2023-11-04

一、分析背景

为了提高店铺的收益,进行准确的客户运营策略,使用店铺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

columns-9列含义:event_time          事件事件event_type          事件的类型-购物、加入购物车、移除购物车、查看product_id           产品IDcategory_id         分类的类别category_code    分类的代码brand                   品牌的名字price                    物品的价格user_id                客户IDuser_session      客户会话ID

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产品客户超过一年才会去购买。热销产品的冷销量和客户的热流失正说明产品本身质量有问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

电商数据分析实战第一篇——客户消费行为分析 的相关文章

随机推荐