有一个专门做特卖的网站(特卖一般是指在特定的时间段里,以优惠的价格出售指定的商品)。本文是对部分特卖商品在2019年双11销售情况的复盘,通过jupyter notebook,使用python的pandas和numpy包完成分析,通过分析结果,优化商品结构,让商品实现更好的销售情况。
数据集为一份Excel表格,包含三张表:商品信息表、商品热度表、用户销售明细表。
包含如下字段:
1、商品信息表:商品名、售卖价、吊牌价、折扣率、库存量、货值、成本价、利润率、SKU;
2、商品热度表:商品名、UV数、收藏数、加购物车数;
3、用户销售明细表:用户id、购买日期、商品名、购买数量、购买单价、购买金额、是否退货、退货件数、退货金额。
导包:
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore') # 忽略警告
读取商品信息表:
# 读取商品信息
dt1 = pd.read_excel("销售数据.xlsx", sheet_name=0)
dt1.head()
读取商品热度表:
# 读取商品热度信息
dt2 = pd.read_excel("销售数据.xlsx", sheet_name=1)
dt2.head()
读取用户销售明细表:
# 读取销售明细表
dt3 = pd.read_excel("销售数据.xlsx", sheet_name=2)
dt3["是否退货"] = dt3["是否退货"].map({"是":1, "否":0})
dt3.head()
将三张表合并为一张表,便于后续计算和分析:
合并商品信息表和商品热度表:
dt_product = dt1.merge(dt2, how='left', on='商品名')
dt_product.head()
聚合用户销售明细表
# 统计每个商品的销售情况
product_sales = dt3.groupby("商品名").agg({"购买数量":"sum",
"购买金额":"sum",
"退货件数":"sum",
"退货金额":"sum",
"购买单价":"mean",
"用户id":pd.Series.nunique}).reset_index()
product_sales.rename(columns = {"购买数量":"商品销售数量",
"购买金额":"商品销售金额",
"是否退货":"商品退货数量",
"退货金额":"商品退货金额",
"购买单价":"商品销售单价",
"用户id":"购买用户数量"}, inplace=True)
product_sales.head()
完成三张表的合并
dt_product_sales = dt_product.merge(product_sales, how='left', on='商品名')
dt_prodcut_sales.head()
总体运营部分,主要关注销售额、售卖比、UV、转化率等指标,其他指标作为辅助指标。销售额用来和预期目标做对比,售卖比用来看商品流转情况。
所以,制定如下指标,通过汇总了解整体运营情况:
GMV
gmv = dt_product_sales['商品销售金额'].sum()
gmv
输出 3747167.0
实销
return_sales = dt_product_sales['商品退货金额'].sum()
return_money = gmv - return_sales
return_money
输出 2607587.0
累计销售量
all_sales = dt_product_sales['商品销售数量'].sum()
all_sales
输出 12017
客单价
custom_price = gmv / dt_product_sales['购买用户数量'].sum()
custom_price
输出 493.56783456269756
UV
uv_cons = dt_product_sales['UV数'].sum()
uv_cons
输出 1176103
转化率
uv_rate = dt_product_sales['购买用户数量'].sum() / uv_cons
uv_rate
输出 0.006455216932530569
折扣率
tags_sales = np.sum(dt_product)sales['吊牌价'] * dt_product_sales['商品销售数量'])
discount_rate = gmv / tags_sales
discount_rate
输出 0.4179229541452886
备货值
goods_value = dt_product_sales['货值'].sum()
goods_value
输出 18916385
售卖比
sales_rate = gmv / goods_value
sales_rate
输出 0.19809096817866195
收藏数
coll_cons = dt_product_sales['收藏数'].sum()
coll_cons
输出 6224
加购数
add_shop_cons = dt_product_sales['加购物车数'].sum()
add_shop_cons
输出 18690
SKU
sku_cons = dt_product_sales['SKU'] / sum()
sku_cons
输出 125
SPU
spu_cons = dt_product_sales['SPU数'].sum()
spu_cons
输出 80
拒退量
reject_cons = dt_product_sales['退货件数'].sum()
reject_cons
输出 3643
拒退额
reject_money = dt_product_sales['商品退货金额'].sum()
reject_money
输出 1139580
数据汇总,并与去年数据进行同比
sales_state_dangqi = pd.DataFrame(
{"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,],},
) #index=["今年双11",]
# 去年的数据是已经统计好了的,不需要计算
sales_state_tongqi = pd.DataFrame(
{"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,],},
) #index=["去年双11",]
sales_date_now=pd.DataFrame([[gmv,],[return_money,],[all_sales,],[custom_price,],[uv_cons,],[uv_rate,],[discount_rate,],[goods_value,],[sales_rate,],[coll_cons,],[add_shop_cons,],[sku_cons,],[spu_cons,],[reject_cons,],[reject_money,]],\
columns=['今年双十一'],
index=['GMV','实销','销量','客单价','UV数','UV转化率','折扣率','备货值','售卖比','收藏数','加购数','SKU','SPU','拒退量','拒退额'])
sales_state_past=pd.DataFrame([2261093,1464936.517,7654,609.34567,904694,0.0053366,0.46,12610930,0.1161,4263,15838,82,67,2000,651188.57],
index=['GMV','实销','销量','客单价','UV数','UV转化率','折扣率','备货值','售卖比','收藏数', '加购数','SKU','SPU','拒退量','拒退额'],\
columns=['去年双十一'] )
sales_state=pd.merge(sales_date_now,sales_state_past,left_index=True,right_index=True)
sales_state_T=pd.DataFrame(sales_state.values.T, index=sales_state.columns, columns=sales_state.index)
sales_state['同比增长']=(sales_state['今年双十一']-sales_state['去年双十一'])/sales_state['去年双十一']
sales_state.sort_values(by='同比增长',inplace=True,ascending=False)
plt.figure(figsize=(16,6))
sales_state['同比增长'].plot(kind='bar',width=0.6,alpha=1,rot=0,edgecolor = 'k',fontsize=12)
plt.title('双十一指标同比去年情况')
plt.ylim([-0.25,1])
plt.ylabel('百分比')
for i,j in zip(range(15),sales_state['同比增长']):
plt.text(i-0.2,j+0.01,'%.1f%%' % (j*100), color = 'k',fontsize = 12)
可见,今年双十一各项指标,除折扣率和客单价较去年降低之外,其余指标均有所增长。
深入探究不同价格区间的数据,来优化后期的促销结构。首先需要找到本次促销活动中各区间的销售源数据,要显示款号、销售额、销售量的年该信息。然后计算每个款的转化率、折扣率等数据。
1.1 指标计算
首先对商品进行价格区间划分,氛围’1-200‘,‘200-400’,‘400及以上'
# 设置切分区域
listBins = [0, 200, 400, 100000]
# 设置切分后对应分组的标签
listLabels = ['1_200', '200_400', '400及以上']
#利用pd.cut进行数据离散化切分
dt_product_sales['价格分组'] = pd.cut(dt_product_sales['售卖价'], bins = listBins, labels = listLabels, include_lowers=Ture)
dt_product_sales.head()
对三个区间进行聚合统计:
dt_product_sales_info = dt_product_sales.groupby('价格分组').agg({
'货值': 'sum',
'商品销售金额': 'sum',
'商品销售数量': 'sum',
'UV数': 'sum',
'购买用户数量': 'sum',
'收藏数': 'sum',
'加购物车数': 'sum'}).reset_index()
dt_product_sales_info.head()
计算货值占比、销售占比、客单价、转化率
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['UV数'] / dt_product_sales_info['购买用户数量']
dt_product_sales_info.head()
根据聚合结果,价格400及以上的商品销售占比最大,达到53%;
购买转化率相差不大,均在0.6% - 0.7%之间;
下次促销需要重点销售价格分组在400及以上的商品,对该类商品进行优化。
取出400及以上价格区间的数据内容
product_400 = dt_product_sales_info[dt_product_sales['价格分组']=='400及以上']
product_400.head()
计算此类商品的转化率、备货值和售卖比
product_400['转化率'] = product_400['购买用户数量'] / product_400['UV数']
product_400['备货值'] = product_400['吊牌价'] * product_400['库存量']
product_400['售卖比'] = product_400['商品销售金额'] / product_400['备货值']
product_400.head()
1.2 观察数据的分布情况
product_400[["转化率"]].boxplot()
# 中位数
print(np.median(product_400["转化率"]))
# 25%分位数
print(np.percentile(product_400["转化率"], 25))
# 75%分位数
print(np.percentile(product_400["转化率"], 75))
product_400[["售卖比"]].boxplot(showbox=True)
# 中位数
print(np.median(product_400["售卖比"]))
# 25%分位数
print(np.percentile(product_400["售卖比"], 25))
# 75%分位数
print(np.percentile(product_400["售卖比"], 75))
优化方案:临界值选取的是分位数值,转化率选取50%分位数的值,意味着50%的商品转化率是大于0.007的。售卖比可以选择75%分位数,表示75%的商品转化率是小于0.318的。可以基于这个数值进行浮动,这里选择的临界值是:转化率0.007,售卖比0.36。
使用ABC分级方法,以转化率和售卖比作为关键指标,指定分级逻辑:
1.3 挑选合格商品
# 转化率大于0.7%的商品,保留
stay_stocks1 = product_400[product_400['转化率'] > 0.007]
# 转化率小于0.7%,但售卖比大于36%的商品,保留
stay_stocks2 = product_400[(product_400['转化率] < 0.007) & (product_400['售卖比'] > 0.36)]
# 转化率小于0.7%,且售卖比小于36%的商品,清仓
stay_stocks3 = product_400[(product_400['转化率] < 0.007) & (product_400['售卖比'] < 0.36)]
和从价格区间优化商品结构思路相同,选择下次促销需要重点销售的商品所在的折扣区间,再计算该类商品的转化率、售卖比,进行商品结构优化。
划分折扣区间
#设置切分区域
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_1']
#利用pd.cut进行数据离散化切分
dt_product_sales['折扣区间'] = pd.cut(dt_product['折扣率'], bins=listBins, labels=listLabels, include_lowest=True)
dt_product_sales.head()
对折扣区间进行聚合统计:
dt_product_discount_info = dt_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["货值"]/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["购买用户数量"]
dt_product_discount_info["转化率"]=dt_product_discount_info["购买用户数量"]/dt_product_discount_info["UV数"]
dt_product_discount_info
根据统计结果,下次促销需要重点销售折扣区间在0.35-0.4的商品,对该类商品进行优化。
取出折扣区间0.35-0.4的数据内容
product_354 = dt_product_sales[dt_product_sales['折扣区间'] == '0.35_0.4]
product_354.head()
计算转化率、备货值、售卖比
product_354['转化率'] = product_354["购买用户数量"]/product_354["UV数"]
product_354["备货值"] = product_354["吊牌价"]*product_354["库存量"]
product_354["售卖比"] = product_354["商品销售金额"]/product_354["备货值"]
优化方案:
stay_stocks = product_354[(product_354["售卖比"]>0.365)&(product_354["转化率"]>0.007)]
stay_stocks