电商特卖商品库存优化分析

本文是对唯品会特卖商品数据分析案例的一个总结,主要是根据商品促销活动的销售数据,分析商品售卖情况,使用ABC分析法进行商品结构优化。

ABC分析法

简述:
ABC分类法又称帕雷托分析法,也叫主次因素分析法,是项目管理中常用的一种方法。它是根据事物在技术或经济方面的主要特征,进行分类排队,分清重点和一般,从而有区别地确定管理方式的一种分析方法。由于它把被分析的对象分成A、B、C三类,所以又称为ABC分析法。

标准帕累托图

在ABC分析法的分析图中,有两个纵坐标,一个横坐标,几个长方形,一条曲线,左边纵坐标表示频数,右边纵坐标表示频率,以百分数表示。横坐标表示影响质量的各项因素,按影响大小从左向右排列,曲线表示各种影响因素大小的累计百分数。一般地,是将曲线的累计频率分为三级,与之相对应的因素分为三类:

  • A类因素:发生累计频率为0%~80%,是主要影响因素,需要严格控制、准确记录,。
  • B类因素:发生累计频率为80%~90%,是次要影响因素,需要稍松空值、良好记录。
  • C类因素:发生累计频率为90%~100%,是一般影响因素,需要简单控制、最少记录。

电商中的ABC分析法

在电商运营活动中,商品ABC分级主要指标有“支付转化率”“商品库存”,根据此区分商品属于哪一类。商品ABC分级法需将分析颗粒精细到每个款式,相对复杂,所以只有在店铺进行大型促销活动才会用到,也因为此时数据量足够大,使用ABC分析法才更有意义。

A级商品:

  • 拥有高库存、高转化率的商品;
  • 因为这类商品既畅销,又有较深的库存作为保障,因此可以作为活动中的主推商品。需要注意的是,在挑选A类商品时,还应注意此款商品的访客不能太低,则,没有经过“充分"流量测试的商品,其高转化率可能是"伪高转化率”。

B级商品:

  • 经过流量测试的中等转化率商品;
  • 此类商品对访客有一定吸引力,但不如A类商品的转化率,可以继续保持当前的销售定为。但需要注意库存告急,以及错误占用了A类商品陈列位置(B类商品陈列位置需要A类之后)。

C级商品:

  • 转化率低的商品;
  • C类商品应放置于店铺陈列底端,基本属于被放弃的一类商品。但是,如果C类商品中高库存的,可尝试降价,更换营销方式等办法。

一、项目背景

唯品会专门做特卖的网站,在特定的时间段里,以优惠的价格出售指定商品。

二、分析目标

评估每次促销活动的结果,根据转换率、售卖比指标构建ABC模型优化商品结构,压缩总库存,使库存结构合理化节约管理力量。

三、分析过程

  • 准备工作(导入数据及处理观察);
  • 总体运营指标分析 —— 计算商品销售额、销量、客单价、UV等指数进行同比、环比分析;
  • 从价格区间分析商品 —— 将商品按价格分为多个区间,对每个区间的商品进行统计分析,针对指定区间计算转换率、售卖比,分级ABC类商品优化商品结构;
  • 从折扣区间分析商品 —— 将商品按折扣区间分为多个区间,对每个区间的商品进行统计分析,针对指定区间计算转换率、售卖比,分级ABC类商品优化商品结构。

1.准备工作

(1) 导入模块
import pandas as pd
pd.set_option('max_columns', 25)
# 保留4位小数
pd.set_option('display.float_format',lambda x : '%.4f' % x)
import numpy as np

import warnings
warnings.filterwarnings('ignore')
import sqlalchemy
import seaborn as sns
import matplotlib.pyplot as plt
(2) 导入数据

数据文件存放在sql数据库,使用sqlalchemy模块导入

# 商品信息表
sql = "select * from sales_info1"
df1 = pd.read_sql(sql,engine)
# 商品热度表
sql = "select * from sales_info2"
df2 = pd.read_sql(sql,engine)
# 用户订单表
sql = 'select * from sales_info3'
df3 = pd.read_sql(sql,engine)
商品信息表

商品热度表

用户订单表
(3)处理表格得到商品信息表
  • 对用户订单表中的商品进行聚合得到表1
  • 合并商品信息表和热度表得到表2
  • 合并表1和表2的到总体商品销售明细
# 对用户订单表中的商品进行聚合
product_sales = df3.groupby('商品名').agg({'用户id': pd.Series.nunique,
                           '购买金额':'sum',
                           '购买数量':'sum',
                           '购买单价':'mean',
                           '退货件数':'sum',
                           '退货金额':'sum'}).reset_index().rename(columns = {'用户id':'商品购买用户数', '购买数量':'商品销售数量','购买金额':'商品销售金额','购买单价':'商品销售单价','是否退货':'商品退货数量','退货金额':'商品退货金额'})
# 合并商品信息表和热度表
dt_product = pd.merge(df1,df2,how = 'left',on='商品名')
# 合并
df_product_sales = pd.merge(product_sales,dt_product,on = '商品名')
# 商品总体描述统计
df_product_sales.describe()
商品销售明细

商品总体描述统计
  • 共有80件商品,每件商品平均销售额在46839元,平均单价为317元,平均销量为150件退货数为45件,退货率较高达到1/3左右,平均折扣率在4折左右。

2.总体运营指标分析

  • 分别计算商品GMV(销售额)、实际销售额(销售额-退款金额)、销量、客单价、UV(商品页面独立访问数)、转化率(客户数/UV)、折扣率(GMV/吊牌总额)、备货值(吊牌价*库存数)、售卖比(GMV/备货值)、收藏数、加入购物车数、SKU(最小品类单元)、SPU(款号)、退货量、退款总额
  • 输入去年同期指标值
  • 环比分析
sales_state = pd.concat([sales_state_dangqi,sales_state_tongqi], axis = 0).T.reset_index().rename(columns = {"index":"指标",1:"今年双11",0:"去年双11"})
sales_state["同比"] = (sales_state["今年双11"] - sales_state["去年双11"])/sales_state["去年双11"]
今年、去年同期对比
  • 总体运营情况上,今年总销售额为3747167比去年同比上涨65%,销量同比上涨57%;
  • 大多数指标均有上涨,平均涨幅40%左右,抛开折扣率的下降,客单价下降了20%左右。

3.从价格区间优化商品结构

3.1 价格区间划分
  • 统计全部商品销售单价
  • 划分价格区间,进行销售统计
# 商品单价统计
df_product_sales["商品销售单价"].describe()
# 划分0-200,201-400,400+ 商品区间
listbins = [0, 200, 400, 1000000]
listlabel = ["200元及以下", "201-400元", "400元以上"]
# cut,左开右闭,include_lowest:包含左端点
df_product_sales["价格分组"] = pd.cut(df_product_sales["商品销售单价"], bins = listbins, labels= listlabel, include_lowest=True)
# 进行统计
dt_product_sales_info = df_product_sales.groupby('价格分组').agg({'货值':'sum',
                                                                  '商品销售金额':'sum',
                                                                  '商品销售数量':'sum',
                                                                  'UV数':'sum',
                                                                  '商品购买用户数':'sum',
                                                                  '收藏数':'sum',
                                                                  '加购物车数':'sum'}).reset_index()
# 增加占比及转化率
dt_product_sales_info['货值占比'] = dt_product_sales_info['货值'].div(dt_product_sales_info['货值'].sum())
dt_product_sales_info['销售占比'] = dt_product_sales_info['商品销售金额'].div(dt_product_sales_info['商品销售金额'].sum())
dt_product_sales_info['售卖比'] = dt_product_sales_info.apply(lambda x:x[2]/x[1],axis = 1)
dt_product_sales_info['客单价'] = dt_product_sales_info.apply(lambda x:x[2]/x[5],axis = 1)
dt_product_sales_info['转换率'] = dt_product_sales_info.apply(lambda x:x[5]/x[4],axis = 1)
价格区间商品统计

3.2 区间选择
  • 由于个价格区间商品销售表现都相近,转化率大致相同,400+商品的销售金额最高,但是销量最低,货值最高,为避免货物积压,就这一区间进行商品结构优化。
product_400 = df_product_sales.query("价格分组 == '400元以上'")
product_400['转换率'] = product_400['商品购买用户数'] / product_400['UV数']
product_400['备货值'] = product_400['吊牌价'] * product_400['库存量']
product_400['售卖比'] = product_400['商品销售金额'] / product_400['备货值']
product_400 = product_400[['商品名','商品销售金额','商品销售数量','商品销售单价','商品购买用户数','UV数','转换率','库存量','备货值','售卖比']].reset_index(drop = True)
# 划分A、B、C
def label(x):
    if x[0] > 0.007:
        return "A"
    elif x[0] <= 0.007 and x[1]>0.3:
        return "B"
    else:
        return "C"
product_400['label'] = product_400[["转换率","售卖比"]].apply(lambda x:label(x),axis = 1)
product_400['color'] = product_400[["转换率","售卖比"]].apply(lambda x:color(x),axis = 1)

400元以上产品

散点图,黄色:C类,绿色:B类,紫色:A类
  • A、B、C类产品分别有12,10,1件
3.3 优化方案
  • A:转化率大于0.7%的商品,暂时保留,用于下次促销活动;
  • B:转化率小于等于0.7%的商品,但是售卖比大于30%的商品予以保留参加下次促销活动,
  • C:转化率小于0.7%的商品,并且售卖比小于36%的商品进行清仓处理。

4.从折扣区间优化商品结构

4.1 折扣区间划分

将产品折扣率划分'0.15-0.2','0.2-0.25','0.25-0.3','0.3-0.35','0.35-0.4','0.4-0.45','0.45-0.5','0.5-0.55','0.55-0.6','0.6-0.65','0.65-0.7','0.7+'多个区间进行分析统计

listbins = [0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 1]
listlabels = ['0.15-0.2','0.2-0.25','0.25-0.3','0.3-0.35','0.35-0.4','0.4-0.45','0.45-0.5','0.5-0.55','0.55-0.6','0.6-0.65','0.65-0.7','0.7+']

df_product_sales['折扣区间'] = pd.cut(df_product_sales['折扣率'],bins = listbins,labels = listlabels,include_lowest=True)
df_product_sales
4.2 指标计算

计算每个折扣区间的货值、销售额、销售数量、UV数、转化率、货值占比等指标

pd.set_option('display.float_format',lambda x : '%.6f' % x)
dt_product_discount_info = df_product_sales.groupby('折扣区间').agg({'货值':'sum',
                                                                     '商品销售金额':'sum',
                                                                     '商品销售数量':'sum',
                                                                     'UV数':'sum',
                                                                     '收藏数':'sum',
                                                                     '加购物车数':'sum',
                                                                     '商品购买用户数':'sum'
                                                                     }).reset_index()
dt_product_discount_info['货值占比'] = dt_product_discount_info['货值'] / dt_product_discount_info['货值'].sum()
dt_product_discount_info['销售占比'] = dt_product_discount_info['商品销售金额'] / dt_product_discount_info['商品销售金额'].sum()
dt_product_discount_info['客单价'] = dt_product_discount_info['商品销售金额'] / dt_product_discount_info['商品购买用户数'].sum()
dt_product_discount_info['转化率'] = dt_product_discount_info['商品购买用户数'] / dt_product_discount_info['UV数'].sum()
折扣区间分析统计

销售情况
4.3 区间选择

折扣率在0.35-0.4之间的产品销售额最高,针对以上区间进行具体分析优化产品

def label2(x):
    if x[0] > 0.365 and x[1]>0.007:
        return "A"
    else:
        return "C"
product_354['label'] = product_354[['售卖比','转换率']].apply(lambda x:label2(x),axis = 1)
0.35-0.4区间产品销售情况
  • A类产品有5件、C类产品有20件,对A类产品保留继续下次促销,清仓处理C类产品。
4.4 优化方案
  • 在折扣区间商品销量均较好,只对商品进行了A、C类划分。
  • 转化率大于0.7%,售卖比大于36.5%的商品划分为A类商品,保留用于下次促销活动。
  • 其余商品划分为C类商品,用于清仓处理。

四、总结

  • 1.从整体运营情况来看,今年促销活动销售额为3747167元,实际销售额为2607587元,同比去年增涨65%以上,销量为12017件同比增涨57%。
  • 2.根据ABC分析法
    • 从价格区间优化结果来看,400元以上价位产品一共23件,其中A类产品12件、B类1件、C类10件,下次活动可以对A类产品采取宣传措施带动其他产品销量,C类产品进行清仓处理为下次活动节省空间资源。
    • 在折扣区间方面,整体折扣率在0.38左右,销售额贡献最高的为0.35-0.4之间的产品,在这一类产品中,A类5件,C类有20件,我们选择保留A类产品,清仓处理C类产品。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341