株式会社ホクソエムのブログ

R, Python, データ分析, 機械学習

簡単な"さんすう"で見積もる施策効果の要因分解

日々、最先端で高度なテクノロジーに基づくビジネス改善”施策”を実施されている読者諸氏の皆さんこんばんわ、株式会社ホクソエム・常務取締役(博士(統計科学))の高柳です。

"XXXというKPI(売上とか)を向上させるために、XXXを構成するYYYという要因(PVとか広告単価とか1人あたりの売上とか)を向上させれそうな施策を試してみたんだけど、ZZZというまた別の売上を構成する要因(Impressionとか来店客数)も増えてたおかげで、結局、施策が売上全体にどのくらいのインパクトがあったのかよくわからないんだ〜助けて〜” ・・・という状況、あると思います。

この記事ではこういった複数の要因が混み入った状況でも ”各要因ごとに施策効果を分解して「PV要因で売上X円UP!」などと評価することができますよ、という話を紹介したい。

あまりやってる人見たことないからメジャーじゃないとは思うんだけど、「引いて掛ける」という簡単なさんすうで計算することができるので覚えておきましょうという話でもある。

状況設定

まず、スーパーの店長になった気持ちで一日あたりの ”売上(円)” というKPIが以下のように分解されるとしておこう。 え?私の手元のKPIツリーではこんな簡単な算数で綺麗に分解できていない?その場合は下記の一般論のケース「結局なんなの?・・・もっと一般論をプログラマティックにやりたい貴方へ」を見てもらいたい。

  • 売上(円) = 1人あたりの売上(円/人)× 来店客数(人)

字面通りに式を読み解くと、これは"売上(円)"というKPIを

  • ”1人あたりの売上(円/人)”
  • "来店客数(人)"

という2つの要因に分けているということだ。 そして今、店長としてのあなたは店の売上をあげるために ”1人あたりの売上(円/人)”を向上させようと躍起になっている、そんな状況を想像してもらいたい。

それでは早速本題に入ろう。 まず現状、各々の要因が

  • 1人あたりの売上(円/人)= 1,000(円/人)
  • 来店客数(人)= 100(人)

だったとしよう。このときの売上(円)はもちろん単純に掛け算をして 1,000(円/人)× 100(人)= 10万円となる。 これはさすがに簡単だ。小学3年生だって暗算でできちゃう。

さて、次にあなたは店長として”1人あたりの売上(円/人)”を向上しようと何某かの単価向上キャンペーンを打ったと思おう。 なんかこう一回来店したときにたくさん買ってくれるような施策だ。牛肉がお買い得!マスクまとめ買いチャンス!トイレットペーパー無制限購入可!などなど何でも良い。

さて、そのおかげもあって"1人あたりの売上(円/人)"が以下のように改善したとしよう(一方、天気が悪かったのか来店客数がしれっと減ってる点に注意)。

  • 1人あたりの売上(円/人)= 1,200(円/人)
  • 来店客数(人)= 90(人)

やったー! ”1人あたりの売上(円/人)”は確かに 1,000(円/人)から 1,200(円/人)に向上している! 今回の”単価向上キャンペーン”は効果があったと言えそうだ!

あった、効果はあった、あったはいいが、その効果は”いかほどの金額”だったのだろうか? 定量にうるさいおじさんたちはきっとこれを要求してくるだろう。これを見積もりたい。 だって貴方は店長だもの。エリア長が褒めてくれなくたっていい。自分だけでも自分を褒めてあげたい。 売上はすべてを癒す、そういうことです。

さて、雑に考えると、単純に売上の増加分の8,000円((1,200(円/人)× 90(円) - 100,000円)だけ効果があったと見積っていいのだろうか?

ここで示す要因分解はこの問題に答えを出してくれる。

要因分解の方法

答えを先に言っちゃうと、各要因による売上増の効果を以下のように計算すればよい。

  • "1人あたりの売上(円/人)"要因 = (1,200 - 1,000) (円/人)* 100 (人)= 20,000円
  • "来店客数(人)"要因 = (90 - 100)(人)* 1,000 (円/人) = -10,000円
  • 両要因の混合(相互作用)要因 = (1,200 - 1,000) (円/人)* (100 - 90)(人) = -2,000円

上の3つの要因を足してもらうと元の売上増加分の8,000円に等しくなっていることがわかると思う。 つまりこういう分解が行われているのだ。

  • 全体の売上増(8,000円)= "1人あたりの売上(円/人)"要因(20,000円) + "来店客数(人)"要因(-10,000円) + 両要因の混合要因(-2,000円)

したがって、この計算方法でいうと "今回の単価向上キャンペーンによって1人あたりの売上は200円向上した。その売上への効果は20,000円程度あったと見込まれる"ということができる(一方、悪天候効果により来店客数が減少したことによる売上への影響は -10,000円あったと言える、また謎の”両要因の混合要因”とやらは、他の2つの要因と比べて1桁小さい点にも注目だ)。 どういう計算をしているのかを日本語で書くとこういうことだ。

  • "1人あたりの売上(円/人)"要因 = (1人あたりの売上(施策後) - 1人あたりの売上(施策前)× 来店客数(施策前)
  • "来店客数(人)"要因 = (来店客数(施策後) - 来店客数(施策前)×1人あたりの売上(施策前)
  • 両要因の混合(相互作用)要因 = (1人あたりの売上(施策後) - 1人あたりの売上(施策前))×(来店客数(施策後) - 来店客数(施策前)

要するに「要因ごとに施策前後での差分を計算し、それに”施策前”のもう一方の要因を掛けてやる」ということだ。 「引いて掛ける」という簡単な”さんすう”で施策効果の要因分解ができましたね?

この計算をGoogle SpreadSheetにしたものを用意したので自分で数式を確かめたい人は参考にしてほしい

あぁ、よかった。これでちゃんと単価向上キャンペーンの効果を見積もれるようになったぞ。 店長としての貴方は枕を高くして眠ることができるわけです。

結局なんなの?・・・もっと一般論をプログラマティックにやりたい貴方へ

ここでやってる分解は要するに「 ”施策や確率的なノイズによってもたらされる各要因の向上度合い” を微小量だと思ってそいつで一次近似してる」だけです。 ここでは2要因の場合を紹介したけど、N要因ある場合には(未定義な変数は心の目👀で補間してください)以下のように考えればよい。

まず売上の増分はN個の要因(x)の変化(Δで書いてるやつ)を用いて以下のようにかける。 f:id:shinichi-takayanagi:20200420195825p:plain

この右辺をΔ(向上度合い)が小さいと思って頑張って展開をしてやると f:id:shinichi-takayanagi:20200420201034p:plain

と書ける。

2要因の場合、この第一項が上記の"1人あたりの売上(円/人)"要因(x_1)と"来店客数(人)"要因(x_2)に相当しています。 ちゃんと導出したければ Sales(x_1, x_2) = x_1 * x_2 と定義して、これをx_1やx_2で微分してみると見通しよく分かると思います。

また最後に残った”両要因の混合(相互作用)要因”と称しているものは上の数式の第二項、要するに高次のオーダーからの寄与ってことになります。

なんで、N要因への拡張も簡単にできるし、Codeで計算しようと思えば簡単にできるわけです(売上関数をちゃんと構築できれば!)。

結論

いろんな要因がごちゃごちゃ同時に変化してしまったとしても、意外と施策効果って簡単な算数で測れるもんだな〜ってのがわかっていただけると幸甚です。

そういえば、こういう”数理を用いたモデリング”(今回は要因分解のモデリング)に詳しくなりたい人にぴったりの本が最近出たようですよ。 (この記事は本書の1章に刺激を受けたのでスッと書きました)