电商淘宝用户行为分析

一、项目介绍

本次实战的数据是来自阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。
数据下载:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1 数据下载地址
由于数据过于庞大,自己的电脑性能有限,所以截取了前1000万条数据来进行实验,主要还是懂得方法。

二、分析数据

本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:

电商淘宝用户行为分析
用户的4种行为:
电商淘宝用户行为分析

; 三、数据清理

3.1 用pandas处理数据,导入数据的时候加上列名

import pandas as pd
data = pd.read_csv('UserBehavior_1千万条.csv', encoding='utf-8')
data.columns = ['user_id', 'item_id', 'category_id', 'behavior', 'time']
'''
用户id 商品id 商品类id 行为类型 时间戳
行为类型:pv :点击
buy: 够买
cart: 加入购物车
fav:收藏商品
'''

3.2 把时间戳变成时间,并且分成date和time两列


data["time"] = pd.to_datetime(data["time"], unit='s')
data["time"] = data["time"].astype(str)
newdata = data["time"].str.split(" ", 2, True)
newdata.columns = ["date", "time"]
data = data.drop("time", axis=1).join(newdata)

3.3 重复值处理


data.drop_duplicates(inplace=True)

3.4 异常值处理
只保留11月25日到12月4日的数据


data = data.drop(data[(data["date"] < '2017-11-25') | (data["date"] > '2017-12-04')].index)

data = data.sort_values(by="date", ascending=True)

至此,数据预处理完成,把处理好的数据保存方便后序导入数据库

data.to_csv("已经预处理的.csv", index=False)

四、数据分析

这里可视化用pyecharts框架来画图

4.1基于AARRR模型分析

4.1.1用户获取(Acquisition)
采用 日新增用户数DNU,考察每日新增用户和日均访问数量。

每日新增用户:
由下图可见,在12月1日新增用户数非常多(当然这只是去了1000万条数据的,本次实验主要学习的是方法)。

电商淘宝用户行为分析
from pymysql import Connect
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.commons.utils import JsCode

conn = Connect(host='localhost', port=3306, user='root', password='123456', database='dianshang')

cursor = conn.cursor()
sql = """
select date,count(behavior) as 日均访问量
from user
where behavior = 'pv'
group by date
order by date;
"""

cursor.execute(sql)

data = cursor.fetchall()
x = []
y_data = []
x_data = []
for i in range(10):
    x.append(data[i][0])
    y_data.append(data[i][1])
    x_data.append(x[i][5:])

add = []
for i in range(9):
    sum = 0
    sum = y_data[i+1] - y_data[i]
    if  sum < 0:
        sum = 0
    add.append(sum)

background_color_js = (
    "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
)
area_color_js = (
    "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    "[{offset: 0, color: '#eb64fb'}, {offset: 1, color: '#3fbbff0d'}], false)"
)

c = (
    Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
    .add_xaxis(xaxis_data=x_data)
    .add_yaxis(
        series_name="注册总量",
        y_axis=add,
        is_smooth=True,
        is_symbol_show=True,
        symbol="circle",
        symbol_size=6,
        linestyle_opts=opts.LineStyleOpts(color="#fff"),
        label_opts=opts.LabelOpts(is_show=True, position="top", color="white"),
        itemstyle_opts=opts.ItemStyleOpts(
            color="red", border_color="#fff", border_width=3
        ),
        tooltip_opts=opts.TooltipOpts(is_show=False),
        areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="每日新增",
            pos_bottom="5%",
            pos_left="center",
            title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=16),
        ),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            boundary_gap=False,
            axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63"),
            axisline_opts=opts.AxisLineOpts(is_show=False),
            axistick_opts=opts.AxisTickOpts(
                is_show=True,
                length=25,
                linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
            ),
            splitline_opts=opts.SplitLineOpts(
                is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
            ),
        ),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            position="right",
            axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),
            axisline_opts=opts.AxisLineOpts(
                linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
            ),
            axistick_opts=opts.AxisTickOpts(
                is_show=True,
                length=15,
                linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
            ),
            splitline_opts=opts.SplitLineOpts(
                is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
            ),
        ),
        legend_opts=opts.LegendOpts(is_show=False),
    )
    .render("每日新增.html")
)

日均访问数量:

电商淘宝用户行为分析
from pymysql import Connect
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.commons.utils import JsCode

conn = Connect(host='localhost', port=3306, user='root', password='123456', database='dianshang')

cursor = conn.cursor()
sql = """
select date,count(behavior) as 日均访问量
from user
where behavior = 'pv'
group by date
order by date;
"""

cursor.execute(sql)

data = cursor.fetchall()
print(data)
x = []
y_data = []
x_data = []
for i in range(10):
    x.append(data[i][0])
    y_data.append(data[i][1])
    x_data.append(x[i][5:])

background_color_js = (
    "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
)
area_color_js = (
    "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    "[{offset: 0, color: '#eb64fb'}, {offset: 1, color: '#3fbbff0d'}], false)"
)

c = (
    Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
    .add_xaxis(xaxis_data=x_data)
    .add_yaxis(
        series_name="注册总量",
        y_axis=y_data,
        is_smooth=True,
        is_symbol_show=True,
        symbol="circle",
        symbol_size=6,
        linestyle_opts=opts.LineStyleOpts(color="#fff"),
        label_opts=opts.LabelOpts(is_show=True, position="top", color="white"),
        itemstyle_opts=opts.ItemStyleOpts(
            color="red", border_color="#fff", border_width=3
        ),
        tooltip_opts=opts.TooltipOpts(is_show=False),
        areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="11-25到12-04日均访问量",
            pos_bottom="5%",
            pos_left="center",
            title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=16),
        ),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            boundary_gap=False,
            axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63"),
            axisline_opts=opts.AxisLineOpts(is_show=False),
            axistick_opts=opts.AxisTickOpts(
                is_show=True,
                length=25,
                linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
            ),
            splitline_opts=opts.SplitLineOpts(
                is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
            ),
        ),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            position="right",
            axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),
            axisline_opts=opts.AxisLineOpts(
                linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
            ),
            axistick_opts=opts.AxisTickOpts(
                is_show=True,
                length=15,
                linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
            ),
            splitline_opts=opts.SplitLineOpts(
                is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
            ),
        ),
        legend_opts=opts.LegendOpts(is_show=False),
    )
    .render("11-25到12-04日均访问量.html")
)

4.1.2 用户激活(Activation)
首先考察PV(页面浏览量或者点击量),UV(独立访客数),人均浏览次数(PV/UV)
这里用SQL语句进行查询,这里的 user是表的名称。


select count(distinct user_id) "UV(独立访客数)",(select count(user_id) from user where behavior='pv') "PV(页面浏览量或者点击量)",
       (select count(user_id) from user where behavior='pv')/count(distinct user_id) 人均浏览次数
from user

电商淘宝用户行为分析

查看每一天的PV(页面浏览量或者点击量)和UV(独立访客数)

电商淘宝用户行为分析
从上图可以直观看到在进入12月份后,pv和uv都呈现明显的增加,12月份有个重要的电商节——双十二,因此我们合理推测可能是由于双十二的到来吸引了大量用户。
from pymysql import Connect
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker

conn = Connect(host='localhost', port=3306, user='root', password='123456', database='dianshang')

cursor = conn.cursor()
sql = """
select date,count(distinct user_id) 日uv,count(user_id) 日pv
from user where behavior='pv' group by date
"""

cursor.execute(sql)

data = cursor.fetchall()

date_data = []
uv_data = []
pv_data = []
x = []
for i in range(9):
    x.append(data[i][0])
    uv_data.append((data[i][1]))
    pv_data.append((data[i][2]))
    date_data.append(x[i][5:])
print(date_data)
print(uv_data)
print(pv_data)

c = (
    Line()
    .add_xaxis(date_data)
    .add_yaxis(
        "日pv",
        y_axis=pv_data,
        markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),
    )
    .add_yaxis(
        "日uv",
        y_axis=uv_data,
        markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="不同日期的日pv和uv"))
    .render("不同日期的日pv和uv.html")
)

从时间维度出发分析用户行为。

电商淘宝用户行为分析
from pymysql import Connect
import pyecharts.options as opts
from pyecharts.charts import Line

conn = Connect(host='localhost', port=3306, user='root', password='123456', database='dianshang')

cursor = conn.cursor()
sql = """
SELECT date,
sum(case when behavior = 'pv' then 1 else 0 end)as 浏览量,
sum(case when behavior = 'buy' then 1 else 0 end)as 购买量,
sum(case when behavior = 'fav' then 1 else 0 end)as 收藏量,
sum(case when behavior = 'cart' then 1 else 0 end)as 加购量
from user
group by date
"""

cursor.execute(sql)

data = cursor.fetchall()
print(data)
x = []
date_data = []
pv_data = []
buy_data = []
fav_data = []
cart_data = []
for i in range(9):
    x.append(data[i][0])
    date_data.append(x[i][5:])
    pv_data.append((data[i][1]))
    buy_data.append((data[i][2]))
    fav_data.append((data[i][3]))
    cart_data.append((data[i][4]))

print(date_data)
print(pv_data)
print(buy_data)
print(fav_data)
print(cart_data)

(
    Line()
    .add_xaxis(xaxis_data=date_data)
    .add_yaxis(
        series_name="浏览量",
        stack="总量",
        y_axis=pv_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="购买量",
        stack="总量",
        y_axis=buy_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="收藏量",
        stack="总量",
        y_axis=fav_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="加购量",
        stack="总量",
        y_axis=cart_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="用户活跃时间段-日期"),
        tooltip_opts=opts.TooltipOpts(trigger="axis"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
        xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
    )
    .render("用户活跃时间段-日期.html")
)

从周来分析:

电商淘宝用户行为分析
from pymysql import Connect
import pyecharts.options as opts
from pyecharts.charts import Line
conn = Connect(host='localhost', port=3306, user='root', password='123456', database='dianshang')

cursor = conn.cursor()
sql = """
select date_format(date,'%W') as weeks,
       sum(case when behavior='pv' then 1 else 0 end) as 浏览量,
       sum(case when behavior='fav' then 1 else 0 end) as 收藏量,
       sum(case when behavior='cart' then 1 else 0 end) as 加购量,
       sum(case when behavior='buy' then 1 else 0 end) as 购买量
from user GROUP BY weeks order by field(weeks,'周一','周二','周三','周四','周五','周六','周日')
"""

cursor.execute(sql)

data = cursor.fetchall()

week_data = []
pv_data = []
buy_data = []
fav_data = []
cart_data = []
for i in range(6):
    week_data.append(data[i][0])
    pv_data.append((data[i][1]))
    buy_data.append((data[i][2]))
    fav_data.append((data[i][3]))
    cart_data.append((data[i][4]))

print(week_data)
print(pv_data)
print(buy_data)
print(fav_data)
print(cart_data)

(
    Line()
    .add_xaxis(xaxis_data=week_data)
    .add_yaxis(
        series_name="浏览量",
        stack="总量",
        y_axis=pv_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="购买量",
        stack="总量",
        y_axis=buy_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="收藏量",
        stack="总量",
        y_axis=fav_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="加购量",
        stack="总量",
        y_axis=cart_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="用户活跃时间段-周"),
        tooltip_opts=opts.TooltipOpts(trigger="axis"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
        xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
    )
    .render("用户活跃时间段-周.html")
)

从小时来分析:

电商淘宝用户行为分析
from pymysql import Connect
import pyecharts.options as opts
from pyecharts.charts import Line
conn = Connect(host='localhost', port=3306, user='root', password='123456', database='dianshang')

cursor = conn.cursor()
sql = """
SELECT time,
sum(case when behavior = 'pv' then 1 else 0 end)as 浏览量,
sum(case when behavior = 'buy' then 1 else 0 end)as 购买量,
sum(case when behavior = 'fav' then 1 else 0 end)as 收藏量,
sum(case when behavior = 'cart' then 1 else 0 end)as 加购量
from user
group by hour(time)
order by hour(time);
"""

cursor.execute(sql)

data = cursor.fetchall()
print(data)
x = []
hour_data = []
pv_data = []
buy_data = []
fav_data = []
cart_data = []
for i in range(24):
    x.append(data[i][0])
    hour_data.append(x[i][0:2])
    pv_data.append((data[i][1]))
    buy_data.append((data[i][2]))
    fav_data.append((data[i][3]))
    cart_data.append((data[i][4]))

print(hour_data)
print(pv_data)
print(buy_data)
print(fav_data)
print(cart_data)

(
    Line()
    .add_xaxis(xaxis_data=hour_data)
    .add_yaxis(
        series_name="浏览量",
        stack="总量",
        y_axis=pv_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="购买量",
        stack="总量",
        y_axis=buy_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="收藏量",
        stack="总量",
        y_axis=fav_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="加购量",
        stack="总量",
        y_axis=cart_data,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="用户活跃时间段-小时"),
        tooltip_opts=opts.TooltipOpts(trigger="axis"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
        xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
    )
    .render("用户活跃时间段-小时.html")
)

可以看出每天在10时平台总流量开始上升,到达14时达到最高值,6-9时比较平稳,12-14时左右应该是午饭时间,大部分的人都会看看手机。而在14时过后迅速下降,在20时到达最低,14时后下午的工作生活就开始了,学生也要上课了,很明显可以看到在18时减缓的趋势降低了很多,此时为下班放学的高峰期,20时吃完晚饭忙完一天的工作后,平台流量就再次开始上涨,直到两点,不难想到大部分的人都会睡觉。从11月30日到12月2日用户的浏览量和加购量有较大的增幅,同时收藏量也有明显增大的趋势,但购买量并没有呈现出明显增大,这可能是因为双十二即将来临,用户更加倾向于选择先收藏加购物车,再在双十二当天领取优惠下单。

4.1.3用户留存(Retention)

select 注册日期,
sum(case when 活跃的第n天=0 then 1 else 0 end) as 每日新增用户数,
sum(case when 活跃的第n天=1 then 1 else 0 end) as 1天后用户数,
sum(case when 活跃的第n天=2 then 1 else 0 end) as 2天后用户数,
sum(case when 活跃的第n天=3 then 1 else 0 end) as 3天后用户数,
sum(case when 活跃的第n天=4 then 1 else 0 end) as 4天后用户数,
sum(case when 活跃的第n天=5 then 1 else 0 end) as 5天后用户数,
sum(case when 活跃的第n天=6 then 1 else 0 end) as 6天后用户数,
sum(case when 活跃的第n天=7 then 1 else 0 end) as 7天后用户数,
sum(case when 活跃的第n天=8 then 1 else 0 end) as 8天后用户数
from(select user1.user_id, user1.date, user2.注册日期, datediff(date,注册日期) as 活跃的第n天
     from(select user_id, date
                 from user
                 group by user_id, date) as user1
     inner join (select user_id, min(date) as 注册日期
                        from user
                        group by user_id) as user2
     on user1.user_id = user2.user_id) as a
group by 注册日期

电商淘宝用户行为分析
用后一天除前一天
select 注册日期,每日新增用户数,
concat((round((1天后用户数/每日新增用户数)*100, '%')), '%') as 第1天留存率,
concat((round((2天后用户数/每日新增用户数)*100, '%')), '%') as 第2天留存率,
concat((round((3天后用户数/每日新增用户数)*100, '%')), '%') as 第3天留存率,
concat((round((4天后用户数/每日新增用户数)*100, '%')), '%') as 第4天留存率,
concat((round((5天后用户数/每日新增用户数)*100, '%')), '%') as 第5天留存率,
concat((round((6天后用户数/每日新增用户数)*100, '%')), '%') as 第6天留存率,
concat((round((7天后用户数/每日新增用户数)*100, '%')), '%') as 第7天留存率,
concat((round((8天后用户数/每日新增用户数)*100, '%')), '%') as 第8天留存率
from(select 注册日期,
sum(case when 活跃的第n天=0 then 1 else 0 end) as 每日新增用户数,
sum(case when 活跃的第n天=1 then 1 else 0 end) as 1天后用户数,
sum(case when 活跃的第n天=2 then 1 else 0 end) as 2天后用户数,
sum(case when 活跃的第n天=3 then 1 else 0 end) as 3天后用户数,
sum(case when 活跃的第n天=4 then 1 else 0 end) as 4天后用户数,
sum(case when 活跃的第n天=5 then 1 else 0 end) as 5天后用户数,
sum(case when 活跃的第n天=6 then 1 else 0 end) as 6天后用户数,
sum(case when 活跃的第n天=7 then 1 else 0 end) as 7天后用户数,
sum(case when 活跃的第n天=8 then 1 else 0 end) as 8天后用户数
from(select user1.user_id, user1.date, user2.注册日期, datediff(date,注册日期) as 活跃的第n天
     from(select user_id, date
                 from user
                 group by user_id, date) as user1
     inner join (select user_id, min(date) as 注册日期
                             from user
                             group by user_id) as user2
     on user1.user_id = user2.user_id) as a
group by 注册日期) as b

电商淘宝用户行为分析

4.1.4用户推荐(Referral)

用户行为转为漏斗

电商淘宝用户行为分析
sql = """
select behavior,count(behavior) 用户行为数,count(distinct user_id) 独立访客数
from user
group by behavior
"""

cursor.execute(sql)

data = cursor.fetchall()
x = []
y = []
for i in range(4):
    x.append(data[i][0])
    y.append(data[i][1])
print(x)
print(y)

data = [[x[i], y[i]] for i in range(len(x))]
(
    Funnel(init_opts=opts.InitOpts(width="1600px", height="800px"))
    .add(
        series_name="",
        data_pair=data,
        gap=2,
        tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} {b} : {c}%"),
        label_opts=opts.LabelOpts(is_show=True, position="inside"),
        itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户行为转为漏斗.html"))
    .render("用户行为转为漏斗.html.html")
)

独立访客转为漏斗

电商淘宝用户行为分析
sql = """
select behavior,count(behavior) 用户行为数,count(distinct user_id) 独立访客数
from user
group by behavior
"""

cursor.execute(sql)

data = cursor.fetchall()
x = []
y = []
for i in range(4):
    x.append(data[i][0])
    y.append(data[i][2])
print(x)
print(y)

data = [[x[i], y[i]] for i in range(len(x))]
c = (
    Funnel()
    .add(series_name="",
        data_pair=data
         )
    .set_global_opts(title_opts=opts.TitleOpts(title="独立访客转为漏斗"))
    .render("独立访客转为漏斗.html")
)

从用户行为转化漏斗看出,用户从收藏或加购到购买的转化率较高,说明用户在最后产生购买行为之前花费了较长时间停留在点击浏览,加购物车和收藏这三个行为中。更有趣的是在独立访客转化漏斗中,发现有收藏行为的独立用户占比最少,而从加购到购买的转化率达到了,说明相对于收藏功能,加购功能更受用户的青睐。

4.1.5用户收益(Revenue)

电商淘宝用户行为分析
sql = """
select 购买量, count(user_id) 用户数, count(user_id)/(select count(user_id) from p_behavior) 复购率
from p_behavior group by 购买量 order by 用户数 desc
"""

cursor.execute(sql)

data = cursor.fetchall()
x = []
y = []
for i in range(15):
    x.append(data[i][0])
    y.append(data[i][2])
print(x)
print(y)

c = (
    Bar()
    .add_xaxis(x)
    .add_yaxis("  ", y)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="不同购买次数占比"),
        datazoom_opts=opts.DataZoomOpts(),
    )
    .render("不同购买次数占比.html")
)

用户购买次数有0-87次,20次以上的用户极有可能是刷单行为,所以我在这里不显示出来。整体购买率还可以,比较客观,可针对复购用户的喜好和习惯调整平台首页的各栏目显示顺序和展示区域,在提供更便捷的服务的同时鼓励用户尝试其他板块的体验,以便展示更多推荐商品和增加引流。

4.2基于RFM模型的用户价值分析

RFM 模型是衡量客户价值和客户创利能力的重要工具,是按照最近一次消费 (Recency),消费频率 (Frequency),消费金额 (Monetary),由于数据中不存在用户消费金额的信息,因此本案例只对用户的消费近度和消费频率进行分析。

4.2.1 R,F打分

select user_id, recency, frecency
from(select user_id,recency,frecency,
cast(row_number() over(order by frecency asc, user_id asc) as signed) as 'id1',
cast(row_number() over(order by frecency desc, user_id desc) as signed) as 'id2'
from rf) as newtable
where abs(id1-id2)=1 or
id1=id2;

电商淘宝用户行为分析
R 的最小时间间隔为 0,最大时间间隔为 8;F 的最近一段时间购买频度最小为 1,最大的购买频度为 84,R值的平均值为2.5,中位数为2,F值的平均值为3,中位数为2,可以根据这两个指标指定一个打分表。
    select user_id,case when recency between 0 and 1 then 2 when recency between 2 and 4 then 1
                        when recency between 5 and 8 then 0 else NULL end r_score,
           case when frecency between 1 and 2 then 0 when frecency between 3 and 5 then 1
           when frecency between 6 and 84 then 2 else NULL end f_score
    from rf
    order by user_id

电商淘宝用户行为分析
4.2.2 计算R,F平均值和标签
    select user_id,r_score,f_score,
           case when r_score>(select avg(r_score) from RF_score) then '高' else '低' end r_class,
           case when f_score>(select avg(f_score) from RF_score) then '高' else '低' end f_class
    from RF_score

电商淘宝用户行为分析

4.3.3 用户分层

select user_id,r_score,f_score
           ,case when r_class='高' and f_class='高' then '价值用户'
                 when r_class='高' and f_class='低' then '发展用户'
                 when r_class='低' and f_class='高' then '保持用户'
                 when r_class='低' and f_class='低' then '挽留用户'
           end as label
    from rf_class

电商淘宝用户行为分析
计算不同用户所占的比例
电商淘宝用户行为分析
sql = """
select label 用户类别,count(user_id) 用户数,count(user_id)/(select count(user_id) from rf_label) 用户占比
from rf_label
group by label
"""

cursor.execute(sql)

data = cursor.fetchall()
x = []
y = []
for i in range(4):
    x.append(data[i][0])
    y.append(data[i][2])
print(x)
print(y)

c = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(x, y)],
        radius=["40%", "55%"],
        label_opts=opts.LabelOpts(
            position="outside",
            formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c}  {per|{d}%}  ",
            background_color="#eee",
            border_color="#aaa",
            border_width=1,
            border_radius=4,
            rich={
                "a": {"color": "#999", "lineHeight": 22, "align": "center"},
                "abg": {
                    "backgroundColor": "#e3e3e3",
                    "width": "100%",
                    "align": "right",
                    "height": 22,
                    "borderRadius": [4, 4, 0, 0],
                },
                "hr": {
                    "borderColor": "#aaa",
                    "width": "100%",
                    "borderWidth": 0.5,
                    "height": 0,
                },
                "b": {"fontSize": 16, "lineHeight": 33},
                "per": {
                    "color": "#eee",
                    "backgroundColor": "#334455",
                    "padding": [2, 4],
                    "borderRadius": 2,
                },
            },
        ),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户群所占的比例"))
    .render("用户群所占的比例.html")
)

"""
重要价值用户:R高F高。这类用户是平台的高质量用户,他们已为平台做了较多的贡献,应给予优惠回馈性服务和个性化服务,以鼓励他们持续购买的热情。

重要发展用户:R高F低。这类用户最近有购买行为但频率不高,可向其提供忠诚度计划,推荐更符合用户喜好、性价比高的商品,吸引其购买,逐渐提高忠诚度。如果是新客户,则需要建立关系,提供新人优惠券鼓励消费。

重要保持用户:R低F高。活跃度低的用户可通过短信等场外提醒来引导其入场参与优惠活动,并提供更新产品来鼓励他们再次购买。还可以鼓励其对之前购买的商品做评价以提高商品热度和可信度。

重要挽留用户:R低F低。这类用户占比最多且容易流失,需要重点挽留,必要时可主动联系客户询问流失原因。可通过拼团打折、积分兑换、捆绑销售、热卖热点商品等活动唤起用户注意力,提升用户兴趣。

"""

根据上图可知可以看到挽留用户占比最多达到了38.01%,价值用户次之,为24.85%,保持用户和发展用户的占比相差不多。根据用户价值分析,我们可以得到用户分层结果,可以根据每个用户群的特性,实现差异化营销:

重要价值用户:R高F高。这类用户是平台的高质量用户,他们已为平台做了较多的贡献,应给予优惠回馈性服务和个性化服务,以鼓励他们持续购买的热情。

重要发展用户:R高F低。这类用户最近有购买行为但频率不高,可向其提供忠诚度计划,推荐更符合用户喜好、性价比高的商品,吸引其购买,逐渐提高忠诚度。如果是新客户,则需要建立关系,提供新人优惠券鼓励消费。

重要保持用户:R低F高。活跃度低的用户可通过短信等场外提醒来引导其入场参与优惠活动,并提供更新产品来鼓励他们再次购买。还可以鼓励其对之前购买的商品做评价以提高商品热度和可信度。

重要挽留用户:R低F低。这类用户占比最多且容易流失,需要重点挽留,必要时可主动联系客户询问流失原因。可通过拼团打折、积分兑换、捆绑销售、热卖热点商品等活动唤起用户注意力,提升用户兴趣。

4.4.4 商品销售分析
关注商品的浏览量,加购量,收藏量以及购买量等

电商淘宝用户行为分析

电商淘宝用户行为分析
在这里插入图片描述

查看成交量大于21的商品

电商淘宝用户行为分析
from pyecharts import options as opts
from pyecharts.charts import TreeMap

data = [
    {"value": 134, "name": "3122135"},
    {"value": 78, "name": "3031354"},
    {"value": 74, "name": "2964774"},
    {"value": 68, "name": "1910706"},
    {"value": 59, "name": "2560262"},
    {"value": 59, "name": "1116492"},
    {"value": 56, "name": "3964583"},
    {"value": 54, "name": "1415828"},
    {"value": 53, "name": "1168232"},
    {"value": 52, "name": "3189426"},
    {"value": 50, "name": "3237415"},
    {"value": 50, "name": "1034594"},
    {"value": 46, "name": "705557"},
    {"value": 46, "name": "1813380"},
    {"value": 45, "name": "740947"},
    {"value": 45, "name": "257772"},
    {"value": 45, "name": "1535294"},
    {"value": 44, "name": "5062984"},
    {"value": 43, "name": "5051027"},
    {"value": 43, "name": "4024409"},
]
c = (
    TreeMap()
    .add("成交量大于21的商品(选取前20名)", data)
    .set_global_opts(title_opts=opts.TitleOpts(title="成交量大于21的商品"))
    .render("成交量大于21的商品.html")
)

通过以上发现浏览量前十的商品,没有进入销量前20,说明用户看了又看但是不一定买。针对浏览量高而销量不高的这部分商品,需要提高的是用户从点击进入商品详情页到最终购买的体验。

电商淘宝用户行为分析
根据上图发现,成交量为1的商品最多,也从侧面说明该平台不能把握用户的消费喜好,无法得到用户最想买的商品,或者是定价不合理导致用户即使有喜欢的也不会购买。
4.5.5 通过RFM模型找出最具价值的核心付费用户群,对这部分用户的行为进行分析
select avg(点击),avg(收藏),avg(加入购物车),avg(购买) from (
Select user_id,
             sum(case when behavior='pv' then 1 else 0 end) as '点击',
             sum(case when behavior='fav' then 1 else 0 end) as '收藏',
             sum(case when behavior='cart' then 1 else 0 end) as '加入购物车',
             sum(case when behavior='buy' then 1 else 0 end) as '购买'
from user
where user_id in (select user_id from rf_label where label='价值用户')
GROUP BY user_id
order by 购买 desc,点击 desc) a;

电商淘宝用户行为分析
从提取的价值用户数据中,不难发现这些用户在这九天中的平均购买次数为5.4,平均收藏行为次数和平均加购次数远小于平均点击浏览次数,表明收藏和加购物车这两个功能的使用频率极低且收藏功能的使用频率最低。

五、总结

本文分析了淘宝APP用户行为数据共100万条,从四个不同角度提出业务问题,使用AARRR模型和RFM模型分析数据给出如下结论和建议。
5.1 通过AARRR模型分析用户使用的各个环节
1.用户获取
在研究时段内,每天都有新增用户,每天12点到14点是活跃用户的黄金时段,用户浏览量、加购量、收藏量和购买量都在这个时间段达到最大值,平台可以利用这个时间段投放广告,加大力度宣传产品.

2.用户激活
多多推出活动,让大家去注册用户,找到产品和用户的切入点,找到用户的”啊哈”时刻,让用户再注册后有进行下一步的冲动。用户从挑选商品到完成购买之前是一个危险区,很多人中途会因为种种原因放弃购买,可以通过分析用户行为确定夹点位置,提出改善转化率的建议。
3.用户留存
让用户养成习惯,在一定程度上增加用户对产品的依赖性,导致无法离开该平台。让用户习惯打开淘宝。
4.用户收益
高复购次数的用户少,商家可以从商品质量、服务质量、物流体验三方面寻找原因,定位所在问题点,寻求高复购率突。
5.用户推荐
淘宝本身用户基数庞大,知名度高,个人认为在一二线城市的用户基本已经达到饱和,传播工作需要针对三四线城市的渠道下沉,在这些地区针对用户价格敏感度高的特性开展类似拼多多的拼团转发和打折促销活动,扩大这部分用户的使用率。

Original: https://blog.csdn.net/Sugar_yjl/article/details/124717529
Author: Sugar_faith
Title: 电商淘宝用户行为分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/676934/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球