結論
エンジンは一律30%引きに対し、純限界利益 +13.2%
ただしおよそ10日に1日は一律ルールに負ける
唐揚げ弁当(消滅 21:00/ 初期在庫 40)を1営業日ぶん、同じ需要の乱数系列で3つの方針に通した結果です。 エンジンは各スロットで動的下限と機会費用を計算し、一律ルールは消滅120分前に30%引きします。
同一シードで対にして比べた 20 日ぶんの結果です。1日あたりの差は平均 821円、 95%信頼区間は 544円 〜 1,097円。区間が0をまたいでいないので、差の向きはこのシード数でも判定できます。
主張しているのは方針どうしの相対比較だけです。 実店舗での効果量や需要予測の精度は主張しません。根拠と限界は下の 前提と限界に全て書いてあります。
商材を選ぶ
物販もサービス枠も「売れ残りの価値がゼロ」という同じ構造です。違うのは費用が発生するタイミングだけで、同じ型で扱えます。
原価構造
値を書き換えると、以下すべてが再計算されます。ここで入れた変動費は「仕入原価・材料費・施術人件費を含む」単位変動費です。
唐揚げ弁当
STOCK / 現物在庫単位固定費配賦は表示専用。値引き判断のロジックには入れない。家賃や人件費はこの1個を売っても売らなくても同額が出ていくため、 下限価格に混ぜた瞬間に全部原価思考へ戻る。ここに置いてあるのは、 現場が普段見ている数字との対応をつけるためだけの参考値。
この原価構造から出る数字
使う語は「限界利益」「限界利益率」に統一している。売上原価ベースの指標と変動費ベースの指標は、 人件費が売上原価に入るかどうかで結果が反転しうるため、混ぜて読まない。
費用が発生するタイミング
STOCK変動費は発注時に初期在庫ぶんが既に発生済み(サンクコスト)。売れても売れなくても 359円 × 40個 = 14,360円 は支出済みで、今夜の値引き判断では取り戻せない。だから下限価格の計算に入れない。
売れ残ると廃棄費用が追加で発生する。1個あたり 12円。 捨てる側にも支出があるため、下限価格は理論上マイナスになりうる(いま出す判断で扱う)。
この2種類を同じ 1 つのデータ構造で扱えること自体が本システムの主張なので、 画面上でも同じ入力欄を使い、扱いの違いだけを説明している。
いま出す判断
時刻を動かすと、その時点でエンジンが出す価格と根拠が変わります(10:00〜20:30)。
今夜この1個をどうするか
下限価格が負になっている。捨てる側にも 1個あたり 12円 の処理費がかかるため、 理論上は代金を受け取らずに引き渡すほうが得になる領域に入っている。 直感に反するが、握りつぶさずそのまま出している。
値引きの下限は「原価を割るかどうか」では決まらない。 仕入原価は発注時に発生済みで、いま売っても売らなくても戻らない。 決めるのは、いま受け取れる額と、残した場合の期待限界利益と、捨てる場合にかかる費用の3つだけ。
動的下限は「今夜この1個」の指標。仕入原価は発注時に発生済み(サンクコスト)なので下限に入れず、代わりに廃棄費用を差し引く。だから時間が経つほど下限は下がる。
この商売として、値引きが割に合うか
上の①とは判断の時点が違う。必要販売増加率は仕入原価を含んだ単位変動費で計算し、「この値引きを商売として続けて割に合うか」を問う。 ①の動的下限は仕入原価を含めず、「もう発注してしまった、目の前のこの1個をどうするか」を問う。 数字が近く見えても、同じ土俵の比較ではない。
判断の根拠
残り30分・在庫1個。残しても定価で売れる見込みはほぼ無く、この1個を残す価値は0円です。下限は-4円(売れ残ると廃棄に12円かかるため、0円で渡しても捨てるより損が小さい領域です)。478円(20%引き)なら下限を上回り、売らずに終えるより手取りが増えます。ただしこの値引きは、販売数が100.2%増えなければ利益は減ります。
この領域の数字だけは代表シード1日ぶんの推移です。 「いま出す判断」は特定の一日の特定の時点についての問いなので、平均を取ると意味が変わります。 他の領域(結論・比較グラフ・感度分析)はいずれも同一シード集合20本の平均です。
3つの方針の比較
同じ需要の乱数系列を3つの方針に通した結果です。累積純限界利益は、物販では発注時の変動費ぶんマイナスから始まります。
- 定価据え置き下限ベースライン
- 一律30%引き現場の実際のルール(本命の比較対象)
- RetailBrain エンジン動的下限と機会費用から毎スロット決める
累積純限界利益の推移
仕入は発注時に 個数ぶん全額支払い済み(サンクコスト)なので、どのポリシーも水面下から始まる。0円の線を上抜けた時点が、その日の仕入を回収し終えたところ。
在庫(残個数)の推移
スロット終了時点の残個数。線が早く落ちるほど早く売り切っているが、安く売っていれば上のグラフは伸びない。2枚を同時に見ること。
値引率の推移
各方針がいつ・どれだけ下げたか。一律ルールは消滅120分前に垂直に落ちる階段、エンジンは残個数と機会費用に応じて滑らかに動く。定価据え置きは0%の水平線。この形の違いが、値引きを時刻で決めているか限界利益で決めているかの違い。
差の確からしさ
区間は0をまたがない- 1日あたりの平均差(円)
- 821円
- 95%信頼区間(円)
- 544円 〜 1,097円
- 標準誤差(円)
- 141円
- 回した日数
- 20日
95%信頼区間が0をまたいでいないので、差の向きはこのシード数で判定できる。ただし平均で上回ることと、毎日上回ることは別。負けた日の割合は上のとおり。
主要指標の比較
- 販売数(個)
- 29.7
- 廃棄数(個)
- 10.4
- 平均実現価格(円)
- 598円
- 定価販売比率
- 100.0%
- 販売数(個)
- 39.4
- 廃棄数(個)
- 0.7
- 平均実現価格(円)
- 527円
- 定価販売比率
- 60.2%
- 販売数(個)
- 40.0
- 廃棄数(個)
- 0.0
- 平均実現価格(円)
- 540円
- 定価販売比率
- 43.5%
表示値は3ポリシー共通の同一シード集合20本の平均(値引率の推移も平均で、 代表シード1日ぶんではない)。合成データによる反実仮想であり、 示せるのはポリシー間の相対比較と、その比較が成立する条件範囲だけ。 絶対的な効果量は主張しない。販売数と廃棄数は平均のため小数になる。
どこまで成り立つか(感度分析)
自分で決めた弾力性で自分のエンジンが勝っても説得力はありません。前提を動かして、勝つ領域と負ける領域の境界を出します。
いま見ているのは上限性能です。 エンジンは真の価格弾力性を知っている前提で各スロットの値引率を決めます (グラフ上の各点では、その点の弾力性を知っているものとして計算しています)。 実際の運用でこの前提が成り立つことはないので、この数字だけを成果として読まないでください。
弾力性を自分で決めて、その値で自分のエンジンを回して勝っても説得力がありません。 そこで前提が外れた場合を併記しています。本システムは弾力性を推定しないので、 推定精度は主張の対象外です。
横軸: 価格弾力性(負値。右へ行くほど値引きに反応しない) / 縦軸: 純限界利益(円・シード20本の平均)
- 定価据え置き
- 一律30%引き
- RetailBrain エンジン
調べた範囲に ENGINE が FLAT_RULE を下回る区間は無かったため、網掛けは無い。
点線(縦)が現在地。スライダーを動かすと網掛けの内か外かが変わる。
差額(エンジン − 一律ルール)
上のグラフから2本を引き算したもの。0円の線を下回っている範囲が、エンジンが一律ルールに負けている範囲。 比率(%)ではなく円で見るのは、一律ルールの損益が0円近くを通る軸位置で比率が発散するため (実測で +2,218% という値が出るが、実体は「一律ルールがたまたまトントンだった」だけ)。
この軸で言えること
調べた範囲(-4.00 〜 -0.20)に ENGINE が FLAT_RULE を下回る区間は無い。上回る幅は +10.8% 〜 +38.6%。
現在地(価格弾力性 -2.60)は下回る区間の外。最も近い評価点ではENGINE が FLAT_RULE を上回る。
数値は現在地に最も近い評価点(価格弾力性 -2.64)での純限界利益。 同一シード集合20本の平均で、3ポリシーは同一の乱数系列で回している。 上の区間分けは、下回る区間(ENGINE が FLAT_RULE を厳密に下回る範囲)に従っている。5%という基準は「上回る」と書くか「ほぼ互角」と書くかの 文言の選択にだけ使っており、区間の切り出しには使っていない。 比較対象の FLAT_RULE は「消滅120分前に一律30%引き」という 現場の実際のルール。
ここで主張しているのは3ポリシーの相対比較と、その比較が成立する条件範囲だけ。 個別施策の絶対的な効果量や、需要予測の精度は主張していない。 数値は合成データ上の結果であり、実店舗の実測値ではない。
前提と限界
この画面が何を仮定し、何を主張しないかを明示します。検証できない部分を隠さないことが、このシミュレータの設計方針です。
需要モデル
q(p, t) = arrival(t) × baseQty × (p / listPrice) ^ ε(t) ε(t) = elasticity × (1 + λ × (1 − remainingRatio)) remainingRatio = 残スロット数 / その商材の全販売可能スロット数
営業日を30分刻みのスロットに区切り、各スロットの実現需要は平均 q のポアソン乱数 (シード固定)で引きます。3ポリシーは必ず同一シードの乱数系列で回すため、 差はポリシーの違いだけから生まれます。画面の数値は同一シード集合の平均で、 本数は結論の下にある「回した日数」で変えられます。増やすほど信頼区間と境界の幅が狭まります。
パラメータと出典
Bijmolt, van Heerde & Pieters (2005), Journal of Marketing Research 42(2), 141–156。 81研究1,851推定のメタ分析、平均 −2.62。ブランド/SKUレベルの値です。
施術枠・座席についてSKUレベルの公表値を見つけられなかったため、物販より弱めに手で置いた値です。 裏付けはありません。
残時間が短いほど価格反応が鋭くなる、という業務観察に基づく仮定です。文献的裏付けはありません。 λ = 0 と置けば時間非依存のモデルに退化します。
商材ごとに売れ残り量がぶれるとポリシー比較が「商材の当たり外れの比較」になってしまうため、 定価のままなら初期在庫の約75%が売れる水準に基準需要を合わせています。実測値ではありません。
なぜカテゴリ弾力性を使わないか
食品カテゴリの価格弾力性としてよく引かれる −0.27〜−0.81(Andreyeva et al. 2010)はカテゴリレベルの推定値で、 「肉全体の需要」を測ったものです。値引き判断は単品=SKUレベルの意思決定なので、 測っている階層が約3倍違います。ここにカテゴリ値を入れると 「値引いても売れない」とエンジンが誤判定し、設計そのものが壊れます。
本システムは弾力性を推定しません。外部から与えます。 したがって推定精度は主張の対象外です。
主張しないこと
- 絶対的な効果量(「廃棄ロス◯%削減」など)。合成データの上での比較なので、実店舗での効果量は言えません。
- 需要予測の精度。 これは意思決定エンジンであって予測器ではありません。予測精度(MAE等)を評価指標に置いていないのは、 欠品コストと過剰コストが非対称な newsvendor 構造では、予測精度が上がっても利益が下がることが普通に起きるためです。
- 主張するのはポリシー間の相対比較と、その比較が成立する条件範囲だけです。 条件範囲そのものは どこまで成り立つか(感度分析)で提示しています。
合成データは実データがないための代用品ではありません。同じ一日を3つの異なる方針で 繰り返す反実仮想は、実データでは原理的に観測できません。
会計上の約束
floorPrice = incurredIfSold
+ opportunityCost
− disposalCostAvoided
incurredIfSold = (枠なら変動費) + 追加販売コスト
disposalCostAvoided = (物販なら廃棄費用)物販の変動費は発注時点で初期在庫ぶんが既に発生済み(サンクコスト)なので、 値引きの下限には入れません。サービス枠の変動費は売れたときだけ発生するので入れます。この違いが物販とサービスを分ける唯一の点です。
単位固定費配賦は画面に出しますが、値引き判断のロジックには一切入れていません。 入れると「原価を下回る値段では売れない」という全部原価思考に戻り、 消滅期限付き在庫では利益を落とす方向に働きます。
純限界利益(売上 − 変動費 − 追加販売コスト − 廃棄費用)。 物販の変動費はポリシー間で定数(初期在庫ぶん)として扱います。 これを販売数に比例させると、深い値引きが廃棄より損に見えてエンジンが不当に負けます。
裏づけの資料
この画面だけでは分からない「どう作ったか」「何が壊れたか」は別文書にしてあります。