一个洗车店引发的思考:给谁发优惠券好呢?
Posted Jie Qiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个洗车店引发的思考:给谁发优惠券好呢?相关的知识,希望对你有一定的参考价值。
文章目录
注:本文是论文Unit Selection Based on Counterfactual Logic的一个笔记
一个洗车店的故事
从前有个洗车店,洗车能赚140,打算找到一个合适的公司对其发放40元优惠券。
为了决定选哪个公司,我们需要调查每个公司的情况来做出一个收益较高的选择。有两种调查的方法,一种是随机试验ab test,即在一个公司内部,随机选择一部分人发优惠券,另一部分不发,那么就能得到该公司关于优惠券的使用率的差异,从而可以计算出该公司选择发放优惠券的收益。
另一个方法是观察两个平行世界,在世界A发优惠券,在世界B不发,通过比较这两者的收益差异来决定到底选谁。
一个已知的事实是,公司里面总有4类人:
- Complier: 收到优惠券买,没收到不买 r a , r a ′ ′ r_a ,r'_a' ra,ra′′
- Always- taker: 收到优惠买,没收到优惠券也买 r a , r a ′ r_a ,r_a' ra,ra′,
- Never- taker: 收到优惠不买,没收到优惠也不买 r a ′ , r a ′ ′ r'_a ,r'_a' ra′,ra′′
- Defier: 收到优惠不买,没收到优惠就买 r a ′ , r a ′ r'_a ,r_a' ra′,ra′
这里A=a表示收到了优惠券,A=a’表示没有收到优惠券,R=r表示使用了该优惠,R=r’表示没用该优惠,C=c表示公司c.
不妨假设这几类人在公司A的占比是(实际是观测不到的)
Complier 30%
Always- taker 10%
Never- taker 20%
Defier 40%
公司B的占比是(实际是观测不到的)
Complier 20%
Always- taker 5%
Never- taker 65%
Defier 10%
于是,通过随机试验ab test, 我们得到以下两组数据,
那么ab test的优化目标是:
O
b
j
1
=
arg
max
c
100
∗
p
(
r
∣
c
,
d
o
(
a
)
)
−
100
∗
p
(
r
∣
c
,
d
o
(
a
′
)
)
Obj_1 =\\arg\\max_c 100*p( r|c,do( a)) -100*p( r|c,do( a'))
Obj1=argcmax100∗p(r∣c,do(a))−100∗p(r∣c,do(a′))
其中
p
(
r
∣
c
,
d
o
(
a
)
)
\\displaystyle p( r|c,do( a))
p(r∣c,do(a))表示给优惠券继续使用的人数,即该目标想要找到一个群体c,其发放优惠券增加的人数最多。但考虑到发了优惠券还购买的人会存在额外的成本,所以我们还可以将其权重设大一点,于是:
O
b
j
2
=
arg
max
c
100
∗
p
(
r
∣
c
,
d
o
(
a
)
)
−
140
∗
p
(
r
∣
c
,
d
o
(
a
′
)
)
Obj_2 =\\arg\\max_c 100*p( r|c,do( a)) -140*p( r|c,do( a'))
Obj2=argcmax100∗p(r∣c,do(a))−140∗p(r∣c,do(a′))
最后一种就是考虑平行世界的利润差异:
我们分析下
Complier: 在世界A将赚100元,在世界B将赚0元。
Always- taker: 在世界A将赚100元(假设还有20损耗成本,可能有人拿了优惠券感到真香,以后没优惠券就不买了(这只是个假设,暂且接受吧),于是赚80),在世界B赚140元。
Never- taker: 在世界A将赚0元,在世界B将赚0元。
Defier: 在世界A将赚0元,在世界B将赚140元。
根据这些差异我们可以写出以下目标函数:
O b j 3 = arg max c 100 p ( r a , r a ′ ′ ∣ c ) + ( − 60 ) p ( r a , r a ′ ∣ c ) + ( 0 ) p ( r a ′ , r a ′ ′ ∣ c ) + ( − 140 ) p ( r a ′ , r a ′ ∣ c ) Obj_3 =\\arg\\max_c 100p( r_a ,r'_a' |c) +( -60) p( r_a ,r_a' |c) +( 0) p( r'_a ,r'_a' |c) +( -140) p( r'_a ,r_a' |c) Obj3=argcmax100p(ra,ra′′∣c)+(−60)p(ra,ra′∣c)+(0)p(ra′,ra′′∣c)+(−140)p(ra′,ra′∣c)
最后得到的目标如下:
可以发现目标1,2的结论跟目标3是完全相反的。
我们以
O
b
j
1
\\displaystyle Obj_1
Obj1为例子算一算验证一下,首先
p
(
r
∣
c
=
g
r
o
u
p
1
,
d
o
(
a
)
)
=
262
262
+
88
p
(
r
∣
c
=
g
r
o
u
p
1
,
d
o
(
a
′
)
)
=
175
175
+
175
p( r|c=group_1 ,do( a)) =\\frac262262+88\\\\ p( r|c=group_1 ,do( a')) =\\frac175175+175
p(r∣c=group1,do(a))=262+88262p(r∣c=group1,do(a′))=175+175175
于是
O
b
j
1
=
100
∗
262
262
+
88
−
100
∗
175
175
+
175
=
24.85714
Obj_1 =100*\\frac262262+88 -100*\\frac175175+175 =24.85714
Obj1=100∗262+88262−100∗175+175175=24.85714
直觉上,平行世界的结果应该是真的,那为什么随机试验会出错呢?
某种程度上,是我们对这个随机试验做了一个分组,这个分组的操作使得公司这一个confounder没有被截断,从而出现了这种问题。而这个问题有趣的地方在于,由于问题的本身setting(判断那个公司更好),这个分组又是不可避免的,所以必然会出现这种情况。
解决方案
这篇论文提出虽然准确的反事实的结果无法得出,但可以根据试验与观测得到的数据给出一个估计区间,我们可以用这个区间的中位数来代替这一反事实估计结果。
这个区间的实验效果如下图所示,
其中
δ
\\delta
δ是下式
argmax
c
β
P
(
r
a
,
r
a
′
′
∣
c
)
+
γ
P
(
r
a
,
r
a
′
∣
c
)
+
θ
P
(
r
a
′
,
r
a
′
′
∣
c
)
+
δ
P
(
r
a
′
,
r
a
′
∣
c
)
\\operatornameargmax_c \\beta P\\left(r_a, r_a^\\prime^\\prime \\mid c\\right)+\\gamma P\\left(r_a, r_a^\\prime \\mid c\\right)+ \\theta P\\left(r_a^\\prime, r_a^\\prime^\\prime \\mid c\\right)+\\delta P\\left(r_a^\\prime, r_a^\\prime \\mid c\\right)
argmaxcβP(ra,ra项目记录-上门洗车-汽车服务
关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。