「ダイナミックプライシングを活用して収益を最適化する方法は?」
「ダイナミックプライシングで収益を最大化する方法とは?」
導入
Uber/Olaのピーク時の料金は通常の運賃よりも高くなります。IRCTCでは、予約率が上がるとRajdhaniの料金も上昇し、Amazonでは同じ商品の価格が何度も変化します。これらの価格をいつ変更するか、どの程度変更するかを決定するのは誰でしょうか?いつ正しい時に正しい価格を決定するのでしょうか?これらの質問の答えは、ダイナミックプライシングの範囲に含まれます。この記事では、初心者が基本的なダイナミックプライシングアルゴリズムを構築するためのリソースと理論的な理解を提供します。
学習目標
- 価格設定の基礎と異なる価格設定の方法を理解する
- ダイナミックプライシング、利点・欠点、方法、ユースケースなどについて深く掘り下げる
- 収益管理の基礎
- 収益最大化のためのPythonを使用したシンプルなダイナミックプライシングアルゴリズムの実装
この記事はデータサイエンスブロガソンの一環として公開されました。
「価格」とは何ですか?
2023年8月、玉ねぎの価格は1キログラムあたり120ルピーでした。その要因は何でしょうか?外部の環境要因による供給の逼迫と安定した需要です。市場、買い手、売り手、需要、供給が価格を決定します。映画のチケット、バスのチケット、EC、燃料など、私たちが今日購入するほとんどの製品も同様です。
価格の理論では、需要と供給が商品やサービスの取引価格を決定します。消費者の支払いが生産の限界費用と一致する場合、最適な市場価格、つまり需要と供給の均衡点とも呼ばれる点を達成します。適切な価格を適切な時に設定することは、ビジネスの成長にとって不可欠です。価格担当者は、データと分析を通じて「適切な価格」に近づくことに焦点を当てます。
価格に影響を与える要素
- 組織的な要素: 商品の在庫、予算制約。
- マーケティングミックス: 製品のライフサイクルのステージ、製品、価格、場所、販促。
- 製品コスト: 生産コストと原材料のコスト。
- 製品への需要: 製品やサービスへの需要。
- 市場の競争: 競合他社の価格が内部価格を大きく決定します。
ダイナミックプライシングとは何ですか?
ダイナミックプライシングでは、最近のトレンド、リアルタイムの顧客の行動、供給と需要、競合他社の価格などを利用して販売される商品の価格を評価します。これにより、顧客の満足度が満たされ、事業が成長できるように、異なる価格ポイントで商品が販売されることが可能になります。
需要が弾力的な場合にダイナミックプライシングが採用されます。需要が非弾力的または完全に非弾力的な場合、ダイナミックプライシングを採用することはできません。顧客が価格の変動に非常に敏感な場合、需要の価格弾力性が高く、この特性はDPを通じて利用されます。
例えば- Bangaloreでは、雨の日に特定の時間と場所で1台のオートリクシャーが利用可能な場合、高い価格(通常の料金の2倍または3倍)を支払う準備ができている顧客はそれを手に入れることができますが、譲歩する準備のない別の顧客はBMTCバスに乗らなければならず、そこでは価格が一定です(非弾性)。
ダイナミックプライシングの目標は何ですか?
- 利益、収益、柔軟性、市場シェア、および顧客満足度の向上。
- 在庫を減らし、倉庫スペースとリソースの効率的な利用。
- 供給と需要のバランス。
したがって、ダイナミックプライシングの成功は、収益/利益/キャパシティ/市場シェア/顧客満足度の最大化です。 例えば、2021年にダイナミックプライシングなしで1Mユニットが売れた場合、2022年の有機的な軌道は1.5Mユニットです。ダイナミックプライシングを導入すると、ユニットの売り上げは2Mに増加するはずですが、顧客のNPSや他の価格指標を失うことはありません。
要するに、年間収益とユニット数のYOY増加は、任意のダイナミックプライシングアルゴリズムの究極の成功指標です。
ダイナミックプライシングのABテストを行う場合、考慮できる成功/出力メトリクスは以下の通りです:
- 平均注文額(AOV)
- コンバージョン率(CR)
- 来訪者当たりの収益(RPV)
- 総粗利益率(GMP)
ダイナミックプライシングに影響を与える要素
- 供給:供給が減ると価格が上がります。
- 需要:需要が高いと価格が上がります。
- 在庫レベル:在庫が古くなり、流行から外れている場合は価格が下がります。例:クリアランスセール。
- 顧客の好み:Olaのミニ、プライム、プライムプラスなど、異なる価格帯があります。
- 季節性と祭り:祭りの時期には航空券の価格が高騰し、ビジネスは高い顧客需要による利益を得ます。
- 場所:観光地は価格が高くなります。
- 時刻:真夜中の価格は昼間の価格よりも高いです。
- 競合他社の価格
ダイナミックプライシングの種類
- セグメンテッドプライシング:Amazon Primeでの学生割引、電車でのシニア割引など。
- 時間帯に基づく価格設定:インドのホテルや航空便は10月/11月(祭りのシーズン)には8月/9月よりも高くなります。
- ピークプライシング:Uber/Olaでのサージプライス
- 競合他社に基づく価格設定
- 価格弾力性:製品がより弾力性があるほど、ダイナミックプライシングに適しています。すべてのFMCG製品はDmart/Relianceストアなどでこのように価格設定されています。
収益/収益管理
価格について話しする際には、収益管理についても議論する必要があります。需要を予測し、収益を最大化するために価格、在庫、配布の最適化。
- 収益管理の主な目的は、適切な製品を適切な顧客に適切な時期、適切な価格で販売することです。
- セグメンテーション、予測、最適化、価格設定は、収益管理に使用されるツールです。
- 製品/サービスが価格弾力性がある場合に最も効果的に機能します。
インドではダイナミックプライシングは合法ですか?
AIとMLの法的および倫理的な側面は、インドではあまり議論されていないので、議論しましょう。
- ダイナミックプライシングは、顧客を自分の利益にならない価格を選ぶように欺くことがあります。また、これは差別的になる可能性もあります。そのため、疑問なのは、それが合法であるかどうかです。
- インドでは、競争法2002年の第3条が価格の固定を禁止しています。
- セクション prohibits商業物品の同一または類似の貿易またはサービスの提供に従事する「企業団体または者団体、カルテルを含む」との協定、または「営業活動または意思決定」が決定市場価格を決定するものを禁止します。
- もし2つの当事者が合意して非常に類似またはほぼ同じ価格を設定した場合、それは違法です。ただし、片方の当事者が他方の知識なしにそれを行った場合、どちらの当事者も法的責任を負いません。
- 正しい方向性は、EUのものに類似した重要な個人情報保護法(Personal Data Protection Act)を持つことであり、これによりインドの市民を捕食的な企業の慣行から守ることです。
問題の概要
FlyAirportByAirはバンガロールでタクシーヘリサービスを提供しており、バンガロール空港へのタクシーサービスを提供しています。需要は比較的流動的で、天候や週末、祭りに基づいて変動するため、彼らは収益を向上させるためにダイナミックプライシングを導入したいと考えています。 下記の条件が与えられた場合、収益を最大化するための最適な価格関数を作成してください。
- 事前予約は出発日の100日前から開始
- 1日あたりの総席数は100
- 需要は1日あたり100から200の間で変動します。シンプルなPythonコードを使用して需要を生成します – > np.random.randint(100, 200)
- 価格を簡素化するために -> 価格 = 需要 – 販売済みのチケット数
予約するまでの残り日数、利用可能な総席数、その日の需要が与えられた場合、各日に適切な価格を見つけてください。
## グローバル変数DAYS = 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)
需要はランダムな関数を使用して予測され、平均値は1日あたり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枚で価格と収益を計算しましょう(需要はランダムに選択されるため、revenueとpriceは異なる場合があります。random.seed(10)を定義することで常に一定の答えを得ることができます)
revenue,p = cumu_rev(1, 3,linear_demand )print("総収益 - ", revenue)print("座席1席当たりの価格 - ", p)
このシンプルな関数を使って、旅行の一日前の日に残っているチケットが10枚で価格と収益を計算しましょう。需要が多いため、チケット1枚当たりの価格は高くなるはずです(3から10まで)。
revenue,p = cumu_rev(1, 10,linear_demand )print("総収益 - ", revenue)print("座席1席当たりの価格 - ", p)#import csv
シンプルな線形価格関数を使用すると、需要が増えるにつれて価格も上昇することが明らかです。この結果をシミュレーションし、価格関数を最適化しましょう。
価格関数を使用したシミュレーション
価格関数1. linear_demand、2. linear_adj、および3. linear_opti_variableを使用して、10,000件の座席予約シミュレーションのストレステストを行い、最高の収益をもたらすベストな価格設定を選択しましょう。これが本演習の目標です。
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("平均", np.mean(simulation) )print("標準偏差", np.std(simulation) )plt.title("10,000チケット予約の収益")
linear_demand関数を基にした平均収益はRs14,908です。これはヒストグラムから明らかです。
2. linear_adjを使用した出力:
simulation = [cumu_rev(DAYS, SEATS,linear_adj ) for i in range(10000)]plt.hist(simulation, bins = 100)print("平均", np.mean(simulation) )print("標準偏差", np.std(simulation) )plt.title("10,000チケット予約の収益")
linear_adj関数を基にした平均収益はRs16,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("平均", np.mean(simulation) )print("標準偏差", np.std(simulation) )
linear_adj関数を基にした平均収益はRs15,838です。これはヒストグラムから明らかです。
価格設定関数の評価
収益最大化に基づいて、linear_adjが最適な価格設定関数です。FlyAirportByAirはこの関数をテストし、ABテストに基づいてその強みと弱みを評価することができます。これにより、パフォーマンスを改善するための学習に役立てることができます。
結論
航空会社、鉄道、観光、チケットなど、さまざまな業界でDPは成功裏に展開されています。正しく実施されれば、ダイナミックプライシングは企業に柔軟性と成長のレバレッジを提供します。適切な調整と要素を備えると、DPは顧客満足度を高める効果があります。この記事は、DPの世界への初心者向けガイドを提供しています。
キーポイント:
- ダイナミックプライシングは、収益、利益、顧客満足度を最適化することを目指しています。
- ダイナミックプライシングで使用される方法は業界によって異なります。
- 最良の方法はABテストの結果、時間をかけてアルゴリズムの改善と反復の基づいて選択されます。
- 需要の弾力性が存在する場合にのみ適用できます。
幸運を祈ります!私のLinkedinプロフィールは、私と連絡を取りたい場合や記事の改善にお手伝いいただきたい場合にご活用ください。ご質問は、Topmate / Mentroで私にメッセージを送信することができます。つながることを楽しみにしています。データサイエンスと分析に関する他の記事もご覧ください。
よくある質問
参考文献
- Kaggle Mini Courses:航空価格最適化マイクロチャレンジ (https://youtu.be/irjpteecxdg?si=aUH2ifTekQutW-9n)
- Coursera: 収益管理の基礎 (https://coursera.org/learn/fundamentals-of-revenue-management)
- HBR Review:ブルース・スプリングスティーンによるダイナミックプライシングの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の所有ではありません。著者の裁量により使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles