首页 > 其他分享 >天猫商品数据分析

天猫商品数据分析

时间:2022-12-24 01:23:09浏览次数:41  
标签:数据分析 pos 商品 天猫 user behavior data id opts

一、选题的背景

随着互联网与电商平台的发展,网上购物正成为国内消费者购物的重要方式。在重要的电商平台淘宝中,用户通过浏览商品详情页、收藏、加购或直接购买等方式来进行网上购物。通过对用户行为进行分析,探索用户流量在时间、流程等维度的规律,分析用户的购买量分布、留存率、价值分层,了解受欢迎的商品和商品类别现状,就可以结合店铺的相关营销策略,实现更加精细化的运营,进而服务于业务增长。

二、大数据分析设计方案

1 流量维度

通过对淘宝流量分析,可以了解到用户活跃时期、活跃时段、用户流量漏斗转化率等用户流量相关信息。
需要指标:UV、PV、人均/日均访问量、用户行为数据、用户行为数据(用户量)、购买用户数量、人均购买次数、购买用户人均购买次数、购买率、复购率、日均UV\PV\行为数据、时均UV\PV\行为数据、用户流量漏斗转化率。

2 用户维度

通过对用户行为分析,了解用户购买次数分布、用户留存率、用户购买路径偏好等。
通过对用户价值分析,使用RFM模型对用户进行价值分类,针对不同类别的用户使用不同运营策略,实现精细化运营。
需要指标:用户购买次数、用户留存率、购买路径对应用户数量、RFM指标。

3 商品维度

通过对top商品和top商品类别进行购买次数、点击次数、购买点击率等指标的分析,探索用户对商品和商品类别的偏好,并通过帕累托分析得出对销售数量贡献较大的少量商品和商品类别,以此展示商品的销售规律。
需要指标:商品购买次数、商品点击次数、商品购买点击率、商品类别购买次数、商品类别购买点击率、商品累计购买数量、商品类别累计购买数量。

三、数据分析步骤

1.数据源

数据集来源于:https://pan.baidu.com/s/1loZ1jVFd6WM9qVFE-t7n-g?pwd=vm74

2.数据清洗

导入包

import pandas as pd
import numpy as np
import random
from dateutil.parser import parse
from datetime import datetime
from datetime import timedelta
from  pyecharts import options as opts
from pyecharts.charts import Bar,Line,Scatter,Grid,Pie
from pyecharts.commons.utils import JsCode

导入数据集

使用的数据已经是随机抽取的100万条数据

data=pd.read_csv(r"taobao_user_behavior_cut.csv",index_col=0)
data.index=range(data.shape[0])
print(data.shape)
data.head()   

 

 

 

 

删除有大量缺失值的列

data.drop("user_geohash",axis=1,inplace=True)
print(data.shape)

检查有无缺失值

columns=["user_id","item_id","behavior_type","item_category","time"]
print(data.loc[:,columns].isnull().sum().sum()) 
#无缺失值

print(sum(data.duplicated())) 
#由于时间仅仅精确到小时,这里的重复值不处理,因为很可能不是重复数据
print(sum(data[data["behavior_type"]!=1].duplicated())) 
#除了点击重复的数据多,收藏加购购买的重复数据(精确到小时)仅270个,进一步验证了想法

 

 

 数字编码转为文字方便使用,日期时间拆分以便后续分析便利

behavior_type=["click","collect","cart","buy"]
data["behavior_type"]=data["behavior_type"].map(lambda s: behavior_type[s-1])
data["date_time"]= data["time"].map(lambda s: parse(s))
data["hour"]= data["date_time"].map(lambda s: s.hour)
data["week"]= data["date_time"].map(lambda s: s.isoweekday())
data["date"]= data["date_time"].map(datetime.date)
data.drop(["time"],axis=1,inplace=True) #节约内存
data.head(5)

 

 

 3.数据分析

3.1 流量维度

3.1.1 流量分析

1. 总体流量分析

print("总访问量PV:")
print(data["user_id"].count())
print("总访客量UV:")
print(data["user_id"].nunique())
print("人均访问量:")
print(data["user_id"].count()/(data["user_id"].nunique()))
print("日均访问量:")
print(data["user_id"].count()/(data["date"].nunique()))
#print(pd.DataFrame(data[["user_id","date"]]).groupby("date")["user_id"].count())
print("用户行为数据:")
print(data["behavior_type"].value_counts().sort_values(ascending=False))
print("用户行为数据(用户量):")
print(data.groupby("behavior_type")["user_id"].nunique().sort_values(ascending=False))

  • 购买率=购买用户人数/总用户人数
  • 复购率=购买两次及两次以上的用户人数/购买用户人数
print("购买用户数量:")
buy_usernum=data[data["behavior_type"]=="buy"]["user_id"].nunique()
print(buy_usernum)
print("人均购买次数:")
print(round(data[data["behavior_type"]=="buy"]["user_id"].count()/data["user_id"].nunique(),3))
print("购买用户人均购买次数:")
print(round(data[data["behavior_type"]=="buy"]["user_id"].count()/buy_usernum,3))
print("购买率:")
print(str(round(buy_usernum/data["user_id"].nunique(),4)*100)+r"%")
print("复购率:")
user_repeatbuy_filter=data[data["behavior_type"]=="buy"].groupby("user_id",as_index=False)["behavior_type"].count()
user_repeatbuy_filter.columns=["user_id","buy_num"]
user_repeatbuy_num=user_repeatbuy_filter[user_repeatbuy_filter["buy_num"]>=2]["user_id"].count()
print(str(round(user_repeatbuy_num/buy_usernum,4)*100)+r"%")

 

  • 自2014.11.18日至2014.12.18日期间,网站总访问量100万次,总访客数9918人,人均访问量101次,日均访问量约3万次,关于用户行为数据,其中商品详情页点击次数约94万次,加购次数约2万8千次,收藏次数约2万次,购买次数约1万次,关于购买数据,其中购买用量约为4千6百人,人均购买次数约为1次/人,购买用户人均购买次数约为2次/人,购买率约46%,复购率约49%。
  • 分析与建议:一个月内,用户购买率接近50%,复购率接近50%,意味着25%的用户会购买两次及以上,这表现了平台产品的总体价值较高,得到了用户的认可与喜爱;另一方面,购买用户量、人均购买次数、购买率、复购率指标应该与过去时间对应指标以及同行指标进行比较,若相对较低,需要从流量推广、活动促销、产品质量、服务质量、同行竞争等维度分析原因,提高平台销售收入。

2. 日均流量分析

data_day=data.groupby(["date","behavior_type"],as_index=False)["user_id"].count().fillna(method="ffill").sort_values(by="date")
line1=Line()
line1.add_xaxis(data_day[data_day["behavior_type"]=="click"]["date"].tolist())
line1.add_yaxis("点击",data_day[data_day["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="日均流量变化"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_day[data_day["behavior_type"]=="collect"]["date"].tolist())
line2.add_yaxis("收藏",data_day[data_day["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_day[data_day["behavior_type"]=="cart"]["date"].tolist())
line3.add_yaxis("加购",data_day[data_day["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_day[data_day["behavior_type"]=="buy"]["date"].tolist())
line4.add_yaxis("购买",data_day[data_day["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("date",as_index=False)["user_id"].count().sort_values(by="date")["date"].tolist())
line5.add_yaxis("PV",data.groupby("date",as_index=False)["user_id"].count().sort_values(by="date")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='日期'))
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="5%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

 

  • 从日均流量变化,可以看出点击、收藏、加购、PV指标均在双12前三天左右开始呈现稳步上升趋势,购买指标直接在双12当天出现跳跃式增长,除收藏指标外各项指标均在双12当天达到最大值
  • 分析与建议:各指标在双12前几天即呈现上升趋势,表明此时活动效果已经初步显露,人们的消费欲望提高,一方面,在这三四天里可以考虑增加活动优惠的推送消息,进一步刺激消费欲望;另一方面,可以在双12前通过预订商品或者直接提前锁定商品价格方式,提前释放用户的购买需求,以减少活动时间延长所带来消费欲望可能减退的不确定性影响。

3. 日均流量分析(用户量

 

data_day=data.groupby(["date","behavior_type"],as_index=False)["user_id"].nunique().fillna(method="ffill").sort_values(by="date")
line1=Line()
line1.add_xaxis(data_day[data_day["behavior_type"]=="click"]["date"].tolist())
line1.add_yaxis("点击",data_day[data_day["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="日均流量变化(用户量)"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_day[data_day["behavior_type"]=="collect"]["date"].tolist())
line2.add_yaxis("收藏",data_day[data_day["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_day[data_day["behavior_type"]=="cart"]["date"].tolist())
line3.add_yaxis("加购",data_day[data_day["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_day[data_day["behavior_type"]=="buy"]["date"].tolist())
line4.add_yaxis("购买",data_day[data_day["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("date",as_index=False)["user_id"].nunique().sort_values(by="date")["date"].tolist())
line5.add_yaxis("UV",data.groupby("date",as_index=False)["user_id"].nunique().sort_values(by="date")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='日期'))
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="5%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

 

 

 与每日流量的现象基本一致。

4. 时均流量分析

data_hour=data.groupby(["hour","behavior_type"],as_index=False)["user_id"].count().fillna(method="ffill").sort_values(by="hour")
line1=Line()
line1.add_xaxis(data_hour[data_hour["behavior_type"]=="click"]["hour"].tolist())
line1.add_yaxis("点击",data_hour[data_hour["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="时均流量变化"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_hour[data_hour["behavior_type"]=="collect"]["hour"].tolist())
line2.add_yaxis("收藏",data_hour[data_hour["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_hour[data_hour["behavior_type"]=="cart"]["hour"].tolist())
line3.add_yaxis("加购",data_hour[data_hour["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_hour[data_hour["behavior_type"]=="buy"]["hour"].tolist())
line4.add_yaxis("购买",data_hour[data_hour["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("hour",as_index=False)["user_id"].count().sort_values(by="hour")["hour"].tolist())
line5.add_yaxis("PV",data.groupby("hour",as_index=False)["user_id"].count().sort_values(by="hour")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='时间'))
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="6%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

 

 

 

  • 从时均流量变化,可以看出:1. 购买量在17时到18时达到最低值 2. 自18时起,各项指标呈现稳步上升趋势,在22时左右达到最大值 3. 23时到凌晨4时左右,各项指标呈现下降趋势。
  • 分析与建议:18时至22时,用户行为活动活跃,人们习惯在此此间浏览商品、购买商品,根据这一特征,从用户角度出发,可以将与用户最相关的商品推送、最优惠的活动推送放在此段时间,以提高流量转化率;从商品角度出发,此段时间的流量应当向高转化率、高销量的优质商品倾斜;从直通车等内部推广角度来说,可以针对此时段的流量适当提高定价,同时鼓励此时段的内部直播活动,从站外推广角度来说,可以考虑增加此时段的流量推广以提高收益。23时-4时,以及17-18时,是用户行为活动的低谷期,减少高成本的流量推广活动,在推送消息次数有限的前提下减少此时段的消息推送

5. 时均流量分析(用户量)

data_hour=data.groupby(["hour","behavior_type"],as_index=False)["user_id"].nunique().fillna(method="ffill").sort_values(by="hour")
line1=Line()
line1.add_xaxis(data_hour[data_hour["behavior_type"]=="click"]["hour"].tolist())
line1.add_yaxis("点击",data_hour[data_hour["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="时均流量变化(用户量)"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_hour[data_hour["behavior_type"]=="collect"]["hour"].tolist())
line2.add_yaxis("收藏",data_hour[data_hour["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_hour[data_hour["behavior_type"]=="cart"]["hour"].tolist())
line3.add_yaxis("加购",data_hour[data_hour["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_hour[data_hour["behavior_type"]=="buy"]["hour"].tolist())
line4.add_yaxis("购买",data_hour[data_hour["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("hour",as_index=False)["user_id"].nunique().sort_values(by="hour")["hour"].tolist())
line5.add_yaxis("UV",data.groupby("hour",as_index=False)["user_id"].nunique().sort_values(by="hour")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='时间')
                     )
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="6%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

现象基本与时均流量变化一致,不同的是点击(用户量)、UV等在18时到22时的增幅相较于时均流量点击、PV的增幅明显缩小,可以看出18时到22时点击的用户量以及访问的用户量并未明显增加,而是单个用户的点击和访问次数增加导致时均流量的增幅明显,进一步验证了上述此时段内用户行为活动活跃的结论。

3.1.2 用户流量流程漏斗分析

data_behavior=data["behavior_type"].value_counts()
data_behavior["click"]

change_rate={"收藏/点击率":round(data_behavior["collect"]/data_behavior["click"],4)*100,
 "加购/点击率":round(data_behavior["cart"]/data_behavior["click"],4)*100,
 "购买/点击率":round(data_behavior["buy"]/data_behavior["click"],4)*100,
 "购买/收藏率":round(data_behavior["buy"]/data_behavior["collect"],4)*100,
 "购买/加购率":round(data_behavior["buy"]/data_behavior["cart"],4)*100,
}
# change_rate.keys()
bar_changerate=Bar()
bar_changerate.add_xaxis(list(change_rate.keys()))
bar_changerate.add_yaxis("转化率",list(change_rate.values()),color="#749f83",label_opts=opts.LabelOpts(formatter=JsCode("function (params) {return params.value + '%'}")))
bar_changerate.set_global_opts(
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %")))
# bar_changerate.set_global_opts(title_opts=opts.TitleOpts(title="转化率"))
bar_changerate.render_notebook()

 

 

 

  • 收藏、加购、购买相较于点击的比率较低,均不超过3%,转化率较低;收藏、加购相较于购买的比率相对较高。
  • 分析与建议:1. 点击后的转化率相对较低,需要与业内其他平台的相关指标进行对比,如果处于较低水平,可以考虑推送机制是否精准、推送的商品质量是否有待提高、定价相对同行是否过高、详情页是否需要优化、售前服务质量是否有待提高等维度来定位问题所在;2. 虽然收藏、加购相较于购买的比率较高,但由于此处收藏与加购的用户商品并未与购买的用户商品一一对应,不能得出收藏加购后购买的可能性提高的结论,需要对用户的购买路径进行分析才能得出相关结论,出现此问题的原因主要是点击详情页、收藏、加购这三个步骤相较于购买这一步骤都不是必须的,故而无法通过简单的流量比率来判断各环节的转化率。

3.1.3 跳出率

跳出率的准确定义是只访问了入口页面即退出的次数/入口页面访问次数。此处将跳出率定义为:只访问一次详情页即退出的用户数/总用户数,用来衡量商品详情页对用户是否具有吸引力,是否能够让用户进行下一步的点击、收藏、加购、购买。

user_bouncenum=data.groupby("user_id").filter(
    lambda x: x["behavior_type"].count()==1  and
    (x["behavior_type"] =="click" ).all()  )  ["user_id"].count()  #建议使用.all()
user_num=data["user_id"].nunique()
user_bouncerate=user_bouncenum/user_num
print("总用户数:"+str(user_num))
print("跳出用户数:"+str(user_bouncenum))
print("跳出率:%.2f%%"%(round(user_bouncerate,4)*100))

  • 就这一个月来说,跳出率仅0.97%,较低,说明用户并不会仅仅访问一个商品详情页就离开(离开指至少这个月不再回来该平台),说明商品或广告对用户具有吸引力,用户愿意在后续的商品选购操作过程中花费时间。
  • 由于数据并未有浏览时间,无法对单个商品进一步分析

3.2 用户维度

3.2.1 用户购买量

1. 购买次数前十客户

data_buy=data[data["behavior_type"]=="buy"].groupby("user_id")["behavior_type"].count()
data_buy.columns=["buy_num"]
data_buy.sort_values(ascending=False).head(10)

 

2. 用户购买频数与频率分布图

data_buy_distribution=data_buy.groupby(by=data_buy).count()
# print("用户购买次数分布表:")
# print(data_buy_distribution)
bar_buy_distribution=Bar()
xaxis=pd.Series(data_buy_distribution.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_buy_distribution.add_xaxis(xaxis)
bar_buy_distribution.add_yaxis("占比",
list(round(data_buy_distribution/data_buy_distribution.sum()*100,2)),
color="#749f83",
label_opts=opts.LabelOpts(formatter=JsCode("function (params) {return params.value + '%'}")))
bar_buy_distribution.set_global_opts(
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %")))
bar_buy_distribution.set_global_opts(title_opts=opts.TitleOpts(title="用户购买次数分布"),
xaxis_opts=opts.AxisOpts(name='购买次数',name_location="middle",name_gap=20),
                     )
bar_buy_distribution.extend_axis(yaxis=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(formatter="{value} 人"
            )
        ))
line=Line().add_xaxis(xaxis).add_yaxis("人数",list(data_buy_distribution),yaxis_index=1)
bar_buy_distribution.overlap(line)
bar_buy_distribution.render_notebook()

 

 

 

  • 从购买次数前10的用户数据可以看出,购买次数前十的用户购买次数均超过10次;从购买次数频数分布直方图可以看出,一个月内购买次数大于等于2次的用户在50%左右,购买次数大于等于3次的用户在25%左右。
  • 分析与建议:针对购买次数较高的用户(如购买次数>=5次,这类用户约占10%)提供更加精细化的服务,如提供专属服务、优质售后等,提高用户对平台的满意度;考虑到复购率约在50%,购买次数大于等于3的用户仅在25%左右,可以考虑建立有关购买次数的激励措施,如在会员制度中加入该因素,同时适当增加推广和精准的活动促销,持续监控平台商品质量,促进用户的复购。

3.2.2 用户留存率

1. 留存率计算

分析次日留存率、3日留存率、7日留存率、14日留存率、30日留存率,通过留存率分析平台的用户粘性。
注:由于此处未能获得新用户的标识,故而此处将基期新用户数目替代为基期用户数目。

data_retain=pd.DataFrame(columns=["日期","基期用户数","次日留存率","3日留存率","7日留存率","14日留存率","30日留存率"])
date_max=pd.Series(data["date"].unique()).max()
# print(date_max)
# print(date_max+timedelta(days=1))
for date in pd.Series(data["date"].unique()).sort_values():
    data_retain_base=set(data[data["date"]==date]["user_id"].unique()) 
    data_base_cnt=len(data_retain_base)
    data_retain_2day=len(set(data[data["date"]==date+timedelta(days=1)]["user_id"].unique()) & data_retain_base)/data_base_cnt if date+timedelta(days=1)<= date_max else 0
    # print(data_retain_2day)
    data_retain_3day=len(set(data[data["date"]==date+timedelta(days=2)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=2)<= date_max else 0
    data_retain_7day=len(set(data[data["date"]==date+timedelta(days=6)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=6)<= date_max else 0
    data_retain_14day=len(set(data[data["date"]==date+timedelta(days=13)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=13)<= date_max else 0
    data_retain_30day=len(set(data[data["date"]==date+timedelta(days=29)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=29)<= date_max else 0
    data_retain_item={"日期":[date],"基期用户数":[data_base_cnt],"次日留存率":[round(data_retain_2day,4)],"3日留存率":[round(data_retain_3day,4)],"7日留存率":[round(data_retain_7day,4)],"14日留存率":[round(data_retain_14day,4)],"30日留存率":[round(data_retain_30day,4)]}
    # print(pd.DataFrame(data_retain_item))
    data_retain_item=pd.DataFrame(data_retain_item)
    data_retain=pd.concat([data_retain,data_retain_item],axis=0,join="inner")
data_retain.index=range(0,data_retain.shape[0])
data_retain

 

 

 注:留存率因为天数不足无法计算的直接填0,在计算平均留存率时不考虑这些数据。

2. 留存率可视化

#留存率可视化
line_retain=Line()
line_retain.add_xaxis(data_retain["日期"].tolist())
line_retain.add_yaxis("次日留存率",data_retain["次日留存率"].tolist())
line_retain.add_yaxis("3日留存率",data_retain["3日留存率"].tolist())
line_retain.add_yaxis("7日留存率",data_retain["7日留存率"].tolist())
line_retain.add_yaxis("14日留存率",data_retain["14日留存率"].tolist())
line_retain.add_yaxis("30日留存率",data_retain["30日留存率"].tolist())
line_retain.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
line_retain.set_global_opts(title_opts=opts.TitleOpts(title="留存率随日期变动"),
xaxis_opts=opts.AxisOpts(name='日期'),
                     yaxis_opts=opts.AxisOpts(name='留存率'))
line_retain.render_notebook()

 

 

 

3. 平均留存率

#计算平均留存率
print("平均次日留存率: "+str(round(data_retain[data_retain["次日留存率"]!=0]["次日留存率"].mean(),4)))
print("平均3日留存率: "+str(round(data_retain[data_retain["3日留存率"]!=0]["3日留存率"].mean(),4)))
print("平均7日留存率: "+str(round(data_retain[data_retain["7日留存率"]!=0]["7日留存率"].mean(),4)))
print("平均14日留存率: "+str(round(data_retain[data_retain["14日留存率"]!=0]["14日留存率"].mean(),4)))
print("平均30日留存率: "+str(round(data_retain[data_retain["30日留存率"]!=0]["30日留存率"].mean(),4)))

 

 

 

  • 从留存率折线图来看,各期限的用户留存率随日期推移变化不大,从平均留存率来看,随期限增加,虽然留存率有所下降,但下降平缓,总体留存率较为稳定。
  • 分析与建议:用户留存率随日期推移变化不大,说明当前阶段平台对用户的粘性未发生显著变化;留存率随期限增加下降平缓说明平台对用户粘性较高,平台保留用户的能力较强。但通过平均次日留存率仅68%,说明短期留存率仍有较大的提升空间,可以通过有奖签到等方式提高短期留存率,长期留存率较为稳定,可以通过增加推送或者发放优惠券等方式,进一步提升长期中用户对平台的粘性。

3.2.3 用户购买路径偏好分析

#购买、点击-购买、点击-收藏-购买、点击-加购-购买、点击-收藏&收藏-购买

#检查是否有直接购买的
# print(data[data["behavior_type"]=="buy"])
# 购买的用户集合
data_buy_set=set(data[data["behavior_type"]=="buy"]["user_id"].unique())
#取出购买用户的数据后按照时间排序
# 再按照用户、商品id 分组  
data_buy_group=data[data["user_id"].map(lambda s: s in data_buy_set)].sort_values(by="date_time").groupby(["user_id","item_id","item_category"],as_index=False)

#同一用户对同一件商品若购买多件,则按照最后一件的购买时间作为购买时间的标志
data_buy_group_num1=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"buy"})["user_id"].nunique()
print("直接购买用户数:"+ str(data_buy_group_num1))

data_buy_group_num2=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","buy"})["user_id"].nunique()
print("点击-购买用户数:"+ str(data_buy_group_num2))

data_buy_group_num3=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","collect","buy"})["user_id"].nunique()
print("点击--收藏-购买用户数:"+ str(data_buy_group_num3))

data_buy_group_num4=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","cart","buy"})["user_id"].nunique()
print("点击-加购-购买用户数:"+ str(data_buy_group_num4))

data_buy_group_num5=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","collect","cart","buy"})["user_id"].nunique()
print("点击-收藏&加购-购买用户数:"+ str(data_buy_group_num5))

# 输出:
# 直接购买用户数:3398
# 点击-购买用户数:2272
# 点击--收藏-购买用户数:41
# 点击-加购-购买用户数:248
# 点击-收藏&加购-购买用户数:2
  • 在五种购买路径中,直接购买、点击-购买是用户的主要购买路径,收藏、加购后的购买在购买路径中占比较少。
  • 分析与建议:结合前面的用户行为数据(用户量):

 

可见,虽然收藏、加购的用户量不低,但真正转化为购买的用户量占比较少,尤其是收藏的转化率堪忧,应当对用户收藏、加购的商品发放优惠券、推送促销活动,也可推送与收藏加购商品同类别但更畅销、更优质的商品以提升销量。

3.2.4 用户价值RFM分析

由于数据集缺少消费金额数据,故而以下分析不考虑M维度,根据R(近的用户价值高)、F(频率高的用户价值高)对应的用户价值将用户分析4类:

R(粘性)F(忠诚度)客户类型精细化运营
重要价值客户 优质客户,提供VIP服务
重要发展客户 最近有交易但频次低,重点发展,想办法提高消费频率,提升消费欲望
重要保持客户 交易频数高但最近无交易,需要主动联系、唤回
重要挽留客户 交易频次低且最近无交易,分析哪里出了问题,试图挽留

1. 用户最近购买的时间间隔分布图

查看用户最近购买的时间间隔的分布,为后续对R进行分箱打分提供指导依据。

#R:最近一次交易时间间隔;F:频率,此处定义为这一个月里的消费频率
date_max=data["date"].max()
data_RFM=pd.DataFrame()
data_RFM["R"]=(date_max-data[data["behavior_type"]=="buy"].groupby("user_id")["date"].max()).map(lambda s: s.days)
data_RFM["F"]=data[data["behavior_type"]=="buy"].groupby("user_id")["date"].count()

#最近购买时间间隔分布图
data_distribution=data_RFM.groupby("R")["F"].count()
# print(type(data_distribution))
bar_distribution=Bar()
xaxis=pd.Series(data_distribution.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_distribution.add_xaxis(xaxis)
bar_distribution.add_yaxis("占比",
list(round(data_distribution/data_distribution.sum()*100,2)),
color="#749f83",
label_opts=opts.LabelOpts(formatter=JsCode("function (params) {return params.value + '%'}")))
bar_distribution.set_global_opts(
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %")))
bar_distribution.set_global_opts(title_opts=opts.TitleOpts(title="最近购买时间间隔分布"),
xaxis_opts=opts.AxisOpts(name='天数'),
                     yaxis_opts=opts.AxisOpts(name='用户占比'))
bar_distribution.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_distribution.render_notebook()

 

 

 

2. 查看R、F值的百分位分布情况

为后续R、F打分提供指导依据。

data_RFM.describe()

3. 计算R、F得分,并得出R、F值的高低

 

#对R、F打分:
def r_score(x):
    if x<=2:
        return 5
    if x>=3 and x<=5:
        return 4
    if x>=6 and x<=8:
        return 3
    if x>=9 and x<=17:
        return 2
    if x>=18:
        return 1
def f_score(x):
    if x==1:
        return 1
    if x==2:
        return 2
    if x==3:
        return 3
    if x==4:
        return 4
    if x>=5:
        return 5
data_RFM["R_SCORE"]=data_RFM["R"].map(r_score)
data_RFM["F_SCORE"]=data_RFM["F"].map(f_score)

data_RFM["R>R_MEAN"]=data_RFM["R_SCORE"]>data_RFM["R_SCORE"].mean()
data_RFM["F>F_MEAN"]=data_RFM["F_SCORE"]>data_RFM["F_SCORE"].mean()
data_RFM.head()

4. 根据R、F值的高低对用户进行分组

def user_classification(x):
    r,f= x
    if r==True and f==True:
        return "重要价值用户"
    elif r==True and f==False:
        return "重要发展用户"
    elif r==False and f==True:
        return "重要保持客户"
    elif r==False and f==False:
        return "重要挽留用户"
    else: 
        return None
data_RFM["user_classification"]=data_RFM[["R>R_MEAN","F>F_MEAN"]].apply(user_classification,axis=1)
data_RFM.head()

5. 计算各类客户数量、占比并可视化

data_RFM["user_classification"].value_counts()

data_RFM["user_classification"].value_counts(True)

#不同价值客户占比图
label=data_RFM["user_classification"].value_counts(True).index.tolist()
num=round(data_RFM["user_classification"].value_counts(True),4).tolist()
pie=Pie().add("",[z for z in zip(label,num)])
pie.set_global_opts(title_opts=opts.TitleOpts(title="不同价值客户占比"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
pie.render_notebook()

 

    • 根据RFM用户价值分析对用户进行分类,其中重要价值用户和重要挽留用户各占约30%,重要发展用户和重要保持用户各占约20%。
    • 分析与建议:应针对不同价值的用户采取不同的运营策略。总的来说,应当提升重要价值用户占比,减少重要挽留用户占比。
      重要价值用户:主要提升该部分用户的满意度,服务升级,发放专属特别优惠,推送推广时也应当注意频率和方式,提升用户体验。
      重要发展用户:最近消费时间间隔小,但消费频率不高,需要提高其消费频率,可在每次购买商品收货后提供限时代金券、限时优惠券等,提升下一步的消费欲望。
      重要保持用户:交易频繁但最近无交易,可以向该类用户增加活动优惠、相关商品的推送频率等,唤回该部分用户。
      重要挽留用户:最近消费时间间隔大,且消费频率低,这类用户即将流失,发放调查问卷调查用户体验找出问题原因,想办法挽留客户,若是价格原因则推送优惠券,若是推送不准确则改进推送机制。

3.3 商品维度

3.3.1 商品数量与商品类别数量

#商品数量与商品类别数
print("商品数目:"+str(data["item_id"].nunique()))
print("商品类别数目:"+str(data["item_category"].nunique()))
# data.head()

 

 

 

3.3.2 top10商品分析

商品分析也可以从点击、收藏、加购和购买四个角度来分析,通过用户购买路径偏好分析,当前收藏和加购并不能有效促进销量的提升,故而这里主要针对点击量和购买量来对商品进行分析。通过点击量可以看出,商品是否对用户具有吸引力,通过购买量可以看出用户对商品的需求,通过统计商品的点击购买率,可以看出商品点击流量的转化情况。

1. 以购买量top10的商品分析

(1) 购买量top10商品的购买量分布

#从购买路径了解到,大多数用户并无收藏和加购的习惯,故而商品维度主要进行点击和购买的分析
data_top10_buynum=data[data["behavior_type"]=="buy"].groupby("item_id")["item_id"].count().sort_values(ascending=False).head(10)
bar_top10_buynum=Bar()
xaxis=pd.Series(data_top10_buynum.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_top10_buynum.add_xaxis(xaxis)
bar_top10_buynum.add_yaxis("购买量",
list(data_top10_buynum),
color="#749f83",
)
bar_top10_buynum.set_global_opts(title_opts=opts.TitleOpts(title="购买量top10的商品购买量分布"),
xaxis_opts=opts.AxisOpts(name='商品id',axislabel_opts={"rotate":50}),
                     yaxis_opts=opts.AxisOpts(name='购买量'))
# bar_top10_buynum.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_top10_buynum.render_notebook()

 

(2) 购买量top10的商品进行购买点击率分析

data_top10_clickbuyrate1=pd.DataFrame()
data_top10_clickbuyrate1["click"]=data[data["behavior_type"]=="click"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate2=pd.DataFrame()
data_top10_clickbuyrate2["collect"]=data[data["behavior_type"]=="collect"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate3=pd.DataFrame()
data_top10_clickbuyrate3["cart"]=data[data["behavior_type"]=="cart"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate4=pd.DataFrame()
data_top10_clickbuyrate4["buy"]=data[data["behavior_type"]=="buy"].groupby(["item_id"])["user_id"].count()
result=pd.merge(data_top10_clickbuyrate1,data_top10_clickbuyrate2,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate3,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate4,how="outer",left_index=True,right_index=True)
result=result.fillna(0)
result["buy_click_rate"]= round(result["buy"]/result["click"]*100,2).map(lambda x: str(x)+"%")
result=result.fillna(0)
result.sort_values(by="buy",ascending=False).head(10)

  • 对于购买量前列的商品,可以将购买点击率分为100%以上(包括无限大)、50%-100%、20%-50%、0-20%四个区间,针对不同区间使用不同的运营策略。
  • 分析与建议:
    转化率在100%以上的:这类商品转化率极高,可能是快消类、囤货类、同质类商品,不需要过多的点击查看商品详情就可以进行购买决策,可向有这类消费需求的用户推送此类商品。
    转化率在50%-100%间的(top10商品中并没有出现):这类商品购买点击率较高,说明用户搜索和点击商品目标明确,此类商品可能是特定特征群体需要的,此时可以收集用户信息分析用户画像,结合商品特征核实是否有更具体的用户特征,如果有就可以进行更精准的推送;另一方面,也可能是商品异质性较低,可选择性不强导致的,需要分析该类别商品的异质性,如果有此类问题可以尝试将类别中有区分度的商品给予更多的流量倾斜观察是否会带来更多的销量;如果以上假设均不成立,可以尝试对此类商品多做推广,毕竟原有转化率较高,较高的流量推广可能带来更多的购买量。
    转化率在20%-50%间的:商品转化率一般,可以多做促销活动,将潜在用户转化为购买用户。
    转化率在20%以下的:商品转化率较低,此时应更多的从商品本身来分析,购买量处于前列,但是购买点击率很低,可能是这部分商品做了流量推广但是推广针对的用户不准确,导致用户虽然点击但只有较少的用户选择了购买,也可能是商品价格远高于同类产品,导致最终成单率较低,又或者商品评价较差导致销量增加迟缓,需要分析更多的信息以作出进一步的判断,并针对分析的结果做出相应改善对策。

2. 以点击量top10的商品分析

(1) 点击量top10商品的点击量分布

data_top10_clicknum=data[data["behavior_type"]=="click"].groupby("item_id")["item_id"].count().sort_values(ascending=False).head(10)
bar_top10_clicknum=Bar()
xaxis=pd.Series(data_top10_clicknum.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_top10_clicknum.add_xaxis(xaxis)
bar_top10_clicknum.add_yaxis("点击量",
list(data_top10_clicknum),
color="#749f83",
)
bar_top10_clicknum.set_global_opts(title_opts=opts.TitleOpts(title="点击量top10商品的点击量分布"),
xaxis_opts=opts.AxisOpts(name='商品id',axislabel_opts={"rotate":50}),
                     yaxis_opts=opts.AxisOpts(name='点击量'))
# bar_top10_clicknum.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_top10_clicknum.render_notebook()

 

(2) 点击量top10的商品进行购买点击率分析

data_top10_clickbuyrate1=pd.DataFrame()
data_top10_clickbuyrate1["click"]=data[data["behavior_type"]=="click"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate2=pd.DataFrame()
data_top10_clickbuyrate2["collect"]=data[data["behavior_type"]=="collect"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate3=pd.DataFrame()
data_top10_clickbuyrate3["cart"]=data[data["behavior_type"]=="cart"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate4=pd.DataFrame()
data_top10_clickbuyrate4["buy"]=data[data["behavior_type"]=="buy"].groupby(["item_id"])["user_id"].count()
result=pd.merge(data_top10_clickbuyrate1,data_top10_clickbuyrate2,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate3,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate4,how="outer",left_index=True,right_index=True)
result=result.fillna(0)
result["buy_click_rate"]= round(result["buy"]/result["click"]*100,2).map(lambda x: str(x)+"%")
result=result.fillna(0)
result.sort_values(by="click",ascending=False).head(10)

点击量前十的商品的购买点击率很低,说明用户点击量高但是转化率却很低,分析原因与上述top10购买量商品转化率20%以下的分析基本一致,可能是做了不精准或者不必要(没有那么大市场需求)的流量推广,或者平台的推送不准确,或者商品价格原因、质量原因等导致用户不愿意购买,需要结合更多信息以进行进一步的分析。

3.3.3 top10的商品类别分析

1. 以购买量top10的商品类别分析 

(1) 购买量top10商品类别的购买量分布

data_top10buynum_category=data[data["behavior_type"]=="buy"].groupby("item_category")["item_category"].count().sort_values(ascending=False).head(10)
bar_top10buynum_category=Bar()
xaxis=pd.Series(data_top10buynum_category.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_top10buynum_category.add_xaxis(xaxis)
bar_top10buynum_category.add_yaxis("购买量",
list(data_top10buynum_category),
color="#749f83",
)
bar_top10buynum_category.set_global_opts(title_opts=opts.TitleOpts(title="购买量top10商品类别的购买量分布"),
xaxis_opts=opts.AxisOpts(name='商品类别',axislabel_opts={"rotate":50}),
                     yaxis_opts=opts.AxisOpts(name='购买量'))
# bar_top10buynum_category.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_top10buynum_category.render_notebook()

  • 这一个月内top10商品类别的平均购买量在110左右。
  • 分析与建议:1. 可对这些商品类别的类别特征进行分析,看是否有相似特征,若有,寻找有这些相似特征但销量一般的商品增加推广,可能带来销量的进一步提升;2.对这些类别中的热销商品增加促销和推广,观察热销商品是否有进一步提升销量的空间;3. 将这些类别中的热销商品与同类别中的销量低的商品销售捆绑,通过降价或者满减促销的方式鼓励消费者进行组合购买,以此促进用户购买。

(2) 购买量top10的商品类别进行购买点击率分析

data_top10_clickbuyrate1=pd.DataFrame()
data_top10_clickbuyrate1["click"]=data[data["behavior_type"]=="click"].groupby(["item_category"])["user_id"].count()
data_top10_clickbuyrate2=pd.DataFrame()
data_top10_clickbuyrate2["collect"]=data[data["behavior_type"]=="collect"].groupby(["item_category"])["user_id"].count()
data_top10_clickbuyrate3=pd.DataFrame()
data_top10_clickbuyrate3["cart"]=data[data["behavior_type"]=="cart"].groupby(["item_category"])["user_id"].count()
data_top10_clickbuyrate4=pd.DataFrame()
data_top10_clickbuyrate4["buy"]=data[data["behavior_type"]=="buy"].groupby(["item_category"])["user_id"].count()
result=pd.merge(data_top10_clickbuyrate1,data_top10_clickbuyrate2,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate3,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate4,how="outer",left_index=True,right_index=True)
result=result.fillna(0)
result["buy_click_rate"]= round(result["buy"]/result["click"]*100,2).map(lambda x: str(x)+"%")
result=result.fillna(0)
result.sort_values(by="buy",ascending=False).head(10)

  • 购买量前十的商品类别中,大部分商品类别的转化率仅在0-3%。
  • 分析与建议:转化率较低的一个重要原因在于用户存在货比三家的心理,但最终往往选择一个商品进行购买,所以导致整个类别的转化率较低。提高类别的转化率关键在于推荐与搜索的精准性,具体表现在:1. 推荐的商品是用户感兴趣的商品,即推荐算法的精准 2.推荐的商品应当是同类商品中较为优质的商品,有较高的商品评价,避免用户过多的比较、点击不同的商品。3.优化用户购买同类商品的比较流程,增加同类商品信息比较与搜索的功能,减少不必要的重复点击查询。这样可以减少用户做出购买决策的时间,提升用户的购买体验。

3.3.4 帕累托分析

对商品类别和商品进行帕累托分析,找出贡献前80%销量的商品类别和商品,往往这些商品类别和商品占总体的比重不到20%,可以将运营推广的重点放在这部分商品类别和商品中。

1. 帕累托分析:类别分析

data_top10buynum_category=pd.DataFrame()
# data_top10buynum_category
data_top10buynum_category["buy_num"]=data[data["behavior_type"]=="buy"].groupby("item_category")["item_category"].count().sort_values(ascending=False)
# data_top10buynum_category.columns=["item_category","buy_num"]
data_top10buynum_category["buy_num_cumsum"]=data_top10buynum_category["buy_num"].expanding().sum()
# data_top10buynum_category.head()
max_num=data_top10buynum_category["buy_num_cumsum"].max()
buynumtop80percent_categorynum=data_top10buynum_category[data_top10buynum_category["buy_num_cumsum"]/max_num<0.8]["buy_num_cumsum"].count()
print("贡献前百分之八十销量的类别总数:"+str(buynumtop80percent_categorynum))
rate=buynumtop80percent_categorynum/data["item_category"].nunique()
print("贡献前百分之八十销量的类别占比:"+str(round(rate,3)))

2. 帕累托分析:商品分析

data_top10buynum_item=pd.DataFrame()
# data_top10buynum_item
data_top10buynum_item["buy_num"]=data[data["behavior_type"]=="buy"].groupby("item_id")["item_id"].count().sort_values(ascending=False)
# data_top10buynum_item.columns=["item_id","buy_num"]
data_top10buynum_item["buy_num_cumsum"]=data_top10buynum_item["buy_num"].expanding().sum()
# data_top10buynum_item.head()
max_num=data_top10buynum_item["buy_num_cumsum"].max()
buynumtop80percent_itemnum=data_top10buynum_item[data_top10buynum_item["buy_num_cumsum"]/max_num<0.8]["buy_num_cumsum"].count()
print("贡献前百分之八十销量的商品总数:"+str(buynumtop80percent_itemnum))
rate=buynumtop80percent_itemnum/data["item_id"].nunique()
print("贡献前百分之八十销量的商品占比:"+str(round(rate,3)))

  • 贡献前80%销量的类别占比9.1%,贡献前80%销量的商品占比1.1%
  • 分析与建议:根据二八法则,运营活动针对这1.1%的商品和9.1%的商品类别应当分配更多的资源,以期获得显著的销量提升效果。
import pandas as pd
import numpy as np
import random
from dateutil.parser import parse
from datetime import datetime
from datetime import timedelta
from  pyecharts import options as opts
from pyecharts.charts import Bar,Line,Scatter,Grid,Pie
from pyecharts.commons.utils import JsCode

data=pd.read_csv(r"/home/mw/input/taobaouser_behaviordata4221/taobao_user_behavior_cut.csv",index_col=0)
data.index=range(data.shape[0])
print(data.shape)
data.head()

data.drop("user_geohash",axis=1,inplace=True)
print(data.shape)

columns=["user_id","item_id","behavior_type","item_category","time"]
print(data.loc[:,columns].isnull().sum().sum())
#无缺失值

print(sum(data.duplicated()))
#由于时间仅仅精确到小时,这里的重复值不处理,因为很可能不是重复数据
print(sum(data[data["behavior_type"]!=1].duplicated()))
#除了点击重复的数据多,收藏加购购买的重复数据(精确到小时)仅270个,进一步验证了想法

behavior_type=["click","collect","cart","buy"]
data["behavior_type"]=data["behavior_type"].map(lambda s: behavior_type[s-1])
data["date_time"]= data["time"].map(lambda s: parse(s))
data["hour"]= data["date_time"].map(lambda s: s.hour)
data["week"]= data["date_time"].map(lambda s: s.isoweekday())
data["date"]= data["date_time"].map(datetime.date)
data.drop(["time"],axis=1,inplace=True) #节约内存
data.head(5)

print("总访问量PV:")
print(data["user_id"].count())
print("总访客量UV:")
print(data["user_id"].nunique())
print("人均访问量:")
print(data["user_id"].count()/(data["user_id"].nunique()))
print("日均访问量:")
print(data["user_id"].count()/(data["date"].nunique()))
#print(pd.DataFrame(data[["user_id","date"]]).groupby("date")["user_id"].count())
print("用户行为数据:")
print(data["behavior_type"].value_counts().sort_values(ascending=False))
print("用户行为数据(用户量):")
print(data.groupby("behavior_type")["user_id"].nunique().sort_values(ascending=False))

print("购买用户数量:")
buy_usernum=data[data["behavior_type"]=="buy"]["user_id"].nunique()
print(buy_usernum)
print("人均购买次数:")
print(round(data[data["behavior_type"]=="buy"]["user_id"].count()/data["user_id"].nunique(),3))
print("购买用户人均购买次数:")
print(round(data[data["behavior_type"]=="buy"]["user_id"].count()/buy_usernum,3))
print("购买率:")
print(str(round(buy_usernum/data["user_id"].nunique(),4)*100)+r"%")
print("复购率:")
user_repeatbuy_filter=data[data["behavior_type"]=="buy"].groupby("user_id",as_index=False)["behavior_type"].count()
user_repeatbuy_filter.columns=["user_id","buy_num"]
user_repeatbuy_num=user_repeatbuy_filter[user_repeatbuy_filter["buy_num"]>=2]["user_id"].count()
print(str(round(user_repeatbuy_num/buy_usernum,4)*100)+r"%")

data_day=data.groupby(["date","behavior_type"],as_index=False)["user_id"].count().fillna(method="ffill").sort_values(by="date")
line1=Line()
line1.add_xaxis(data_day[data_day["behavior_type"]=="click"]["date"].tolist())
line1.add_yaxis("点击",data_day[data_day["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="日均流量变化"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_day[data_day["behavior_type"]=="collect"]["date"].tolist())
line2.add_yaxis("收藏",data_day[data_day["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_day[data_day["behavior_type"]=="cart"]["date"].tolist())
line3.add_yaxis("加购",data_day[data_day["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_day[data_day["behavior_type"]=="buy"]["date"].tolist())
line4.add_yaxis("购买",data_day[data_day["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("date",as_index=False)["user_id"].count().sort_values(by="date")["date"].tolist())
line5.add_yaxis("PV",data.groupby("date",as_index=False)["user_id"].count().sort_values(by="date")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='日期'))
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="5%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

data_day=data.groupby(["date","behavior_type"],as_index=False)["user_id"].nunique().fillna(method="ffill").sort_values(by="date")
line1=Line()
line1.add_xaxis(data_day[data_day["behavior_type"]=="click"]["date"].tolist())
line1.add_yaxis("点击",data_day[data_day["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="日均流量变化(用户量)"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_day[data_day["behavior_type"]=="collect"]["date"].tolist())
line2.add_yaxis("收藏",data_day[data_day["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_day[data_day["behavior_type"]=="cart"]["date"].tolist())
line3.add_yaxis("加购",data_day[data_day["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_day[data_day["behavior_type"]=="buy"]["date"].tolist())
line4.add_yaxis("购买",data_day[data_day["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("date",as_index=False)["user_id"].nunique().sort_values(by="date")["date"].tolist())
line5.add_yaxis("UV",data.groupby("date",as_index=False)["user_id"].nunique().sort_values(by="date")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='日期'))
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="5%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

data_hour=data.groupby(["hour","behavior_type"],as_index=False)["user_id"].count().fillna(method="ffill").sort_values(by="hour")
line1=Line()
line1.add_xaxis(data_hour[data_hour["behavior_type"]=="click"]["hour"].tolist())
line1.add_yaxis("点击",data_hour[data_hour["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="时均流量变化"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_hour[data_hour["behavior_type"]=="collect"]["hour"].tolist())
line2.add_yaxis("收藏",data_hour[data_hour["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_hour[data_hour["behavior_type"]=="cart"]["hour"].tolist())
line3.add_yaxis("加购",data_hour[data_hour["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_hour[data_hour["behavior_type"]=="buy"]["hour"].tolist())
line4.add_yaxis("购买",data_hour[data_hour["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("hour",as_index=False)["user_id"].count().sort_values(by="hour")["hour"].tolist())
line5.add_yaxis("PV",data.groupby("hour",as_index=False)["user_id"].count().sort_values(by="hour")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='时间'))
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="6%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

data_hour=data.groupby(["hour","behavior_type"],as_index=False)["user_id"].nunique().fillna(method="ffill").sort_values(by="hour")
line1=Line()
line1.add_xaxis(data_hour[data_hour["behavior_type"]=="click"]["hour"].tolist())
line1.add_yaxis("点击",data_hour[data_hour["behavior_type"]=="click"]["user_id"].tolist())
line1.set_global_opts(title_opts=opts.TitleOpts(title="时均流量变化(用户量)"),legend_opts=opts.LegendOpts(orient="vertical",pos_top="5%",pos_left="2%"))
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line2=Line()
line2.add_xaxis(data_hour[data_hour["behavior_type"]=="collect"]["hour"].tolist())
line2.add_yaxis("收藏",data_hour[data_hour["behavior_type"]=="collect"]["user_id"].tolist())
line2.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="25%",pos_left="2%"))
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line3=Line()
line3.add_xaxis(data_hour[data_hour["behavior_type"]=="cart"]["hour"].tolist())
line3.add_yaxis("加购",data_hour[data_hour["behavior_type"]=="cart"]["user_id"].tolist())
line3.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical",pos_top="45%",pos_left="2%"))
line3.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line4=Line()
line4.add_xaxis(data_hour[data_hour["behavior_type"]=="buy"]["hour"].tolist())
line4.add_yaxis("购买",data_hour[data_hour["behavior_type"]=="buy"]["user_id"].tolist())
line4.set_global_opts(legend_opts=opts.LegendOpts(pos_top="65%",pos_left="2%"))
line4.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

line5=Line()
line5.add_xaxis(data.groupby("hour",as_index=False)["user_id"].nunique().sort_values(by="hour")["hour"].tolist())
line5.add_yaxis("UV",data.groupby("hour",as_index=False)["user_id"].nunique().sort_values(by="hour")["user_id"].tolist())
line5.set_global_opts(legend_opts=opts.LegendOpts(pos_top="85%",pos_left="2%"),
xaxis_opts=opts.AxisOpts(name='时间')
                     )
line5.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render_notebook()

grid_1=Grid()
grid_1.add(line1,grid_opts=opts.GridOpts(pos_left="15%",pos_top="6%",pos_bottom="81%"))
grid_1.add(line2,grid_opts=opts.GridOpts(pos_left="15%",pos_top="24%",pos_bottom="62%"))
grid_1.add(line3,grid_opts=opts.GridOpts(pos_left="15%",pos_top="43%",pos_bottom="43%"))
grid_1.add(line4,grid_opts=opts.GridOpts(pos_left="15%",pos_top="62%",pos_bottom="24%"))
grid_1.add(line5,grid_opts=opts.GridOpts(pos_left="15%",pos_top="81%",pos_bottom="5%"))
grid_1.render_notebook()

data_behavior=data["behavior_type"].value_counts()
data_behavior["click"]

change_rate={"收藏/点击率":round(data_behavior["collect"]/data_behavior["click"],4)*100,
 "加购/点击率":round(data_behavior["cart"]/data_behavior["click"],4)*100,
 "购买/点击率":round(data_behavior["buy"]/data_behavior["click"],4)*100,
 "购买/收藏率":round(data_behavior["buy"]/data_behavior["collect"],4)*100,
 "购买/加购率":round(data_behavior["buy"]/data_behavior["cart"],4)*100,
}
# change_rate.keys()
bar_changerate=Bar()
bar_changerate.add_xaxis(list(change_rate.keys()))
bar_changerate.add_yaxis("转化率",list(change_rate.values()),color="#749f83",label_opts=opts.LabelOpts(formatter=JsCode("function (params) {return params.value + '%'}")))
bar_changerate.set_global_opts(
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %")))
# bar_changerate.set_global_opts(title_opts=opts.TitleOpts(title="转化率"))
bar_changerate.render_notebook()

user_bouncenum=data.groupby("user_id").filter(
    lambda x: x["behavior_type"].count()==1  and
    (x["behavior_type"] =="click" ).all()  )  ["user_id"].count()  #建议使用.all()
user_num=data["user_id"].nunique()
user_bouncerate=user_bouncenum/user_num
print("总用户数:"+str(user_num))
print("跳出用户数:"+str(user_bouncenum))
print("跳出率:%.2f%%"%(round(user_bouncerate,4)*100))

data_buy=data[data["behavior_type"]=="buy"].groupby("user_id")["behavior_type"].count()
data_buy.columns=["buy_num"]
data_buy.sort_values(ascending=False).head(10)

data_buy_distribution=data_buy.groupby(by=data_buy).count()
# print("用户购买次数分布表:")
# print(data_buy_distribution)
bar_buy_distribution=Bar()
xaxis=pd.Series(data_buy_distribution.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_buy_distribution.add_xaxis(xaxis)
bar_buy_distribution.add_yaxis("占比",
list(round(data_buy_distribution/data_buy_distribution.sum()*100,2)),
color="#749f83",
label_opts=opts.LabelOpts(formatter=JsCode("function (params) {return params.value + '%'}")))
bar_buy_distribution.set_global_opts(
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %")))
bar_buy_distribution.set_global_opts(title_opts=opts.TitleOpts(title="用户购买次数分布"),
xaxis_opts=opts.AxisOpts(name='购买次数',name_location="middle",name_gap=20),
                     )
bar_buy_distribution.extend_axis(yaxis=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(formatter="{value} 人"
            )
        ))
line=Line().add_xaxis(xaxis).add_yaxis("人数",list(data_buy_distribution),yaxis_index=1)
bar_buy_distribution.overlap(line)
bar_buy_distribution.render_notebook()

data_retain=pd.DataFrame(columns=["日期","基期用户数","次日留存率","3日留存率","7日留存率","14日留存率","30日留存率"])
date_max=pd.Series(data["date"].unique()).max()
# print(date_max)
# print(date_max+timedelta(days=1))
for date in pd.Series(data["date"].unique()).sort_values():
    data_retain_base=set(data[data["date"]==date]["user_id"].unique())
    data_base_cnt=len(data_retain_base)
    data_retain_2day=len(set(data[data["date"]==date+timedelta(days=1)]["user_id"].unique()) & data_retain_base)/data_base_cnt if date+timedelta(days=1)<= date_max else 0
    # print(data_retain_2day)
    data_retain_3day=len(set(data[data["date"]==date+timedelta(days=2)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=2)<= date_max else 0
    data_retain_7day=len(set(data[data["date"]==date+timedelta(days=6)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=6)<= date_max else 0
    data_retain_14day=len(set(data[data["date"]==date+timedelta(days=13)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=13)<= date_max else 0
    data_retain_30day=len(set(data[data["date"]==date+timedelta(days=29)]["user_id"].unique()) & data_retain_base)/data_base_cnt  if date+timedelta(days=29)<= date_max else 0
    data_retain_item={"日期":[date],"基期用户数":[data_base_cnt],"次日留存率":[round(data_retain_2day,4)],"3日留存率":[round(data_retain_3day,4)],"7日留存率":[round(data_retain_7day,4)],"14日留存率":[round(data_retain_14day,4)],"30日留存率":[round(data_retain_30day,4)]}
    # print(pd.DataFrame(data_retain_item))
    data_retain_item=pd.DataFrame(data_retain_item)
    data_retain=pd.concat([data_retain,data_retain_item],axis=0,join="inner")
data_retain.index=range(0,data_retain.shape[0])
data_retain

#留存率可视化
line_retain=Line()
line_retain.add_xaxis(data_retain["日期"].tolist())
line_retain.add_yaxis("次日留存率",data_retain["次日留存率"].tolist())
line_retain.add_yaxis("3日留存率",data_retain["3日留存率"].tolist())
line_retain.add_yaxis("7日留存率",data_retain["7日留存率"].tolist())
line_retain.add_yaxis("14日留存率",data_retain["14日留存率"].tolist())
line_retain.add_yaxis("30日留存率",data_retain["30日留存率"].tolist())
line_retain.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
line_retain.set_global_opts(title_opts=opts.TitleOpts(title="留存率随日期变动"),
xaxis_opts=opts.AxisOpts(name='日期'),
                     yaxis_opts=opts.AxisOpts(name='留存率'))
line_retain.render_notebook()

#计算平均留存率
print("平均次日留存率: "+str(round(data_retain[data_retain["次日留存率"]!=0]["次日留存率"].mean(),4)))
print("平均3日留存率: "+str(round(data_retain[data_retain["3日留存率"]!=0]["3日留存率"].mean(),4)))
print("平均7日留存率: "+str(round(data_retain[data_retain["7日留存率"]!=0]["7日留存率"].mean(),4)))
print("平均14日留存率: "+str(round(data_retain[data_retain["14日留存率"]!=0]["14日留存率"].mean(),4)))
print("平均30日留存率: "+str(round(data_retain[data_retain["30日留存率"]!=0]["30日留存率"].mean(),4)))

#购买、点击-购买、点击-收藏-购买、点击-加购-购买、点击-收藏&收藏-购买

#检查是否有直接购买的
# print(data[data["behavior_type"]=="buy"])
# 购买的用户集合
data_buy_set=set(data[data["behavior_type"]=="buy"]["user_id"].unique())
#取出购买用户的数据后按照时间排序
# 再按照用户、商品id 分组
data_buy_group=data[data["user_id"].map(lambda s: s in data_buy_set)].sort_values(by="date_time").groupby(["user_id","item_id","item_category"],as_index=False)

#同一用户对同一件商品若购买多件,则按照最后一件的购买时间作为购买时间的标志
data_buy_group_num1=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"buy"})["user_id"].nunique()
print("直接购买用户数:"+ str(data_buy_group_num1))

data_buy_group_num2=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","buy"})["user_id"].nunique()
print("点击-购买用户数:"+ str(data_buy_group_num2))

data_buy_group_num3=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","collect","buy"})["user_id"].nunique()
print("点击--收藏-购买用户数:"+ str(data_buy_group_num3))

data_buy_group_num4=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","cart","buy"})["user_id"].nunique()
print("点击-加购-购买用户数:"+ str(data_buy_group_num4))

data_buy_group_num5=data_buy_group.filter(lambda x: set(x[x["date_time"]<=x[x["behavior_type"]=="buy"]["date_time"].max()]["behavior_type"])=={"click","collect","cart","buy"})["user_id"].nunique()
print("点击-收藏&加购-购买用户数:"+ str(data_buy_group_num5))

# 输出:
# 直接购买用户数:3398
# 点击-购买用户数:2272
# 点击--收藏-购买用户数:41
# 点击-加购-购买用户数:248
# 点击-收藏&加购-购买用户数:2
#R:最近一次交易时间间隔;F:频率,此处定义为这一个月里的消费频率
date_max=data["date"].max()
data_RFM=pd.DataFrame()
data_RFM["R"]=(date_max-data[data["behavior_type"]=="buy"].groupby("user_id")["date"].max()).map(lambda s: s.days)
data_RFM["F"]=data[data["behavior_type"]=="buy"].groupby("user_id")["date"].count()

#最近购买时间间隔分布图
data_distribution=data_RFM.groupby("R")["F"].count()
# print(type(data_distribution))
bar_distribution=Bar()
xaxis=pd.Series(data_distribution.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_distribution.add_xaxis(xaxis)
bar_distribution.add_yaxis("占比",
list(round(data_distribution/data_distribution.sum()*100,2)),
color="#749f83",
label_opts=opts.LabelOpts(formatter=JsCode("function (params) {return params.value + '%'}")))
bar_distribution.set_global_opts(
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %")))
bar_distribution.set_global_opts(title_opts=opts.TitleOpts(title="最近购买时间间隔分布"),
xaxis_opts=opts.AxisOpts(name='天数'),
                     yaxis_opts=opts.AxisOpts(name='用户占比'))
bar_distribution.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_distribution.render_notebook()

data_RFM.describe()

#对R、F打分:
def r_score(x):
    if x<=2:
        return 5
    if x>=3 and x<=5:
        return 4
    if x>=6 and x<=8:
        return 3
    if x>=9 and x<=17:
        return 2
    if x>=18:
        return 1
def f_score(x):
    if x==1:
        return 1
    if x==2:
        return 2
    if x==3:
        return 3
    if x==4:
        return 4
    if x>=5:
        return 5
data_RFM["R_SCORE"]=data_RFM["R"].map(r_score)
data_RFM["F_SCORE"]=data_RFM["F"].map(f_score)

data_RFM["R>R_MEAN"]=data_RFM["R_SCORE"]>data_RFM["R_SCORE"].mean()
data_RFM["F>F_MEAN"]=data_RFM["F_SCORE"]>data_RFM["F_SCORE"].mean()
data_RFM.head()

def user_classification(x):
    r,f= x
    if r==True and f==True:
        return "重要价值用户"
    elif r==True and f==False:
        return "重要发展用户"
    elif r==False and f==True:
        return "重要保持客户"
    elif r==False and f==False:
        return "重要挽留用户"
    else: 
        return None
data_RFM["user_classification"]=data_RFM[["R>R_MEAN","F>F_MEAN"]].apply(user_classification,axis=1)
data_RFM.head()

data_RFM["user_classification"].value_counts()

data_RFM["user_classification"].value_counts(True)

#不同价值客户占比图
label=data_RFM["user_classification"].value_counts(True).index.tolist()
num=round(data_RFM["user_classification"].value_counts(True),4).tolist()
pie=Pie().add("",[z for z in zip(label,num)])
pie.set_global_opts(title_opts=opts.TitleOpts(title="不同价值客户占比"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
pie.render_notebook()

#商品数量与商品类别数
print("商品数目:"+str(data["item_id"].nunique()))
print("商品类别数目:"+str(data["item_category"].nunique()))
# data.head()

#从购买路径了解到,大多数用户并无收藏和加购的习惯,故而商品维度主要进行点击和购买的分析
data_top10_buynum=data[data["behavior_type"]=="buy"].groupby("item_id")["item_id"].count().sort_values(ascending=False).head(10)
bar_top10_buynum=Bar()
xaxis=pd.Series(data_top10_buynum.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_top10_buynum.add_xaxis(xaxis)
bar_top10_buynum.add_yaxis("购买量",
list(data_top10_buynum),
color="#749f83",
)
bar_top10_buynum.set_global_opts(title_opts=opts.TitleOpts(title="购买量top10的商品购买量分布"),
xaxis_opts=opts.AxisOpts(name='商品id',axislabel_opts={"rotate":50}),
                     yaxis_opts=opts.AxisOpts(name='购买量'))
# bar_top10_buynum.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_top10_buynum.render_notebook()

data_top10_clickbuyrate1=pd.DataFrame()
data_top10_clickbuyrate1["click"]=data[data["behavior_type"]=="click"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate2=pd.DataFrame()
data_top10_clickbuyrate2["collect"]=data[data["behavior_type"]=="collect"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate3=pd.DataFrame()
data_top10_clickbuyrate3["cart"]=data[data["behavior_type"]=="cart"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate4=pd.DataFrame()
data_top10_clickbuyrate4["buy"]=data[data["behavior_type"]=="buy"].groupby(["item_id"])["user_id"].count()
result=pd.merge(data_top10_clickbuyrate1,data_top10_clickbuyrate2,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate3,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate4,how="outer",left_index=True,right_index=True)
result=result.fillna(0)
result["buy_click_rate"]= round(result["buy"]/result["click"]*100,2).map(lambda x: str(x)+"%")
result=result.fillna(0)
result.sort_values(by="buy",ascending=False).head(10)

data_top10_clicknum=data[data["behavior_type"]=="click"].groupby("item_id")["item_id"].count().sort_values(ascending=False).head(10)
bar_top10_clicknum=Bar()
xaxis=pd.Series(data_top10_clicknum.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_top10_clicknum.add_xaxis(xaxis)
bar_top10_clicknum.add_yaxis("点击量",
list(data_top10_clicknum),
color="#749f83",
)
bar_top10_clicknum.set_global_opts(title_opts=opts.TitleOpts(title="点击量top10商品的点击量分布"),
xaxis_opts=opts.AxisOpts(name='商品id',axislabel_opts={"rotate":50}),
                     yaxis_opts=opts.AxisOpts(name='点击量'))
# bar_top10_clicknum.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_top10_clicknum.render_notebook()

data_top10_clickbuyrate1=pd.DataFrame()
data_top10_clickbuyrate1["click"]=data[data["behavior_type"]=="click"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate2=pd.DataFrame()
data_top10_clickbuyrate2["collect"]=data[data["behavior_type"]=="collect"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate3=pd.DataFrame()
data_top10_clickbuyrate3["cart"]=data[data["behavior_type"]=="cart"].groupby(["item_id"])["user_id"].count()
data_top10_clickbuyrate4=pd.DataFrame()
data_top10_clickbuyrate4["buy"]=data[data["behavior_type"]=="buy"].groupby(["item_id"])["user_id"].count()
result=pd.merge(data_top10_clickbuyrate1,data_top10_clickbuyrate2,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate3,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate4,how="outer",left_index=True,right_index=True)
result=result.fillna(0)
result["buy_click_rate"]= round(result["buy"]/result["click"]*100,2).map(lambda x: str(x)+"%")
result=result.fillna(0)
result.sort_values(by="click",ascending=False).head(10)

data_top10buynum_category=data[data["behavior_type"]=="buy"].groupby("item_category")["item_category"].count().sort_values(ascending=False).head(10)
bar_top10buynum_category=Bar()
xaxis=pd.Series(data_top10buynum_category.index)
xaxis=xaxis.map(lambda s: str(s)).tolist()
bar_top10buynum_category.add_xaxis(xaxis)
bar_top10buynum_category.add_yaxis("购买量",
list(data_top10buynum_category),
color="#749f83",
)
bar_top10buynum_category.set_global_opts(title_opts=opts.TitleOpts(title="购买量top10商品类别的购买量分布"),
xaxis_opts=opts.AxisOpts(name='商品类别',axislabel_opts={"rotate":50}),
                     yaxis_opts=opts.AxisOpts(name='购买量'))
# bar_top10buynum_category.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar_top10buynum_category.render_notebook()

data_top10_clickbuyrate1=pd.DataFrame()
data_top10_clickbuyrate1["click"]=data[data["behavior_type"]=="click"].groupby(["item_category"])["user_id"].count()
data_top10_clickbuyrate2=pd.DataFrame()
data_top10_clickbuyrate2["collect"]=data[data["behavior_type"]=="collect"].groupby(["item_category"])["user_id"].count()
data_top10_clickbuyrate3=pd.DataFrame()
data_top10_clickbuyrate3["cart"]=data[data["behavior_type"]=="cart"].groupby(["item_category"])["user_id"].count()
data_top10_clickbuyrate4=pd.DataFrame()
data_top10_clickbuyrate4["buy"]=data[data["behavior_type"]=="buy"].groupby(["item_category"])["user_id"].count()
result=pd.merge(data_top10_clickbuyrate1,data_top10_clickbuyrate2,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate3,how="outer",left_index=True,right_index=True)
result=pd.merge(result,data_top10_clickbuyrate4,how="outer",left_index=True,right_index=True)
result=result.fillna(0)
result["buy_click_rate"]= round(result["buy"]/result["click"]*100,2).map(lambda x: str(x)+"%")
result=result.fillna(0)
result.sort_values(by="buy",ascending=False).head(10)

data_top10buynum_category=pd.DataFrame()
# data_top10buynum_category
data_top10buynum_category["buy_num"]=data[data["behavior_type"]=="buy"].groupby("item_category")["item_category"].count().sort_values(ascending=False)
# data_top10buynum_category.columns=["item_category","buy_num"]
data_top10buynum_category["buy_num_cumsum"]=data_top10buynum_category["buy_num"].expanding().sum()
# data_top10buynum_category.head()
max_num=data_top10buynum_category["buy_num_cumsum"].max()
buynumtop80percent_categorynum=data_top10buynum_category[data_top10buynum_category["buy_num_cumsum"]/max_num<0.8]["buy_num_cumsum"].count()
print("贡献前百分之八十销量的类别总数:"+str(buynumtop80percent_categorynum))
rate=buynumtop80percent_categorynum/data["item_category"].nunique()
print("贡献前百分之八十销量的类别占比:"+str(round(rate,3)))

data_top10buynum_item=pd.DataFrame()
# data_top10buynum_item
data_top10buynum_item["buy_num"]=data[data["behavior_type"]=="buy"].groupby("item_id")["item_id"].count().sort_values(ascending=False)
# data_top10buynum_item.columns=["item_id","buy_num"]
data_top10buynum_item["buy_num_cumsum"]=data_top10buynum_item["buy_num"].expanding().sum()
# data_top10buynum_item.head()
max_num=data_top10buynum_item["buy_num_cumsum"].max()
buynumtop80percent_itemnum=data_top10buynum_item[data_top10buynum_item["buy_num_cumsum"]/max_num<0.8]["buy_num_cumsum"].count()
print("贡献前百分之八十销量的商品总数:"+str(buynumtop80percent_itemnum))
rate=buynumtop80percent_itemnum/data["item_id"].nunique()
print("贡献前百分之八十销量的商品占比:"+str(round(rate,3)))

 

四、总结

    • 平台基本情况
      在统计的一个月里,网站总访问量100万次,总访客数9918人,日均访问量约3万次,人均访问量101次。复购率49%,近1/4用户会选择回购,验证了产品与平台的价值,跳出率0.97%,说明平台的用户流失极少,平台商品与广告对用户具有吸引力,人们愿意花费时间在平台上浏览、选购商品。(注:时期包含双12可能导致各指标较日常时期有所提升)
    • 流量维度建议
      1. 用户的活跃时间有规律。在18点-22点,用户的访问量、各项行为指标明显上升,故而可以在此期间多进行推送、直播带货、促销活动等。
      2. 在流量转化方面,收藏、加购、购买的点击转化率均不超过3%,转化率较低,可考虑推送机制是否精准、商品质量是否有待提高、定价是否相对同行更高、售前服务质量是否有待提高等维度来定位问题。
    • 用户维度建议
      1. 用户的短期留存率仍有较大的提升空间,可以通过有奖签到、限时优惠券等方式提高用户粘性;用户的长期留存率相较于短期留存率下降平缓,较为稳定,可以通过增加推送、发放优惠券等方式提升长期中用户对平台的忠诚度。
      2. 在用户的购买路径中,直接购买以及点击-购买是主要的购买方式,虽然收藏与加购的用户数量不低但转为购买量的占比很低,应当针对用户收藏、加购的商品加大力度发放优惠券、推送相关促销活动等促进用户对收藏加购商品的购买。
      3. 据RFM模型对用户进行了分类,针对不同价值的用户采取不同不同的运营策略,进行更为精细化的运营,提升重要价值用户占比,减少重要挽留用户占比。
    • 商品维度建议
      1. 针对购买量前列的商品,依据转化率所在区间的不同,采取不同的运营策略。
      2. 点击量前列的商品,转化率普遍很低,通过推荐算法、流量推广、商品价格与质量等维度定位问题原因。
      3. 对类别的点击购买转化率较低的问题,可以尝试从精准推荐、优质推送、优化同类别商品的搜索流程等维度改善。
      4. 结合帕累托分析的结果,运营活动应对销量贡献大的商品或类别给予更多的资源倾斜。

 

 

标签:数据分析,pos,商品,天猫,user,behavior,data,id,opts
From: https://www.cnblogs.com/yangxingyang/p/17001892.html

相关文章

  • 大数据分析——景点数据分析
    一、选题背景随着我国经济、科技的不断发展和人民生活水平的不断提高,旅游逐渐成为社会的主要经济部门。旅游这项活动在伴随着经济社会的发展同时应运而生,它本质上是一种社......
  • Python网络爬虫—对京东口红销售的数据分析
    一、选题的背景 对电商来说,抓取某些数据,再进行分析,可以有效地反映出数据在某个区间内变化情况。数据受某些因素而发生巨大的影响,也可以借助分析的数据来规划相关项目的后......
  • 数据分析——近年倒闭公司数据分析
    一、选题背景原因:应届毕业生毕业找工作就是一个很大的选择。在即将找工作的这个时间段,就业公司的前景也很重要。所以将分析倒闭公司的情况作为选题。目标:分析每年倒闭公......
  • 淘宝双12购物数据分析
    一、选题的背景随着社会的发展,数据化时代,线上购物比例增幅巨大,各种的线上购物节,6.18、双十一、双十二等等。因此分析双十二活动日时段各行为数量的走势和对比,以及活动......
  • Python网络爬虫——福州小区信息的抓取和数据分析
    一、选题的背景为了能够充分了解福州当地小区的房价信息,并能够充分了解小区的位置,为每个人不同的需求,选择不同价位的房源,并通过其成交量进行参考和选择,以及剩余量爬取的信......
  • 大数据分析——我国近十年的人口比率分析
    选题背景近年来,我国人口总量惯性增长,人口增速有所放缓。与之前相比,人口老龄化加速,人口数量红利进入尾声。当前我国人口的特征是高龄少子,适龄人口生育意愿显著下降,人口老龄......
  • python数据分析练习
    第一部分:数据类型处理数据加载字段含义:user_id:用户IDorder_dt:购买日期order_product:购买产品的数量order_amount:购买金额df=pd.read_csv('../data/CDN......
  • 关于Gmail电子邮件使用情况数据分析
    关于Gmail电子邮件使用数据分析一、选题背景    随着时代的快速发展,互联网越来越发达,越来越多的人们开始抛弃传统的书信邮件,改用了电子邮件。电子邮件有很多的优......
  • 单链表实现小商品信息管理系统
    单链表实现小商品信息管理系统设计一个小商品信息管理系统。根据以下功能,分析使用的逻辑结构和存储结构。(1)增加功能:能录入新数据(包括:商品名称、商品编号、厂家、库存量,......
  • 对美国心脏病数据集进行大数据分析
    一、选题背景    本数据来源于美国2020年40万成年人与其健康状况相关的CDC年度调查数据。心脏病是美国大多数种族(非洲裔美国人、美洲印第安人和阿拉斯加原住......