电商促销复盘

什么是特卖:
唯品会是一个专门做特卖的网站,什么是特卖呢。特卖一般是指在特定的时间段里,以优惠的价格出售指定的商品,一般以商城或者专卖店为多。该模式在线下早已存在(比如商场促销、街边的尾货甩卖),在国外成熟的大商场内也有针对滞销商品的打折特卖,如奥特莱斯。特卖一般是商家清库存,不过也有一些专门生产商品做特卖的商家。
特卖行业也是有个真实存在的产业链,只是因为快速分销渠道,地理位置等关系,大多数都集中在一线城市,部分生活在一线城市的都基本或多或少去过几次各个品牌的特卖仓,但是二三线甚至四五线城市的就比较难接触到,后来就有一群人成了品牌搬运工,和各大品牌联系通过微信等渠道快速分销大牌库存,达到快速低价消除库存,加快周转回笼资金等目的。
在货源上,由于品牌尾货具备天然的清仓需求,是折扣零售最常见的货源,但实际上,只要成本足够低,新品首发、定制包销、自有品牌均可以成为折扣特卖零售的可持续货源。成立初期,唯品会货源以尾货为主,但随着唯品会在电商领域的不断发展,新品和专供品的占比不断提升,早在 2016 年 Q2 分析中,唯品会当季新品和平台特供品就已经占 37%了。

分析目标:
评估每次促销活动的结果,并根据情况优化商品结构,以便让自己的商品卖得更好

分析流程:
一、总体分析运营指标
二、从价格区间找出表现不好的产品,优化商品结构
三、从折扣区间找出表现不好的产品,优化商品结构

数据导入
将excel数据导入pandas,给定的数据除了商品热度表和商品明细表是聚合数据,用户购买明细表包括每一单的信息,所以根据商品名分类,聚合每个商品的基本销售情况,如销售数量、平均销售单价、退货数量等,并修改列名,最后将三表连接

import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')

#商品明细表
dt1 = pd.read_excel(r'唯品会销售数据.xlsx',sheetname=0)

#商品热度表
dt2 = pd.read_excel(r'唯品会销售数据.xlsx',sheetname=1)

#用户购买明细表
dt3 = pd.read_excel(r'唯品会销售数据.xlsx',sheetname=2)
dt_product = dt1.merge(dt2,how='left',on='商品名')

#  按商品名统计每个商品销售情况
product_sales = dt3.groupby('商品名').agg({'购买数量':'sum',
                                          '购买单价':'mean',
                                          '购买金额':'sum',
                                          '退货件数':'sum',
                                          '退货金额':'sum',
                                          '用户id':'nunique'}).reset_index()
product_sales.rename(columns={'购买数量':'商品销售数量',
                              '购买单价':'商品销售单价',
                              '购买金额':'商品销售金额',
                              '退货件数':'商品退货数量',
                              '退货金额':'商品退货金额',
                              '用户id':'购买用户数量'},inplace = True)
# 合并三表
dt_product_sales = dt_product.merge(product_sales,how='left',on='商品名')
dt_product_sales.head()
dt_product_sales数据总览

一、总体运营评价
总体运营部分,主要关注销售额、售卖比、UV、转化率等指标,其他指标作为辅助指标。销售额用来和预期目标做对比,售卖比用来看商品流转情况。

  • GMV:销售额,在唯品会里称为到手价。
  • 实销:GMV – 拒退金额。
  • 销量:累计销售量(含拒退)。
  • 客单价:GMV / 客户数,客单价与毛利率息息相关,一般客单价越高,毛利率越高。
  • UV:商品所在页面的独立访问数。
  • 转化率:客户数 / UV。
  • 折扣率:GMV / 吊牌总额(吊牌总额 = 吊牌价 * 销量),在日常工作中,吊牌额是必不可少的。
  • 备货值:吊牌价 * 库存数。
  • 售卖比:又称售罄率,GMV / 备货值。
  • 收藏数:收藏某款商品的用户数量。
  • 加购数:加购物车人数。
  • SKU数:促销活动中的SKU计数(一般指货号)。
  • SPU数:促销活动中的SPU计数(一般指款号)。
  • 拒退量:拒收和退货的总数量。
  • 拒退额:拒收和退货的总金额。
# GMV:销售额(包含退货金额)
gmv = dt_product_sales['商品销售金额'].sum()

# 实际销售额=GMV-退货金额
return_sales = dt_product_sales['商品退货金额'].sum()
return_money = gmv-return_sales

# 销量:累计销售量(含拒退)
all_sales = dt_product_sales['商品销售数量'].sum()

# 客单价=GMV/客户数
custom_price=gmv/dt_product_sales['购买用户数量'].sum()

# UV转化率:商品所在页面的独立访客数
uv_cons = dt_product_sales['UV数'].sum()

# 转化率=客户数/UV
uv_rate = dt_product_sales['购买用户数量'].sum()/uv_cons

# 折扣率=GMV/吊牌总额
tags_sales = np.sum(dt_product_sales['吊牌价'] * dt_product_sales['商品销售数量'])
discount_rate = gmv/tags_sales

# 备货值=吊牌价 * 库存数
goods_value = np.sum(dt_product_sales['吊牌价'] * dt_product_sales['库存量'])

# 售卖比=GMV/备货值
sales_rate = gmv/good_value

# 收藏数:收藏某款商品的用户数量
coll_cons = dt_product_sales['收藏数'].sum()

# 加购数:加购物车人数
add_shop_cons = dt_product_sales['加购物车数'].sum()

# SKU数:促销活动中的最小品类单元(货号)
sku_cons = dt_product_sales['SKU'].sum()

# SPU数:促销活动中的SPU计数(款号)
spu_cons = len(dt_product_sales['商品名'].unique())

# 拒退量:拒收和退货的总数量。退货件数
reject_cons = dt_product_sales['商品退货数量'].sum()

# 拒退额:拒收和退货的总金额
reject_money = dt_product_sales['商品退货金额'].sum()

# 汇总统计
sales_state_dangqi = pd.DataFrame.from_dict(
    {'GMV':gmv,'实际销售额':return_money,'销量':all_sales,'客单价':custom_price,
     'UV':uv_cons,'UV转化率':uv_rate,'折扣率':discount_rate,'备货值':goods_value,
     '售卖比':sales_rate,'收藏数':coll_cons,'加购数':add_shop_cons,'SKU':sku_cons,
     'SPU':spu_cons,'拒退量':reject_cons,'拒退额':reject_money},orient='index'
    )

# 导入去年销售数据
sales_state_tongqi = pd.DataFrame.from_dict(
    {"GMV":2261093,"实际销售额":1464936.517,"销量":7654,"客单价":609.34567,
     "UV":904694,"UV转化率":0.0053366,"折扣率":0.46,"备货值":12610930,
     "售卖比":0.1161,"收藏数":4263,"加购数":15838,"SKU":82,
     "SPU":67,"拒退量":2000,"拒退额":651188.57}, orient='index'
    )

# 计算两年数据同比
sales_state_dangqi.reset_index(inplace=True)
sales_state_dangqi.columns=['指标','今年双11']
sales_state_tongqi.reset_index(inplace=True)
sales_state_tongqi.columns=['指标','去年双11']
sales_state=sales_state_dangqi.merge(sales_state_tongqi,on='指标')
sales_state['同比'] = (sales_state['今年双11']-sales_state['去年双11'])/sales_state['去年双11']
两年销售指标同比

从销售指标整体来看:

  • 相比去年各项指标都有了明显的提升,如销量提升57%,销售额提升78%;
  • 同时可以发现今年折扣率和客单价有所下降,分别为下降9%和19%,也许这是销量提升的原因之一;
  • 值得注意的是今年的退货量和退货金额都有了明显上升,分别上升82%和75%,虽然应该有一部分销量提升的原因,但仍需警惕

二、从价格区间优化商品结构
我们需要做的是,深入探究不同区间的数据,以此来优化后期的促销结构。首先我们需要找到在本次促销中此区间的销售源数据,源数据要求显示具体的款号、销售额、销量等信息。第二步,计算出每个款的转化率、折扣率等数据。
查看以下指标:

  • 销售额
  • 销量
  • 件单价
  • 客户数
  • UV
  • 转换率
  • 库存
  • 货值
  • 售卖比
    查看销售价格大致分布后,将价格划分为三个区间:'0-200','200-400','400以上',提取出上述8个指标所需数据,并计算出货值占比、销量占比、客单价和转化率
#划分价格区间
list_bins = [0,200,400,10000]

#设置切分后的对应标签
list_labels = ['0-200','200-400','400以上']

#用pd.cut进行数据离散化切分,注意分组标签和分组数要一致
dt_product_sales['价格分组'] = pd.cut(dt_product_sales['商品销售单价'],bins=list_bins,labels=list_labels)
dt_product_sales_info = dt_product_sales.groupby('价格分组')['货值','商品销售金额',
                                                               '商品销售数量','UV数','购买用户数量',
                                                               '收藏数','加购物车数'].sum()
dt_product_sales_info.reset_index(inplace=True)

# 货值占比,销售占比,客单价,转化率
dt_product_sales_info['货值占比'] = dt_product_sales_info['货值']/dt_product_sales_info['货值'].sum()
dt_product_sales_info['销售占比'] = dt_product_sales_info['商品销售金额']/dt_product_sales_info['商品销售金额'].sum()
dt_product_sales_info['客单价'] = dt_product_sales_info['商品销售金额']/dt_product_sales_info['购买用户数量']
dt_product_sales_info['转化率'] = dt_product_sales_info['购买用户数量']/dt_product_sales_info['UV数']
dt_product_sales_info
分价格区间销售指标

从各价格销售情况来看

  • 转化率都差不多,200-400区间略高,转化率为0.68%;
  • 销量最大的是200-400区间,但销售额最多的是400以上区间,400以上区间占比53.1%,200-400区间占比37.8%,0-200区间整体销售额不高

将400以上区间的销售数据单独拿出分析,计算出区间内各商品转化率、备货值和售卖比,并按转化率或售卖比排序

# 取出400以上价格区间的数据内容
product_400 = dt_product_sales[dt_product_sales['价格分组']=='400以上']

#计算400以上区间的转化率、备货值和售卖比
product_400['转化率'] = product_400['购买用户数量']/product_400['UV数']
product_400['备货值'] = product_400['吊牌价'] * product_400['库存量']
product_400['售卖比'] = product_400['商品销售金额']/product_400['备货值']

#取出要分析的指标并按售卖比或转化率排序
product_400_1 = product_400[["商品名","商品销售金额","商品销售数量","商品销售单价","购买用户数量","UV数","转化率","库存量","备货值","售卖比"]]
product_400_1.sort_values('售卖比',ascending=False)

400以上区间销售指标

根据以上销售指标数据提出以下优化方案

  • 转化率大于0.7%的商品,保留,拟用于下次促销活动
  • 转化率小于0.7%的商品,但是售卖比大于25%的商品暂时保留予以参加下次促销活动
  • 转化率小于0.7%且售卖比小于25%的商品进行清仓处理
# 挑选合格商品
stay_stock571 = product_400[product_400['转化率']>=0.007]
stay_stock572 = product_400[(product_400['售卖比']>=0.25)&(product_400['转化率']<0.007)]
stay_stock573 = product_400[(product_400['售卖比']<0.25)&(product_400['转化率']<0.007)]
400以上区间需要清仓处理的商品

三、从折扣区间优化商品结构
根据商品折扣率分布情况,划分价格折扣区间,聚合相应指标,并计算出货值占比、销售占比、客单价、转化率

#划分折扣价格区间
discount_bins = [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]
discount_labels = ['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-1']
dt_product_sales['折扣区间'] = pd.cut(dt_product_sales['折扣率'],bins=discount_bins,labels=discount_labels)

#聚合指标
dt_discount_info = dt_product_sales.groupby('折扣区间')['货值','商品销售金额',
                                                        '商品销售数量','UV数','购买用户数量',
                                                        '收藏数','加购物车数'].sum()
dt_discount_info.reset_index(inplace=True)

# 货值占比、销售占比、客单价、转化率
dt_discount_info['货值占比'] = dt_discount_info['货值']/dt_discount_info['货值'].sum()
dt_discount_info['销售占比'] = dt_discount_info['商品销售金额']/dt_discount_info['商品销售金额'].sum()
dt_discount_info['客单价'] = dt_discount_info['商品销售金额']/dt_discount_info['购买用户数量']
dt_discount_info['转化率'] = dt_discount_info['购买用户数量']/dt_discount_info['UV数']
dt_discount_info.sort_values('销售占比',ascending=False)
各折扣区间销售情况

从折扣区间销售情况看不论是销售量还是销售金额,最大的都是0.35-0.4区间,其销售占比达36.6%;转化率来看最大的是0.55-0.6区间,为1.32%,最小的反而为折扣最大的0.15-0.2区间,仅为0.42%

取出0.35-0.4折扣区间的商品单独分析,计算其转化率,备货值和售卖比,并提出相应指标列按售卖比或转化率排序

# 取出0.35-0.4折扣区间的数据内容
product_354 = dt_product_sales[dt_product_sales['折扣区间']=='0.35-0.4']

product_354['转化率'] = product_354['购买用户数量']/product_354['UV数']
product_354['备货值'] = product_354['吊牌价']*product_354['库存量']
product_354['售卖比'] = product_354['商品销售金额']/product_354['备货值']

product_354 = product_354[["商品名","商品销售金额","商品销售数量","商品销售单价","购买用户数量","UV数","库存量","备货值","折扣率","售卖比",'转化率']].sort_values('售卖比')
product_354.sort_values('售卖比',ascending=False)

折扣区间0.35-0.4销售情况

根据各商品转化率和售卖比提出优化方案

  • 找出售卖比大于25%%或转化率大于0.7%的商品予以保留,其余进行清仓处理;
#挑选合格的商品
stay_stock1 = product_354[(product_354['售卖比']>=0.25)|(product_354['转化率']>=0.007)]

# 清仓处理商品
stay_stock2 = product_354[(product_354['售卖比']<0.25)&(product_354['转化率']<0.007)]
stay_stock2
0.35-0.4折扣区间下次需清仓商品

代码链接
提取码:8eve

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345