Python 淘宝用户行为分析

一、项目介绍

利用淘宝平台提供的数据集,通过业务指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括:日PV和日UV分析,复购行为分析,漏斗流失分析和用户价值RFM分析。

二、理解数据

属性值说明:

  • user_id:用户身份
  • item_id:商品ID
  • behavior_type:用户行为类型(包含点击、收藏、加购物车、支付四种行为,分别用数字1、2、3、4表示)
  • user_geohash:地理位置
  • item_category:品类ID(商品所属的品类)
  • time:用户行为发生的时间
    注:数据经过脱敏处理,地理位置作用不大,剔除掉。

三、数据准备

'''
数据清洗:有无缺失、特征筛选、变量类型转换
'''
import pandas as pd

data = pd.read_csv('old_user.csv')
data.pop('user_geohash')
data['date'] = data['time'].map(lambda x: x.split(' ')[0])
data['hour'] = data['time'].map(lambda x: x.split(' ')[1])
data.pop('time')
print(data.info())
data['date'] = pd.to_datetime(data['date'])
data['hour'] = data['hour'].astype('int32')
data.isnull().sum()
data.to_csv('new_user.csv', index=False)

四、用户行为分析

# 读取数据
data = pd.read_csv('new_user.csv')
data.head(10)
# 总浏览量(PV)、访问用户数(UV)
print('总的浏览量是',data['user_id'].shape[0])
print('访问用户数是',len(data['user_id'].unique()))
print('每个UV平均访问深度',data['user_id'].shape[0]/len(data['user_id'].unique()))
print('每个UV每日平均访问深度',data['user_id'].shape[0]/len(data['user_id'].unique())/len(data['date'].unique()))
# 日浏览总量
pv_daily = data.groupby(['date'])['user_id'].count().reset_index(name='pv')
# 日访问人数
uv_daily = data.groupby(['date'])['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
x_major_locator = plt.MultipleLocator(4)
fig,ax = plt.subplots(2,1,figsize=(10,8))
ax[0].plot(pv_daily['date'], pv_daily['pv'])
ax[0].set_xlabel('date')
ax[0].set_ylabel('pv')
ax[0].xaxis.set_major_locator(x_major_locator)
ax[1].plot(uv_daily['date'], uv_daily['uv'])
ax[1].set_xlabel('date')
ax[1].set_ylabel('uv')
ax[1].xaxis.set_major_locator(x_major_locator)
图1.png

结果表明:

  • PV和UV在双十二达到高峰
  • UV和PV两个访问量数值差距比较大
  • PV和UV在双十二前后两天波动较大,其余时间段期间趋势走向大体一致,整体比较平稳
# 每个时刻的pv
pv_hour = data.groupby(['hour'])['user_id'].count().reset_index(name='pv')
# 每个时刻的uv
uv_hour = data.groupby(['hour'])['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
fig,ax = plt.subplots(2,1,figsize=(10,8))
x_major_locator = plt.MultipleLocator(1)
ax[0].plot(pv_hour['hour'], pv_hour['pv'])
ax[0].set_xlabel('hour')
ax[0].set_ylabel('pv')
ax[0].xaxis.set_major_locator(x_major_locator)
ax[1].plot(uv_hour['hour'], uv_hour['uv'])
ax[1].set_xlabel('hour')
ax[1].set_ylabel('uv')
ax[1].xaxis.set_major_locator(x_major_locator)
图2.png

结果表明:

  • 晚上凌晨之后(0-5),用户都会去睡觉,PV\UV下降显著,早晨6点之后,PV\UV显著上升,在10点左右达到高峰。
  • UV10点以后一直比较稳定,PV18点以后迅速上涨,在21点左右涨幅一倍多。说明淘宝用户的活跃时段在18-22点左右,活跃人数在10-22点比较稳定。

五、漏斗流失分析

# 漏斗模型分析,统计各阶段的转化人数
# 点击——>收藏——>加入购物车——>支付
user = data.groupby('behavior_type')['user_id'].unique().map(lambda x: len(x)).reset_index(name='uv')
print(f'整个过程流失率:{round((user.uv[0]-user.uv[3])*100/user.uv[0],2)}%')
图3.png

结果表明:

  • 从电商链路的角度分析,收藏应该在加购前一步,加购在支付之前,但从UV来看,加购、支付的UV反而更高。
  • 原因分析:首先,收藏与加购在功能上存在一定重叠,用户相比收藏更偏爱用加购的方式表达购买意愿。其次,用户可能有时倾向于直接支付购买,不会加入购物车统一下单支付购买,不过这两者差距不是很大,不用着重分析,只是爱好习惯不同
  • 用户建议:收藏是否可以进一步细化功能,通过收藏夹管理,自定义标注等方式区别于加购的功能
  • 收藏相比加购到支付的流失率更低,说明收藏相比加购转化的成功率更高,可以进一步挖掘偏爱用收藏支持购物决策的人群特点

六、复购情况分析

# 用户复购分析(同一天内的购买不算复购)
d1 = data[data['behavior_type'] == 4]
total = len(d1['user_id'].unique())
d2 = d1.groupby('user_id')['date'].unique().map(lambda x: len(x)).reset_index(name='count')
part = len(d2[d2['count'] > 1])
print(f'复购率为:{round(part/total,4)*100}%')

# 复购次数分布
d3 = d2[d2['count'] > 1]
sns.distplot(d3['count'])

# 复购间隔分布(本次购买与下次购买间隔)
distance = list()
for i in d3['user_id']:
    d4 = d1.groupby(by=['user_id'])['date'].get_group(i)
    d4 = pd.DataFrame(d4.values,columns=['date']).sort_values(by = 'date')
    d4['date'] = pd.to_datetime(d4['date'])
    for j in range(len(d4)-1):
        flag = (d4.iloc[j+1,0] - d4.iloc[j,0]).days
        if flag:
            distance.append(flag)
sns.distplot(distance)
图4.png

图5.png

结果表明:

  • 大多数用户的复购次数在2~10次之间
  • 复购集中在购买后10天内,尤以1-5天为高峰期

七、用户价值RFM分析

用户分类规则

用户分类 recency frequency
重要价值客户
重要保持客户
重要发展客户
流失客户

分值规则

打分 recency frequency
4 5天以内 20次以上
3 10-15天 10-20次
2 5-10天 5-10次
1 15天以上 5次以下
# 用户类别划分,RFM模型
# money 在一段时期内的采购总金额(数据缺失)
from datetime import datetime
datenow=datetime(2014,12,19)
d5 = d1.copy()
d5['date'] = pd.to_datetime(d5['date'])
d5['date'] = d5['date'].map(lambda x: (datenow-x).days)
d5.rename(columns={'date':'recency'},inplace=True)
d6 = d5.groupby('user_id')['recency'].min().reset_index()
d6['frequency'] = d2['count']

def rscore(x):
    if x < 5:
        score = 4
    elif 5 <= x < 10:
        score = 2
    elif 10 <= x < 15:
        score = 3
    else:
        score = 1
    return score
d6['rscore'] = d6['recency'].map(rscore)
def fscore(x):
    if x > 20:
        score = 4
    elif 5 <= x < 10:
        score = 2
    elif 10 <= x < 20:
        score = 3
    else:
        score = 1
    return score
d6['fscore'] = d6['frequency'].map(fscore)
def rfm(x,y):
    if x > 2 and y > 2:
        label = '重要价值客户'
    elif x <= 2 and y >= 2:
        label = '重要保持客户'
    elif x >= 2 and y <= 2:
        label = '重要发展客户'
    else:
        label = '流失客户'
    return label
d6['level'] = d6[['rscore','fscore']].apply(lambda x: rfm(*x), axis=1)
print(d6['level'].value_counts())
图6.png
  • 重要价值客户:予以关注并维护
  • 重要保持用户:近期消费频次低。予以相应的价格刺激,如折扣和捆绑销售等增加用户的购买频率
  • 重要发展用户:远期消费频次高。产品卖点刺激,品牌灌输等加强他们对品牌的认可,提高忠诚度
  • 流失客户:需分析流失原因

学习的脚步永无止境!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344