一、数据来源:https://tianchi.aliyun.com/competition/entrance/231522/introduction
二、分析内容(思路)
(一)用户的总体情况
- 每日的访客量、浏览量
- 每日的访客量、浏览量的日环比
- 每日收藏、加购和购买人数的趋势变化
(二)将数据拆分呈活动数据和日常数据
- 从小时的角度分析双十二这一天的用户行为
- 从小时的角度分析日常的用户活动行为
(三)购买率
(四)转化率-漏斗模型
(五)用户对商品的偏好分析
三、处理数据并进行可视化及分析
#1.导入并查看数据
import pandas as pd
user = pd.read_csv('D:/py4e/hejing/user/tianchi_fresh_comp_train_user.csv')
user.head( )
user.describe( )
# 2.处理数据
# 2.1 统计user表缺失值
user.isnull().sum()
注1:地理位置的缺失不此次用户行为的分析,故不作处理。
# 2.2查看user表重复值
user.duplicated().sum()
# 2.3将user表的time字段格式转化为datetime格式
user['time'] = pd.to_datetime(user['time'])
# 2.4提取日期和时间
user['date'] = user['time'].dt.date
user['month'] = user['date'].values.astype('datetime64[M]')
user['hour'] = user['time'].dt.hour
# 2.5转化userid、item_id、behavior_type数据类型
user['user_id'] = user['user_id'].astype('str')
user['item_id'] = user['item_id'].astype('str')
user['behavior_type'] = user['behavior_type'].apply(str)
# 3 数据可视化
# 3.1统计每日的pv和uv
pv = user[user['behavior_type'] == '1'].groupby(by = 'date')['behavior_type'].count()
uv = user[user['behavior_type'] == '1'].drop_duplicates(['user_id','date']).groupby(by = 'date')['user_id'].count()
pv.describe( )
uv.describe( )
# 3.2画出每日的pv和uv
from pyecharts.charts import Line
from pyecharts import options as opts
import numpy as np
from matplotlib import pyplot as plt
pv_line = Line().add_xaxis(xaxis_data = list(pv.index.astype(str))
).add_yaxis('pv',np.around(
pv.values/10000,decimals = 2),label_opts = opts.LabelOpts(is_show= False)
).add_yaxis(
# yaxis_index =1 ,y_axis是双坐标的设置
'uv',yaxis_index = 1, y_axis=np.around(uv.values/10000,decimals = 2),
label_opts = opts.LabelOpts(is_show = False) ).extend_axis(
yaxis=opts.AxisOpts(type_ = 'value',name = 'uv',
min_ = 0, max_ = 1.8, interval = 0.3,axislabel_opts= opts.LabelOpts(
formatter = '{value}万人'))).set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),),
yaxis_opts=opts.AxisOpts(
type_="value",
name="pv",min_=0,max_=100,
interval=20,
axislabel_opts=opts.LabelOpts(formatter="{value} 万次"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),title_opts=opts.TitleOpts(title="pv与uv趋势图")
)
pv_line.render_notebook()
结论1:
- 访客数和浏览量呈相同趋势变化,除去特殊节点,浏览量一般为46.8万,访客数为1.28万
- 在12月12日这一节点(节日活动的促销),浏览量有大幅的增长
# 3.3pv、uv差异分析(by day)
pv_uv = pd.concat([pv,uv],join = 'outer', ignore_index = False, axis= 1)
pv_uv.columns = ['pv_1','uv_1']
# 查看日环比
new_pv_uv = pv_uv.diff()
new_pv_uv
# 画出日环比
pv_uv_line = Line().add_xaxis(xaxis_data = list(new_pv_uv.index.astype(str))
).add_yaxis('新增pv',new_pv_uv.pv_1,label_opts = opts.LabelOpts(
is_show= False)).extend_axis(
yaxis=opts.AxisOpts(type_ = 'value',name = '新增uv',
min_ = -2000, max_ = 1600, interval = 400,axislabel_opts= opts.LabelOpts(
formatter = '{value}'))).set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),),
yaxis_opts=opts.AxisOpts(
type_="value",
name="新增pv",min_=-350000,max_=250000,
interval=100000,
axislabel_opts=opts.LabelOpts(formatter="{value}"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),title_opts=opts.TitleOpts(title="pv与uv差异分析")
)
pv_uv_line1 = Line().add_xaxis(xaxis_data = list(new_pv_uv.index.astype(str))
).add_yaxis('新增uv',new_pv_uv.uv_1,label_opts = opts.LabelOpts(
is_show= False))
new_line = pv_uv_line.overlap(pv_uv_line1)
new_line.render_notebook()
结论2:
- 这一个月,网站的访客数整体呈较稳定的数量
- 双十二这一节点,浏览量有特别大的波动,其他时间均在小范围内的波动
# 3.4用户行为分析
# 计算收藏、加购、购买人数
collect = user[user['behavior_type'] == '2'].groupby(by = 'date')['behavior_type'].count()
cart = user[user['behavior_type'] == '3'].groupby(by = 'date')['behavior_type'].count()
buy = user[user['behavior_type'] == '4'].groupby(by = 'date')['behavior_type'].count()
# 画出趋势收藏、加购和购买的趋势线
a = Line().add_xaxis(xaxis_data=list(collect.index.astype(str))
).add_yaxis(series_name = '收藏人数',y_axis= collect, label_opts = opts.LabelOpts(
is_show = False)).add_yaxis(series_name = '加购人数',y_axis = cart, label_opts = opts.LabelOpts(
is_show = False)).add_yaxis(series_name = '购买人数',y_axis = buy, label_opts = opts.LabelOpts(
is_show = False)).set_global_opts( title_opts = opts.TitleOpts(title = '不同时期用户行为数据'),tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"
))
a.render_notebook()
结论3:
- 收藏、加购和购买人数,三者的趋势变化相同,形状和pv、uv一致
- 在11月30日这一天,有一个小幅度的增长。猜测这一天,双十二活动已经前置,已进行相关营销活动吸引用户
# 4.把数据拆分成活动数据和日常数据
# ——由于数据里面包含双十二大促的数据,因此整理分析用户的不同时段行为可能会导致分析结果与实际差异较大,因此拆分开来做不同的对比分析
# 4.1把user的date列转换为datetime类型
user['date'] = pd.to_datetime(user['date'])
# 4.2选取活动数据子集和日常数据子集
acti = user[(user['date'] == '2014-12-12') | (user['date'] == '2014-12-11')]
daily = user[(user['date'] != '2014-12-12')& (user['date'] != '2014-12-11')]
# 4.3活动期间不同时段的用户行为分析
from pyecharts.charts import Bar
# 按照小时统计活动期间用户浏览、收藏、加购和购买的情况
pv_a = acti[acti['behavior_type'] == '1'].groupby(by = 'hour')['behavior_type'].count()
collect_a = acti[acti['behavior_type'] == '2'].groupby(by = 'hour')['behavior_type'].count()
cart_a = acti[acti['behavior_type'] == '3'].groupby(by = 'hour')['behavior_type'].count()
buy_a = acti[acti['behavior_type'] == '4'].groupby(by = 'hour')['behavior_type'].count()
pv_x = list(pv_a.index)
pv_y = list(pv_a)
pv_bar = Bar().add_xaxis(pv_x).add_yaxis(
'浏览量', pv_y, label_opts = opts.LabelOpts(is_show = False)).set_global_opts(
title_opts=opts.TitleOpts(title = '活动期间pv数据'))
pv_bar.render_notebook()
acti_line = Line().add_xaxis(xaxis_data = pv_x).add_yaxis(
'收藏',collect_a, label_opts=opts.LabelOpts(is_show = False)
).add_yaxis('加购', cart_a, label_opts=opts.LabelOpts(is_show = False)
).add_yaxis('购买', buy_a, label_opts = opts.LabelOpts(is_show = False)
).set_global_opts( title_opts = opts.TitleOpts(
title = '活动期间用户行为'),tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"))
acti_line.render_notebook()
结论4:
- 活动期间,用户一般在21点至23点登录网站浏览商品
- 活动期间,0点时网站的订单成交量达到最大值
# 4.4日常期间不同时段的用户行为分析
# 4.41按小时统计不同时段的用户行为
pv_d = daily[daily['behavior_type'] == '1'].groupby('hour')['behavior_type'].count()
collect_d = daily[daily['behavior_type'] == '2'].groupby('hour')['behavior_type'].count()
cart_d = daily[daily['behavior_type'] == '3'].groupby('hour')['behavior_type'].count()
buy_d = daily[daily['behavior_type'] == '4'].groupby('hour')['behavior_type'].count()
pv_d_x = list(pv_d.index)
pv_d_y = list(pv_d)
pv_d_bar = Bar().add_xaxis(xaxis_data = pv_d_x).add_yaxis(
'浏览量',pv_d_y,label_opts = opts.LabelOpts(is_show = False)).set_global_opts(
title_opts=opts.TitleOpts(title = '日常期间pv数据'))
pv_d_bar.render_notebook()
daily_line = Line().add_xaxis(xaxis_data = pv_d_x).add_yaxis(
'收藏',collect_d,label_opts=opts.LabelOpts(is_show = False)).add_yaxis(
'加购',cart_d,label_opts=opts.LabelOpts(is_show = False)).add_yaxis(
'购买',buy_d, label_opts=opts.LabelOpts(is_show = False)
).set_global_opts( title_opts = opts.TitleOpts(
title = '日常期间用户行为'),tooltip_opts=opts.TooltipOpts(
is_show=True,trigger="axis",axis_pointer_type="cross"))
daily_line.render_notebook()
结论5:
- 与大促时间不同,大促期间,0点是用户购买的高峰,而在日常期间,21点是用户购买的高峰期
- 不管是大促期间还是在日常期间,用户都更习惯在21点至22点浏览商品
# 4.42统计活动及日常期间用户的购买率
# 活动期间
acti_b_num = acti[acti['behavior_type'] == '4'].drop_duplicates(['user_id','hour']).groupby('hour')['user_id'].count()
acti_num = acti.drop_duplicates(['user_id','hour']).groupby('hour')['user_id'].count()
acti_rate = round(acti_b_num/acti_num,2)
# 日常期间
daily_b_num = daily[daily['behavior_type'] == '4'].drop_duplicates(['user_id','hour']).groupby('hour')['user_id'].count()
daily_num = daily.drop_duplicates(['user_id','hour']).groupby('hour')['user_id'].count()
daily_rate = round(daily_b_num/daily_num,2)
# 画出趋势曲线
buy_rate = Line().add_xaxis(list(acti_num.index)).add_yaxis(
'活动购买率', acti_rate, label_opts=opts.LabelOpts(is_show = True)
).add_yaxis('日常购买率', daily_rate, label_opts= opts.LabelOpts(is_show = True)
).set_global_opts(title_opts=opts.TitleOpts(title = '不同时段购买率'),
tooltip_opts=opts.TooltipOpts(is_show = True, trigger = 'axis',
axis_pointer_type="cross"))
buy_rate.render_notebook()
结论6:
- 日常时的购买率最高的出现在上午10点到下午15点间,还有晚上的20点至22点
- 活动期间的0点时购买率最高的时间,但是明显晚上21点已经在分析中出现比较多的峰值,因此可以考虑这个时段做做吸引用户购买的营销活动
# 4.5转化漏斗分析
# 4.51活动期间的转化漏斗
from pyecharts.charts import Funnel
# la = loudou_acti
pv_la = acti[acti['behavior_type'] == '1']['user_id'].count()
collect_la = acti[acti['behavior_type'] == '2']['user_id'].count()
cart_la = acti[acti['behavior_type'] == '3']['user_id'].count()
buy_la = acti[acti['behavior_type'] == '4']['user_id'].count()
# 计算活动期间的转化率
a = pd.DataFrame([pv_la,collect_la,cart_la,buy_la],
index = ['浏览数','收藏数','加购数','购买数'],
columns = ['人数'])
la_rate = a['人数']/a.loc['浏览数','人数']*100
a['转化率'] = la_rate.apply(lambda x: round(x,2))
# 漏斗数据转化为[(key1,value1),(key2,value2),...]
data_la = list([i for i in zip(a.index,a['转化率'])])
# 画出漏斗图
funnel_1 = Funnel().add(series_name = '环节',data_pair = data_la, is_selected = True, sort_ = 'descending',
label_opts = opts.LabelOpts(position = 'inside')).set_series_opts(tooltip_opts=opts.TooltipOpts(
formatter = '{a}
{b}:{c}%')).set_global_opts(title_opts=opts.TitleOpts(title = '活动期间用户转化率'))
funnel_1.render_notebook()
# 4.52日常期间的转化率
# ld = loudou_daily
pv_ld = daily[daily['behavior_type'] == '1']['user_id'].count()
collect_ld = daily[daily['behavior_type'] == '2']['user_id'].count()
cart_ld = daily[daily['behavior_type'] == '3']['user_id'].count()
buy_ld = daily[daily['behavior_type'] == '4']['user_id'].count()
# 计算日常期间的活动率
b = pd.DataFrame([pv_ld,collect_ld,cart_ld,buy_ld],
index = ['浏览数','收藏数','加购数','购买数'],
columns = ['人数'])
ld_rate = b['人数']/b.loc['浏览数','人数']*100
b['转化率'] = ld_rate.apply(lambda x: round(x,2))
# 漏斗数据转化为[(key1,value1),(key2,value2),...]
data_ld = list([i for i in zip(b.index,b['转化率'])])
# 画出漏斗图
funnel_2 = Funnel().add(series_name = '环节',data_pair = data_ld, is_selected = True, sort_ = 'descending',
label_opts = opts.LabelOpts(position = 'inside')).set_series_opts(tooltip_opts=opts.TooltipOpts(
formatter = '{a}
{b}:{c}%')).set_global_opts(title_opts=opts.TitleOpts(title = '日常期间用户转化率'))
funnel_2.render_notebook()
四、用户对商品的偏好
# 查看该月内用户的复购率情况
group_user = user[user['behavior_type'] == '4'].groupby('user_id')
user_count = group_user.item_id.count().reset_index()
a = user_count[user_count['item_id'] > 1]['user_id'].count()/user_count['user_id'].count()
a *100
结论7:
- 本月复购率达至91.5%,说明运营效果很强,用户黏性很强
# 查看用户购买最多的时哪种商品
item_count = user[user['behavior_type'] == '4'].groupby('item_id').count()
count1 = item_count.reset_index()['user_id']
data = count1.sort_values(ascending = False)
data
结论8:
- 从用户下单的商品来看,共有170451种商品售出,其中编号为‘162687’是最受欢迎的商品
#排除只售出1件商品的影响并作图
data[data>1].hist(bins = 10)
结论9:
- 仅有13.7%左右的商品是能售出超过1件,受用户欢迎的商品只是占少数部分,大致符合二八法则
五、总结
从用户在线时间来看,不管是活动时间还是日常时间,20点至22点都是用户最活跃的时刻,可以在此时间段内进行针对的进行营销活动。
从购买率来看,活动期间的购买比日常期间的购买率要大1%,从转化率来看,浏览量到购买的转化率仅为1.41%(活动期间2.39%)。日常期间网站流量峰值大约为12万,活动期间,网站流量升至14万,且活动期间购买人数是全月的峰值,企业可抓住活动的机会进行针对性的营销活动,促进转化率的提高。
从用户的整体情况和购买率来看,该数据用户基数为2万,可以保持日均1.3万的用户在线,且从用户复购率情况来看,超过90%的客户在该段时间消费超过一次,用户的忠诚度非常高,说明用户运营得非常好,这一点是网站盈利的重要利器,网站只需花费少部分费用来维护客户关系。
网站上的商品有1万7千多种,但是仅有13.7%的商品售出超过1件,对于销量最高的商品——162687,可根据该商品的属性(生产地、发货地、用途等方面)来判断用户需求和偏好。