美文网首页
电商数据可视化分析

电商数据可视化分析

作者: 英国丶蔷薇 | 来源:发表于2020-11-10 00:20 被阅读0次

数据说明
用户在商品全集上的移动端行为数据(D),表名为tianchi_fresh_comp_train_user_2w,包含如下字段:

字段 字段说明 提取说明
user_id 用户标识 抽样&字段脱敏
item_id 商品标识 字段脱敏
behavior_type 用户对商品的行为类型 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4
user_geohash 用户位置的空间标识 可以为空 由经纬度通过保密的算法生成
item_category 商品分类标识 字段脱敏
time 行为时间 精确到小时级别

数据来源
天池:https://tianchi.aliyun.com/competition/entrance/231522/introduction

一、了解数据

1. 加载模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import pyecharts.options as opts
%matplotlib inline

2. 读取数据

user=pd.read_csv('/Users/apple/Desktop/数据分析/数据分析项目/数据集/电商用户行为可视化分析/tianchi_fresh_comp_train_user.csv')
user.head()
image

3. 查看数据类型和数据结构

user.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15463110 entries, 0 to 15463109
Data columns (total 6 columns):
 #   Column         Dtype 
---  ------         ----- 
 0   user_id        int64 
 1   item_id        int64 
 2   behavior_type  int64 
 3   user_geohash   object
 4   item_category  int64 
 5   time           object
dtypes: int64(4), object(2)
memory usage: 707.8+ MB

time列不是时间格式,需要做转换

二、数据处理

1. 查看是否有缺失值

user.isnull().sum()
user_id                0
item_id                0
behavior_type          0
user_geohash     8207386
item_category          0
time                   0
dtype: int64

因为不做地理数据的分析,【user_geohash】这列的缺失值不做处理

2. 查看是否有重复值

user[user.duplicated()==True]
image

没有重复值,所以不做处理

3. 将time列转换为datetime格式

user['time']=pd.to_datetime(user.time)
user.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15463110 entries, 0 to 15463109
Data columns (total 6 columns):
 #   Column         Dtype         
---  ------         -----         
 0   user_id        int64         
 1   item_id        int64         
 2   behavior_type  int64         
 3   user_geohash   object        
 4   item_category  int64         
 5   time           datetime64[ns]
dtypes: datetime64[ns](1), int64(4), object(1)
memory usage: 707.8+ MB

4. 提取出日期和时间

user['date']=user.time.dt.date
user['month']=user.date.values.astype('datetime64[M]')
user['hour']=user.time.dt.hour

5. 转换数据类型

user['behavior_type']=user['behavior_type'].apply(str)
user['user_id']=user['user_id'].apply(str)
user['item_id']=user['item_id'].apply(str)

三、数据可视化分析

1. 分析每天的pv与uv的趋势

from pyecharts.charts import Line
from pyecharts.charts import Grid

# 统计每日PV和UV数据
pv_day=user[user.behavior_type=='1'].groupby('date')['behavior_type'].count()
uv_day=user[user.behavior_type=='1'].drop_duplicates(['user_id','date']).groupby('date')['user_id'].count()

# 不同时期pv和uv趋势图
attr=list(pv_day.index)# 时间序列为x轴
pv_uv_line=(
    Line(init_opts=opts.InitOpts(width="1000px",height="500px"))# 设置画布大小
    .add_xaxis(xaxis_data=attr)# 设置x轴
    .add_yaxis(
        "pv",
        np.around(pv_day.values/10000,decimals=2),
        label_opts=opts.LabelOpts(is_show=False)# 设置数据标签为不显示
    )# 设置第一个Y轴为pv
    .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),
    )# 设置第二个Y轴为uv
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="uv",
            type_="value",
            min_=0,
            max_=1.6,
            interval=0.4,
            axislabel_opts=opts.LabelOpts(formatter="{value} 万人"),
        )# 对Y轴做设置
    )
    # 设置全局参数
    .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"),
        ),# 设置x轴坐标轴指示器
        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),# 设置y轴坐标轴上的刻度箭头为显示
            splitline_opts=opts.SplitLineOpts(is_show=True),# 设置分割线/网格线
        ),
        title_opts=opts.TitleOpts(title="pv与uv趋势图"),
    )# 设置标题
)

pv_uv_line.render_notebook()
image

2. 不同时期用户行为分析

# 统计收藏、加购、购买人数
shopping_cart=user[user.behavior_type=='3'].groupby('date')['behavior_type'].count()
collect=user[user.behavior_type=='2'].groupby('date')['behavior_type'].count()
buy=user[user.behavior_type=='4'].groupby('date')['behavior_type'].count()

# 不同时期用户行为趋势图
attr_a=collect.index.tolist()
y_1=collect.values.tolist()
y_2=shopping_cart.values.tolist()
y_3=buy.values.tolist()

behavior=(
        Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
    .add_xaxis(xaxis_data=attr_a)
    .add_yaxis(
        '收藏人数',
        y_1,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .add_yaxis(
        '加购人数',
        y_2,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .add_yaxis(
        '购买人数',
        y_3,
        label_opts=opts.LabelOpts(is_show=False)
    )
    .set_global_opts(title_opts=opts.TitleOpts(title='不同时期用户行为分析'))
)
behavior.render_notebook()
image

四、把数据拆分为活动数据和日常数据做不同时段的分析

由于数据里面包含双十二大促的数据,因此拆分开来做不同的对比分析

1. 把date列转换为datetime类型

user['date']=pd.to_datetime(user['date'])

2. 选取活动数据子集和日常数据子集

active=user[user['date'].isin(['2014-12-11','2014-12-12','2014-12-13'])]
daily=user[~user['date'].isin(['2014-12-11','2014-12-12','2014-12-13'])]

3. 活动期间不同时段的用户行为分析

统计出活动期间内不同时段的用户行为分类数据

from pyecharts.charts import Bar

a_pv_h=active[active.behavior_type=='1'].groupby('hour')['behavior_type'].count()
a_uv_h=active[active.behavior_type=='1'].drop_duplicates(['user_id','time']).groupby('hour')['behavior_type'].count()
a_collect_h=active[active.behavior_type=='2'].groupby('hour')['behavior_type'].count()
a_cart_h=active[active.behavior_type=='3'].groupby('hour')['behavior_type'].count()
a_buy_h=active[active.behavior_type=='4'].groupby('hour')['behavior_type'].count()

attr_h=a_pv_h.index.tolist()
y1=np.around(a_pv_h/3,decimals=0)
y0=np.around(a_uv_h/3,decimals=0)
y2=np.around(a_collect_h/3,decimals=0).tolist()
y3=np.around(a_cart_h/3,decimals=0).tolist()
y4=np.around(a_buy_h/3,decimals=0).tolist()

活动期间pv/uv不同时段对比

pv_uv_line=(
    Line(init_opts=opts.InitOpts(width="1000px",height="500px"))# 设置画布大小
    .add_xaxis(xaxis_data=attr_h)# 设置x轴
    .add_yaxis(
         '浏览人数',
        y_axis=list(np.around(y1/1000)),
        label_opts=opts.LabelOpts(is_show=False)# 设置数据标签为不显示
    )# 设置第一个Y轴为pv
    .add_yaxis(
        series_name='点击人数',
        yaxis_index=1,
        y_axis=list(np.around(y0/100)),
        label_opts=opts.LabelOpts(is_show=False),
    )# 设置第二个Y轴为uv
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="点击人数",
            type_="value",
            min_=0,
            max_=70,
            interval=10,
            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"),
        ),# 设置x轴(x的坐标轴指示器为shadow)
        yaxis_opts=opts.AxisOpts(
            name="浏览人数",
            type_="value",
            min_=0,
            max_=70,
            interval=10,
            axislabel_opts=opts.LabelOpts(formatter="{value} 千次"),
            axistick_opts=opts.AxisTickOpts(is_show=True),# 设置y轴坐标轴上的刻度箭头为显示
            splitline_opts=opts.SplitLineOpts(is_show=True),# 设置分割线/网格线
        ),
        title_opts=opts.TitleOpts(title="活动期间pv/uv不同时段对比"),
    )# 设置标题
)

pv_uv_line.render_notebook()
image

pv和uv从18点开始快速上升,直到21点和22点达到高峰,因此商家可以在18点开始部署促销活动吸引客户,21点和22点的高峰正式开始促销,此时顾客浏览得差不多了,适时送些优惠券等促销手段,刺激客户购买欲望

# 日均各时段活动用户行为
behavior_line=(Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
         .add_xaxis(xaxis_data=attr_h)
         .add_yaxis(
             '收藏人数',
             y2,
             label_opts=opts.LabelOpts(is_show=False)
         )
         .add_yaxis(
             '加购人数',
             y3,
             label_opts=opts.LabelOpts(is_show=False)
         )
         .add_yaxis(
             '购买人数',
             y4,
             label_opts=opts.LabelOpts(is_show=False)
         )
         .set_global_opts(
             title_opts=opts.TitleOpts(title="日均各时段活动用户行为")
         )
)

behavior_line.render_notebook()
image
  1. 这是双十二三天活动的日均数据,可以发现活动期间是商家在起主导作用,因为大促集中在零点,因此用户的购买高峰也出现在0点,这部分客户很有可能是之前就加好购物车了
  2. 但是可以发现0点的时候仍有很多顾客在这时加入购物车,超过了同时段的购买人数。这部分客户有可能是并没有赶上或者没有抢到商家的第一波促销优惠,商家可以考虑在0点-1点时可以发布第二波的促销优惠

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

统计出日常期间内不同时段的用户行为分类数据

d_pv_h=daily[daily.behavior_type=='1'].groupby('hour')['behavior_type'].count()
d_uv_h=daily[daily.behavior_type=='1'].drop_duplicates(['user_id','time']).groupby('hour')['behavior_type'].count()
d_collect_h=daily[daily.behavior_type=='2'].groupby('hour')['behavior_type'].count()
d_cart_h=daily[daily.behavior_type=='3'].groupby('hour')['behavior_type'].count()
d_buy_h=daily[daily.behavior_type=='4'].groupby('hour')['behavior_type'].count()

attr_d=d_pv_h.index.tolist()
d1=np.around(d_pv_h/28,decimals=0)
d0=np.around(d_uv_h/28,decimals=0)
d2=np.around(d_collect_h/28,decimals=0).tolist()
d3=np.around(d_cart_h/28,decimals=0).tolist()
d4=np.around(d_buy_h/28,decimals=0).tolist()

日常期间pv/uv不同时段对比

pv_uv_line=(
    Line(init_opts=opts.InitOpts(width="1000px",height="500px"))# 设置画布大小
    .add_xaxis(xaxis_data=attr_d)# 设置x轴
    .add_yaxis(
         '浏览人数',
        y_axis=list(np.around(d1/1000)),
        label_opts=opts.LabelOpts(is_show=False)# 设置数据标签为不显示
    )# 设置第一个Y轴为pv
    .add_yaxis(
        series_name='点击人数',
        yaxis_index=1,
        y_axis=list(np.around(d0/100)),
        label_opts=opts.LabelOpts(is_show=False),
    )# 设置第二个Y轴为uv
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="点击人数",
            type_="value",
            min_=0,
            max_=70,
            interval=10,
            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"),
        ),# 设置x轴(x的坐标轴指示器为shadow)
        yaxis_opts=opts.AxisOpts(
            name="浏览人数",
            type_="value",
            min_=0,
            max_=45,
            interval=10,
            axislabel_opts=opts.LabelOpts(formatter="{value} 千次"),
            axistick_opts=opts.AxisTickOpts(is_show=True),# 设置y轴坐标轴上的刻度箭头为显示
            splitline_opts=opts.SplitLineOpts(is_show=True),# 设置分割线/网格线
        ),
        title_opts=opts.TitleOpts(title="日常期间pv/uv不同时段对比"),
    )# 设置标题
)

pv_uv_line.render_notebook()
image

日均各时段活动用户行为

d_behavior_line=(Line(init_opts=opts.InitOpts(width="1000px",height="500px"))
         .add_xaxis(xaxis_data=attr_d)
         .add_yaxis(
             '收藏人数',
             d2,
             label_opts=opts.LabelOpts(is_show=False)
         )
         .add_yaxis(
             '加购人数',
             d3,
             label_opts=opts.LabelOpts(is_show=False)
         )
         .add_yaxis(
             '购买人数',
             d4,
             label_opts=opts.LabelOpts(is_show=False)
         )
         .set_global_opts(
             title_opts=opts.TitleOpts(title="日均各时段日常期间用户行为")
         )
)

d_behavior_line.render_notebook()
image
  1. 与大促不同的是日常期间购买人数从上午10点到晚上23点都没有出现太大的变化,其高峰出现在晚上21点
  2. 收藏、加购的高峰出现在晚上21点到22点之间,上面pv和uv的高峰也是集中在晚上21点到22点之间,说明大部分客户都在晚上这个时间段浏览商品,日常时可以集中在这个时段进行日常促销活动

5. 转化漏斗分析

活动期间的转化漏斗

from pyecharts.charts import Funnel

# 活动期间的转化数据
a_pv=active[active.behavior_type=='1']['user_id'].count()
a_uv=active[active.behavior_type=='1'].drop_duplicates(['user_id','date','item_id'])['user_id'].count()
a_collect=active[active.behavior_type=='2']['user_id'].count()
a_cart=active[active.behavior_type=='3']['user_id'].count()
a_buy=active[active.behavior_type=='4']['user_id'].count()

a_attr=['浏览','点击','收藏加购','购买']
values=[
    np.around((a_pv/a_pv*100),2),
    np.around((a_uv/a_pv*100),2),
    np.around(((a_cart+a_collect)/a_uv*100),2),
    np.around((a_buy/a_uv*100),2)
]

data=list(zip(a_attr,values))

# 活动期间用户转化漏斗
a_funnel=(
    Funnel()
    .add(
        '用户行为',
        data_pair=data,
        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=3)
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户转化漏斗", subtitle="活动"))
)
a_funnel.render_notebook()
image
  1. 活动期间从点击到收藏加购的转化率只有11.62%,购买的只有3.22%,说明浏览量和点击量不少但是吸引不了顾客购买,虽然是大促,但是转化率还是很低的
  2. 按照“点击-收藏加购-购买”这一用户行为路径,我们可通过优化“点击-收藏加购”这一环节进而提升购买的转化率,可以通过【鼓励用户收藏加购后可以领券或参与促销活动的资格】来刺激用户加购收藏,从而刺激用户的购买欲望。

日常期间的转化漏斗

# 日常期间的转化数据
d_pv=daily[daily.behavior_type=='1']['user_id'].count()
d_uv=daily[daily.behavior_type=='1'].drop_duplicates(['user_id','date','item_id'])['user_id'].count()
d_collect=daily[daily.behavior_type=='2']['user_id'].count()
d_cart=daily[daily.behavior_type=='3']['user_id'].count()
d_buy=daily[daily.behavior_type=='4']['user_id'].count()

d_attr=['浏览','点击','收藏加购','购买']
values=[
    np.around((d_pv/d_pv*100),2),
    np.around((d_uv/d_pv*100),2),
    np.around(((d_cart+d_collect)/d_uv*100),2),
    np.around((d_buy/d_uv*100),2)
]

d_data=list(zip(d_attr,values))

# 日常期间用户转化漏斗
d_funnel=(
    Funnel()
    .add(
        '用户行为',
        data_pair=d_data,
        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=3)
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户转化漏斗", subtitle="活动"))
)
d_funnel.render_notebook()
image

日常期间总的点击量中,有10.89%收藏加购,到最后只有1.99%购买,其购买转化率远低于活动的购买转化率

五、商品类目分析

1. 热门类目分析

日常数据分析

# pv排名前十的商品类目
d_pv_category=daily[daily.behavior_type=='1'].groupby('item_category')['user_id'].count().sort_values(ascending=False)

# uv排名前十的商品类目
d_uv_category=daily[daily.behavior_type=='1'].drop_duplicates(['user_id','date','item_id']).groupby('item_category')['user_id'].count().sort_values(ascending=False)

# 收藏加购人数排名前十的商品类目
a=daily[daily.behavior_type=='2'].groupby('item_category')['user_id'].count()
b=daily[daily.behavior_type=='3'].groupby('item_category')['user_id'].count()
d_cart_category=pd.concat([a,b],axis=1,join='outer').sum(axis=1,skipna=True).sort_values(ascending=False)

# 购买人数排名前十的商品类目
d_buy_category=daily[daily.behavior_type=='4'].groupby('item_category')['user_id'].count().sort_values(ascending=False)

# 各方面都稳居前十的热门商品类目
d_hot_category=pd.concat([d_pv_category.head(10),d_uv_category.head(10),d_cart_category.head(10),d_buy_category.head(10)],axis=1,join='inner')
d_hot_category.columns=['日常-pv','日常-uv','日常-收藏加购','日常-购买']

print(d_hot_category)
                日常-pv   日常-uv  日常-收藏加购  日常-购买
item_category                                
1863           414840  297964  31138.0   2705
13230          397457  286954  24315.0   1321
6513           318998  235695  22418.0   1581
5399           301775  212244  19133.0   1361
5232           150726  106537  11974.0   2237
from pyecharts.charts import Boxplot

# 日常转化率计算
d_rate_category=pd.concat([d_pv_category,d_uv_category,d_cart_category,d_buy_category],axis=1,join='inner')
d_rate_category.columns=['日常-pv','日常-uv','日常-收藏加购','日常-购买']
d_rate_category['日常-uv转化率']=np.round((d_rate_category['日常-uv']/d_rate_category['日常-pv']*100),2)
d_rate_category['日常-收藏加购转化率']=np.round((d_rate_category['日常-收藏加购']/d_rate_category['日常-uv']*100),2)
d_rate_category['日常-购买转化率']=np.round((d_rate_category['日常-购买']/d_rate_category['日常-uv']*100),2)

# 将转化率三列数据抽取加入到新列表中
y_data=[]
for n in range(4,7):
    l=[]
    for x in d_rate_category.iloc[:,n].values:
        l.append(x)
    y_data.append(l)

# 日常转化率-箱型图
d_box=(Boxplot()
       .add_xaxis(d_rate_category.columns.tolist()[4:])
       .add_yaxis('',Boxplot.prepare_data(y_data))
)

d_box.render_notebook()
image

可以看出转化率各个指标都是偏上的,收藏加购转化率和购买转化率出现了100%,并且大部分的数据距离中位数是偏大的,所以需要筛选掉异常值

# 以购买转化率来排除掉异常值
u=d_rate_category['日常-购买转化率'].mean()
std=d_rate_category['日常-购买转化率'].std()

# 正态分布检验
from scipy import stats
print(stats.kstest(d_rate_category['日常-购买转化率'],'norm',(u,std)))

# 按照3σ原则,筛选出异常值(大于3个标准误差),即正常值为小于等于3个标准误差内
data=d_rate_category[np.abs(d_rate_category['日常-购买转化率']-u)<=3*std]
KstestResult(statistic=0.2303310778213689, pvalue=3.42701690952319e-241)

p值大于0.05,属于正态分布

活动数据分析

# pv排名前十的商品类目
a_pv_category=active[active.behavior_type=='1'].groupby('item_category')['user_id'].count().sort_values(ascending=False)

# uv排名前十的商品类目
a_uv_category=active[active.behavior_type=='1'].drop_duplicates(['user_id','date','item_id']).groupby('item_category')['user_id'].count().sort_values(ascending=False)

# 收藏加购人数排名前十的商品类目
a=active[active.behavior_type=='2'].groupby('item_category')['user_id'].count()
b=active[active.behavior_type=='3'].groupby('item_category')['user_id'].count()
a_cart_category=pd.concat([a,b],axis=1,join='outer').sum(axis=1,skipna=True).sort_values(ascending=False)

# 购买人数排名前十的商品类目
a_buy_category=active[active.behavior_type=='4'].groupby('item_category')['user_id'].count().sort_values(ascending=False)

# 各方面都稳居榜首的热门商品类目有哪些?
a_hot_category=pd.concat([a_pv_category.head(10),a_uv_category.head(10),a_cart_category.head(10),a_buy_category.head(10)],axis=1,join='inner')

print(a_hot_category)
               user_id  user_id       0  user_id
item_category                                   
1863             69453    44820  4862.0      832
5027             65171    42378  3462.0      462
13230            58119    38777  3381.0      402
5894             52767    36289  3633.0      404
6513             52241    35650  3563.0      541
5399             51642    33745  3066.0      424
5232             23103    14725  1707.0      529
# 活动转化率计算
a_rate_category=pd.concat([a_pv_category,a_uv_category,a_cart_category,a_buy_category],axis=1,join='inner')
a_rate_category.columns=['活动-pv','活动-uv','活动-收藏加购','活动-购买']
a_rate_category['活动-uv转化率']=np.round((a_rate_category['活动-uv']/a_rate_category['活动-pv']*100),2)
a_rate_category['活动-收藏加购转化率']=np.round((a_rate_category['活动-收藏加购']/a_rate_category['活动-uv']*100),2)
a_rate_category['活动-购买转化率']=np.round((a_rate_category['活动-购买']/a_rate_category['活动-uv']*100),2)

# 将转化率三列数据抽取加入到新列表中
y_data1=[]
for n in range(4,7):
    l=[]
    for x in a_rate_category.iloc[:,n].values:
        l.append(x)
    y_data1.append(l)

# 活动转化率-箱型图
d_box=(Boxplot()
       .add_xaxis(a_rate_category.columns.tolist()[4:])
       .add_yaxis('',Boxplot.prepare_data(y_data1))
)

d_box.render_notebook()
image

可以看出收藏加购转化率和购买转化率出现了远远大于100%的数据,有可能是活动前有浏览的客户,所以需要筛选掉异常值

# 以购买转化率来排除掉异常值
a_u=a_rate_category['活动-购买转化率'].mean()
a_std=a_rate_category['活动-购买转化率'].std()

# 正态分布检验
print(stats.kstest(a_rate_category['活动-购买转化率'],'norm',(a_u,a_std)))

# 按照3σ原则,筛选出异常值
data1=a_rate_category[np.abs(a_rate_category['活动-购买转化率']-u)<=3*a_std]
KstestResult(statistic=0.26196615761885234, pvalue=1.8989094047851988e-182)

p值大于0.05,属于正态分布

2. 潜力股类目分析

# 日常前十的商品类目在活动里依然排名前十吗?
d=d_hot_category.index.isin(list(a_hot_category.index))

# 活动前十数据里不在日常前十的商品类目
a_hots=a_hot_category[~a_hot_category.index.isin(list(d_hot_category.index))]

print(d)
print(a_hots)
[ True  True  True  True  True]
               user_id  user_id       0  user_id
item_category                                   
5027             65171    42378  3462.0      462
5894             52767    36289  3633.0      404

日常与活动的差异统计

# 日常数据汇总
d_data=pd.DataFrame(data.iloc[:,4:])
d_data['日常-日均pv']=data['日常-pv']/28
d_data['日常-日均uv']=data['日常-uv']/28
d_data['日常-日均收藏加购']=data['日常-收藏加购']/28
d_data['日常-日均购买']=data['日常-购买']/28

# 活动数据汇总
a_data=pd.DataFrame(data1.iloc[:,4:])
a_data['活动-日均pv']=data1['活动-pv']/3
a_data['活动-日均uv']=data1['活动-uv']/3
a_data['活动-日均收藏加购']=data1['活动-收藏加购']/3
a_data['活动-日均购买']=data1['活动-购买']/3

# 排除活动/日常数据为0的商品类目
s=pd.concat([a_data,d_data],axis=1,join='outer').fillna(0)
x=list(s[(s['活动-日均pv']==0)|(s['日常-日均pv']==0)].index)
all=s[~s.index.isin(x)]

# 日常与活动的差异
diff=pd.DataFrame()
diff['日均pv差异']=all['活动-日均pv']-all['日常-日均pv']
diff['日均uv差异']=all['活动-日均uv']-all['日常-日均uv']
diff['日均收藏加购差异']=all['活动-日均收藏加购']-all['日常-日均收藏加购']
diff['日均购买差异']=all['活动-日均购买']-all['日常-日均购买']
diff['uv转化率差异']=all['活动-uv转化率']-all['日常-uv转化率']
diff['收藏加购转化率差异']=all['活动-收藏加购转化率']-all['日常-收藏加购转化率']
diff['购买转化率差异']=all['活动-购买转化率']-all['日常-购买转化率']

活动与日常差异的类目

# 各方面数据活动比日常表现出色的商品类目的前30%
per=round(len(diff)*0.3)
a=diff['日均pv差异'].sort_values(ascending=False).head(per)
b=diff['日均uv差异'].sort_values(ascending=False).head(per)
c=diff['日均收藏加购差异'].sort_values(ascending=False).head(per)
d=diff['日均购买差异'].sort_values(ascending=False).head(per)
e=diff['uv转化率差异'].sort_values(ascending=False).head(per)
f=diff['收藏加购转化率差异'].sort_values(ascending=False).head(per)
g=diff['购买转化率差异'].sort_values(ascending=False).head(per)
potential_category=pd.concat([a,b,c,d,e,f,g],axis=1,join='inner')

print(potential_category.index)
Int64Index([3070, 7516, 5449], dtype='int64', name='item_category')

区间分析

# 日常:将数据均匀划分5个区间
d_pv_cats=pd.cut(d_data['日常-日均pv'],5,right=False)
d_uv_cats=pd.cut(d_data['日常-日均uv'],5,right=False)
d_cart_cats=pd.cut(d_data['日常-日均收藏加购'],5,right=False)
d_buy_cats=pd.cut(d_data['日常-日均购买'],5,right=False)
d_uvrate_cats=pd.cut(d_data['日常-uv转化率'],5,right=False)
d_cartrate_cats=pd.cut(d_data['日常-收藏加购转化率'],5,right=False)
d_buyrate_cats=pd.cut(d_data['日常-购买转化率'],5,right=False)

# 日均pv、uv、收藏加购、购买人数同时处于第四第五区间(区间第一第二名)
d_cats1=pd.concat([
    d_pv_cats[(d_pv_cats.values.codes==4)|(d_pv_cats.values.codes==5)],
    d_uv_cats[(d_uv_cats.values.codes==4)|(d_uv_cats.values.codes==5)],
    d_cart_cats[(d_cart_cats.values.codes==4)|(d_cart_cats.values.codes==5)],
    d_buy_cats[(d_buy_cats.values.codes==4)|(d_buy_cats.values.codes==5)]
],axis=1,join='inner')

# 各项转化率同时处于第四第五区间(区间第一第二名)
d_cats2=pd.concat([
    d_uvrate_cats[(d_uvrate_cats.values.codes==4)|(d_uvrate_cats.values.codes==5)],
    d_cartrate_cats[(d_cartrate_cats.values.codes==4)|(d_cartrate_cats.values.codes==5)],
   d_buyrate_cats[(d_buyrate_cats.values.codes==4)|(d_buyrate_cats.values.codes==5)]
],axis=1,join='inner')

print(d_cats1.index,d_cats2.index)
Int64Index([1863], dtype='int64', name='item_category') Int64Index([1764], dtype='int64', name='item_category')
# 活动:将数据均匀划分5个区间
a_pv_cats=pd.cut(a_data['活动-日均pv'],5,right=False)
a_uv_cats=pd.cut(a_data['活动-日均uv'],5,right=False)
a_cart_cats=pd.cut(a_data['活动-日均收藏加购'],5,right=False)
a_buy_cats=pd.cut(a_data['活动-日均购买'],5,right=False)
a_uvrate_cats=pd.cut(a_data['活动-uv转化率'],5,right=False)
a_cartrate_cats=pd.cut(a_data['活动-收藏加购转化率'],5,right=False)
a_buyrate_cats=pd.cut(a_data['活动-购买转化率'],5,right=False)

# 日均pv、uv、收藏加购、购买人数同时处于第四第五区间(区间第一第二名)
a_cats1=pd.concat([
    a_pv_cats[(a_pv_cats.values.codes==4)|(a_pv_cats.values.codes==5)],
    a_uv_cats[(a_uv_cats.values.codes==4)|(a_uv_cats.values.codes==5)],
    a_cart_cats[(a_cart_cats.values.codes==4)|(a_cart_cats.values.codes==5)],
    a_buy_cats[(a_buy_cats.values.codes==4)|(a_buy_cats.values.codes==5)]
],axis=1,join='inner')

# 各项转化率同时处于第四第五区间(区间第一第二名)
a_cats2=pd.concat([
    a_uvrate_cats[(a_uvrate_cats.values.codes==4)|(a_uvrate_cats.values.codes==5)],
    a_cartrate_cats[(a_cartrate_cats.values.codes==4)|(a_cartrate_cats.values.codes==5)],
   a_buyrate_cats[(a_buyrate_cats.values.codes==4)|(a_buyrate_cats.values.codes==5)]
],axis=1,join='inner')

print(a_cats1.index,a_cats2.index)
Int64Index([1863], dtype='int64', name='item_category') Int64Index([9493, 1466, 2670, 3784, 2224], dtype='int64', name='item_category')

3. 整体类目分析

将筛选出来的热门类目和潜力股类目组合

# 热门类目
hot=pd.concat([d_hot_category,a_hot_category,d_cats1,a_cats1],axis=1,join='outer').index.tolist()

# 潜力股类目
potential=pd.concat([potential_category,d_cats2,a_cats2,a_hots],axis=1,join='outer').index.tolist()

# 类目汇总
category_data=user[user.item_category.isin(hot+potential)]

热门类目分析

# 热门类目的指标计算(时间段)
h_pv=category_data[(category_data.behavior_type=='1')&(category_data.item_category.isin(hot))].groupby('hour')['user_id'].count()
h_uv=category_data[(category_data.behavior_type=='1')&(category_data.item_category.isin(hot))].drop_duplicates(['user_id','time']).groupby('hour')['user_id'].count()
h_cart=category_data[((category_data.behavior_type=='2')|(category_data.behavior_type=='3'))&(category_data.item_category.isin(hot))].groupby('hour')['user_id'].count()
h_buy=category_data[(category_data.behavior_type=='4')&(category_data.item_category.isin(hot))].groupby('hour')['user_id'].count() 
h_df=pd.concat([h_pv,h_uv,h_cart,h_buy],axis=1,join='inner')
h_df.columns=['pv','uv','收藏加购','购买']

# 数据标准化(0-1标准化)
def data_norm(df,*cols):
    df_n=df.copy()
    for col in cols:
        min_=df_n[col].min()
        max_=df_n[col].max()
        df_n[col]=(df_n[col]-min_)/(max_-min_)
    return (df_n)
hot_df=data_norm(h_df,h_df.columns)

# 热门类目不同时段的指标表现
hot_line=(Line()
             .add_xaxis(hot_df.index.tolist())
             .add_yaxis(
                series_name="pv",
                y_axis=hot_df['pv'],
                label_opts=opts.LabelOpts(is_show=False),
             )
             .add_yaxis(
                series_name="uv",
                y_axis=hot_df['uv'],
                label_opts=opts.LabelOpts(is_show=False),
             )
             .add_yaxis(
                series_name="收藏加购",
                y_axis=hot_df['收藏加购'],
                label_opts=opts.LabelOpts(is_show=False),
             )
              .add_yaxis(
                series_name="购买",
                y_axis=hot_df['购买'],
                label_opts=opts.LabelOpts(is_show=False),
             )
             .set_global_opts(title_opts=opts.TitleOpts(title='热门类目不同时段的指标表现'))
)

hot_line.render_notebook()
image
  1. 由于双十二大促活动的关系,购买人数在0点就达到第一个高峰。接着在10点和13点达到第二个高峰,在21点达到一整天的高峰,并且21点也是pv、uv、收藏加购、购买4个指标非常聚集的高峰点
  2. 0点、10点、13点、21点,商家可以掌握好这四个时间节点

潜力股类目分析

# 潜力股类目的指标计算(时间段)
p_pv=category_data[(category_data.behavior_type=='1')&(category_data.item_category.isin(potential))].groupby('hour')['user_id'].count()
p_uv=category_data[(category_data.behavior_type=='1')&(category_data.item_category.isin(potential))].drop_duplicates(['user_id','time']).groupby('hour')['user_id'].count()
p_cart=category_data[((category_data.behavior_type=='2')|(category_data.behavior_type=='3'))&(category_data.item_category.isin(potential))].groupby('hour')['user_id'].count()
p_buy=category_data[(category_data.behavior_type=='4')&(category_data.item_category.isin(potential))].groupby('hour')['user_id'].count() 
p_df=pd.concat([p_pv,p_uv,p_cart,p_buy],axis=1,join='inner')
p_df.columns=['pv','uv','收藏加购','购买']

# 数据标准化(0-1标准化)
po_df=data_norm(p_df,p_df.columns)

# 潜力股类目不同时段的指标表现
potential_line=(Line()
             .add_xaxis(p_df.index.tolist())
             .add_yaxis(
                series_name="pv",
                y_axis=po_df['pv'],
                label_opts=opts.LabelOpts(is_show=False),
             )
             .add_yaxis(
                series_name="uv",
                y_axis=po_df['uv'],
                label_opts=opts.LabelOpts(is_show=False),
             )
             .add_yaxis(
                series_name="收藏加购",
                y_axis=po_df['收藏加购'],
                label_opts=opts.LabelOpts(is_show=False),
             )
              .add_yaxis(
                series_name="购买",
                y_axis=po_df['购买'],
                label_opts=opts.LabelOpts(is_show=False),
             )
             .set_global_opts(title_opts=opts.TitleOpts(title='潜力股类目不同时段的指标表现'))
)

potential_line.render_notebook()
image
  1. 潜力股类目则跟热门类目有些差异,购买人数分别是在0点、10点、14点、21点达到高峰。
  2. 0点的高峰值也是比热门类目要高,代表可能这些潜力股类目是在活动中表现比较出色,是适合去做促销类活动的。
  3. 但是购买人数在22点有明显的下降趋势,有可能与热门类目有竞争,导致客户流失,商家可以考虑从其他方面增强商品的核心竞争力或加大促销力度

相关文章

网友评论

      本文标题:电商数据可视化分析

      本文链接:https://www.haomeiwen.com/subject/rzxdbktx.html