淘宝用户行为分析+python可视化

目录

  • 背景
  • 样本抽取
  • 样本处理
    • 删除异常数据
    • 删除重复记录
    • 缺失值处理
    • 数据转换
  • 漏斗指标分析
  • 用户行为数据分析
  • 用户价值分析
  • 总结
  • 完整代码

背景

数据源 阿里巴巴云天池
数据集介绍
淘宝用户行为分析+python可视化_第1张图片
数据量
淘宝用户行为分析+python可视化_第2张图片
可以看的出来数据量级还是很大的,为了方便分析需要对样本进行抽样

分析的主要方向如下

  1. 交易漏斗指标分析
  2. 用户行为指标分析
  3. 用户价值分析

样本抽取

大数据读取:分块处理
抽取原则:随机选取10000名用户的行为数据

#数据集太大,取10000个用户的行为数据做分析
datalist = []
chunksize = 1000000
chuncks = pd.read_csv('UserBehavior_v1.csv',index_col=False,chunksize=chunksize)
print('chunck start!')
a = time.time()
for chunck in chuncks:
    datalist.append(chunck)
b = time.time()
del chuncks,chunck
print('chunck end!',b-a)
data = pd.concat(datalist,ignore_index=True)
del datalist

#随机选取10000名用户
user_list = data['user_id'].unique().tolist()
random.shuffle(user_list)
user_list = [user_list[i] for i in range(10000)]
data = data[data['user_id'].isin(user_list)]

样本处理

删除异常数据

#删除时间不在样本范围内的数据
data = data[(data['time']>=to_timestamp('2017-11-25')//1000)&(data['time']<to_timestamp('2017-12-04')//1000)]

#根据user_id,goods_id删除第一条行为数据不是pv的记录
d_ = data.groupby(['user_id','goods_id'])['time'].min().to_frame(name='d')
data.set_index(['user_id','goods_id'],inplace=True)
data = data.join(d_,on=['user_id','goods_id'],how='left')
data = data.loc[data[(data['time']==data['d'])&(data['behavior']=='pv')].index]
data.reset_index(inplace=True)
del data['d']

删除重复记录

print('删除前:',data.shape[0])
data.drop_duplicates(inplace=True)
print('删除后:',data.shape[0])
data.to_csv('UserBehavior_v1.csv',index=False)

缺失值处理

淘宝用户行为分析+python可视化_第3张图片

数据转换

#处理time 转换成字符串日期

def fun_date(s):
    t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(s))
    return pd.Series([t,t[8:10],t[11:13],t[14:16],t[17:]],index=['date','day','hour','minute','second'])

data[['date','day','hour','minute','second']] = data['time'].apply(lambda s:fun_date(s))
data['week'] = data['date'].map(lambda s:datetime.date(int(s[:4]), int(s[5,7]), int(s[8:10]).isocalendar())
data['week'] = data['week'].map(lambda s:s[2])

漏斗指标分析

用户购买流程主要分为:

  1. 浏览->购买
  2. 浏览->对商品产生兴趣->购买
    浏览到购买过程中商品的转化率:
data_cross = pd.crosstab([data['user_id'],data['goods_id']],data['behavior'])
a = data_cross[((data_cross['cart']+data_cross['fav'])==0) & (data_cross['buy']>0)].shape[0]
b = data_cross.shape[0]
print('直接购买:',a)
print('浏览:',b)
print('转化率:',fun_percent(a/b))

淘宝用户行为分析+python可视化_第4张图片
其中,直接购买商品中用户感兴趣的比例

direct_goods_buy = data_cross[((data_cross['cart']+data_cross['fav'])==0)&(data_cross['buy']>0)].reset_index()['goods_id'].nunique()
plt.pie([uninterested_goods_buy,direct_goods_buy-uninterested_goods_buy],labels=['不感兴趣','感兴趣'],autopct='%1.1f%%')
plt.title('直接购买商品中是否是用户感兴趣商品占比')

淘宝用户行为分析+python可视化_第5张图片
可以看出,用户直接购买的商品中大部分商品在销售中,不需要添加到购物车和收藏中。由此可以看出,精准推荐商品可以简化用户购买路径转化。

再来看看另一种转化情况

#每个环节不去重转化
c = data_cross[(data_cross['cart']+data_cross['fav'])>0].shape[0]
d = data_cross[((data_cross['cart']+data_cross['fav'])>0)&(data_cross['buy']>0)].shape[0]
df_funnel = pd.DataFrame([[b],[c],[d]],columns=['count'])
df_funnel['单一转化率'] = [1]+list(np.array(df_funnel['count'][1:])/np.array(df_funnel['count'][:-1]))
df_funnel['总体转化率'] = [1]+list(np.array(df_funnel['count'][1:])/np.array(df_funnel['count'][0]))
df_funnel['单一转化率'] = df_funnel['单一转化率'].map(fun_percent)
df_funnel['总体转化率'] = df_funnel['总体转化率'].map(fun_percent)

funnel = Funnel("漏斗图", "转化率(%)", width=600, height=400, title_pos='center')
funnel.add("商品交易行环节",
           ['浏览商品','加入购物车或收藏','购买'],
           df_funnel['总体转化率'].map(lambda s:float(s[:-1])),
           label_pos="inside",is_label_show=True,
           legend_pos='left',legend_orient='vertical')
funnel.render('funnel.html')

df_funnel

淘宝用户行为分析+python可视化_第6张图片
在这里插入图片描述
从浏览到加购/收藏的转化极低,由此产生了以下假设:
淘宝用户行为分析+python可视化_第7张图片

先来验证第一个猜测

#商品质量偏低,无法满足用户购物需求
#查看商品中用户感兴趣量占比
data['bh'] = data['behavior'].map(lambda s:'cart_fav' if s in ['cart','fav'] else s)
goods_num = data['goods_id'].nunique()
interested_goods = data[data['bh']=='cart_fav']['goods_id'].nunique()
uninterested_goods_buy = data[(data['goods_id'].isin(list(set(data['goods_id'])-set(data[data['bh']=='cart_fav']['goods_id']))))&(data['bh']=='buy')]['goods_id'].nunique()

plt.pie([interested_goods,goods_num-interested_goods-uninterested_goods_buy,uninterested_goods_buy],
        labels=['感兴趣','不感兴趣不购买','不感兴趣直接购买'],autopct='%1.1f%%')

淘宝用户行为分析+python可视化_第8张图片
由此可以看出,有95.7%的商品用户不感兴趣也不想购买。商品的购买率极低
考虑到同品类商品内部之间会存在一个竞品关系,再看一下商品品类中的购买率情况

item_num = data['item_id'].nunique()
interested_item = data[data['bh']=='cart_fav']['item_id'].nunique()
uninterested_item_buy = data[(data['item_id'].isin(list(set(data['item_id'])-set(data[data['bh']=='cart_fav']['item_id']))))&(data['bh']=='buy')]['item_id'].nunique()

plt.pie([interested_item,item_num-interested_item-uninterested_item_buy,uninterested_item_buy],
        labels=['感兴趣','不感兴趣不购买','不感兴趣直接购买'],autopct='%1.1f%%')
plt.title('商品品类中用户是否感兴趣占比')

淘宝用户行为分析+python可视化_第9张图片
61.4%的商品品类是用户不感兴趣也不想购买的,可能是因为

  1. 上架商品品类比较冷门,需求量低
  2. 上架商品不是当季畅销
    建议:要审核商品质量,考虑是否下架冷门商品,节省流量资源

接下来,验证第二个假设

#平台推荐商品与用户需求不一致
#购买用户数最多的top20商品
topbuy_goods = data[data['behavior']=='buy'].groupby('goods_id')['user_id'].nunique().to_frame(name='count').sort_values('count',ascending=False)
topbuy_goods[:20].plot.bar()

淘宝用户行为分析+python可视化_第10张图片

#访问用户数最多的top20商品
toppv_goods = data[data['behavior']=='pv'].groupby('goods_id')['user_id'].nunique().to_frame(name='count').sort_values('count',ascending=False)
toppv_goods[:20].plot.bar()

淘宝用户行为分析+python可视化_第11张图片
重复商品数为2
再看一下商品品类

#平台推荐商品与用户需求不一致
#购买用户数最多的top20商品品类
topbuy_item = data[data['behavior']=='buy'].groupby('item_id')['user_id'].nunique().to_frame(name='count').sort_values('count',ascending=False)
topbuy_item[:20].plot.bar()

淘宝用户行为分析+python可视化_第12张图片

#访问用户数最多的top20商品品类
toppv_item = data[data['behavior']=='pv'].groupby('item_id')['user_id'].nunique().to_frame(name='count').sort_values('count',ascending=False)
toppv_item[:20].plot.bar()

淘宝用户行为分析+python可视化_第13张图片
得出结论:
在商品品类推荐上,有16个重复,商品推荐,重复数为仅为2。
商品推荐算法存在很大漏洞,没有把握住用户对商品的偏爱影响因素,造成流量资源的浪费
从用户购买的商品品类和商品上看,用户对商品的购买还是比较集中的,可以考虑加大该品类商品的推荐

#用户感兴趣商品中,仅加购、仅收藏、加购+收藏占比,以及到购买的转化率
l = [[data_cross[(data_cross['cart']>0)&(data_cross['fav']==0)].shape[0],
      data_cross[(data_cross['cart']>0)&(data_cross['fav']==0)&(data_cross['buy']>0)].shape[0]],
     [data_cross[(data_cross['cart']==0)&(data_cross['fav']>0)].shape[0],
      data_cross[(data_cross['cart']==0)&(data_cross['fav']>0)&(data_cross['buy']>0)].shape[0]],
     [data_cross[(data_cross['cart']>0)&(data_cross['fav']>0)].shape[0],
      data_cross[(data_cross['cart']>0)&(data_cross['fav']>0)&(data_cross['buy']>0)].shape[0]]]
df_ = pd.DataFrame(l,columns=['count','buy_count'],index=['仅加购','仅收藏','加购+收藏'])
df_['rate'] = df_['buy_count']/df_['count']

淘宝用户行为分析+python可视化_第14张图片
顾客浏览转化到加购的用户偏多,并且加购转化到购买的用户转化率比较大
加购和收藏对购买的转化有叠加效应
总的来说,对购买转化的影响程度上:加购+收藏>仅加购>仅收藏

用户行为数据分析

(1)流量指标:pv,uv,日活跃户数(定义发生购买行为为活跃用户)

#pv
df_ = data[data['bh']=='pv'].groupby(['day','week']).count().reset_index().groupby('week')['user_id'].mean()
df_.plot.bar()

淘宝用户行为分析+python可视化_第15张图片

#uv
df_ = data[data['bh']=='pv'].groupby(['day','week'])['user_id'].nunique().reset_index().groupby('week')['user_id'].mean()
df_.plot.bar()

淘宝用户行为分析+python可视化_第16张图片

#日活用户数
df_ = data[data['bh']=='buy'].groupby(['day','week'])['user_id'].nunique().reset_index().groupby('week')['user_id'].mean()
df_.plot.bar()

淘宝用户行为分析+python可视化_第17张图片

#总体活跃用户占比
plt.pie([data['user_id'].nunique(),data[data['bh']=='buy']['user_id'].nunique()],labels=['购买','未购买'],autopct='%1.1f%%')

淘宝用户行为分析+python可视化_第18张图片
得出结论:到了周末的时候,访问用户数购买用户数都有所提高
周一、周四购买用户数有提高的原因可能是临近双十二,预售活动开启

(2)按照天、时间段维度分析用户活跃时间

#pv
df_ = data[data['bh']=='pv'].groupby(['hour'])['user_id'].count()
df_.plot.bar()

淘宝用户行为分析+python可视化_第19张图片

#uv
df_ = data[data['bh']=='pv'].groupby(['hour'])['user_id'].nunique()
df_.plot.bar()

淘宝用户行为分析+python可视化_第20张图片

#日活用户数
df_ = data[data['bh']=='buy'].groupby(['hour'])['user_id'].nunique()
df_.plot.bar()

淘宝用户行为分析+python可视化_第21张图片
一天当中,1:00至7:00睡眠时间,用户数很少;19:00~23:00是用户活跃时间段
7:00至16:00 工作时间,pv明显有所下降,uv下降幅度比较小,可能大家上班都会刷刷淘宝,但是浏览页面不怎么频繁
用户购买发生在10:0016:00,20:0022:00的比较多

(3) pv次数与是否购买的关系

#pv次数与用户购买关系
df_ = data[data['behavior']=='pv'].groupby(['user_id','goods_id'])['bh'].count().to_frame('pv')
df__ = data[data['behavior']=='buy'].groupby(['user_id','goods_id'])['bh'].count().to_frame('buy')
df_ = df_.join(df__)
df_['buy'] = df_['buy'].map(lambda s:1 if s >0 else 0)
df = df_.groupby(['pv'])['buy'].count().to_frame('count')
df['buy'] = df_.groupby(['pv'])['buy'].sum()
df.plot.bar()
df.reset_index(inplace = True)
df['pv'] = df['pv'].map(lambda s: 5 if s>5 else s)
sns.lineplot(x=df['pv'],y=df['buy']/df['count'])

淘宝用户行为分析+python可视化_第22张图片
浏览次数越多,购买的几率越大

用户价值分析

(1)复购率

df_ = data[(data['bh']=='buy')&(data['user_id'].isin(data[data['day']==25]['user_id']))&(data['day']!=3)].groupby(['user_id'])['goods_id'].count().to_frame(name='count')
plt.pie([df_[df_['count']>2].shape[0],df_[df_['count']==1].shape[0]],labels=['复购','只够买一次'],autopct='%1.1f%%')

在这里插入图片描述

(2)RFM模型对用户分层

#RFM对用户分层
#以2017-12-04日为观察点,计算R值
df = pd.DataFrame()
df['user_id'] = data['user_id'].unique()
df_ = data[data['bh']=='buy']
df_['day'] = df_['day'].map({25:9,26:8,27:7,28:6,29:5,30:4,1:3,2:2,3:1})
df_ = df_.groupby('user_id').agg({'day':min,'goods_id':'count'}).reset_index()
df = pd.merge(df,df_,how='left',on='user_id')
df.fillna(0,inplace=True)
df['day'] = df['day'].map(lambda s:int(s>=df['day'].mean()))
df['goods_id'] = df['goods_id'].map(lambda s:int(s>=df['goods_id'].mean()))
df = df.groupby(['day','goods_id'])['user_id'].count()
plt.pie(df,labels=['重要挽留客户','重要发展客户','重要高价值客户'],autopct='%1.1f%%')

淘宝用户行为分析+python可视化_第23张图片

总结

淘宝用户行为分析+python可视化_第24张图片

完整代码

github

你可能感兴趣的:(Kaggle,数据分析,python)