介绍
Uber/Ola高峰时段的价格比普通车费要高。在IRCTC中,随着预订率的增加,Rajdhani的价格也会增加,在亚马逊中,同一产品的价格会多次变动。是谁决定何时改变这些价格,以及在何种程度上改变?是谁决定在合适的时间定出合适的价格?这些问题的答案都属于动态定价的范畴。本文为初学者提供了一些资源和理论知识,帮助他们构建一个基本的动态定价算法。
学习目标
- 了解定价的基本知识和不同的定价方法
- 深入探讨动态定价、优缺点、方法、应用案例等
- 掌握基本的收入管理知识
- 使用Python实现一个简单的动态定价算法以最大化收入
本文是作为数据科学博览会的一部分发表的。
何为‘价格’?
2023年8月,洋葱的价格是每公斤120卢比。是什么导致了这个价格?供应因外部环境因素而紧缺,需求保持稳定。市场、买家、卖家、需求和供应共同决定了价格。对于我们今天购买和销售的大多数产品也是如此:电影票、公交车票、电子商务、燃料等。
在价格理论中,需求和供应决定了商品和服务的交易价格。当消费者为商品和服务支付的金额与生产的边际成本相一致时,我们实现了最优市场价格,也称为需求和供应之间的均衡点。在正确的时间定出合适的价格对于业务增长至关重要。因此,定价经理们致力于接近“正确的价格”,这可以通过数据和分析来实现。
影响定价的因素
- 组织因素:产品库存可用性、预算限制
- 市场营销组合:产品生命周期阶段、产品、价格、渠道和促销
- 产品成本:生产成本和原材料成本
- 产品需求:对产品或服务的需求
- 市场竞争:竞争对手的定价在很大程度上决定了内部定价
何为动态定价?
动态定价使用最近的趋势、实时客户行为、供需情况和竞争定价来评估所售商品的价格。它允许商品以不同的价格销售,以满足客户满意度并使企业发展壮大。
当需求具有弹性时,采用动态定价策略。当需求不弹性或完全不弹性时,不能采用动态定价策略。当消费者对价格变化非常敏感时,需求的价格弹性很高,这一特性可以通过动态定价来利用。
例如,在班加罗尔,某个时刻和特定地点只有一辆汽车三轮车,而且是一个下雨天,愿意支付更高价格(是每公里费用的两倍或三倍 – 弹性价格)的客户将得到那辆汽车,而不愿意妥协的其他客户将不得不乘坐BMTC公交车,其价格保持恒定(不可弹性)。
动态定价的目标是什么?
- 增加利润、收入、灵活性、市场份额和客户满意度。
- 减少旧库存,更好地利用仓储空间和资源。
- 平衡供需关系。
因此,动态定价的成功在于最大化收入/利润/能力/市场份额/客户满意度。 例子- 如果在2021年,没有动态定价,卖出了100万个单位,而2022年的有机增长轨迹是150万个单位。通过使用动态定价,销售数量应该增加到200万,而不会损害客户NPS或其他定价指标。
简单来说,年度收入和销售数量的增长是任何动态定价算法的最终成功指标。
对于动态定价的AB实验,可以考虑以下成功/输出指标:
- 平均订单价值(AOV)
- 转化率(CR)
- 每访问者收入(RPV)
- 毛利率百分比(GMP)
影响动态定价的因素
- 供应:供应较少时,价格较高。
- 需求:需求较高时,价格较高。
- 库存水平:如果库存陈旧过时,价格会下降。例如- 清仓销售。
- 客户偏好:Ola的不同等级(mini、prime、prime plus等)有不同的定价层级。
- 季节性和节日:节日期间的机票价格暴涨,企业从高需求中获利。
- 地点:旅游景点的价格较高。
- 一天中的时间:午夜价格高于中午价格
- 竞争对手定价
动态定价的类型
- 分段定价:Amazon Prime上的学生折扣,火车上的老年人折扣。
- 基于时间的定价:印度的酒店和航班在10月/11月(节日季节)比8月/9月要高。
- 高峰定价:Uber/Ola上的涨价。
- 定价基于竞争对手。
- 价格弹性:产品的弹性越大,越适合动态定价。所有快消品都是这样定价的。
收入/收益管理
谈到定价,就不能不谈到收益管理。优化定价、库存和分发,以预测需求,以最大化收益。
- 收入管理的主要目标是在适当的时间以适当的价格向适当的客户销售合适的产品。
- 细分、预测、优化和定价是收益管理中使用的工具。
- 在产品/服务价格弹性较大时效果最好。
在印度动态定价是否合法?
印度很少讨论人工智能和机器学习的法律和伦理方面,所以让我们来讨论一下。
- 动态定价会让顾客在选择价格时被欺骗,这可能不符合他/她的最佳利益。而且,这可能具有歧视性,所以问题是 – 这是否合法?
- 在印度,2002年的竞争法第3条禁止定价固定。
- 该条款禁止任何在相同或相似商品贸易或服务提供领域从事的企业协会或个人协会(包括卡特尔),决定市场价格的协议或“实际生效的做法或作出的决定”。
- 如果两个当事方勾结并设定非常相似或几乎相似的价格,那么这是非法的。但如果一方在没有对方知情的情况下这样做,那么任何一方都不承担责任。
- 正确的方法是制定一项重要的个人数据保护法(类似欧盟的那些法律),以保护印度公民免受掠夺性的企业行为。
问题陈述
FlyAirportByAir 是班加罗尔的一家出租直升机出租服务,为班加罗尔机场提供出租车服务。由于需求相对不稳定,根据天气、周末和节日而变化,他们希望引入动态定价以改善业绩。编写一个优化的定价函数,以便根据以下要求最大化收入:
- 提前预订开始于100天前
- 每天总座位数为100
- 需求每天在100至200之间变化。使用以下简单的Python代码生成需求 ->np.random.randint(100, 200)
- 为简化定价 -> 价格 = 需求 – 销售的票数
根据预订剩余天数、可用座位数和当天需求,找到每天的合适价格。
## Global VariablesDAYS = 100SEATS = 100DEMAND_MIN = 100DEMAND_MAX = 200
预测需求是解决动态定价的第一步。需求随着内外部因素的变化而变化。可以使用时间序列预测或回归方法来预测未来需求。
demand_hist = [np.random.randint(DEMAND_MIN, DEMAND_MAX) for i in range(10000)]plt.hist(demand_hist, bins = 100)print("mean", np.mean(demand_hist) )print("STD", np.std(demand_hist)
使用随机函数来预测需求;平均值为每天150个座位,标准差为28.9。
例子
我们来考虑这个例子:D0是旅程的日期。随着人们在旅程日期接近时确定他们的旅行计划,需求往往超过初始天数(D8)。即使D0的市场需求为8,只有3个座位被预订;我的竞争对手吸收了其余的座位。
考虑到需求是线性的,Python中对同样问题的表示:
def linear_demand(days_left, ticket_left, demand_level): tickets_sold_per_day = int(ticket_left/days_left) price = demand_level - tickets_sold_per_day ## ticket_left/days_left nearly is 1. return max(0,price)#import csv
计算收入的函数:
def cumu_rev(days_left, ticket_left, pricing_function, rev_to_date = 0, demand_min = DEMAND_MIN, demand_max = DEMAND_MAX): if days_left > 0 and ticket_left >0 : demand = np.random.randint(demand_min, demand_max+1) p = pricing_function(days_left, ticket_left,demand ) q = demand - p # demand is linear Q is tickets sold q = max(0,q) q = min(ticket_left,q) ## cannot sell more than tickets available return q*p, p
给定这个简单的函数,让我们计算旅行前一天的价格和收入,剩余的总票数为3。 (由于需求是随机选择的,收入和价格可能会有所不同,可以定义random.seed(10)以始终获得恒定的答案)
revenue,p = cumu_rev(1, 3,linear_demand )print("总收入 - ", revenue)print("每个座位的价格 - ", p)
给定这个简单的函数,让我们计算旅行前一天的价格和收入,剩余的总票数为10。每张票的价格应该更高,因为需求更高(从3到10)。
revenue,p = cumu_rev(1, 10,linear_demand )print("总收入 - ", revenue)print("每个座位的价格 - ", p)#import csv
通过一个简单的线性定价函数,很明显的是,需求增加时,价格也会增加。让我们模拟这个过程,试图优化定价函数。
使用定价函数进行模拟
让我们对座位预订进行10,000次模拟,使用三种定价函数1. linear_demand,2. linear_adj,和3. linear_opti_variable,并选择能够给出最高收入的最佳定价,这是此次练习的目标
1. linear_demand
- 需求是随机的。
- 价格是需求和已售出票数之间的差值。
- 因此,如果需求更高,价格也会更高。
def linear_demand(days_left, ticket_left, demand_level): tickets_sold_per_day = int(ticket_left/days_left) price = demand_level - tickets_sold_per_day ## ticket_left/days_left nearly is 1. return max(0,price)#import csv
2. linear_adj
- 需求是随机预测的。
- 价格是线性的,但是是分段的。引入一个索引opti,将前一个linear_demand函数优化为分段函数。当需求更高时,有更多的票被预订,进而增加收入。
- OPTI是基于需求的固定值。
def linear_adj(days_left, ticket_left, demand_level): """ 假设我们预计会有很多流量/点击和展示。 如果需求高,我们按不同的比率收费 """ if demand_level > 180: opti = 3 price = demand_level - int( (ticket_left/days_left) + (opti*(demand_level/180))) elif demand_level > 150: opti = 2 price = demand_level - int( (ticket_left/days_left) + (opti*(demand_level/180))) elif demand_level > 100: opti = 1 price = demand_level - int( (ticket_left/days_left) + (opti*(demand_level/180))) elif demand_level > 0: opti = 0 price = demand_level - int( (ticket_left/days_left) + (opti*(demand_level/180))) return max(0,price)#import csv
3. linear_opti_variable
- 类似于2,使用了一个OPTI索引,但这个索引是变化的,像Kmeans一样,需要根据弯曲曲线选择OPTI的最佳值。
def linear_opti_variable(days_left, ticket_left, demand_level, opti = 1): price = demand_level - int( (ticket_left/days_left) + (opti*(demand_level/150))) # price = demand_level - int (ticket_left/days_left) ## if opti = 0 then the second term becomes 0 ## As opti increased second term increased. ## 150 because on average the demand is 150, (100+150)/2 ## IF demand is higher than 150, then price will reduce ## IF demand is lower than 150 then price will increase. return max(0,price)
递归收入函数用于计算所有10,000次模拟的累积收入:
def cumu_rev(days_left, ticket_left, pricing_function, rev_to_date = 0, demand_min = DEMAND_MIN, demand_max = DEMAND_MAX): if days_left > 0 and ticket_left >0 : #random.seed(10) demand = np.random.randint(demand_min, demand_max+1) p = pricing_function(days_left, ticket_left,demand ) q = demand - p # demand is linear Q is tickets sold q = max(0,q) q = min(ticket_left,q) ## cannot sell more than tickets available return cumu_rev(days_left = days_left-1, ticket_left =ticket_left-q, pricing_function = pricing_function, rev_to_date = rev_to_date+p*q) else: return rev_to_date
1. 使用linear_demand输出:
simulation = [cumu_rev(DAYS, SEATS,linear_demand ) for i in range(10000)]plt.hist(simulation, bins = 100)print("mean", np.mean(simulation) )print("STD", np.std(simulation) )plt.title("10K票订购收入")
基于linear_demand函数的平均收入为14,908卢比。这可以从直方图中看出。
2. 使用linear_adj输出:
simulation = [cumu_rev(DAYS, SEATS,linear_adj ) for i in range(10000)]plt.hist(simulation, bins = 100)print("mean", np.mean(simulation) )print("STD", np.std(simulation) )plt.title("10K票订购收入")
基于linear_adj函数的平均收入为16,146卢比。这可以从直方图中看出。
3. 使用linear_opti_variable输出:
这里的第一步是选择提供最高收入的OTPI值:
opti_mean = []for j in range(20): simulation = [cumu_rev(DAYS, SEATS,partial(linear_opti_variable, opti= j) ) for i in range(10000)] opti_mean.append(np.mean(simulation)) plt.plot(opti_mean) plt.title("收入最大化的最佳值")
def argmax(lst): return lst.index(max(lst))print("最佳的OPTI值是 -" ,list(range(20))[argmax(opti_mean)])>> 输出 >> 最佳的OPTI值是 - 1
基于拐点曲线,最佳的OPTI值为1。现在,让我们找到OTPI = 1的收入。
simulation = [cumu_rev(DAYS, SEATS,partial(linear_opti_variable, opti = list(range(20))[argmax(opti_mean)]) ) for i in range(10000)]plt.hist(simulation, bins = 100)print("mean", np.mean(simulation) )print("STD", np.std(simulation) )
基于linear_adj函数的平均收入为15,838卢比。这可以从直方图中看出。
定价函数评估
根据收入最大化,linear_adj是最佳定价函数。FlyAirportByAir可以测试此函数,并根据AB实验评估其优势和劣势。从中学习可以用来改进性能。
结论
动态定价已成功应用于航空、铁路、旅游、售票等行业。当正确实施时,动态定价为企业提供了灵活性和潜在的增长杠杆。通过适当的调整和要素,动态定价可以提高客户满意度。本文章为动态定价领域的初学者提供了指南。
要点:
- 动态定价旨在优化收入、利润和客户满意度。
- 动态定价的方法因行业而异。
- 根据AB测试结果选择最佳方法,并随时间不断改进算法。
- 需满足需求弹性的条件才能应用动态定价。
祝您好运!如果您想联系我或帮助改进文章,这是我的Linkedin 个人资料。您可以在 Topmate/Mentro 上给我发消息以提问。我将很高兴与您保持联系。这里还有我的其他关于数据科学和分析的文章。
常见问题
参考资料
- Kaggle迷你课程:航空公司定价优化微挑战 (https://youtu.be/irjpteecxdg?si=aUH2ifTekQutW-9n)
- Coursera:收入管理基础课程 (https://coursera.org/learn/fundamentals-of-revenue-management)
- HBR评论:7个关于动态定价的教训(由布鲁斯·斯普林斯廷提供) (https://hbr.org/2022/09/7-lessons-on-dynamic-pricing-courtesy-of-bruce-springsteen)
- 使用价格乘数的动态定价模型在线客票预订平台 (https://www.krjournal.com/index.php/krj/article/view/38/357)
- 用于多产品收入管理问题的动态定价策略 (https://www0.gsb.columbia.edu/faculty/cmaglaras/papers/multi_rm.pdf)
- 价格优化:从探索到生产化 (https://www.youtube.com/watch?v=wPxDibqdg_w)
在本文中展示的媒体不归Analytics Vidhya所有,仅为作者使用。