使用黄氏曲线评估零售店促销活动效果

  • 1. 关于项目
  • 2. 数据预处理
  • 3. 促销分析与评估
    • 3.1 企业周权重指数
    • 3.2 权重曲线和黄氏曲线
      • 3.2.1 权重曲线
      • 3.2.2 黄氏曲线
    • 3.3 促销效果评估
  • 4. 项目总结

1. 关于项目

这是一个线上电玩产品零售店在六一促销活动(2020年5.28-6.3)的复盘工作中的一个环节。
这一小节里,将使用黄氏曲线分析工具,从整体上对促销活动的效果进行评估。
黄氏曲线是零售业数据化管理工具之一,本质上是一种加权曲线

一个完整的促销活动复盘工作还有很多繁杂的工作,包括目标回顾、评估结果、分析原因以及总结经验四个方面。
活动复盘是促进活动迭代的一个重要原因。通过交易数据、系统数据、用户反馈等来确定用户喜好、流程思考、活动设计。

2. 数据预处理

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
%matplotlib inline
sales = pd.read_excel('sales.xlsx')
sales
年月 销售额
0 2019年3月 31 1256.80
1 2019年3月 30 1130.00
2 2019年3月 29 1214.80
3 2019年3月 28 1129.00
4 2019年3月 27 595.00
... ... ... ...
463 2020年6月 5 1939.42
464 2020年6月 4 1985.00
465 2020年6月 3 1668.29
466 2020年6月 2 2070.05
467 2020年6月 1 3572.06

468 rows × 3 columns

sales.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 468 entries, 0 to 467
Data columns (total 3 columns):
年月     468 non-null object
日      468 non-null int64
销售额    468 non-null float64
dtypes: float64(1), int64(1), object(1)
memory usage: 11.1+ KB
sales['日'] = sales['日'].astype(str)
sales['日期'] = pd.to_datetime(sales['年月']+sales['日'], format='%Y年%m月%d')
sales.drop(columns=['年月','日'], inplace=True)
sales.sort_values(by='日期', inplace=True)
sales
销售额 日期
30 187.00 2019-03-01
29 272.40 2019-03-02
28 255.60 2019-03-03
27 367.80 2019-03-04
26 605.40 2019-03-05
... ... ...
462 1880.35 2020-06-06
461 1221.48 2020-06-07
460 1413.28 2020-06-08
459 1737.08 2020-06-09
458 1794.69 2020-06-10

468 rows × 2 columns

sales.sort_values(by='日期', inplace=True)
sales
销售额 日期
30 187.00 2019-03-01
29 272.40 2019-03-02
28 255.60 2019-03-03
27 367.80 2019-03-04
26 605.40 2019-03-05
... ... ...
462 1880.35 2020-06-06
461 1221.48 2020-06-07
460 1413.28 2020-06-08
459 1737.08 2020-06-09
458 1794.69 2020-06-10

468 rows × 2 columns

3. 促销分析与评估

促销活动是零售业最常见的销售模式,随着促销的逐渐日常化,促销的分析和评估也变成一种固定的工作。
然而不管是线上或者线下的促销活动分析,往往会存在一些误区:
1.只关注促销的目标,完成目标就是成功了。
2.只关注促销活动的同比,且对比的误差比较大。
3.只关注促销前和促销中的数据,却从来不关注促销后的数据。

而黄氏曲线,是在对每日销售额进行权重处理的基础上,将促销活动以及前后相邻时间段的权重值进行对比,不仅关注促销本身的效果,同时关注促销对后续销售的影响,是一个对促销效果进行量化评估的有效工具。

3.1 企业周权重指数

周权重指数是以某段销售周期内的历史日销售额数据为基础,以周为单位,进行权重分析处理的一种管理工具。
周权重指数是一个相对概念,每个企业不尽相同,一般介于7.0~14.0之间。值越大表示该企业或者店铺的日销售额波动幅度越大。
周权重指数是零售店铺用来量化处理各种销售状况、销售事件的管理工具,非常强大。

plt.rcParams['font.sans-serif'] = ['SimHei']
sales.plot('日期','销售额', figsize=(18, 6))
<matplotlib.axes._subplots.AxesSubplot at 0xd5a3048>

周权重指数等于周一到周日每天的日权重指数相加。
所以在计算周权重指数前,需要先计算每日的权重指数。

计算日权重指数的步骤:
1.先选取最近完整一年的销售数据,可以是2019-01-01到2019-12-31,也可以是2019-03-01到2020-02-29这一整年的销售数据;
2.剔除数据集中的异常值,如节假日、促销活动非常规销售日引起的销售额变化等记录;
3.将剩下的数据以周为单位进行整理,并计算出平均日销售;

# datetime.weedak()方法的返回值为[0,6]之间的整数,分别代表周一到周日。在别的时区可能代表的是周日到周六。
sales['星期'] = sales['日期'].apply(lambda x:x.weekday()) + 1
sales = sales.reindex(columns=['日期','星期','销售额'])
sales
日期 星期 销售额
30 2019-03-01 5 187.00
29 2019-03-02 6 272.40
28 2019-03-03 7 255.60
27 2019-03-04 1 367.80
26 2019-03-05 2 605.40
... ... ... ...
462 2020-06-06 6 1880.35
461 2020-06-07 7 1221.48
460 2020-06-08 1 1413.28
459 2020-06-09 2 1737.08
458 2020-06-10 3 1794.69

468 rows × 3 columns

# 选取2019年6月份到2020年5月份这一整年的数据,并剔除了2019年11月中7000多销售额的那个异常值。
subset = sales.query('"2019-06-01" <= 日期 < "2020-06-01" & 销售额 < 6000').copy()
mean_weekday = subset.groupby('星期')['销售额'].mean()
mean_weekday
星期
1    1612.590962
2    1421.880962
3    1494.894808
4    1487.894902
5    1356.369038
6    1383.588302
7    1429.729245
Name: 销售额, dtype: float64

4. 找出平均日销售额最低的一天,设定它的日权重指数为1.0,然后分别用其余六天的平均日销售额除以这个最低值,就分别得到每天的日权重指数。

weight_index = mean_weekday.div(mean_weekday.min()).round(1)
weight_index.name = '日权重指数'
weight_index
星期
1    1.2
2    1.0
3    1.1
4    1.1
5    1.0
6    1.0
7    1.1
Name: 日权重指数, dtype: float64

5. 最后将周一到周日的日权重指数求和,就得到企业标准周权重指数。

weight_index.sum()
7.5

注意:这个计算结果是整个企业使用的周权重指数和日权重指数。
而具体到企业下的某个分店,则需要根据分店的销售规律分别计算。

分店的周权重指数计算方法:
1.选取最近2个月,和上一年同期月份的数据。
2.剔除数据集中的异常值,如节假日、促销活动非常规销售日引起的销售额变化等记录;
3.将剩下的数据以周为单位进行整理,并计算出平均日销售额,以及平均周销售额;
4.计算分店日权重指数。公式为:(其中N为1~ 7,代指周一到周日)
分店星期N的日权重指数 = (星期N的平均日销售额 ÷ 平均周销售额)× 企业周权重指数

在本次项目里计算的是企业总体情况,所以用的是企业标准的周权重指数。

3.2 权重曲线和黄氏曲线

为了评估的时效性和可比性,这里选取活动日以及其前后一个星期的记录,进行对比分析活动前后的差距。

promote_set = sales.query('"2020-05-21" <= 日期 <= "2020-06-10"').copy()
promote_set
日期 星期 销售额
437 2020-05-21 4 1347.24
436 2020-05-22 5 1516.32
435 2020-05-23 6 1756.28
434 2020-05-24 7 1724.58
433 2020-05-25 1 2134.84
432 2020-05-26 2 1844.07
431 2020-05-27 3 1574.27
430 2020-05-28 4 2272.15
429 2020-05-29 5 1847.67
428 2020-05-30 6 1793.38
427 2020-05-31 7 1693.99
467 2020-06-01 1 3572.06
466 2020-06-02 2 2070.05
465 2020-06-03 3 1668.29
464 2020-06-04 4 1985.00
463 2020-06-05 5 1939.42
462 2020-06-06 6 1880.35
461 2020-06-07 7 1221.48
460 2020-06-08 1 1413.28
459 2020-06-09 2 1737.08
458 2020-06-10 3 1794.69
promote_set = promote_set.merge(weight_index.reset_index(), on='星期', how='left')
promote_set
日期 星期 销售额 日权重指数
0 2020-05-21 4 1347.24 1.1
1 2020-05-22 5 1516.32 1.0
2 2020-05-23 6 1756.28 1.0
3 2020-05-24 7 1724.58 1.1
4 2020-05-25 1 2134.84 1.2
5 2020-05-26 2 1844.07 1.0
6 2020-05-27 3 1574.27 1.1
7 2020-05-28 4 2272.15 1.1
8 2020-05-29 5 1847.67 1.0
9 2020-05-30 6 1793.38 1.0
10 2020-05-31 7 1693.99 1.1
11 2020-06-01 1 3572.06 1.2
12 2020-06-02 2 2070.05 1.0
13 2020-06-03 3 1668.29 1.1
14 2020-06-04 4 1985.00 1.1
15 2020-06-05 5 1939.42 1.0
16 2020-06-06 6 1880.35 1.0
17 2020-06-07 7 1221.48 1.1
18 2020-06-08 1 1413.28 1.2
19 2020-06-09 2 1737.08 1.0
20 2020-06-10 3 1794.69 1.1

3.2.1 权重曲线

单位权重(销售)值 = ∑日销售额 / ∑日权重指数
这个公式的含义是:计算在某个销售时期内平均单位权重指数的销售额,这就解决了“时间标准”有时没有可对比性的原则。

将销售时期的时间段定为天,把每天的销售额分别除以当日的权重指数,得到的便是单位权重(销售)值曲线,简称权重曲线。

promote_set.eval('权重曲线 = 销售额 / 日权重指数', inplace=True)
promote_set
日期 星期 销售额 日权重指数 权重曲线
0 2020-05-21 4 1347.24 1.1 1224.763636
1 2020-05-22 5 1516.32 1.0 1516.320000
2 2020-05-23 6 1756.28 1.0 1756.280000
3 2020-05-24 7 1724.58 1.1 1567.800000
4 2020-05-25 1 2134.84 1.2 1779.033333
5 2020-05-26 2 1844.07 1.0 1844.070000
6 2020-05-27 3 1574.27 1.1 1431.154545
7 2020-05-28 4 2272.15 1.1 2065.590909
8 2020-05-29 5 1847.67 1.0 1847.670000
9 2020-05-30 6 1793.38 1.0 1793.380000
10 2020-05-31 7 1693.99 1.1 1539.990909
11 2020-06-01 1 3572.06 1.2 2976.716667
12 2020-06-02 2 2070.05 1.0 2070.050000
13 2020-06-03 3 1668.29 1.1 1516.627273
14 2020-06-04 4 1985.00 1.1 1804.545455
15 2020-06-05 5 1939.42 1.0 1939.420000
16 2020-06-06 6 1880.35 1.0 1880.350000
17 2020-06-07 7 1221.48 1.1 1110.436364
18 2020-06-08 1 1413.28 1.2 1177.733333
19 2020-06-09 2 1737.08 1.0 1737.080000
20 2020-06-10 3 1794.69 1.1 1631.536364
plt.rcParams['font.sans-serif'] = ['SimHei']
promote_set.plot('日期',['销售额', '权重曲线'], figsize=(18, 6))
<matplotlib.axes._subplots.AxesSubplot at 0xd94c550>

从权重曲线上可以看出,促销活动是有一定效果的,但是还不够直观,不能看出活动中和活动前后平均销售水平的变化幅度,进而量化地评估活动效果的好坏程度。

3.2.2 黄氏曲线

取权重曲线中的某个时间段,以权重异动点为起点,以最后一个异动点为终点,把起点和终点之间的权重数据做平均,所得数据值为起点和终点之间的数据纵轴,呈现的数据曲线为黄氏曲线。
黄氏曲线为权重曲线同一时间段的平均值。

将相邻时间段的权重值进行对比,相邻的时间段能保证对比状态的一致性,有可对比性。同时销售额与当日权重指数的比值降低了周一到周日销售额不均衡的影响。因此在黄氏曲线的基础上,可以更好地对促销效果进行量化评估。

除此外,黄氏曲线也常常用于店铺受某个事件影响评估、新品上市评估、缺货影响评估、网站改版评估、新人到任评估、竞争对手活动造成的影响评估。

def HuangshiCurve(data,point_of_date):"""data:含有单位权重值(权重曲线)字段的数据帧point_of_date:促销活动的开始和结束日期"""before = data.query('"%s" > 日期' % point_of_date[0])['权重曲线'].mean()during = data.query('"%s" <= 日期 <= "%s"' % point_of_date)['权重曲线'].mean()after = data.query('"%s" < 日期' % point_of_date[1])['权重曲线'].mean()data['黄氏曲线'] = np.nandata.loc[data['日期'] < point_of_date[0],'黄氏曲线'] = beforedata.loc[data['日期'] > point_of_date[1],'黄氏曲线'] = afterdata.loc[data['黄氏曲线'].isna(),'黄氏曲线'] = duringreturn data
point_of_date = ('2020-05-28', '2020-06-03')
promote_set = HuangshiCurve(promote_set, point_of_date)
promote_set
日期 星期 销售额 日权重指数 权重曲线 黄氏曲线
0 2020-05-21 4 1347.24 1.1 1224.763636 1588.488788
1 2020-05-22 5 1516.32 1.0 1516.320000 1588.488788
2 2020-05-23 6 1756.28 1.0 1756.280000 1588.488788
3 2020-05-24 7 1724.58 1.1 1567.800000 1588.488788
4 2020-05-25 1 2134.84 1.2 1779.033333 1588.488788
5 2020-05-26 2 1844.07 1.0 1844.070000 1588.488788
6 2020-05-27 3 1574.27 1.1 1431.154545 1588.488788
7 2020-05-28 4 2272.15 1.1 2065.590909 1972.860823
8 2020-05-29 5 1847.67 1.0 1847.670000 1972.860823
9 2020-05-30 6 1793.38 1.0 1793.380000 1972.860823
10 2020-05-31 7 1693.99 1.1 1539.990909 1972.860823
11 2020-06-01 1 3572.06 1.2 2976.716667 1972.860823
12 2020-06-02 2 2070.05 1.0 2070.050000 1972.860823
13 2020-06-03 3 1668.29 1.1 1516.627273 1972.860823
14 2020-06-04 4 1985.00 1.1 1804.545455 1611.585931
15 2020-06-05 5 1939.42 1.0 1939.420000 1611.585931
16 2020-06-06 6 1880.35 1.0 1880.350000 1611.585931
17 2020-06-07 7 1221.48 1.1 1110.436364 1611.585931
18 2020-06-08 1 1413.28 1.2 1177.733333 1611.585931
19 2020-06-09 2 1737.08 1.0 1737.080000 1611.585931
20 2020-06-10 3 1794.69 1.1 1631.536364 1611.585931
plt.rcParams['font.sans-serif'] = ['SimHei']
promote_set.plot('日期',['权重曲线', '黄氏曲线'], figsize=(12,6))
<matplotlib.axes._subplots.AxesSubplot at 0xd9babe0>

促销的 爆发度 和 衰减度
促销爆发度体现了促销活动立杆见影的程度,这和促销活动的方案、宣传力度、卖场等息息相关,是一个综合指标。
而促销衰减度是用来判断促销活动是否有透支销售的情况发生。如果衰减度大于爆发度则有销售透支的现象发生,如果衰减度大于两倍的爆发度,那这个促销活动就是彻底失败了。

爆发度 = (促销期间单位权重值的平均值 - 促销前单位权重值的平均值) / 促销前单位权重值的平均值 * 100%
衰减度 = (促销期间单位权重值的平均值 - 促销后单位权重值的平均值) / 促销前单位权重值的平均值 * 100%

注意:这里的除数都是促销前的,把增量和减量都除以同一个数,得到的是相较于促销前的变化率,保证了对比的一致性。

把前面计算黄氏曲线的函数修改一下,就可以得到爆发度和衰减度。

def HuangshiCurve(data,point_of_date):"""data:含有单位权重值(权重曲线)字段的数据帧point_of_date:促销活动(事件)的开始和结束日期"""before = data.query('"%s" > 日期' % point_of_date[0])['权重曲线'].mean()during = data.query('"%s" <= 日期 <= "%s"' % point_of_date)['权重曲线'].mean()after = data.query('"%s" < 日期' % point_of_date[1])['权重曲线'].mean()data['黄氏曲线'] = np.nandata.loc[data['日期'] < point_of_date[0],'黄氏曲线'] = beforedata.loc[data['日期'] > point_of_date[1],'黄氏曲线'] = afterdata.loc[data['黄氏曲线'].isna(),'黄氏曲线'] = duringexplosive_range = (during - before) / before * 100  # 爆发度attenuation_range = (during - after) / before * 100  # 衰减度return (data,(explosive_range, attenuation_range))
promote_set, trends = HuangshiCurve(promote_set, point_of_date)
print('爆发度: %.2f%% \n衰减度:%.2f%% ' % trends )
爆发度: 24.20%
衰减度:22.74%

3.3 促销效果评估

本次促销活动的爆发度是24.20%,衰减度是22.74%。促销结束后一周的平均销售额比促销前一周平均销售额上涨1.46%。(定量分析)
促销活动的爆发度高于衰减度,促销活动并未透支促销之后一周的销售额,本次促销活动在总体上是成功的(在销售目标完成的前提下)。(定性分析)

4. 项目总结

  • 使用权重指数和黄氏曲线来评估和分析零售活动的指标时,计算的地方很多,看起来很麻烦。

    而实际上这些计算过程都可以通过函数或者模板自动计算,实际上难的是业务逻辑,而不是计算过程。

    特别是书本上的知识,对相关概念的定义,由于本人水平有限,都需要反复咀嚼斟酌良久才能明白其意。本次项目也算是对这部分知识的一次梳理和总结。

    本次项目也只是黄氏曲线应用的一个小的方面,这个工具还有很多应用场景,需要在后续的工作中再深入剖析。

  • 数据分析是通过各种分析手段和业务指标对数据进行定量和定性分析。定性分析让我们了解数据的各种状态,定量分析让我们知道这些状态的程度或所处的位置。而这些定量和定性分析的结果是作为业务评估依据和业务决策依据的重要指标之一。

使用黄氏曲线评估零售店促销活动效果相关推荐

  1. 对促销活动效果评估的一些思考

    如何评估一档促销活动

  2. 如何评估电商活动效果?持续迭代、打造爆款

    作者:杜延花 来源:GrowingIO 增长公开课第 43 期 GrowingIO 商业分析师,毕业于中南大学,服务过 Charles&Keith.美素佳儿.中原地产等多家行业头部客户,有丰富 ...

  3. [业务题]货拉拉数据分析岗简答题, 评估优惠券促销活动的收益效果,评估哪种优惠券对企业更优

    如题: 货拉拉会经常给用户发放不同的折扣券.假设有三种类型的折扣券A, B, C :这三种折扣券同时通过APP直接发放给玩家们,且每张折扣券的优惠程度,有效日期大致一样.用户可以在一次同时使用多种优惠 ...

  4. (电商)唯品会双十一促销活动复盘——数据分析

    (电商)唯品会双十一促销活动复盘--数据分析 项目背景: 唯品会是一个专门做特卖的网站,什么是特卖呢.特卖一般是指在特定的时间段里,以优惠的价格出售指定的商品,一般以商城或者专卖店为多.该模式在线下早 ...

  5. 花钱办活动效果不明?零售企业应该这样量化促销活动成效

    问题:费时费力的花钱举办了一场打折优惠促销活动,可是零售商家如何知道活动办得好不好? 无论是百货超市.大卖场.电器商城等线下店铺,还是天猫店.淘宝店.京东店等线上店铺,促销活动已经是目前零售行业普遍使 ...

  6. 作为数据分析师,如何评估活动效果

    目录 背景 如何定义评判二字 活动评估关键问题 从0建立评估模型的做法 第一步 梳理活动流程 第二步 筛选主指标 第三步 设定判定标准 第四步 找到影响结果的过程 背景 正式工作已经十个月了,相较于现 ...

  7. 快拿走这份千字秘笈:3招量化促销活动结果,新零售营销得这么做

    无论是百货超市.大卖场.电器商城等线下店铺,还是天猫店.淘宝店.京东店等线上店铺,促销活动已经是目前零售行业普遍使用的营销方式.面对打折.满减.优惠券.代金券.大抽奖.储值卡等等形形色色的促销形式,商 ...

  8. 美容美发美甲店做活动效果提升30%的营销方案18个套路

    一年当中大大小小的节日对于我们美业人来讲是借势做活动,增加店铺人气的好机会.很多美容美发等美业店铺都在为了怎么能在节日活动中吸引更多的客户而绞尽脑汁,可是往往结果却差强人意.其实相对于如何宣传与执行活 ...

  9. 促销活动的2个环节与7个关键点

    今年在火炬计划项目分部做了大半年的时间,接触了300多个商场提交的促销方案与活动总结,亲自参与策划.执行了宜昌的小区推广.宁波的展会营销.莆田的会议营销.杭州的冠军联盟百城千店活动.常州开业旗舰店开业 ...

最新文章

  1. 完胜ReLU!斯坦福的神经网络采用这种激活函数,竟高保真还原各种图像视频
  2. 我的世界基岩版json_我的世界基岩版合集
  3. LeetCode Wiggle Sort II(快排)
  4. Flask的jinja输出json内容
  5. Tensorflow 指令加速
  6. python数据分析天气预报论文_用python+sklearn(机器学习)实现天气预报数据 模型和使用...
  7. http端口_PhpStorm 修改默认端口号63342
  8. 8能达到go速度吗 php_相同逻辑的php与golang代码效率对比,最好语言落谁家…
  9. NodeJs从零构建代理ip池(一)介绍
  10. vmplayer下管理网络
  11. 教你用手机代替各类门禁卡
  12. JavaScript 高淇讲解的代码(三)
  13. 【操作系统】CPU调度算法
  14. 计算机如何重新进行硬盘分区,最简单办法,如何在不重装电脑系统的情况下对硬盘进行重新分区-电脑怎么分区...
  15. VB中九九乘法表的实现
  16. 管理:重要性影响力方格
  17. CDN是什么?以及CDN的原理
  18. 数据库的列类型与字段属性
  19. modprobe ipmi_si报错问题
  20. Linux/Centos7搭建饥荒服务器教程

热门文章

  1. c++实现中文大写数字转换
  2. wuc-tab标签点击不了_买白酒时,不论啥牌子,只要标签上有“这行字”,全是酒精勾兑酒...
  3. 数据分析从业人员获得更高学位的主要理由
  4. 树莓派3B+ 叮当语音控制
  5. 时间对象常用方法 - 获取
  6. DCM4CHE解压缩的DICOM文件
  7. PyTorch 预训练权重保存位置
  8. 每天读一点好玩心理学--记忆
  9. 2021-2027全球及中国合成孔径雷达卫星服务行业研究及十四五规划分析报告
  10. Python编程 简单春节倒计时教程(附源代码)