电商促销项目复盘
数据:
共三张表,
- sales_info1是商品信息表,
- sales_info2顾客浏览记录统计,
- sales_info3购买信息表
分析流程:
- 1、总体运营指标
- 2、从价格区间找出表现不好的产品,优化商品结构
- 3、从折扣区间来找出表现不好的产品,优化商品结构
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
此次分析的目标:
评估每次促销活动的结果,并根据情况优化商品结构,以便让自己的商品卖的更好。
1、读取各部分数据集
import sqlalchemy
engine = sqlalchemy.create_engine('mysql+pymysql://***:***@****:3306/***')
# 读取数据
# 商品信息表
sql_cmd = "select * from sales_info1"
# 执行sql语句,获取数据
dt1 = pd.read_sql(sql=sql_cmd, con=engine)
dt1.rename(columns={"sale_name":"商品名",
"sale_price":"售卖价",
"tag_price":"吊牌价",
"discout":"折扣率",
"stocks":"库存量",
"stocks_value":"货值",
"cost_price":"成本价",
"profit_rate":"利润率",
"skus":"SKU"},
inplace=True)
dt1
# 读取数据
# 顾客浏览记录
sql_cmd = "select * from sales_info2"
# 执行sql语句,获取数据
dt2 = pd.read_sql(sql=sql_cmd, con=engine)
dt2.rename(columns={"sale_name":"商品名",
"uvs":"UV数",
"collections":"收藏数",
"carts":"加购物车数"},
inplace=True)
dt2
# 读取数据
# 订单详情
sql_cmd = "select * from sales_info3"
# 执行sql语句,获取数据
dt3 = pd.read_sql(sql=sql_cmd, con=engine)
dt3.rename(columns={"user_id":"用户id",
"buy_date":"购买日期",
"sale_name":"商品名",
"buy_cons":"购买数量",
"buy_price":"购买单价",
"cost_price":"购买金额",
"is_tui":"是否退货",
"tui_cons":"退货件数",
"tui_price":"退货金额"},
inplace=True)
dt3['是否退货']=dt3["是否退货"].map({"是":1,"否":0})
dt3
2、合并商品信息表和商品热度表数据
# 把商品信息加上该商品的热度信息
# 得到基础的商品信息,以及商品的一些热度信息:加购物车数量,收藏数量、uv数
dt_product = dt1.merge(dt2,how="left",on="商品名")
dt_product.head()
3、合并商品信息表和商品热度表数据和用户销售明细表
# 统计每个商品的一个销售情况
product_sales = dt3.groupby("商品名").agg({"购买数量":"sum",
"购买金额":"sum",
"退货件数":"sum",
"退货金额":"sum",
"购买单价":"mean",
"用户id":"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_product_sales
一、总体运营情况评价
总体运营部分,主要关注销售额、售卖比、UV、转化率等指标,其他指标作为辅助指标。销售额用来和预期目标做对比,售卖比用来看商品流转情况。
- GMV:销售额
- 实销:GMV – 拒退金额。
- 销量:累计销售量(含拒退)。
- 客单价:GMV / 客户数,客单价与毛利率息息相关,一般客单价越高,毛利率越高。
- UV:商品所在页面的独立访问数。
- 转化率:客户数 / UV。
- 折扣率:GMV / 吊牌总额(吊牌总额 = 吊牌价 * 销量),在日常工作中,吊牌额是必不可少的。
- 备货值:吊牌价 * 库存数。
- 售卖比:又称售罄率,GMV / 备货值。
- 收藏数:收藏某款商品的用户数量。
- 加购数:加购物车人数。
- SKU数:促销活动中的SKU计数(一般指货号)。
- SPU数:促销活动中的SPU计数(一般指款号)。
- 拒退量:拒收和退货的总数量。
- 拒退额:拒收和退货的总金额。
#1、GMV:销售额,包含退货的金额
gmv = dt_product_sales["商品销售金额"].sum()
gmv
3747167.0
#2、实际销售额=GMV - 退货金额
return_sales = dt_product_sales["商品退货金额"].sum()
return_money = gmv - return_sales
return_money
2607587.0
#3、销量:累计销售量(含拒退)
all_sales = dt_product_sales["商品销售数量"].sum()
all_sales
12017
#4、客单价:GMV / 客户数,客单价与毛利率息息相关,一般客单价越高,毛利率越高。
# dt3.user_id.unique().count()
custom_price = gmv / dt_product_sales["购买用户数量"].sum()
custom_price
493.56783456269756
# 5、UV:商品所在页面的独立访问数
uv_cons = dt_product_sales["UV数"].sum()
uv_cons
1176103
# 6、转化率:客户数 / UV。
uv_rate = dt_product_sales["购买用户数量"].sum() / dt_product_sales["UV数"].sum()
uv_rate
0.006455216932530569
# 7、折扣率:GMV / 吊牌总额(吊牌总额 = 吊牌价 * 销量),在日常工作中,吊牌额是必不可少的。
tags_sales = np.sum(dt_product_sales["吊牌价"] * dt_product_sales["商品销售数量"])
discount_rate= gmv / tags_sales
discount_rate
0.4179229541452886
# 8、备货值:吊牌价 * 库存数。
goods_value = dt_product_sales["货值"].sum()
goods_value
18916395
# 9、售卖比:又称售罄率,GMV / 备货值。
sales_rate = gmv / goods_value
sales_rate
0.19809096817866195
# 10、收藏数:收藏某款商品的用户数量。
coll_cons = dt_product_sales["收藏数"].sum()
coll_cons
6224
# 11、加购数:加购物车人数。
add_shop_cons = dt_product_sales["加购物车数"].sum()
add_shop_cons
18690
# 12、SKU数:促销活动中的最小品类单元(一般指货号)。
sku_cons = dt_product_sales["SKU"].sum()
sku_cons
125
# 13、SPU数:促销活动中的SPU计数(一般指款号)。
spu_cons = len(dt_product_sales["商品名"].unique())
spu_cons
80
# 14、拒退量:拒收和退货的总数量。退货件数
reject_cons = dt_product_sales["退货件数"].sum()
reject_cons
3643
# 15、拒退额:拒收和退货的总金额。
reject_money = dt_product_sales["商品退货金额"].sum()
reject_money
1139580.0
# 汇总统计
# 汇总统计
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_state = pd.concat([sales_state_dangqi, sales_state_tangqi])
sales_state_dangqi_s = pd.DataFrame(sales_state_dangqi.stack()).reset_index().iloc[:,[1,2]] # 行转列
sales_state_dangqi_s.columns = ["指标","今年双11"]
sales_state_tongqi_s = pd.DataFrame(sales_state_tongqi.stack()).reset_index().iloc[:,[1,2]]
sales_state_tongqi_s.columns = ["指标","去年双11"]
sales_state = pd.merge(sales_state_dangqi_s, sales_state_tongqi_s,on="指标")
sales_state["同比"] = (sales_state["今年双11"] - sales_state["去年双11"]) / sales_state["去年双11"]
sales_state
指标 | 今年双11 | 去年双11 | 同比 | |
---|---|---|---|---|
0 | GMV | 3.747167e+06 | 2.261093e+06 | 0.657237 |
1 | 实际销售额 | 2.607587e+06 | 1.464937e+06 | 0.780000 |
2 | 销量 | 1.201700e+04 | 7.654000e+03 | 0.570029 |
3 | 客单价 | 4.935678e+02 | 6.093457e+02 | -0.190004 |
4 | UV数 | 1.176103e+06 | 9.046940e+05 | 0.300001 |
5 | UV转化率 | 6.455217e-03 | 5.336600e-03 | 0.209612 |
6 | 折扣率 | 4.179230e-01 | 4.600000e-01 | -0.091472 |
7 | 货值 | 1.891640e+07 | 1.261093e+07 | 0.500000 |
8 | 售卖比 | 1.980910e-01 | 1.161000e-01 | 0.706210 |
9 | 收藏数 | 6.224000e+03 | 4.263000e+03 | 0.460005 |
10 | 加购数 | 1.869000e+04 | 1.583800e+04 | 0.180073 |
11 | sku数 | 1.250000e+02 | 8.200000e+01 | 0.524390 |
12 | spu数 | 8.000000e+01 | 6.700000e+01 | 0.194030 |
13 | 拒退量 | 3.643000e+03 | 2.000000e+03 | 0.821500 |
14 | 拒退额 | 1.139580e+06 | 6.511886e+05 | 0.750000 |
二、从价格区间来优化商品结构
我们需要做的是,深入探究不同区间的数据,以此来优化后期的促销结构。首先我们需要找到在本次促销中此区间的销售源数据,源数据要求显示具体的款号、销售额、销量等信息。第二步,计算出每个款的转化率、折扣率等数据。
查看指标:
- 销售额
- 销量
- 件单价
- 客户数
- UV
- 转换率
- 库存
- 货值
- 售卖比
dt_product_sales["售卖价"].describe()
count 80.000000
mean 317.225000
std 221.303273
min 9.000000
25% 188.000000
50% 279.000000
75% 426.500000
max 1000.000000
Name: 售卖价, dtype: float64
# 划分价格区间段
#设置切分区域
listBins = [0,100,200, 300,400, 500,100000]
#设置切分后对应标签
listLabels = ['1_100','100_200','200_300','300_400','400_500','500及以上']
#利用pd.cut进行数据离散化切分,注意分组标签和分组数要一致
dt_product_sales['价格分组'] = pd.cut(dt_product_sales['售卖价'], bins=listBins, labels=listLabels, include_lowest=True)
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["购买用户数量"]/dt_product_sales_info["UV数"]
dt_product_sales_info
价格分组 | 货值 | 商品销售金额 | 商品销售数量 | UV数 | 购买用户数量 | 收藏数 | 加购物车数 | 货值占比 | 销售占比 | 客单价 | 转化率 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1_100 | 402787 | 57920.0 | 1871 | 182376 | 1181 | 937 | 2802 | 0.021293 | 0.015457 | 49.043184 | 0.006476 |
1 | 100_200 | 1170359 | 281976.0 | 1744 | 187185 | 1099 | 796 | 2522 | 0.061870 | 0.075250 | 256.575068 | 0.005871 |
2 | 200_300 | 4167529 | 717554.0 | 2947 | 250365 | 1863 | 1574 | 4615 | 0.220313 | 0.191492 | 385.160494 | 0.007441 |
3 | 300_400 | 4418444 | 700148.0 | 2031 | 215182 | 1288 | 1034 | 3687 | 0.233577 | 0.186847 | 543.593168 | 0.005986 |
4 | 400_500 | 5515063 | 957261.0 | 2108 | 237961 | 1322 | 1067 | 2959 | 0.291549 | 0.255463 | 724.100605 | 0.005556 |
5 | 500及以上 | 3242213 | 1032308.0 | 1316 | 103034 | 839 | 816 | 2105 | 0.171397 | 0.275490 | 1230.402861 | 0.008143 |
# 取出200_300及以上价格区间的数据内容
product_200 = dt_product_sales[dt_product_sales["价格分组"]=='200_300']
# 转换率=客户数 / UV
product_200['转换率'] = product_200["购买用户数量"]/product_200["UV数"]
# 备货值=吊牌价 * 库存数
product_200["备货值"] = product_200["吊牌价"]*product_200["库存量"]
# 售卖比=又称售罄率,GMV / 备货值
product_200["售卖比"] = product_200["商品销售金额"]/product_200["备货值"]
product_200.head()
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售数量 | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | A002 | 236 | 610 | 0.386885 | 423 | 258030 | 75 | 0.682203 | 1 | 13124 | ... | 146 | 34456.0 | 31 | 7316.0 | 236.0 | 87 | 200_300 | 0.006629 | 258030 | 0.133535 |
6 | A007 | 214 | 523 | 0.409178 | 371 | 194033 | 169 | 0.210280 | 2 | 16071 | ... | 176 | 37664.0 | 51 | 10914.0 | 214.0 | 110 | 200_300 | 0.006845 | 194033 | 0.194111 |
7 | A008 | 238 | 1039 | 0.229066 | 254 | 263906 | 268 | -0.126050 | 2 | 8936 | ... | 159 | 37842.0 | 40 | 9520.0 | 238.0 | 98 | 200_300 | 0.010967 | 263906 | 0.143392 |
9 | A010 | 217 | 504 | 0.430556 | 373 | 187992 | 123 | 0.433180 | 1 | 13323 | ... | 156 | 33852.0 | 50 | 10850.0 | 217.0 | 97 | 200_300 | 0.007281 | 187992 | 0.180071 |
12 | B003 | 288 | 746 | 0.386059 | 439 | 327494 | 109 | 0.621528 | 1 | 23170 | ... | 151 | 43488.0 | 44 | 12672.0 | 288.0 | 89 | 200_300 | 0.003841 | 327494 | 0.132790 |
5 rows × 22 columns
product_200[["转换率","库存量"]]
转换率 | 库存量 | |
---|---|---|
1 | 0.006629 | 423 |
6 | 0.006845 | 371 |
7 | 0.010967 | 254 |
9 | 0.007281 | 373 |
12 | 0.003841 | 439 |
21 | 0.012380 | 287 |
24 | 0.007296 | 178 |
34 | 0.018192 | 376 |
38 | 0.020118 | 269 |
53 | 0.004608 | 563 |
57 | 0.014234 | 207 |
58 | 0.003160 | 515 |
61 | 0.021579 | 460 |
64 | 0.021228 | 147 |
66 | 0.007989 | 302 |
68 | 0.008588 | 241 |
70 | 0.013419 | 338 |
71 | 0.007030 | 491 |
74 | 0.005045 | 343 |
78 | 0.004396 | 462 |
优化方案:
- 转化率大于1%,且库存大于400的商品,暂时保留,用于下次促销活动;
- 转化率小于1%,但大于0.5%的商品予以保留参加下次促销活动,
- 转化率小于0.5%的商品进行清仓处理。
# 挑选合格的商品:
# 1、保留商品:转化率大于1%的商品且库存大于400予以保留
stay_stocks201 = product_200[(product_200["转换率"]>=0.01) & (product_200["库存量"]>300)]
stay_stocks201
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售数量 | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
34 | D005 | 260 | 613 | 0.424144 | 376 | 230488 | 130 | 0.500000 | 1 | 5222 | ... | 153 | 39780.0 | 46 | 11960.0 | 260.0 | 95 | 200_300 | 0.018192 | 230488 | 0.172590 |
61 | G002 | 232 | 513 | 0.452242 | 460 | 235980 | 109 | 0.530172 | 2 | 4356 | ... | 145 | 33640.0 | 43 | 9976.0 | 232.0 | 94 | 200_300 | 0.021579 | 235980 | 0.142554 |
70 | H001 | 297 | 755 | 0.393377 | 338 | 255190 | 166 | 0.441077 | 1 | 6856 | ... | 149 | 44253.0 | 42 | 12474.0 | 297.0 | 92 | 200_300 | 0.013419 | 255190 | 0.173412 |
3 rows × 22 columns
# 挑选合格的商品:
# 2、保留商品:转化率小于1%,但大于0.5%的商品予以保留
stay_stocks201 = product_200[(product_200["转换率"]<0.01) & (product_200["转换率"]>=0.005)]
stay_stocks201
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售数量 | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | A002 | 236 | 610 | 0.386885 | 423 | 258030 | 75 | 0.682203 | 1 | 13124 | ... | 146 | 34456.0 | 31 | 7316.0 | 236.0 | 87 | 200_300 | 0.006629 | 258030 | 0.133535 |
6 | A007 | 214 | 523 | 0.409178 | 371 | 194033 | 169 | 0.210280 | 2 | 16071 | ... | 176 | 37664.0 | 51 | 10914.0 | 214.0 | 110 | 200_300 | 0.006845 | 194033 | 0.194111 |
9 | A010 | 217 | 504 | 0.430556 | 373 | 187992 | 123 | 0.433180 | 1 | 13323 | ... | 156 | 33852.0 | 50 | 10850.0 | 217.0 | 97 | 200_300 | 0.007281 | 187992 | 0.180071 |
24 | C005 | 270 | 765 | 0.352941 | 178 | 136170 | 115 | 0.574074 | 2 | 12610 | ... | 147 | 39690.0 | 35 | 9450.0 | 270.0 | 92 | 200_300 | 0.007296 | 136170 | 0.291474 |
66 | G007 | 299 | 664 | 0.450301 | 302 | 200528 | 160 | 0.464883 | 1 | 11516 | ... | 134 | 40066.0 | 52 | 15548.0 | 299.0 | 92 | 200_300 | 0.007989 | 200528 | 0.199803 |
68 | G009 | 216 | 485 | 0.445361 | 241 | 116885 | 115 | 0.467593 | 1 | 11644 | ... | 153 | 33048.0 | 46 | 9936.0 | 216.0 | 100 | 200_300 | 0.008588 | 116885 | 0.282739 |
71 | H002 | 246 | 517 | 0.475822 | 491 | 253847 | 75 | 0.695122 | 1 | 13087 | ... | 148 | 36408.0 | 30 | 7380.0 | 246.0 | 92 | 200_300 | 0.007030 | 253847 | 0.143425 |
74 | H005 | 243 | 536 | 0.453358 | 343 | 183848 | 147 | 0.395062 | 2 | 16453 | ... | 131 | 31833.0 | 27 | 6561.0 | 243.0 | 83 | 200_300 | 0.005045 | 183848 | 0.173148 |
8 rows × 22 columns
# 3、清仓处理商品,找出转化率小于0.5%的部分
stay_stocks203 = product_200[product_200["转换率"]<0.005]
stay_stocks203
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售数量 | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12 | B003 | 288 | 746 | 0.386059 | 439 | 327494 | 109 | 0.621528 | 1 | 23170 | ... | 151 | 43488.0 | 44 | 12672.0 | 288.0 | 89 | 200_300 | 0.003841 | 327494 | 0.132790 |
53 | F004 | 258 | 560 | 0.460714 | 563 | 315280 | 198 | 0.232558 | 2 | 22788 | ... | 176 | 45408.0 | 69 | 17802.0 | 258.0 | 105 | 200_300 | 0.004608 | 315280 | 0.144024 |
58 | F009 | 246 | 552 | 0.445652 | 515 | 284280 | 117 | 0.524390 | 2 | 24053 | ... | 115 | 28290.0 | 38 | 9348.0 | 246.0 | 76 | 200_300 | 0.003160 | 284280 | 0.099515 |
78 | H009 | 239 | 518 | 0.461390 | 462 | 239316 | 168 | 0.297071 | 1 | 25707 | ... | 173 | 41347.0 | 52 | 12428.0 | 239.0 | 113 | 200_300 | 0.004396 | 239316 | 0.172772 |
4 rows × 22 columns
其他价格区间可做同样处理
三、从折扣区间来优化商品结构
同样地,我们选择0.35-0.4折扣区间进行深入探究。
dt_product_sales.head()
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | 收藏数 | 加购物车数 | 商品销售数量 | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | A001 | 15 | 70 | 0.214286 | 501 | 35070 | 14 | 0.066667 | 2 | 10926 | 48 | 372 | 185 | 2775.0 | 59 | 885.0 | 15.0 | 116 | 1_100 |
1 | A002 | 236 | 610 | 0.386885 | 423 | 258030 | 75 | 0.682203 | 1 | 13124 | 84 | 193 | 146 | 34456.0 | 31 | 7316.0 | 236.0 | 87 | 200_300 |
2 | A003 | 473 | 1253 | 0.377494 | 415 | 519995 | 394 | 0.167019 | 1 | 25657 | 45 | 173 | 144 | 68112.0 | 31 | 14663.0 | 473.0 | 94 | 400_500 |
3 | A004 | 320 | 835 | 0.383234 | 624 | 521040 | 279 | 0.128125 | 2 | 20833 | 5 | 273 | 172 | 55040.0 | 56 | 17920.0 | 320.0 | 111 | 300_400 |
4 | A005 | 15 | 82 | 0.182927 | 179 | 14678 | 27 | -0.800000 | 1 | 19371 | 71 | 356 | 122 | 1830.0 | 32 | 480.0 | 15.0 | 81 | 1_100 |
# 划分价格区间段
#设置切分区域
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()
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | 收藏数 | 加购物车数 | 商品销售数量 | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 折扣区间 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | A001 | 15 | 70 | 0.214286 | 501 | 35070 | 14 | 0.066667 | 2 | 10926 | 48 | 372 | 185 | 2775.0 | 59 | 885.0 | 15.0 | 116 | 1_100 | 0.2_0.25 |
1 | A002 | 236 | 610 | 0.386885 | 423 | 258030 | 75 | 0.682203 | 1 | 13124 | 84 | 193 | 146 | 34456.0 | 31 | 7316.0 | 236.0 | 87 | 200_300 | 0.35_0.4 |
2 | A003 | 473 | 1253 | 0.377494 | 415 | 519995 | 394 | 0.167019 | 1 | 25657 | 45 | 173 | 144 | 68112.0 | 31 | 14663.0 | 473.0 | 94 | 400_500 | 0.35_0.4 |
3 | A004 | 320 | 835 | 0.383234 | 624 | 521040 | 279 | 0.128125 | 2 | 20833 | 5 | 273 | 172 | 55040.0 | 56 | 17920.0 | 320.0 | 111 | 300_400 | 0.35_0.4 |
4 | A005 | 15 | 82 | 0.182927 | 179 | 14678 | 27 | -0.800000 | 1 | 19371 | 71 | 356 | 122 | 1830.0 | 32 | 480.0 | 15.0 | 81 | 1_100 | 0.15_0.2 |
# 货值占比、销售占比、客单价、转化率 后面求
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价格区间的数据内容
product_354 = dt_product_sales[dt_product_sales["折扣区间"]=='0.35_0.4']
product_354.head()
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | 收藏数 | 加购物车数 | 商品销售数量 | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 折扣区间 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | A002 | 236 | 610 | 0.386885 | 423 | 258030 | 75 | 0.682203 | 1 | 13124 | 84 | 193 | 146 | 34456.0 | 31 | 7316.0 | 236.0 | 87 | 200_300 | 0.35_0.4 |
2 | A003 | 473 | 1253 | 0.377494 | 415 | 519995 | 394 | 0.167019 | 1 | 25657 | 45 | 173 | 144 | 68112.0 | 31 | 14663.0 | 473.0 | 94 | 400_500 | 0.35_0.4 |
3 | A004 | 320 | 835 | 0.383234 | 624 | 521040 | 279 | 0.128125 | 2 | 20833 | 5 | 273 | 172 | 55040.0 | 56 | 17920.0 | 320.0 | 111 | 300_400 | 0.35_0.4 |
10 | B001 | 426 | 1121 | 0.380018 | 479 | 536959 | 311 | 0.269953 | 1 | 20448 | 6 | 242 | 158 | 67308.0 | 43 | 18318.0 | 426.0 | 101 | 400_500 | 0.35_0.4 |
12 | B003 | 288 | 746 | 0.386059 | 439 | 327494 | 109 | 0.621528 | 1 | 23170 | 111 | 299 | 151 | 43488.0 | 44 | 12672.0 | 288.0 | 89 | 200_300 | 0.35_0.4 |
# 转换率=客户数 / UV
product_354['转换率'] = product_354["购买用户数量"]/product_354["UV数"]
# 备货值=吊牌价 * 库存数
product_354["备货值"] = product_354["吊牌价"]*product_354["库存量"]
# 售卖比=又称售罄率,GMV / 备货值
product_354["售卖比"] = product_354["商品销售金额"]/product_354["备货值"]
product_354.head()
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 折扣区间 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | A002 | 236 | 610 | 0.386885 | 423 | 258030 | 75 | 0.682203 | 1 | 13124 | ... | 34456.0 | 31 | 7316.0 | 236.0 | 87 | 200_300 | 0.35_0.4 | 0.006629 | 258030 | 0.133535 |
2 | A003 | 473 | 1253 | 0.377494 | 415 | 519995 | 394 | 0.167019 | 1 | 25657 | ... | 68112.0 | 31 | 14663.0 | 473.0 | 94 | 400_500 | 0.35_0.4 | 0.003664 | 519995 | 0.130986 |
3 | A004 | 320 | 835 | 0.383234 | 624 | 521040 | 279 | 0.128125 | 2 | 20833 | ... | 55040.0 | 56 | 17920.0 | 320.0 | 111 | 300_400 | 0.35_0.4 | 0.005328 | 521040 | 0.105635 |
10 | B001 | 426 | 1121 | 0.380018 | 479 | 536959 | 311 | 0.269953 | 1 | 20448 | ... | 67308.0 | 43 | 18318.0 | 426.0 | 101 | 400_500 | 0.35_0.4 | 0.004939 | 536959 | 0.125350 |
12 | B003 | 288 | 746 | 0.386059 | 439 | 327494 | 109 | 0.621528 | 1 | 23170 | ... | 43488.0 | 44 | 12672.0 | 288.0 | 89 | 200_300 | 0.35_0.4 | 0.003841 | 327494 | 0.132790 |
5 rows × 23 columns
product_354[["转换率","库存量"]].sort_values(["转换率","库存量"])
转换率 | 库存量 | |
---|---|---|
32 | 0.003325 | 417 |
2 | 0.003664 | 415 |
30 | 0.003686 | 239 |
56 | 0.003752 | 235 |
12 | 0.003841 | 439 |
48 | 0.003886 | 224 |
41 | 0.003892 | 629 |
42 | 0.004033 | 354 |
54 | 0.004092 | 179 |
16 | 0.004137 | 325 |
77 | 0.004780 | 237 |
10 | 0.004939 | 479 |
26 | 0.005011 | 258 |
3 | 0.005328 | 624 |
22 | 0.005335 | 242 |
63 | 0.005861 | 479 |
1 | 0.006629 | 423 |
13 | 0.007018 | 396 |
24 | 0.007296 | 178 |
60 | 0.007302 | 142 |
19 | 0.010335 | 188 |
21 | 0.012380 | 287 |
70 | 0.013419 | 338 |
37 | 0.013470 | 287 |
64 | 0.021228 | 147 |
# 挑选合格的商品:
# 1、保留商品:库存大于300且转化率大于0.7%的商品予以保留
stay_stocks1 = product_354[(product_354["库存量"]> 300)&(product_354["转换率"]>0.007)]
stay_stocks1
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 折扣区间 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
13 | B004 | 491 | 1394 | 0.352224 | 396 | 552024 | 353 | 0.281059 | 2 | 14535 | ... | 78560.0 | 47 | 23077.0 | 491.0 | 102 | 400_500 | 0.35_0.4 | 0.007018 | 552024 | 0.142313 |
70 | H001 | 297 | 755 | 0.393377 | 338 | 255190 | 166 | 0.441077 | 1 | 6856 | ... | 44253.0 | 42 | 12474.0 | 297.0 | 92 | 200_300 | 0.35_0.4 | 0.013419 | 255190 | 0.173412 |
2 rows × 23 columns
# 2、转换率在0.4%~0.7%之间的,予以保留
stay_stocks2 = product_354[(product_354["转换率"]> 0.004)&(product_354["转换率"]<=0.007)]
stay_stocks2
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 折扣区间 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | A002 | 236 | 610 | 0.386885 | 423 | 258030 | 75 | 0.682203 | 1 | 13124 | ... | 34456.0 | 31 | 7316.0 | 236.0 | 87 | 200_300 | 0.35_0.4 | 0.006629 | 258030 | 0.133535 |
3 | A004 | 320 | 835 | 0.383234 | 624 | 521040 | 279 | 0.128125 | 2 | 20833 | ... | 55040.0 | 56 | 17920.0 | 320.0 | 111 | 300_400 | 0.35_0.4 | 0.005328 | 521040 | 0.105635 |
10 | B001 | 426 | 1121 | 0.380018 | 479 | 536959 | 311 | 0.269953 | 1 | 20448 | ... | 67308.0 | 43 | 18318.0 | 426.0 | 101 | 400_500 | 0.35_0.4 | 0.004939 | 536959 | 0.125350 |
16 | B007 | 548 | 1499 | 0.365577 | 325 | 487175 | 420 | 0.233577 | 2 | 29492 | ... | 110148.0 | 66 | 36168.0 | 548.0 | 122 | 500及以上 | 0.35_0.4 | 0.004137 | 487175 | 0.226095 |
22 | C003 | 473 | 1321 | 0.358062 | 242 | 319682 | 254 | 0.463002 | 2 | 17244 | ... | 70950.0 | 44 | 20812.0 | 473.0 | 92 | 400_500 | 0.35_0.4 | 0.005335 | 319682 | 0.221939 |
26 | C007 | 403 | 1122 | 0.359180 | 258 | 289476 | 167 | 0.585608 | 2 | 20754 | ... | 70122.0 | 47 | 18941.0 | 403.0 | 104 | 400_500 | 0.35_0.4 | 0.005011 | 289476 | 0.242238 |
42 | E003 | 486 | 1349 | 0.360267 | 354 | 477546 | 220 | 0.547325 | 2 | 19094 | ... | 59292.0 | 43 | 20898.0 | 486.0 | 77 | 400_500 | 0.35_0.4 | 0.004033 | 477546 | 0.124160 |
54 | F005 | 338 | 957 | 0.353187 | 179 | 171303 | 206 | 0.390533 | 1 | 18817 | ... | 39546.0 | 32 | 10816.0 | 338.0 | 77 | 300_400 | 0.35_0.4 | 0.004092 | 171303 | 0.230854 |
63 | G004 | 392 | 1040 | 0.376923 | 479 | 498160 | 234 | 0.403061 | 2 | 15356 | ... | 57624.0 | 50 | 19600.0 | 392.0 | 90 | 300_400 | 0.35_0.4 | 0.005861 | 498160 | 0.115674 |
77 | H008 | 324 | 886 | 0.365688 | 237 | 209982 | 157 | 0.515432 | 1 | 19245 | ... | 45036.0 | 40 | 12960.0 | 324.0 | 92 | 300_400 | 0.35_0.4 | 0.004780 | 209982 | 0.214476 |
10 rows × 23 columns
# 挑选合格的商品:
# 3、保留商品:在折扣率小于37%的部分找出售卖比大于36.5%且转化率大于0.7%的部分予以保留
stay_stocks3 = product_354[product_354["转换率"]<=0.004]
stay_stocks3
商品名 | 售卖价 | 吊牌价 | 折扣率 | 库存量 | 货值 | 成本价 | 利润率 | SKU | UV数 | ... | 商品销售金额 | 退货件数 | 商品退货金额 | 商品销售单价 | 购买用户数量 | 价格分组 | 折扣区间 | 转换率 | 备货值 | 售卖比 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | A003 | 473 | 1253 | 0.377494 | 415 | 519995 | 394 | 0.167019 | 1 | 25657 | ... | 68112.0 | 31 | 14663.0 | 473.0 | 94 | 400_500 | 0.35_0.4 | 0.003664 | 519995 | 0.130986 |
12 | B003 | 288 | 746 | 0.386059 | 439 | 327494 | 109 | 0.621528 | 1 | 23170 | ... | 43488.0 | 44 | 12672.0 | 288.0 | 89 | 200_300 | 0.35_0.4 | 0.003841 | 327494 | 0.132790 |
30 | D001 | 346 | 951 | 0.363828 | 239 | 227289 | 269 | 0.222543 | 1 | 24418 | ... | 45672.0 | 37 | 12802.0 | 346.0 | 90 | 300_400 | 0.35_0.4 | 0.003686 | 227289 | 0.200942 |
32 | D003 | 193 | 533 | 0.362101 | 417 | 222261 | 165 | 0.145078 | 1 | 27367 | ... | 29143.0 | 49 | 9457.0 | 193.0 | 91 | 100_200 | 0.35_0.4 | 0.003325 | 222261 | 0.131121 |
41 | E002 | 389 | 1080 | 0.360185 | 629 | 679320 | 244 | 0.372751 | 2 | 24150 | ... | 59906.0 | 36 | 14004.0 | 389.0 | 94 | 300_400 | 0.35_0.4 | 0.003892 | 679320 | 0.088185 |
48 | E009 | 401 | 1004 | 0.399402 | 224 | 224896 | 268 | 0.331671 | 2 | 25477 | ... | 62155.0 | 50 | 20050.0 | 401.0 | 99 | 400_500 | 0.35_0.4 | 0.003886 | 224896 | 0.276372 |
56 | F007 | 488 | 1351 | 0.361214 | 235 | 317485 | 402 | 0.176230 | 2 | 25320 | ... | 73200.0 | 34 | 16592.0 | 488.0 | 95 | 400_500 | 0.35_0.4 | 0.003752 | 317485 | 0.230562 |
7 rows × 23 columns
优化结果:
-
第一类商品可以作为主推商品,第二类商品转化率中等说明对访客具有一定吸引力,可以予以保留;
-
第三类商品转化率过小,不能带来较高收益,在活动中应该处于推荐按页面底端,但对于这类商品中库存较高的类别,应该防止货物积压,进行清仓处理等活动。