<<返回python首页 python

《Python 应用案例》

淘宝移动端用户客户价值分析

本节将对淘宝用户分析使用。2014年是阿里巴巴集团移动电商业务快速发展的一年,例如2014双11大促中移动端成交占比达到42.6%,超过240亿元。相比PC时代,移动端网络的访问是随时随地的,具有更丰富的场景数据,比如用户的位置信息、用户访问的时间规律等。 本节是在天池举办的阿里巴巴移动电商平台的真实用户-商品行为数据为基础,同时提供移动时代特有的位置信息,用户需要通过大数据和算法构面向建移动电子商务的商品推荐模型。并能够挖掘出数据背后丰富的内涵,为移动用户在合适的时间、合适的地点精准推荐合适的内容。

淘宝移动端用户客户价值分析

项目背景

本项目以淘宝APP的用户行为数据作为分析对象,从流量指标、转化指标、营运指标、会员指标等角度进行指标的统计分析和一些建模分析。由于品类和地区的字段被处理过了,因此项目分析的重点放在电商链路分析中。

数据集介绍

本数据集共有104万条左右数据,数据为淘宝APP2014年11月18日至2014年12月18日的用户行为数据,共计6列字段,列字段分别是:

user_id:用户身份,脱敏

item_id:商品ID,脱敏

behavior_type:用户行为类型(包含点击、收藏、加购物车、支付四种行为,分别用数字1、2、3、4表示)

user_geohash:地理位置

item_category:品类ID(商品所属的品类)

time:用户行为发生的时间

导入相关库及数据

import pandas as pd
import numpy as py
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv('/share/datasets/tianchi_mobile_recommend_train_user.csv')
data.head()

数据清洗

1、数据总体情况

# 这里因为item_category和user_geohash已经脱敏了缺少分析的意义,所以删除这两列
# apply()是一种让函数作用于列或者行操作,applymap()是一种让函数作用于DataFrame每一个元素的操作,而map是一种让函数作用于Series每一个元素的操作
import re
data = data[['user_id','item_id','behavior_type','time']]
data['date'] = data['time'].map(lambda x: x.split(' ')[0])
data['hour'] = data['time'].map(lambda x: x.split(' ')[1])
# act_dict = {1:'点击',2:'收藏',3:'加购物车',4:'支付'}
# df['act'] = df['behavior_type'].map(act_dict)
data.head()
data.shape
data.dtypes
data['date'] = pd.to_datetime(data['date'])
data['hour'] = data['hour'].astype('int32')
data.dtypes
data['user_id'].nunique()

2、缺失值处理

data.isnull().sum()

异常值处理

四个字段均不是连续数值型的,因此暂时不做异常值处理

流量指标分析

流量指标:指用户在该网站操作的每一个步骤记录的量化指标。 包括浏览量PV;独立访客数 UV (新访客数;回访客数) 针对每一个访客又可以用以下指标来衡量访客质量,包括: 1、平均在线时间—平均每个UV访问网页停留的时间长度。 2、平均访问深度—平均每个UV的pv数量 3、跳失率—浏览某个页面后就离开的访问次数/ 该页面的全部访问次数

# 周期内总的PV值
print('总的浏览量是%d'%data['user_id'].shape[0])
# 日均PV\UV
pv_daily = data.groupby(['date'])['user_id'].count().reset_index().rename(columns = {'user_id':'pv'})
uv_daily = data.groupby(['date'])['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns = {'user_id':'uv'})
fig,ax = plt.subplots(2,1)
pv_daily.plot('date','pv',ax=ax[0])
uv_daily.plot('date','uv',ax=ax[1])
data_drop = data[data['date']!='2014-12-12']
pv_daily = data_drop.groupby(['date'])['user_id'].count().reset_index().rename(columns = {'user_id':'pv'})
uv_daily = data_drop.groupby(['date'])['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns = {'user_id':'uv'})
fig,ax = plt.subplots(2,1,figsize=(10,6))
pv_daily.plot('date','pv',ax=ax[0])
uv_daily.plot('date','uv',ax=ax[1])

1、PV和UV在双十二达到高峰 2、PV和UV在11.18-11.28这段期间趋势走向大体一致,整体比较平稳,在双十二前后两天波动较大

# 每个时刻的pv,uv
pv_daily = data.groupby(['hour'])['user_id'].count().reset_index().rename(columns = {'user_id':'pv'})
uv_daily = data.groupby(['hour'])['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns = {'user_id':'uv'})
fig,ax = plt.subplots(2,1)
pv_daily.plot('hour','pv',ax=ax[0])
uv_daily.plot('hour','uv',ax=ax[1])

1、0-5点,PV\UV下降显著,在10点左右达到高峰。 2、UV10点以后一直比较稳定,PV18点以后迅速上涨,在21点左右涨幅一倍多。 说明淘宝用户的活跃时段在18-22点左右,活跃人数在10-22点比较稳定。

# 每个UV平均访问深度
round(data['user_id'].shape[0]/data['user_id'].nunique(),2)

每个UV的平均PV数是1225.69 每个UV的每日平均PV数是40.86

转化指标分析

用户在电商网站采购的完整链路可以拆解成以下几个环节: 点击—注册—收藏—客服—加购—下单—支付(可细分为渠道转化率;事件转化率;类目转化率;品牌转化率等)

# 漏斗模型
# 计算每一环用户行为的访问量
view = data.groupby(['behavior_type'])['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
print('点击-加购的流失率:%d'% round((view.pv[0]-view.pv[2])*100/view.pv[0],2)+'%')
print('点击-收藏的流失率:%d'% round((view.pv[0]-view.pv[1])*100/view.pv[0],2)+'%')
print('加购-支付的流失率:%d'% round((view.pv[2]-view.pv[3])*100/view.pv[2],2)+'%')
print('收藏-支付的流失率:%d'% round((view.pv[1]-view.pv[3])*100/view.pv[1],2)+'%')
view

1、从电商链路的角度分析,收藏应该在加购前一步,但从PV来看,加购的PV反而更高,可能是因为: 收藏与加购在功能上存在一定重叠,用户相比收藏更偏爱用加购的方式表达购买意愿。建议:收藏是否可以进一步细化功能,通过收藏夹管理,自定义标注等方式区别于加购的功能 2、收藏相比加购到支付的流失率更低,说明收藏相比加购转化的成功率更高,可以进一步挖掘偏爱用收藏支持购物决策的人群特点

营运指标

包括成交指标、订单指标、退货指标、效率指标、采购指标、库存指标、供应链指标等,由于项目重点是行为数据这里不具体阐述了。

# 成交指标
# 支付环节的总数
df = data[data['date']!='2014-12-12']
date_buy = df[df.behavior_type==4].groupby(['date'])['item_id'].count().reset_index()
hour_buy = df[df.behavior_type==4].groupby(['hour'])['item_id'].count().reset_index()
fig, ax = plt.subplots(2,1)
date_buy.plot('date','item_id',ax=ax[0])
hour_buy.plot('hour','item_id',ax=ax[1])
plt.subplots_adjust(wspace=5, hspace=1)
# plt.xticks((date_buy.index),pd.date_range('2014-11-18','2014-12-18'))

10-16点,18-22点是支付的高峰,看不出什么有用信息

会员指标

电商对会员的定义是只要注册即可,因此会员是由有消费行为的和潜在消费用户组成。 相关指标有注册会员数;活跃会员数;活跃会员比例;会员复购率;平均购买次数;会员回购率;会员留存率 复购率:在某时期内产生二次及二次以上购买的会员数 / 购买会员的总数 回购率:上一期末活跃会员在下一期时间内有购买行为的会员比例,与流失率是相对的概念 回购率与留存率的差别在与,留存是针对一个时间节点而言的,研究的是该时间点这一批次用户在接下来N天的留存情况, 回购是时间段之间的会员行为对比,衡量的是一段时间内会员相比上期是否流失

# 复购率(一天内下了两单不算复购吗?)
rebuy = data[data.behavior_type==4].groupby(['user_id'])['date'].apply(lambda x:x.nunique()).reset_index().rename(columns={'date':'num'})
rebuy_ratio = rebuy[rebuy.num>=2].shape[0]/rebuy.shape[0]
print('复购率是:%f'%rebuy_ratio)
# 所有时间间隔消费次数的分布
data_day_buy = data[data.behavior_type==4].groupby(['user_id','date']).item_id.count().reset_index()
data_user_buy4=data_day_buy.groupby('user_id').date.apply(lambda x:x.sort_values().diff(1).dropna())
data_user_buy4=data_user_buy4.map(lambda x:x.days)
data_user_buy4.value_counts().plot(kind='bar')
plt.title('time_gap')
plt.xlabel('gap_day')
plt.ylabel('gap_count')
# 不同用户的平均复购时间
import seaborn
sns.distplot(data_user_buy4.reset_index().groupby('user_id').date.mean())

复购集中在购买后10天内,尤以4-6天为高峰期

# RFM模型
from datetime import datetime
datenow=datetime(2014,12,19)
# recency 距离dateNow最近的一次支付时间
rec = data[data.behavior_type==4].groupby(['user_id'])['date'].apply(lambda x:(datenow-x.sort_values().iloc[-1]).days)
rec = rec.reset_index().rename({'date':'recency'})
# frequecy 在一段时期内的采购频率(30 day),一天内多次采购算作一次
fre = data[data.behavior_type==4].groupby(['user_id'])['date'].apply(lambda x: x.drop_duplicates().count()).reset_index().rename({'date':'frequency'})
# # money 在一段时期内的采购总金额(数据缺失)
# mon = data[data.behavior_type==4].groupby(['user_id'])['sales'].sum().reset_index().rename({'sales':'money'})
rfm = pd.merge(rec,fre,on='user_id',how='outer')
rfm.columns = ['user_id','recency','frequency']
#将各维度分成两个程度,基于等频分段,分数越高越好
# 这里rfm采用何种方式分段,分完后,rfm分到什么样的权重是需要细化的
# 注意 pd.cut()根据值的分布来划分;pd.qcut()根据值的频率来划分,每一组值的个数相同
rfm['recent_level'] = pd.qcut(rfm.recency,2,labels=['2','1'])
rfm['freq_level'] = pd.qcut(rfm.frequency,2,labels=['1','2'])
rfm['rfm']=rfm['recent_level'].str.cat(rfm['freq_level'])
rfm.describe()
def trans_value(x):
    if x == '22' :
        return '重要价值客户'
    elif x == '21':
        return '重要深耕客户'
    elif x == '12':
        return '重要唤回客户'
    else: 
        return '流失客户'
rfm['level']=rfm['rfm'].apply(lambda x:trans_value(x))
rfm['level'].value_counts()

总结

重要价值客户:予以关注并维护 重要深耕用户:近期消费频次低。予以相应的价格刺激,如折扣和捆绑销售等增加用户的购买频率 重要唤回用户:远期消费频次高。产品卖点刺激,品牌灌输等加强他们对品牌的认可,提高忠诚度 流失客户:因其数量占三分之一左右,需分析流失原因。

移动端设备除iPad Pro外,其它移动设备仅能阅读基础的文本文字。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。
您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。

狐狸教程 Copyright 2021

进入全屏