在广告和推荐系统当中,一个重要的衡量指标就是点击率,也即是CTR(Click Through Rate)。
计算公式: CTR = 点击数 / 曝光数
也有一种衡量指标是 uvCTR。 uvCTR = 点击uv数 / 曝光uv数。
考虑 CTR = 点击数 / 曝光数 这个公式的指标,只考虑了比例的关系,但没考虑样本数大小。因为样本数少的情况下,这个比例其实是不准确的;而样本数越大,这个比例越准确,越能反映真实情况。
举个例子,有三个广告:
A:点击数 2 曝光数 10
B:点击数 20 曝光数 100
C:点击数 200 曝光数 1000
它们的 CTR 都是 0.2 。但是很明显,从置信度来讲,是 C > B > A。因为C的样本数更多,C 的 0.2 CTR更加反映真实,更加可信。
为了衡量样本数对于 CTR 置信区间的影响,我们引入"威尔逊(Wilson)区间"的概念。公式如下:
p —— 概率,在这里指点击的概率,也就是 CTR
n —— 样本总数。在这里指 曝光数
z —— 在正态分布里,均值 + z * 标准差 会有一定的置信度。例如 z 取 1.96,就有 95% 的置信度。
Wilson区间的含义就是,就是指 在一定置信度下, 真实的 CTR 范围是多少。举一个例子,如下面代码所示。计算刚刚如上所述的 A、B、C 三个广告的 Wilson 区间( z取 1.96,也就是说该区间的置信度为 95% )。
frommathimportsqrt
defconfidence(clicks,impressions):
n=impressions
ifn==0:return0
z=1.96#1.96->95%confidence
phat=float(clicks)/n
denorm=1.+(z*z/n)
enum1=phat+z*z/(2*n)
enum2=z*sqrt(phat*(1-phat)/n+z*z/(4*n*n))
return(enum1-enum2)/denorm,(enum1+enum2)/denorm
defwilson(clicks,impressions):
ifimpressions==0:
return0
else:
returnconfidence(clicks,impressions)
if__name__=='__main__':
printwilson(2,10)
printwilson(20,100)
printwilson(200,1000)
"""
--------------------
results:
(0.07048879557839793,0.4518041980521754)
(0.14384999046998084,0.27112660859398174)
(0.1805388068716823,0.22099327100894336)
"""
从结果可以看到
A:点击数 2 曝光数 10点击率 95% 置信度的置信区间为 (0.07, 0.45)
B:点击数 20 曝光数 100 点击率 95% 置信度的置信区间为 (0.14, 0.27)
C:点击数 200 曝光数 1000 点击率 95% 置信度的置信区间为 (0.18, 0.22)
在实际的应用上面,就会取最低值,作为修正后的 Wilson CTR。也就是 A 的 Wilson CTR 为 0.07,B的 Wilson CTR 为 0.14,C的 Wilson CTR 为 0.18。这相当于是给样本数不足的CTR进行一定的衰减降权。