Skip to main content
機械学習を用いた在庫処分に関する価格提案

EC(ネットショップ)の在庫処分に関するダイナミックプライシングアルゴリズムの提案

Tomohiro Munemasa

2019,5,1


概要

本稿では, 売れ残る商品に対して, 適切な価格を提案するための手法を提案する. 従来の手法では, 値下げしたい販売商品の価格を線形的に減少させている.

これでは, 他の有益な情報をほとんど考慮出来ていない.


本稿では, 他の情報を有効に用いて, 各商品に対して売れ残る確率を求め, それに応じて価格を減少させる手法を提案する.

1 方針

1.1 売れるかどうかの確立予測

参考文献
[1] Peng Ye, Julian Qian, Jieying Chen, Chen-HungWu, Yitong Zhou, Spencer De Mars, Frank Yang, Li Zhang. Customized Regression Model for Airbnb Dynamic Pricing. In Proceedings of the 24nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD’18), 2018.

方針としては, Airbnb で採用されている手法[1] を参考にする.

つまり, ある商品が, ある期間に売り切れるかどうかの2 値分類を勾配ブースティングで行い, その確率をもとに価格を変動させる.

取得可能な情報は表1 である.

(表1) 利用可能な情報
店舗ID
店舗名
受注日時
受注No
商品SKU
商品枝番
商品名
数量
単価
受注時の在庫数
商品ページのセッション
商品別の購買率
商品別の購買間隔
モール単位のポイントアップイベント

これらから予測に使えそうな特徴量は, 表2 であると思われる.

(表2) 使えそうな情報
店舗名
受注日時
数量
単価
受注時の在庫数
商品ページのセッション
商品別の購買率
商品別の購買間隔
モール単位のポイントアップイベント
ある期間からの数量の減少率
ある期間からの単価の変化率
受注時の在庫数から現在の在庫数の減少率
ある期間からの商品ページのセッションの減少率
ある期間からの商品別の購買率の変化率
ある期間からの商品別の購買間隔の変化率
季節・月
曜日
在庫処分までの残り日数

表2 の2 重傍線部以降は追加しようと考えている特徴量である.

日時から曜日や, 時間帯などを細かく区切った特徴量を派生させて作ることで, 精度を向上させることができると思われる.

また, 今回は, 在庫処分までの残り日数が重要なので,残り日数を特徴量として追加する.

時系列データなので, ある期間(昨日, 一週間前, …) からの特徴量の変化率も特徴量として加える.

その他は, 実際にデータの分布やimportance を見て適宜特徴量を追加する.

これらを用いて, 店舗ごとに, ある商品が売れるかどうかの確率を予測するようなモデルを作成する.

使用するモデルとしては, 高速で精度が出やすいLightGBM を用いる.

具体的な運用法としては, 例えば月末までにある商品の在庫を処分したいと考える.

その場合は, 毎日売れるかどうかの確率を算出し, その確率を元に値下げするようなことになる.

図1 に価格推定までの流れを示す.

価格推定までの流れ
図1 価格推定までの流れ

1.2 非線形的な価格変動

次に, 得られた確率を元に非線形的な価格値下げを考える.

Airbnb では, 需要スコアなどを元に, 価格を変化させていた.

需要スコアを算出しようとするとなると, 商品のカテゴリごとにグルーピングし, 在庫処分までにかかった時間を元に需要スコアを算出することになると思われる.

ただし, 商品のカテゴリを分類できるような特徴量が無いため, 今回は需要スコアを用いないで進めていく.

非線形的に価格を減少させることは, こちらが何らかの関数を設定しないと実現することは不可能である.

この理由は単純で, 価格変動させた際のデータが圧倒的に不足しているためである.

実際にAirbnb でも価格調整の関数をあらかじめ設定していた. 以上から, 本稿でもあらかじめ価格値下げのための関数を設定する必要がある.

その前に記法の定義を行う. 表3 に本稿で用いる記法を示す.

適宜参照して頂きたい.

表3 記法の定義
Notation Description
\(a\) 値下げしたい商品名
\(v \in \mathbb{ Z }\) 値下げしたい商品の価格(円)
\(v_{init} \in \mathbb{ Z }\) 値下げしたい商品の初期価格
\(v_{end} = (1 – y)・v\) 値下げしたい商品の最終価格(円)
\(x \in \mathbb{ Z }\) 在庫処分したい期間(日)
\(y \in [0,1] \) 値下げできる最大の割合
\(p \in [0,1] \) LightGBM で予測した売れるかどうかの確率
\(f: \mathbb{ R } \rightarrow \mathbb{ R } \) 価格予測に用いる関数
\(q \in \mathbb{ R } \) 価格予測に用いる関数のハイパーパラメータ
\(\)

本稿で提案する価格調整の関数\(f\)は(1) である.

[1] を参考にして決定した. ただし, \(q\)はハイパーパラメータである.


(1)

\[f(x) = 1 – x^{pq}\]


\( p = \frac{1}{2} \) のとき, 価格推移は線形的になるが, それ以外の場合は確率 \(p\) に応じて非線形な関数になることが重要である.

つまり, 予測に自信がない場合は, 線形的になるが, 自信がある場合はそれに応じて, 非線形的に変化するような関数となっている.

例として, 図2 では, \(p > \frac{1}{2} \) のときに \( q = 2 \) , それ以外のときに, \( q = 4 \) となるように\(q\) を定めて, 関数(1) を図示した.

締め切りまでの価格推移
図2 (例) 締切までの価格推移

従来であれば, 全ての場合で線形なグラフ, つまり \( p = 0.5\) のグラフであったが, 提案手法では, 商品が売れないと判断された場合には, 指数関数的に減少し, 商品が売られそうと判断された場合には, 価格の減少が緩やかになっていることがわかる.

グラフの曲がり具合はハイパー パラメータ\(q\) で調整可能なので, かなり融通が利くグラフになっている.

2 終わりに

本稿では, 課題とされていた売れ残りそうな商品の価格を非線形的に減少させる手法を提案した.

実際に Airbnb で運用されている手法を取り入れているため, 信頼度も高いと思われる.

価格推定関数のハイパーパ ラメータの設定は, 調整が必要であるが, 売れるかどうかの確率に応じて変化するようなグラフなので, 取り扱いの簡単なグラフである.

やはり, 精度を上げるためには売れるかどうかの確率の精度を上げることに直結する.

困難性の一つとして考えられるのが, 教師データの不足である.

ある期間に在庫が無くならない商品は山ほどあるが, 逆に在庫が無くなるような商品はごく僅かであると考えられる.

つまり, 正例が圧倒的に不足していると考えられる. その場合は, ある期間にある割合の在庫が解消されたかどうかを基準として教師データを作成する.

より精度を上げる方法としては, 商品のカテゴリがあれば, そのカテゴリ全体の需要スコアのようなものを計算できる.

また, 商品のレビューは売れるかどうかの確率に大きく繋がると思われるので, そのようなものがあれば精度を大きく向上させると思われる.

この記事をシェアする