淘宝用户行为分析(Python)

一、分析背景与目的

 2014年是阿里巴巴集团移动电子商务业务快速发展的一年。例如,2014年11月11日的移动销售中的移动终端商品总销售额(GMV)占总GMV的42.6%。与PC时代相比,移动终端可以随时随地访问网络。此外,他们还拥有更丰富的背景数据,例如用户的位置信息,访问时间的规律性等。该数据基于阿里巴巴M-Commerce平台上的真实用户商品行为数据。同时,它提供了移动时代典型的位置信息。

通过挖掘用户行为数据价值,深度分析,然后可视化展现出来;能够充分发现业务运营中的问题,制定合理的运营策略,优化运营效率,进行精准营销。

二、数据理解

数据来源于阿里天池:(https://tianchi.aliyun.com/dataset/dataDetail?dataId=46&userId=1)
大概有一千多万条,6个特征指标;6个特征代表的含义如下:

字段名字段描述
user_id用户ID
item_id商品ID
behavior_type行为类型(1:浏览,2:收藏,3:加入购物车,4:下单付款)
user_geohash用户地理位置
item_category商品类目
time行为发生的具体时间

分析思路:
在这里插入图片描述

三、数据清洗

#导入相关的库
import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
from datetime import timedelta
import matplotlib.dates as mdates
plt.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False     # 正常显示负号

1、读取并查看数据基本信息和数据的完整性

data=pd.read_csv('./tianchi_mobile_recommend_train_user.csv')
data.head()
data.info()

在这里插入图片描述
在这里插入图片描述
time为object类型,后面需将time这一列转化为时间格式

2、缺失值处理

data.isnull().sum()
data.drop(['user_geohash'],axis=1,inplace=True)#这里user_geohash大量缺失不好填充,所以选择删除user_geohash这一特征

在这里插入图片描述

3、增加新特征

#将time这一列数据分割成日期、时间、星期
data.time = pd.to_datetime(data['time'])
data['date']=data['time'].dt.date
data['hour']=data['time'].dt.time
data['week']=data['time'].dt.weekday

#​将行为类型的代表数值用字符表示
di = {1:'浏览',2: '收藏',3:'加入购物车',4:'付款'}
data['behavior_type']= data['behavior_type'].apply(lambda x: di[x])
#查看数据基本信息
data.head()
data.info()

在这里插入图片描述
在这里插入图片描述

四、数据分析

1、不同时间维度的PV、UV流量的情况

(1)每天pv、uv变化

date_pv=data.groupby('date').user_id.count()
date_uv=data.groupby('date').user_id.nunique()
plt.style.use('ggplot')
plt.figure(figsize=(15,18), dpi=80)
plt.subplot(611)
plt.plot(date_pv.index, date_pv.values, 'bo-')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())    # 按月显示,按日显示的话,将MonthLocator()改成DayLocator()
plt.gcf().autofmt_xdate()  # 自动旋转日期标记
plt.xlabel('2014-xx-xx')
plt.title('一个月内pv变化')
plt.show()

plt.figure(figsize=(15,18), dpi=80)
plt.subplot(612)
plt.plot(date_uv.index, date_uv.values, 'ro-')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())    # 按月显示,按日显示的话,将MonthLocator()改成DayLocator()
plt.gcf().autofmt_xdate()  # 自动旋转日期标记
plt.xlabel('2014-xx-xx')
plt.title('一个月内uv变化')
plt.show()

在这里插入图片描述
201411-18到2014-12-18内uv、pv变化平稳趋势大体一致,在2014-12-12pv、uv大幅增长;根据常识可知,是由于双十二淘宝商家大量优惠活动的原因。

(2)一天内pv、uv变化

hour_pv=data.groupby('hour').user_id.count()
hour_uv=data.groupby('hour').user_id.nunique()
plt.figure(figsize=(15,18), dpi=80)
plt.subplot(613)
plt.plot(hour_pv.index, hour_pv.values,  'bo-')
plt.title('一天内pv变化')
plt.show()

plt.figure(figsize=(15,18), dpi=80)
plt.subplot(614)
plt.plot(hour_uv.index, hour_uv.values,  'ro-')
plt.title('一天内uv变化')
plt.show()

在这里插入图片描述
一天中从早上6:00-10:00,18:00-21:00这两个时间段pv有较明显上升;uv从早上6:00-10:00有较明显增加,而后到21点uv保持稳定数量,然后开始下降;pv、uv变化符合大众工作作息时间。

(3)一周内pv、uv变化

week_pv=data.groupby('week').user_id.count()
week_uv=data.groupby('week').user_id.nunique()

plt.figure(figsize=(15,18), dpi=80)
plt.subplot(615)
x=np.arange(7)
plt.plot(week_pv.index, week_pv.values,  'bo-')
plt.title('一周内pv变化')
tick_label=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']
plt.xticks(x,tick_label)
plt.show()

plt.figure(figsize=(15,18), dpi=80)
plt.subplot(616)
x=np.arange(7)
plt.plot(week_uv.index, week_uv.values,  'ro-')
plt.title('一周内uv变化')
tick_label=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']
plt.xticks(x,tick_label)
plt.show()

在这里插入图片描述
一周内周一到周四pv、uv数量增加,周四到周六开始减少,周日有小幅上升;根据客观现实推测可能是周末大家选择计划出去玩等,有较长的可支配自由时间;周四pv,uv数量最高。

2、不同行为在不同时间维度下的pv情况

(1)每天不同行为的pv变化

data_1=data.loc[data['behavior_type'] != '浏览']
plt.style.use('ggplot')

df_date_pv1=pd.pivot_table(data,index=['behavior_type','date'],values=['user_id'],aggfunc='count')
df_date_pv=df_date_pv1.unstack(0)
df_date_pv.plot()
plt.title('一个月内不同行为的pv变化')
plt.show()

df_date_pv1_1=pd.pivot_table(data_1,index=['behavior_type','date'],values=['user_id'],aggfunc='count')
df_date_pv_1=df_date_pv1_1.unstack(0)
df_date_pv_1.plot()
plt.title('一个月内不同行为的pv变化')
plt.show()

在这里插入图片描述
在这里插入图片描述
不同行为每天的pv变化趋势一致,2014-11-12当天的付款人数高于收藏人数许多;说明商家活动有利于促进消费,活动效果好。

(2)不同行为一天内pv变化

df_hour_pv1=pd.pivot_table(data,index=['behavior_type','hour'],values=['user_id'],aggfunc='count')
df_hour_pv=df_hour_pv1.unstack(0)
df_hour_pv.plot()
plt.title('一个天内不同行为的pv变化')
plt.show()
df_hour_pv1_1=pd.pivot_table(data_1,index=['behavior_type','hour'],values=['user_id'],aggfunc='count')
df_hour_pv_1=df_hour_pv1_1.unstack(0)
df_hour_pv_1.plot()
plt.title('一个天内不同行为的pv变化')
plt.show()

在这里插入图片描述
在这里插入图片描述
一天内不同行为pv变化大体相同

(3)一周内不同行为pv变化

df_week_pv1=pd.pivot_table(data,index=['behavior_type','week'],values=['user_id'],aggfunc='count')
df_week_pv=df_week_pv1.unstack(0)
df_week_pv.plot()
plt.title('一个周内不同行为的pv变化')
plt.show()
df_week_pv1_1=pd.pivot_table(data_1,index=['behavior_type','week'],values=['user_id'],aggfunc='count')
df_week_pv_1=df_week_pv1_1.unstack(0)
df_week_pv_1.plot()
plt.title('一个周内不同行为的pv变化')
plt.show()

在这里插入图片描述
周四付款人数突然大幅上升,推测是由双十二当天导致的。

3、运营指标

(1)日ARPPU、日ARPU

#日ARPPU每付费平均费用=总收入/活跃付费用户数(因为没有金额,所以使用消费总数代替总金额)
#每天每人消费总次数
one_user_buy1=data[data['behavior_type']=='付款'].groupby(['date','user_id']).size().reset_index().rename(columns={0:'total'})
#one_user_buy1.head()
one_user_buy2=one_user_buy1.groupby('date')['total'].sum()/one_user_buy1.groupby('date')['total'].count()
plt.figure(figsize=(18,5), dpi=80)
plt.subplot(121)
one_user_buy2.plot()
plt.ylabel('平均次数')
plt.title('日ARPPU')
plt.show()

#日ARPU平均每活跃用户消费次数
data['operation']=1
#每天不同用户不同行为类型次数
data_user_active1=data.groupby(['date','user_id','behavior_type'])['operation'].count().reset_index().rename(columns={'operation':'total'})
#data_user_active.head()
plt.figure(figsize=(18,5), dpi=80)
plt.subplot(122)
data_user_active2=data_user_active1.groupby('date').apply(lambda x: x[x.behavior_type =='付款'].total.sum()/len(x.user_id.unique()))
data_user_active2.plot()
plt.ylabel('平均次数')
plt.title('日ARPU')
plt.show()

在这里插入图片描述
在这里插入图片描述
双十二当天ARPU、ARPPU都是大幅升高的,平时ARPU在0.5左右,ARPPU在2.37左右。

(2) 付费率

buy_rate=data_user_active1.groupby('date').apply(lambda x: x[x.behavior_type=='付款'].total.count()/len(x.user_id.unique()))
buy_rate.plot()                                      
plt.ylabel('付费率')
plt.title('付费率')
plt.show()

在这里插入图片描述
平时付费率在23%左右,双十二当天付费率达将近50%

(3) 复购率

#复购率=复购人数/购买总人数
re_buy1=data[data.behavior_type=='付款'].groupby('user_id')['date'].apply(lambda x: len(x.unique()))
re_buy2=re_buy1[re_buy1>=2].count()/re_buy1.count()
re_buy2

在这里插入图片描述
87%左右的人都有进行二次消费的。

1)复购时间消费间隔次数
re_day_buy=data[data.behavior_type=='付款'].groupby('user_id').date.apply(lambda x: x.sort_values()).diff(1).dropna()
re_day_buy=re_day_buy.map(lambda x: abs(x.days))
df1= re_day_buy.value_counts()
plt.figure(figsize=(15,5)) 
X=df1.index
Y=df1.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('复购间隔时间(天)',font)
plt.xticks(fontsize=10)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('复购时间间隔分布',fontsize=18)
plt.show()

在这里插入图片描述
大部分人复购时间间隔都在7天以内,随着消费时间间隔增大,消费人数也随之减少,因此可考虑把营销重点放在复购时间间隔7天内的客户。

2)同一时间段用户消费分布
samedt_user_buy=data[data['behavior_type']=='付款'].groupby(['user_id','date','hour'])['operation'].sum()
df2= samedt_user_buy.value_counts()

plt.figure(figsize=(15,5)) 
X=df2.index
Y=df2.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('复购次数',font)
plt.xticks(fontsize=10)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('复购频率分布',fontsize=18)
plt.show()

在这里插入图片描述
在这期间,大部分人的消费次数都在6次以内,因此可把营销推广对象重点关注大于6次消费的顾客。

(4)留存率

#建立n日留存率计算函数
def cal_retention(data,n): #n为n日留存
    user=[]
    date=pd.Series(data.date.unique()).sort_values()[:-n] #时间截取至最后一天的前n天
    retention_rates=[]
    new_users=[]
    retention_user=[]
    for i in date:
        new_user=set(data[data.date==i].user_id.unique())-set(user) #识别新用户,本案例中设初始用户量为零
        user.extend(new_user)  #将新用户加入用户群中
        #第n天留存情况
        user_nday=data[data.date==i+timedelta(n)].user_id.unique() #第n天登录的用户情况
        a=0
        for user_id in user_nday:
            if user_id in new_user:
                a+=1
        b = len(new_user)
        retention_rate=a/b #计算该天第n日留存率
        retention_rates.append(retention_rate) #汇总n日留存数据
        new_users.append(b) #汇总n日的新用户数
        retention_user.append(a) #汇总n日留存的用户数
    data_new_user = pd.Series(new_users, index=date)
    data_retention_user = pd.Series(retention_user, index=date)
    data_retention_rate = pd.Series(retention_rates,index=date)
    data_retention = pd.concat([data_new_user,data_retention_user,data_retention_rate], axis=1)
    data_retention.columns=['new_user','retention_user','retention_rate']
    return data_retention
data_retention=cal_retention(data,1)
data_retention=data_retention.rename(columns={'new_user':'新用户数','retention_user':'次日留存用户数','retention_rate':'次日留存率'})
data_retention3=cal_retention(data,3)
data_retention3=data_retention3.rename(columns={'new_user':'新用户数','retention_user':'3日留存用户数','retention_rate':'3日留存率'})
data_retention7=cal_retention(data,7)
data_retention7=data_retention7.rename(columns={'new_user':'新用户数','retention_user':'7日留存用户数','retention_rate':'7日留存率'})
data_retention14=cal_retention(data,14)
data_retention14=data_retention14.rename(columns={'new_user':'新用户数','retention_user':'14日留存用户数','retention_rate':'14日留存率'})
data_retention3.drop(['新用户数'],axis=1,inplace=True)
data_retention7.drop(['新用户数'],axis=1,inplace=True)
data_retention14.drop(['新用户数'],axis=1,inplace=True)

retention=pd.concat([data_retention,data_retention3,data_retention7,data_retention14],axis=1)
retention

在这里插入图片描述

#设置图形大小
plt.style.use('ggplot')
plt.figure(figsize=(20,7),dpi=80)
x=retention.index
y1=retention['次日留存率']
y2=retention['3日留存率']
y3=retention['7日留存率']
y4=retention['14日留存率']
# color可以百度颜色代码
plt.plot(x,y1,label='次日留存率',color='y',linestyle='-',marker='o')
plt.plot(x,y2,label='3日留存率',color='g',linestyle='-',marker='o')
plt.plot(x,y3,label='7日留存率',color='r',linestyle='-',marker='o')
plt.plot(x,y4,label='14日留存率',color='b',linestyle='-',marker='o')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())    # 按月显示,按日显示的话,将MonthLocator()改成DayLocator()
plt.gcf().autofmt_xdate()  # 自动旋转日期标记
font={'size':18,}
plt.xlabel('2014-xx-xx',font)
plt.xticks(fontsize=15)
plt.title('留存率',fontsize=18)
plt.legend()
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到留存率较好,这期间留存率几乎在40+%;次日留存率、3/7/14日留存率之间没有太大的差距;双十二活动能带来短暂的留存率升高。

4、转化漏斗分析

from pyecharts import Funnel
pv_users = data[data.behavior_type == '浏览']['user_id'].count()
fav_users = data[data.behavior_type== '加入购物车']['user_id'].count()
cart_users = data[data.behavior_type== '收藏']['user_id'].count()
buy_users = data[data.behavior_type == '付款']['user_id'].count()
attr = ['浏览', '加入购物车', '收藏', '付款']
values = [np.around((pv_users / pv_users * 100), 2),
         np.around((cart_users / pv_users * 100), 2),
         np.around((fav_users / pv_users * 100), 2),
         np.around((buy_users / pv_users * 100), 2)]

funnel1 = Funnel('用户行为转化漏斗', '图中的比例表示该行为下的总行为次数占浏览行为总次数的比例',title_pos='center')
funnel1.add(name='环节',  # 指定图例名称
            attr=attr,  # 指定属性名称
            value=values,  # 指定属性所对应的值
            is_label_show=True,  # 确认显示标签
            label_formatter='{c}'+'%',  # 指定标签显示的方式
            legend_top='bottom',    # 指定图例位置,为避免遮盖选择右下展示
            # pyecharts包的文档中指出,当label_formatter='{d}'时,标签以百分比的形式显示.         
            label_pos='outside',  # 指定标签的位置,inside,outside
            legend_orient='vertical',  # 指定图例显示的方向
            legend_pos='right')  # 指定图例的位置

funnel1.render('用户行为转化漏斗.html')

在这里插入图片描述
从浏览——加入购物车/收藏——付款的转化率是2.97%/2.1%——1.04%;可以看出浏览到加入购物车或者收藏这一环节的流失率较大,可能由于产品不符合消费者需求或者详情页面不友好等需要对其中原因进一步挖掘分析。

5、用户价值RFM模型分析(RF)

用户分群方法一:

#RFM分析(假设现在是2014/12/20)
from datetime import datetime 
#最近一次购买距离现在的天数
data['date']=pd.to_datetime(data['date'])
recent_buy=data[data.behavior_type=='付款'].groupby('user_id')['date'].apply(lambda x: datetime(2014,12,20)-x.sort_values().iloc[-1]).reset_index().rename(columns={'date':'recent'})
recent_buy.recent=recent_buy.recent.map(lambda x: x.days)
#购买频率(购买次数)
fred_buy=data[data.behavior_type=='付款'].groupby('user_id').date.count().reset_index().rename(columns={'date':'fred'})
#rfm

recent_fred=pd.merge(recent_buy,fred_buy,on='user_id')
#为实现自动细分,将使用R和F变量的80%分位数
quantiles=recent_fred.quantile(q=[0.8])

recent_fred['R']=np.where(recent_fred['recent']<=int(quantiles.recent.values),2,1)
recent_fred['F']=np.where(recent_fred['fred']<=int(quantiles.fred.values),1,2)
recent_fred['rfm']=recent_fred.R.map(str)+recent_fred.F.map(str)

#打标签,时间越近次数越多越重要
labels = {'12':'流失客户','22': '明星客户','11':'次要客户','21':'新客户'}
recent_fred['labels']= recent_fred['rfm'].apply(lambda x: labels[x])
rfm=pd.DataFrame(recent_fred['labels'].value_counts())

plt.figure(figsize=(10,7))
plt.pie(rfm.values,autopct='%1.1f%%',labels=rfm.index,explode=(0.05,0,0,0),colors=['red','yellowgreen','gold','orange'],textprops={'fontsize':15})
plt.legend()
plt.axis('equal')
plt.title('客户类群占比',fontsize=18)

在这里插入图片描述
流失客户很少,说明这期间大部分淘宝人群都有定期购物,新客户占了大部分62%,商家可以发起一些发放优惠券类营销活动使次要客户和新客户多参与消费,同时可能帮助到次要客户发展成新客户类;对流失客户可以看看其平均收益要是收益可观的话可以从客户层面与业务部门合作对这些客户进行分析研究并制定留住他们的策略,如打电话询问等尽可能将他们发展成明星客户类群。

用户分群方法二:基于RFM模型K-Means算法(由于缺少金额数据,所以这里用RF分析聚类)

用轮廓系数和肘方法找出最优k值

# 用户质量RFM聚类分析(基于消费行为特征聚类分析)
from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn import preprocessing

#准备数据
recent_fred.user_id = recent_fred.user_id.astype('str')
X = recent_fred.values[:,1:3]

# 数据标准化(z_score)
Model = preprocessing.StandardScaler()
X = Model.fit_transform(X)

ss_score = []
inertia = []
for k in range(2,10):
    clf = KMeans(n_clusters=k,max_iter=1000)
    pred = clf.fit_predict(X) 
    ss = metrics.silhouette_score(X,pred)
    ss_score.append(ss)
    inertia.append(clf.inertia_)
    
# 做图对比    
fig = plt.figure()
ax1 = fig.add_subplot(121)
plt.plot(list(range(2,10)),ss_score,c='b')
plt.title('轮廓系数')


ax1 = fig.add_subplot(122)
plt.plot(range(2,10),inertia,marker='o')
plt.xlabel('number of clusters')
plt.ylabel('distortions')
plt.title('inertia')
plt.show()

在这里插入图片描述
采用轮廓系数和inertia分数两个指标综合判定聚类质量,轮廓系数是越接近于1越好,肘方法inertia出现明显拐点;
综合来看,聚为4类效果比较好。

# 根据最佳的K值,聚类得到结果
model = KMeans(n_clusters=4,max_iter=1000)
model.fit_predict(X)
recent_fred['type']=model.labels_
rf_type=recent_fred.drop(['R','F','rfm','labels'],axis=1,inplace=False)
r=rf_type.groupby('type').mean()
r['样本个数']=rf_type['type'].value_counts()
r['样本个数占比']=r['样本个数']/rf_type['type'].count()
r['样本个数占比']=r['样本个数占比'].map(lambda x: '%.2f%%'%(x*100))
r.columns=[['R均值','F均值','样本个数','样本个数占比']]
r

在这里插入图片描述

#可视化聚类结果
plt.style.use('ggplot')
# 四个簇的簇中心
#centers = model.cluster_centers_

# 绘制聚类效果的散点图
sns.lmplot(x = 'recent', y = 'fred', hue = 'type', markers = ['^','s','o','v'],data =rf_type, fit_reg = False, scatter_kws = {'alpha':0.8}, legend_out = False)
#plt.scatter(centers[:,0],centers[:,1], marker = '*', color = 'black', s = 130)
plt.xlabel('消费时间间隔')
plt.ylabel('消费频率')
# 图形显示
plt.show()

在这里插入图片描述
1、第0组消费新鲜度均值在5.6天,消费频率在10次,占73.4%;根据业务理解,该群体可定义为中等价值客户(新客户),距离现在消费时间间隔一般,消费频率一般,属于不够忠诚极易被竞品抢走的用户,建议对这批用户多进行一些品牌上的宣传,同时通过活动刺激他们多活跃,多消费,提升忠诚度;
2、第1组消费消费新鲜度均值在21天,消费频率在4.3次,占15.7%;该群体可定义为低价值客户(次要客户),属于已流失或已沉默用户,建议通过短信或Email或其它方式召回或唤醒;
3、第2组消费新鲜度均值3.5天,消费频率48次,占11%;该群体为高价值客户(明星客户),高活跃和高价值的用户,是最需要重点呵护的用户,建议安排专员一对一服务;
4、第3组群体内部样本为3太少,在实际应用中可忽略不计。

*两种方法用户分群结果区别不大

6、用户商品偏好分析

1)不同行为top10商品

plt.figure(figsize=(20,7))
product_1= data[data.behavior_type == '浏览']['item_id'].value_counts().head(10) # 商品统计
X=product_1.index
Y=product_1.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5) 
for x,y in enumerate(Y):
    plt.text(x,y+10,y,ha='center',fontsize=18)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('商品ID',font)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('浏览量Top10商品',fontsize=18)
plt.show()

plt.figure(figsize=(20,7))
product_3= data[data.behavior_type == '收藏']['item_id'].value_counts().head(10)
X=product_3.index
Y=product_3.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5) 
for x,y in enumerate(Y):
    plt.text(x,y,y,ha='center',fontsize=18)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('商品ID',font)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('收藏量Top10商品',fontsize=18)
plt.show()

plt.figure(figsize=(20,7))
product_2= data[data.behavior_type == '加入购物车']['item_id'].value_counts().head(10)
X=product_2.index
Y=product_2.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5) 
for x,y in enumerate(Y):
    plt.text(x,y,y,ha='center',fontsize=18)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('商品ID',font)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('加入购物车数量Top10商品',fontsize=18)
plt.show()

plt.figure(figsize=(20,7))
product_4= data[data.behavior_type == '付款']['item_id'].value_counts().head(10)
X=product_4.index
Y=product_4.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5) 
for x,y in enumerate(Y):
    plt.text(x,y,y,ha='center',fontsize=18)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('商品ID',font)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('付款量Top10商品',fontsize=18)
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)不同行为的top20商品类目

import squarify
sizes=data[data.behavior_type == '浏览']['item_category'].value_counts().head(20)
colors = ['steelblue','#9999ff','red','indianred','deepskyblue','lime','magenta','violet','peru',  'green','yellow','orange','tomato','lawngreen','cyan','darkcyan','dodgerblue','teal','tan','royalblue']
plt.figure(figsize=(12,8), dpi= 80)
plot = squarify.plot(sizes = sizes.values, # 指定绘图数据
                     label = sizes.index, # 指定标签
                     color = colors, # 指定自定义颜色
                     alpha = 0.6, # 指定透明度
                     value = sizes.values, # 添加数值标签
                     edgecolor = 'white', # 设置边界框为白色
                     linewidth =3 # 设置边框宽度为3
                    )
# 设置标签大小为10
plt.rc('font', size=20)
# 设置标题大小
plot.set_title('浏览量top20商品类目',fontdict = {'fontsize':25})
# 除坐标轴
plt.axis('off')
# 除上边框和右边框刻度
plt.tick_params(top = 'off', right = 'off')
# 图形展示
plt.show()
import squarify
sizes=data[data.behavior_type == '加入购物车']['item_category'].value_counts().head(20)
colors = ['steelblue','#9999ff','red','indianred','deepskyblue','lime','magenta','violet','peru',  'green','yellow','orange','tomato','lawngreen','cyan','darkcyan','dodgerblue','teal','tan','royalblue']
plt.figure(figsize=(12,8), dpi= 80)
plot = squarify.plot(sizes = sizes.values, # 指定绘图数据
                     label = sizes.index, # 指定标签
                     color = colors, # 指定自定义颜色
                     alpha = 0.6, # 指定透明度
                     value = sizes.values, # 添加数值标签
                     edgecolor = 'white', # 设置边界框为白色
                     linewidth =3 # 设置边框宽度为3
                    )
# 设置标签大小为10
plt.rc('font', size=20)
# 设置标题大小
plot.set_title('加入购物车数量top20商品类目',fontdict = {'fontsize':25})
# 除坐标轴
plt.axis('off')
# 除上边框和右边框刻度
plt.tick_params(top = 'off', right = 'off')
# 图形展示
plt.show()
import squarify
sizes=data[data.behavior_type == '收藏']['item_category'].value_counts().head(20)
colors = ['steelblue','#9999ff','red','indianred','deepskyblue','lime','magenta','violet','peru',  'green','yellow','orange','tomato','lawngreen','cyan','darkcyan','dodgerblue','teal','tan','royalblue']
plt.figure(figsize=(12,8), dpi= 80)
plot = squarify.plot(sizes = sizes.values, # 指定绘图数据
                     label = sizes.index, # 指定标签
                     color = colors, # 指定自定义颜色
                     alpha = 0.6, # 指定透明度
                     value = sizes.values, # 添加数值标签
                     edgecolor = 'white', # 设置边界框为白色
                     linewidth =3 # 设置边框宽度为3
                    )
# 设置标签大小为10
plt.rc('font', size=20)
# 设置标题大小
plot.set_title('收藏量top20商品类目',fontdict = {'fontsize':25})
# 除坐标轴
plt.axis('off')
# 除上边框和右边框刻度
plt.tick_params(top = 'off', right = 'off')
# 图形展示
plt.show()
import squarify
sizes=data[data.behavior_type == '付款']['item_category'].value_counts().head(20)
colors = ['steelblue','#9999ff','red','indianred','deepskyblue','lime','magenta','violet','peru',  'green','yellow','orange','tomato','lawngreen','cyan','darkcyan','dodgerblue','teal','tan','royalblue']
plt.figure(figsize=(12,8), dpi= 80)
plot = squarify.plot(sizes = sizes.values, # 指定绘图数据
                     label = sizes.index, # 指定标签
                     color = colors, # 指定自定义颜色
                     alpha = 0.6, # 指定透明度
                     value = sizes.values, # 添加数值标签
                     edgecolor = 'white', # 设置边界框为白色
                     linewidth =3 # 设置边框宽度为3
                    )
# 设置标签大小为10
plt.rc('font', size=20)
# 设置标题大小
plot.set_title('付款量top20商品类目',fontdict = {'fontsize':25})
# 除坐标轴
plt.axis('off')
# 除上边框和右边框刻度
plt.tick_params(top = 'off', right = 'off')
# 图形展示
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、总结与建议

1、对热销爆款商品和商品类目进行合适的引流展示。

2、双十二期间pv、uv远高于平时,且付款人数高出收藏人数许多,因此商家可考虑定期举办优惠等活动进行促销。

3、周一到周四pv流量增加,周五至周日下降;一天中从早上10::0到晚上22:00uv数量稳定且居多,pv在18:00-21:00期间增加幅度大;因此可以在工作日18:00-22:00期间加大力度进行营销推广展示等策略。

4、大部分人复购时间间隔在7天以下,消费频次在6次以下,可重点关注复购时间间隔7天以内,消费频率不低于6次的客户。

5、留存率较好,这期间留存率几乎在40+%;次日留存率、3/7/14日留存率之间没有太大的差距;双十二活动能带来短暂的留存率升高。淘宝商家可以考虑举办一些活动来提升客户的留存率。

6、基于RFM模型客户聚类分群分析结果可分为3类客户:
高价值客户(明星客户):
消费新鲜度均值3.5天,消费频率48次, 占11%;该群体为高价值客户(明星客户),高活跃和高价值的用户,是最需要重点呵护的用户,建议安排专员一对一服务;
中等价值客户(新客户):
消费新鲜度均值在5.6天,消费频率在10次,占73.4%;距离现在消费时间间隔一般,消费频率一般,属于不够忠诚极易被竞品抢走的用户,建议对这批用户多进行商品内容的宣传,同时通过活动刺激他们多活跃,多消费,提升忠诚度;
低价值客户(次要客户):
消费消费新鲜度均值在21天,消费频率在4.3次,占15.7%;属于已流失或已沉默用户,建议通过短信或Email或其它方式召回或唤醒。

7、浏览到收藏/加入购物车这一环节转化率低2.97%/2.1%,需对其进一步挖掘分析转化率低的原因。

  • 6
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值