电商用户行为分析

2021/6/6 18:52:38

本文主要是介绍电商用户行为分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

项目背景

本数据报告以某电商用户行为数据为数据集,通过行业的指标对淘宝用户行为进行分析,从而探索某电商用户的行为模式,具体指标包括:日PV和日UV分析,付费率分析,漏斗流失分析和用户价值RFM分析。

理解数据

本数据集为某电商2014年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 np
import matplotlib.pyplot as plt
import seaborn as sns
# 去除警告日志提醒的显示
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
#解决中文乱码等显示问题
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
%config InlineBackend.figure_format = 'svg'
data = pd.read_csv(r"D:\学习\数据分析项目\淘宝用户行为分析\tianchi_mobile_recommend_train_user\tianchi_mobile_recommend_train_user.csv")
data.head()
user_iditem_idbehavior_typeuser_geohashitem_categorytime
0980478372324315621NaN42452014-12-06 02
1977261363835835901NaN58942014-12-09 20
298607707647497121NaN28832014-12-18 11
398662432320593836196nn52n65622014-12-06 10
4981459082902085201NaN139262014-12-16 21

缺失值处理

data.isnull().sum()
user_id                0
item_id                0
behavior_type          0
user_geohash     8334824
item_category          0
time                   0
dtype: int64
data.fillna('miss',inplace=True)

标准化处理

#拆分数据集
import re
data['date'] = data['time'].map(lambda s: re.compile(' ').split(s)[0])
data['hour'] = data['time'].map(lambda s: re.compile(' ').split(s)[1])
data.head()
user_iditem_idbehavior_typeuser_geohashitem_categorytimedatehour
0980478372324315621miss42452014-12-06 022014-12-0602
1977261363835835901miss58942014-12-09 202014-12-0920
298607707647497121miss28832014-12-18 112014-12-1811
398662432320593836196nn52n65622014-12-06 102014-12-0610
4981459082902085201miss139262014-12-16 212014-12-1621
data.dtypes
user_id           int64
item_id           int64
behavior_type     int64
user_geohash     object
item_category     int64
time             object
date             object
hour             object
dtype: object
#将time列和date列转化为日期类数据类型,hour列应该是字符串数据类型。
#数据类型转化
data['date']=pd.to_datetime(data['date'])
data['time']=pd.to_datetime(data['time'])
data['hour']=data['hour'].astype('int64')
data.dtypes
user_id                   int64
item_id                   int64
behavior_type             int64
user_geohash             object
item_category             int64
time             datetime64[ns]
date             datetime64[ns]
hour                      int64
dtype: object
data = data.sort_values(by='time',ascending=True)#排序处理
data = data.reset_index(drop=True)#建立索引
data
user_iditem_idbehavior_typeuser_geohashitem_categorytimedatehour
0734627153784852331miss91302014-11-18 00:00:002014-11-180
1360901372367481151miss105232014-11-18 00:00:002014-11-180
2404597331552181771miss85612014-11-18 00:00:002014-11-180
38141991498085241miss90532014-11-18 00:00:002014-11-180
411330998257308611miss37832014-11-18 00:00:002014-11-180
...........................
122569011326530971199460622miss60542014-12-18 23:00:002014-12-1823
122569021300825532961968191miss115322014-12-18 23:00:002014-12-1823
122569034359294535059483219rhhgph95412014-12-18 23:00:002014-12-1823
12256904128337991869939381954g37v37982014-12-18 23:00:002014-12-1823
1225690577522552692921911miss8892014-12-18 23:00:002014-12-1823

12256906 rows × 8 columns

用户行为分析

PV(访问量):即Page View, 具体是指网站的是页面浏览量或者点击量,页面被刷新一次就计算一次。

UV(独立访客):即Unique Visitor,访问网站的一台电脑客户端为一个访客。

日访问量分析

#pv_daily记录每天用户操作次数,uv_daily记录每天不同的上线用户数量
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,axes=plt.subplots(2,1)
pv_daily.plot(x='date',y='pv',ax=axes[0])
uv_daily.plot(x='date',y='uv',ax=axes[1])
axes[0].set_title('pv_daily')
axes[1].set_title('uv_daily')

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBAgcDfI-1622973943355)(output_20_0.svg)]

结果显示如上图所示,在双十二期间,pv和uv访问量达到峰值,并且可以发现,uv和pv两个访问量数值差距比较大。

小时访问量分析

#pv_hour记录每小时用户操作次数,uv_hour记录每小时不同的上线用户数量
pv_hour = data.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
uv_hour = data.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
fig,axes = plt.subplots(2,1,sharex=True)
pv_hour.plot(x='hour',y='pv',ax=axes[0])
uv_hour.plot(x='hour',y='uv',ax=axes[1])
axes[0].set_title('pv_hour')
axes[1].set_title('uv_hour')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1j8lVeP-1622973943358)(output_24_0.svg)]

pv和uv在凌晨0-5点期间波动情况相同,都呈下降趋势,访问量在5点时达到最低点,同时在晚上18:00左右,pv波动情况比较剧烈,相比来看uv不太明显,可以看出晚上18:00以后是淘宝用户访问app的活跃时间段。

不同行为类型用户pv分析

pv_detail = data.groupby(['behavior_type','hour'])['user_id'].count().reset_index().rename(columns={'user_id':'total_pv'})
fig,axes = plt.subplots(2,1,sharex=True)
sns.pointplot(x='hour',y='total_pv',hue='behavior_type',data=pv_detail,ax=axes[0])
sns.pointplot(x='hour',y='total_pv',hue='behavior_type',data=pv_detail[pv_detail.behavior_type!=1],ax=axes[1])

axes[0].set_title('pv_different_behavior_type')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqFfqC3G-1622973943359)(output_27_0.svg)]

图表显示:点击这一用户行为相比较于其他三类用户行为,pv访问量较高,同时四种用户行为的波动情况基本一致,因此晚上这一时间段不管哪一种用户行为,pv访问量都是最高的。

用户消费行为分析

用户购买次数情况分析

data_buy=data[data.behavior_type==4].groupby('user_id')['behavior_type'].count()
sns.displot(data_buy)
plt.title('daily_buy')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lyn1wHRu-1622973943361)(output_31_0.svg)]

data_buy=data[data.behavior_type==4].groupby('user_id')['behavior_type'].count().reset_index().rename(columns={'behavior_type':'buy_count'})
data_buy.describe()
user_idbuy_count
count8.886000e+038886.000000
mean7.152087e+0713.527459
std4.120719e+0719.698786
min4.913000e+031.000000
25%3.567731e+074.000000
50%7.238800e+078.000000
75%1.071945e+0817.000000
max1.424559e+08809.000000
bins = [1,10,20,50]
data_buy['buy_count_cut'] = pd.cut(data_buy['buy_count'],bins,labels = ['1-10','10-20','20-50'])
buy_count_cut = data_buy['buy_count_cut'].value_counts()
buy_count_cut
1-10     4472
10-20    1972
20-50    1417
Name: buy_count_cut, dtype: int64

淘宝用户消费次数普遍在10次以内,因此需要重点关注购买次数在10次以上的消费者用户群体。

付费率

付费率=消费人数/活跃用户人数

data.groupby('date').apply(lambda x:x[x.behavior_type==4].count()/len(x.user_id.unique())).plot()
plt.title('付费率')
Text(0.5, 1.0, '付费率')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBCz9Ia0-1622973943363)(output_37_1.svg)]

每天活跃用户人群中,大概6%的用户具有消费行为,在双十二期间消费用户人数最多。

漏斗流失分析

浏览主页——点击商品——加入购物车&收藏——开始支付——完成购买

data_user = data.groupby(['behavior_type']).count()
data_user.head()
user_iditem_iduser_geohashitem_categorytimedatehour
behavior_type
111550581115505811155058111550581115505811155058111550581
2242556242556242556242556242556242556242556
3343564343564343564343564343564343564343564
4120205120205120205120205120205120205120205
pv_all=data['user_id'].count()
print(pv_all)
12256906

总浏览量:12256906
点击量:11550581
收藏量+加购量:242556+343564= 586120
购买量:120205

点击量-购买意向 流失率:94.93%

购买意向-购买量 流失率:79.49%

在本数据集中,缺少“下单”的用户行为数据,所以无法分析出用户下单到最终付款完后完成的流失率。
同时,因为收藏与加购两个用户行为并不存在上下级关系,所以合并为购买意向进行分析。

用户价值度RFM模型分析

RFM的含义:

R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。
F(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。
from datetime import datetime
datenow=datetime(2014,12,20)
#每位用户最近购买时间
recent_buy_time=data[data.behavior_type==4].groupby('user_id').date.apply(lambda x:datetime(2014,12,20)-x.sort_values().iloc[-1]).reset_index().rename(columns={'date':'recent'})
#每个用户消费频率
buy_freq=data[data.behavior_type==4].groupby('user_id').date.count().reset_index().rename(columns={'date':'freq'})
rfm=pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id',how='outer')
#对各维度进行打分
rfm['recent_value']=pd.qcut(rfm.recent,2,labels=['2','1'])
rfm['freq_value']=pd.qcut(rfm.freq,2,labels=['1','2'])
rfm['rfm']=rfm['recent_value'].str.cat(rfm['freq_value'])
rfm.head()
user_idrecentfreqrecent_valuefreq_valuerfm
049134 days62121
161183 days12121
275287 days61111
375917 days211212
4126456 days82121
from datetime import datetime
datenow=datetime(2014,12,20)
#每位用户最近购买时间
recent_buy_time=data[data.behavior_type==4].groupby('user_id').date.apply(lambda x:datetime(2014,12,20)-x.sort_values().iloc[-1]).reset_index().rename(columns={'date':'recent'})
#每个用户消费频率
buy_freq=data[data.behavior_type==4].groupby('user_id').date.count().reset_index().rename(columns={'date':'freq'})
rfm=pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id',how='outer')

#对各维度进行打分
rfm['recent_value']=pd.qcut(rfm.recent,2,labels=['2','1'])
rfm['freq_value']=pd.qcut(rfm.freq,2,labels=['1','2'])
rfm['rfm']=rfm['recent_value'].str.cat(rfm['freq_value'])
rfm.head()
user_idrecentfreqrecent_valuefreq_valuerfm
049134 days62121
161183 days12121
275287 days61111
375917 days211212
4126456 days82121

因为本数据集没有提供消费金额,因此只能R和F进行用户价值分析。
通过RF用户价值分析,对于22用户,为重点用户需要关注;对于21这类忠诚度高而购买频率不足的,可以通过活动优惠券等方式提高用户的购买频率;对于12这类忠诚度不高而消费频率低的用户,需要关注他们的购物习性,多做推送,做精准化营销。

rfm.groupby(['rfm']).count()
user_idrecentfreqrecent_valuefreq_value
rfm
1127672767276727672767
1212191219121912191219
2117211721172117211721
2231793179317931793179
rfm_count = rfm['rfm'].value_counts()
plt.figure(figsize=(8,8))
plt.pie(rfm_count.values,labels=rfm_count.index,autopct='%.2f%%',
       wedgeprops={'linewidth':0.5,'edgecolor':'green'},
       textprops={'fontsize':30,'color':'#003371'}
       ) 
plt.title('RFM',size=30)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DjMuyIDt-1622973943364)(output_51_0.svg)]


                   

这篇关于电商用户行为分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程