电商用户行为可视化分析

news2024/11/23 15:26:35

1、导包

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.charts import Grid

2、导数据

t_f_user = pd.read_csv("tianchi_fresh_comp_train_user.csv")

tianchi_fresh_comp_train_user_2w,包含如下字段:

字段 字段说明 提取说明

user_id 用户标识 抽样&字段脱敏

item_id 商品标识 字段脱敏

behavior_type 用户对商品的行为类型 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4。

user_geohash 用户位置的空间标识,可以为空 由经纬度通过保密的算法生成

item_category 商品分类标识 字段脱敏

time 行为时间 精确到小时级别

3、数据探索

t_f_user.shape
(23291027, 6)
t_f_user.info()

t_f_user.describe()

查看缺失值

t_f_user.isnull().sum()

查看重复值

t_f_user.duplicated().sum()
7827917

4、数据预处理

去重

t_f_user.drop_duplicates(keep="last",inplace=True)

转换时间类型

t_f_user["time"] = pd.to_datetime(t_f_user["time"],errors="coerce")

5、统计每日PV和UV数据

t_f_user["date_time"] =t_f_user["time"].dt.date


pv_day = t_f_user[t_f_user["behavior_type"]==1].groupby(["date_time"])["behavior_type"].count()



uv_day = t_f_user[t_f_user["behavior_type"]==1].drop_duplicates(subset=["user_id","date_time"]).groupby("date_time")["user_id"].count()
attr = list(pv_day.index)

pv = (

    Line(
        init_opts=opts.InitOpts(
            width="1000px",
            height = "500px"
         )
    )
    .add_xaxis(
        xaxis_data=attr
    
    )
    
    .add_yaxis(
        "pv",
        np.around(pv_day.values/10000,decimals=2),
        label_opts=opts.LabelOpts(is_show=False)
    
    )
    .add_yaxis(
        series_name="uv",
        yaxis_index=1,
        y_axis = np.around(uv_day.values / 10000,decimals=2),
        label_opts= opts.LabelOpts(is_show=False)
    
    )
    
    .extend_axis(
        yaxis=opts.AxisOpts(
            name ="uv",
            type_="value",
            min_=0,
            max_=1.6,
            interval=0.4,
            axislabel_opts=opts.LabelOpts(formatter="{value}万人")
        
        )
    
    )
    
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(
            is_show=True,
            trigger="axis",
            axis_pointer_type="cross"
        
        ),
        xaxis_opts= opts.AxisOpts(
            type_="category",
            axispointer_opts=opts.AxisPointerOpts(
                is_show = True,
                   type_ = "shadow"
            )
        ),
        yaxis_opts=opts.AxisOpts(
            name="pv",
            type_="value",
            min_ =0,
            max_ = 100,
            interval=20,
            axislabel_opts= opts.LabelOpts(formatter="{value}万次"),
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True)
        
        ),
       title_opts = opts.TitleOpts(title="PV与UV趋势图")
     
    )

)
pv.render_notebook()

通过 PV、UV趋势图可以发现在双十二期间PV量和 UV量都有了明显的提升,并在12月12日达到顶峰。 非活动期间 PV和UV 每天波动性都不是很大,其中 PV 值在42万上下小幅度波动,UV值在1.2万上下小幅度波动

6、pv、uv日差异分析

pv_uv_diff = pd.concat([pv_day,uv_day],join="outer",axis=1)
pv_uv_diff.columns=["pv_diff","uv_diff"]
pv_uv_diff = pv_uv_diff.diff()


attr = pv_uv_diff.index

pv = pv_uv_diff["pv_diff"]
uv = pv_uv_diff["uv_diff"]
diff =(
    Line(
        init_opts=opts.InitOpts(
            width="1000px",
            height="500px"
        )
    )
    .add_xaxis(xaxis_data=attr)
    .add_yaxis(
        "新增PPV",
        pv,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="新增UV",
            type_ = "value",
            min_ = -2000,
            max_ = 1600,
            axislabel_opts=opts.LabelOpts(formatter="{value}")
        
        )
    
    )
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(
            is_show=True,
            trigger="axis",
            axis_pointer_type="cross"
        ),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
        ),
        yaxis_opts=opts.AxisOpts(
            name="新增PV",
            type_="value",
            min_=-350000,
            max_=250000,
            interval=100000,
            axislabel_opts=opts.LabelOpts(formatter="{value}"),
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
            
        ),
        
        title_opts = opts.TitleOpts(title="pv、uv日差异分析")
    )

)
diff2 =(
    Line()
    .add_xaxis(xaxis_data=attr)
    .add_yaxis(
        "新增uv",
        uv ,
        yaxis_index='1',
        label_opts=opts.LabelOpts(is_show=False)
    )
)
t =diff.overlap(diff2)
t.render_notebook()

7、不同时期用户行为分析

collect = t_f_user[t_f_user["behavior_type"]==2].groupby("date_time")["behavior_type"].count()
shapping_cart = t_f_user[t_f_user["behavior_type"]==3].groupby("date_time")["behavior_type"].count()
buy = t_f_user[t_f_user["behavior_type"]==4].groupby("date_time")["behavior_type"].count()

sns.set()
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
fig = plt.figure(figsize=(10,5))
ax=plt.subplot()
plt.plot(collect.index,collect.values,color="g",marker="^")
plt.plot(shapping_cart.index,shapping_cart.values,color="r",marker="^")
plt.plot(buy.index,buy.values,color="b",marker="^")
plt.legend(["收藏","添加购物车","购买"])
plt.title("不同时期用户行为分析")
plt.yticks([i for i in range(0,50001,10000)])
plt.xticks(collect.index,rotation=90)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)

plt.ylabel("人数")
plt.show()

8、不同时期的转化率

pv_day = t_f_user[t_f_user["behavior_type"]==1].groupby(["date_time"])["behavior_type"].count()

buy_day = t_f_user[t_f_user["behavior_type"]==4].groupby(["date_time"])["behavior_type"].count()



rate  = np.around(buy_day.values /  pv_day.values,3)
attr = buy_day.index
b_rate =(
    Line()
    .add_xaxis(xaxis_data=buy_day.index.to_list())
    .add_yaxis(
        series_name= "转化率",
       y_axis=rate
    )
     .set_global_opts(title_opts=opts.TitleOpts(title="不同时期的转化率"))
)

b_rate.render_notebook()

seaborn 绘图

rate  = np.around(buy_day /  pv_day,3).reset_index()
sns.set()
fig = plt.figure(figsize=(10,5))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
sns.lineplot(data = rate,x="date_time",y="behavior_type",markers="o")
plt.xlabel("日期")
plt.ylabel("转化率")
plt.title("不同时期转化率")
plt.xticks(rate["date_time"],rotation=90)
plt.show()

9、选取活动数据子集和日常数据子集

由于数据里面包含双十二大促的数据,因此整理分析用户的不同时段行为可能会导致分析结果与实际差异较大,因此拆分开来做不同的对比分析

active_data=t_f_user[t_f_user["date_time"].isin(["2014/12/11","2014/12/12","2014/12/13"])]
daily_data =t_f_user[~t_f_user["date_time"].isin(["2014/12/11","2014/12/12","2014/12/13"])]

  双十二期间不同时段的用户行为分析

t_f_user["hour"] = t_f_user["time"].dt.hour 


active_collect_hour = active_data[active_data["behavior_type"]==2].groupby("hour")["behavior_type"].count()
active_shapping_cart_hour = active_data[active_data["behavior_type"]==3].groupby("hour")["behavior_type"].count()
active_buy_hour = active_data[active_data["behavior_type"]==4].groupby("hour")["behavior_type"].count()


active_pv_hour = active_data[active_data["behavior_type"]==1].groupby("hour")["user_id"].count()



active_collect_hour_m = np.round(active_collect_hour.values / 3,0).tolist()
active_shapping_cart_hour_m = np.round(active_shapping_cart_hour.values / 3,0).tolist()
active_buy_hour_m  = np.round(active_buy_hour.values / 3,0).tolist()
active_pv_hour_m  = np.round(active_pv_hour.values  /3,0).tolist()


attr = list(active_collect_hour.index)
plt.figure(figsize=(12,8))
ax1 = plt.subplot(2,1,1)
ax1.spines["top"].set_visible(False)
ax1.spines["right"].set_visible(False)
ax1 = plt.bar(attr,active_pv_hour_m)
plt.title("双十二期间各时间段PV值")
plt.xticks([i for i in range(0,24,1)])

ax2 = plt.subplot(2,1,2)
ax2.spines["top"].set_visible(False)
ax2.spines["right"].set_visible(False)
ax2.plot(attr,active_collect_hour_m,label="收藏",color="b",marker="^")
ax2.plot(attr,active_shapping_cart_hour_m,label="添加购物车",color="r",marker="^")
ax2.plot(attr,active_buy_hour_m ,label="购买",color="g",marker="^")
ax2.legend(loc="best")

plt.title("正常期间各时间段用户行为")
plt.xticks([i for i in range(0,24,1)])
plt.show()

日常期间不同时段的用户行为分析

from pyecharts.charts import Bar



daily_collect_hour = daily_data[daily_data["behavior_type"]==2].groupby("hour")["behavior_type"].count()
daily_shapping_cart_hour = daily_data[daily_data["behavior_type"]==3].groupby("hour")["behavior_type"].count()
daily_buy_hour = daily_data[daily_data["behavior_type"]==4].groupby("hour")["behavior_type"].count()

daily_pv_hour =daily_data[daily_data["behavior_type"]==1].groupby("hour")["user_id"].count()

daily_collect_hour_m = np.round(daily_collect_hour.values / 3,0).tolist()
daily_shapping_cart_hour_m = np.round(daily_shapping_cart_hour.values / 3,0).tolist()
daily_buy_hour_m  = np.round(daily_buy_hour.values / 3,0).tolist()
daily_pv_hour_m  = np.round(daily_pv_hour.values  /3,0).tolist()



pv_m=( 
    Bar()
    .add_xaxis(xaxis_data=attr)
    .add_yaxis(
    "浏览人数",
        daily_pv_hour_m  ,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="日常PV各时间段数据"),
    )
)

daily_m =(
      Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
      .add_xaxis(xaxis_data=attr)
      .add_yaxis(
        "加购人数",
        daily_shapping_cart_hour_m ,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .add_yaxis(
        "收藏人数",
        daily_collect_hour_m,
        label_opts=opts.LabelOpts(is_show=False)
    )
     .add_yaxis(
        "购买人数",
        daily_buy_hour_m ,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15)),
        title_opts=opts.TitleOpts(title="日均各时段活动用户行为",pos_top="48%"),
        legend_opts=opts.LegendOpts(pos_top="48%"),
    )

)
ggrid = (
    Grid()
    .add(pv_m, grid_opts=opts.GridOpts(pos_bottom="60%"))
    .add(daily_m , grid_opts=opts.GridOpts(pos_top="60%"))
)
ggrid.render_notebook()

不同时段的购买率

#活动期间
active_hour_buy_user_num = active_data[active_data["behavior_type"] == 4].drop_duplicates(['user_id','date_time','hour']).groupby('hour')['user_id'].count()

active_hour_user_num = active_data.drop_duplicates(['user_id','date_time','hour']).groupby('hour')['user_id'].count()

active_hour_buy_rate = np.around(active_hour_buy_user_num.values / active_hour_user_num.values,3)


#日常期间

daily_hour_buy_user_num = daily_data[daily_data["behavior_type"] == 4].drop_duplicates(['user_id','date_time','hour']).groupby('hour')['user_id'].count()
daily_hour_user_num = daily_data.drop_duplicates(['user_id','date_time','hour']).groupby('hour')['user_id'].count()
daily_buy_rate = np.around(daily_hour_buy_user_num.values / daily_hour_user_num.values,3)





buy_rate=(
    Line()
    .add_xaxis(xaxis_data=attr)
    .add_yaxis(
        "日常购买率",
       daily_buy_rate,
    )
    .add_yaxis(
        "活动购买率",
       active_hour_buy_rate,
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="不同时段购买率"))
)

buy_rate.render_notebook() 

转化漏斗分析

活动期间的转化漏斗

active_pv_num = active_data[active_data["behavior_type"]==1]["user_id"].count()
active_collect_num=active_data[active_data["behavior_type"]==2]["user_id"].count()
active_cart_num=active_data[active_data["behavior_type"]==3]["user_id"].count()
active_buy_num=active_data[active_data["behavior_type"]==4]["user_id"].count()


attr=["点击","加入购物车","收藏","购买"]


values=[np.around((active_pv_num/active_pv_num*100),2),
        np.around((active_cart_num/active_pv_num*100),2),
        np.around((active_collect_num/active_pv_num*100),2),
        np.around((active_buy_num/active_pv_num*100),2),
       ]


data = [[attr[i], values[i]] for i in range(len(attr))]


a=(
    Funnel()
    .add(
        series_name="用户行为",
        data_pair=data,
        gap=2,
        tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b} : {c}%",is_show=True),
        label_opts=opts.LabelOpts(is_show=True, position="ourside"),
        itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户转化漏斗", subtitle="活动"))
)
a.render_notebook()

日常漏斗

daily_pv_num = daily_data[daily_data["behavior_type"]==1]["user_id"].count()
daily_collect_num=daily_data[daily_data["behavior_type"]==2]["user_id"].count()
daily_cart_num=daily_data[daily_data["behavior_type"]==3]["user_id"].count()
daily_buy_num=daily_data[daily_data["behavior_type"]==4]["user_id"].count()


attr=["点击","加入购物车","收藏","购买"]

values=[np.around((daily_pv_num/daily_pv_num*100),2),
        np.around((daily_cart_num/daily_pv_num*100),2),
        np.around((daily_collect_num/daily_pv_num*100),2),
        np.around((daily_buy_num/daily_pv_num*100),2),
       ]

data = [[attr[i], values[i]] for i in range(len(attr))]


a=(
    Funnel()
    .add(
        series_name="用户行为",
        data_pair=data,
        gap=2,
        tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b} : {c}%",is_show=True),
        label_opts=opts.LabelOpts(is_show=True, position="ourside"),
        itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户转化漏斗", subtitle="活动"))
)
a.render_notebook()

按照“点击-加入购物车-收藏-购买”这一用户行为路径,我们可通过优化“点击-加入购物车”这一环节进而提升购买的转化率,可以通过鼓励用户收藏加购后可以领券来刺激用户加购收藏从而刺激用户的购买欲望。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1289319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提高企业邮箱安全性的策略与技巧

提高企业邮箱的安全性的方法大体相同&#xff0c;每家邮箱供应商也可能会有自己独有防护措施。 为了增强Zoho Mail企业邮箱的安全性&#xff0c;您可参考以下建议&#xff1a; 采用强密码&#xff1a;创建包含大写字母、小写字母、数字和特殊字符的复杂密码&#xff0c;并定期…

基于SSM的图书馆管理系统运行部署教程

基于SSM的图书馆管理系统运行部署教程 1、下载2、数据准备-导入sql文件3、项目导入idea4、项目运行5、测试6、日志乱码问题 1、下载 源码下载地址&#xff1a; https://download.csdn.net/download/weixin_44796239/85072348下载之后&#xff0c;会得到一个压缩包&#xff1a; …

Windows驱动中校验数字签名(使用 ci.dll)

1.背景 对于常规应用程序来说&#xff0c;校验数字签名认证在应用层可以使用 WinVerifyTrust, 在驱动层使用常规的 API无法使用&#xff0c;自己分析数据又太麻烦。 在内核中 ci.dll 包装了数据签名验证相关的功能&#xff0c;我们可以使用该 dll 来实现我们的数字签名验证。 详…

2023年度亚太客户中心产业发展论坛——鸿联九五荣获亚太区卓越客服大赛客户运营管理类铂金大奖

11月27-28日&#xff0c; 2023年度亚太客户中心产业发展论坛暨亚太区卓越客服大赛在马来西亚吉隆坡举行。来自中国、澳大利亚、马来西亚、新加坡、中国香港、印度尼西亚和泰国等多个国家及地区的优秀企业代表齐聚吉隆坡。 论坛首日活动以“Experience Excellence, Meet the Cha…

JavaScript代码压缩的功效与作用

JavaScript代码压缩可实现3大功能&#xff1a;减小体积、优化逻辑、提升执行效率 专业的JavaScript代码压缩&#xff0c;绝不仅仅是去除回车使代码挤到一行&#xff0c;而是用真正的技术减小代码体积、提升代码性能。 下面&#xff0c;以JShaman的JavaScript代码压缩功能为例…

辐射校正、辐射定标、大气校正关系

文章目录 前言一、基本概念二、辐射校正三、辐射定标四、大气校正 1.是否需要大气校正2.大气校正模型 五、参考链接 前言 完整的辐射校正包括遥感器校准、大气校正、太阳高度和地形校正。本文主要介绍辐射校正基本概念及区分辐射校正、辐射定标、大气校正。 一、基本概念 DN&a…

Java 将word转为PDF的三种方式和处理在服务器上下载后乱码的格式

我这边是因为业务需要将之前导出的word文档转换为PDF文件&#xff0c;然后页面预览下载这样的情况。之前导出word文档又不是我做的&#xff0c;所以为了不影响业务&#xff0c;只是将最后在输出流时转换成了PDF&#xff0c;当时本地调用没什么问题&#xff0c;一切正常&#xf…

挂耳式蓝牙耳机性价比排行榜吗,排名靠前的几款耳机推荐

当涉及挂耳式蓝牙耳机的选择时&#xff0c;消费者常常陷入选择困境&#xff0c;面对市场上琳琅满目的产品&#xff0c;很难找到性价比兼具的理想之选&#xff0c;为了帮助大家在众多选择中快速定位高性价比的耳机&#xff0c;我们精心整理了一份挂耳式蓝牙耳机性价比排行榜&…

javaWebssh图书系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

系统前景 图书有很多&#xff0c;老的图书书的管理靠纸介质&#xff0c;浪费人力和物力&#xff0c;给图书管理者带来极大的资源浪费。随着计算机信息化的普及&#xff0c;对图书的管理带来本质的改变&#xff0c;图书的销售情况以及&#xff0c;图书管理&#xff0c;以及年终对…

搜不到你想找的资料?那是你还没有掌握这些搜索技巧

文章目录 Google搜索命令sitefiletypeintitleinauthor:define:related:OR:- (减号):.. (两个点):weather:stocks:movie:link: 示例site:filetype:intitle:inauthor:define:related:OR:- (减号):.. (两个点):*** (星号):**cache:info:weather:stocks:movie:link: 补充 Google搜索…

解析操作系统是如何启动起来的?

操作系统被称为“第一个程序”&#xff0c;the first programme&#xff0c;原因很简单&#xff0c;只有当操作系统启动起来后才能运行我们编写的程序&#xff0c;那么你有没有想过这个问题&#xff1a;操作系统是怎样启动起来的呢&#xff1f;实际上这个过程就像发射火箭一样有…

解决vue ssr服务端渲染运行时报错:net::ERR_PROXY_CONNECTION_FAILED

现象&#xff1a; 从代码里找了半天也没有找到问题&#xff0c;但是由于ssr服务端渲染配置本身非常复杂&#xff0c;步骤又繁琐&#xff0c; 而且报错又很多&#xff0c;不知道哪里出了问题。 感觉是header或者cookie丢失造成的&#xff0c;因为据说ssr本身有这样的缺陷&…

NHN和SuiFrens合作的限量版配饰正式发售

SuiFrens那些可爱、富有想象力的生物&#xff0c;即将迎来全新装扮&#xff0c;而你也可以一同享受。今天&#xff0c;限量版NHN x SuiFrens Pebble City幸运配饰系列正式推出&#xff0c;同时还有机会在SuiFrens商店免费领取独家限量版NHN帽子。 NHN x SuiFens Pebble City配饰…

17、pytest自动使用fixture

官方实例 # content of test_autouse_fixture.py import pytestpytest.fixture def first_entry():return "a"pytest.fixture def order():return []pytest.fixture(autouseTrue) def append_first(order, first_entry):return order.append(first_entry)def test_s…

CVE初探之漏洞反弹Shell(CVE-2019-6250)

概述 ZMQ(Zero Message Queue)是一种基于消息队列得多线程网络库&#xff0c;C编写&#xff0c;可以使得Socket编程更加简单高效。 该编号为CVE-2019-6250的远程执行漏洞&#xff0c;主要出现在ZMQ的核心引擎libzmq(4.2.x以及4.3.1之后的4.3.x)定义的ZMTP v2.0协议中。 这一…

调试文心大模型或chatgpt的function Calling函数应用场景

沉默了一段时间&#xff0c;最近都在研究AI大模型的产品落地应用&#xff0c;我觉得这个function calling出来后&#xff0c;对目前辅助办公有革命性的改变&#xff0c;可以它来做什么呢&#xff1f;我们先来调试看看&#xff0c;chatgpt和文心大模型的ERNIE Bot支持这个&#…

电力智慧运维系统

电力智慧运维系统是以提高用户侧电力运行安全&#xff0c;降低运维成本为目标&#xff1b;采用智能化运维管理工具—“电易云”&#xff0c;帮助企业建立电力运维体系全方位的信息化、数字化平台&#xff0c;实现设备运行的数字化在线监控与线下维护处理的有机融合&#xff0c;…

在线学习平台-项目搭建

ER图: 外面的圆圈是外键(外键建在多的一边) 平台搭建: 参考这篇博客:若依的基本使用 测试: 先随便写一个测试的控制层看看项目是否搭建成功 调用验证码接口拿到uuid和token 更改token有效时长 之和的请求都需要带上token,测试时可以把token设置长一些 继承插件 需要什么…

C语言能判断一个变量是int还是float吗?

C语言能判断一个变量是int还是float吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

HXDSP2441-HXD-PRO(CPU)在线仿真器

HXD-PRO&#xff08;CPU&#xff09;在线仿真器 CPU下载器具体使用方法参考《HXD-PRO在线仿真器使用手册》&#xff0c;需要注意的是&#xff0c;CPU下载器在PLL初始化后才可以正常连接。